Freertos vPortEnterCritical卡死调试方法

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

今天遇到一个问题,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
在你的代码中,当你添加了业务功能代码时,四个任务都卡死了,这可能是因为业务功能代码导致了任务调度问题。在FreeRTOS中,任务调度是基于时间片轮转的,每个任务在执行完一定时间后会被调度到另一个任务上。但是,如果某个任务在执行过程中长时间阻塞或者死锁,那么其他任务就无法得到执行,从而导致了任务卡死的现象。 在你的情况下,添加的业务功能代码可能导致了任务的长时间阻塞或者死锁。你可以尝试以下几个方法来解决这个问题: 1. 检查业务功能代码中是否存在死循环或者长时间阻塞的情况。如果有,你需要修改代码,确保任务能够及时释放CPU资源,让其他任务得到执行的机会。 2. 检查任务的优先级设置是否合理。如果某个任务的优先级设置过高,它可能会长时间占用CPU资源,导致其他任务无法得到执行。你可以尝试调整任务的优先级,确保任务之间的相对重要性和紧急程度得到合理的反映。 3. 检查任务的堆栈大小是否足够。如果任务的堆栈空间不足,它可能会导致堆栈溢出,从而引发任务卡死的问题。你可以尝试增加任务的堆栈大小,确保任务能够正常运行。 4. 使用调试工具来定位问题。FreeRTOS提供了一些调试工具,例如FreeRTOS Trace,可以帮助你追踪任务的调度情况和堆栈使用情况,从而找出问题所在。
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值