今天遇到一个问题,Freertos卡在vPortEnterCritical断言中了,从vPortEnterCritical中的代码可以看到,此时在中断中执行了vPortEnterCritical。在检查完代码后,还是没注意到是在哪里调用了这个方法(老眼昏花了)。于是添加了几行log,轻松定位到问题。
1.错误日志:
RTOS_CORE [I] vPortValidateInterruptPriority:754 ulCurrentInterrupt:0x44
RTOS_CORE [I] vPortValidateInterruptPriority:785 ucCurrentPriority:0x30,ucMaxSysCallPriority:0x20
RTOS_CORE [I] vPortValidateInterruptPriority:786 result:1
RTOS_CORE [D] vPortValidateInterruptPriority:803 reg:300,val:300
RTOS_CORE [D] uxQueueMessagesWaiting:1585 E
RTOS_CORE [D] vPortEnterCritical:443 IRQ[44]:TIM2 ----中断TIM2中调用了没有ISR的函数
RTOS_CORE [E] vPortEnterCritical:445 ASSERT ERROR:0 ----RTOS卡在这里,445行
vPortEnterCritical中添加日志,判断是否有中断发生。CortexM4Int2String()打印对应中断的名字。从上面的日志可以看到,此时在中断TIM2中。
2.vPortEnterCritical添加日志

3.portmacro.h中宏修改
注意待代码稳定后,请删掉日志或者关闭对应的log。
#define vPortEnterCriticalDbg( ) \
do {
\
if( portNVIC_INT_CTRL_REG & 0xFF/*portVECTACTIVE_MASK*/) LOGD

本文讲述了如何通过添加日志定位CortexM4平台上的Freertos程序在中断TIM2中错误地调用了一个没有ISR的函数,导致vPortEnterCritical断言。作者分享了解决方法,即检查中断上下文并修复uxQueueMessagesWaiting中的问题。
最低0.47元/天 解锁文章
1万+

被折叠的 条评论
为什么被折叠?



