Freertos的故障诊断

本章重点介绍FreeRTOS新手用户遇到的最常见问题。首先,它侧重于三个问题,这些问题已被证明是多年来最常见的支持请求来源;中断优先级分配不正确、堆栈溢出和printf()使用不当。然后,它以常见问题解答的风格简要介绍了其他常见错误、可能的原因及其解决方案。
使用configASSERT()可以立即捕获和识别许多最常见的错误源,从而提高生产率。强烈建议在开发或调试FreeRTOS应用程序时定义configASSERT()。

中断优先级

注意:这是支持请求的首要原因,在大多数端口中,定义configASSERT()会立即捕获错误!

如果正在使用的FreeRTOS端口支持中断嵌套,并且中断的服务例程使用FreeRTOS API,则必须将中断的优先级设置为configMAX_SYSCALL_interrupt_priority或更低。如果不这样做,将导致临界区无效,进而导致间歇性故障。

如果在以下处理器上运行FreeRTOS,请特别小心:
中断优先级默认为具有尽可能高的优先级,这在某些ARM Cortex处理器上就是这种情况,也可能在其他处理器上也是如此。在这样的处理器上,不能不初始化使用FreeRTOS API的中断的优先级。
数字上的高优先级数字表示逻辑上的低中断优先级,这似乎违反直觉,因此会引起混淆。ARM Cortex处理器也是如此,可能还有其他处理器也是如此。
例如,在这样的处理器上,以优先级5执行的中断本身可以被优先级为4的中断中断中断。因此,如果将configMAX_SYSCALL_INTERRUPT_PRIORITY设置为5,则任何使用FreeRTOS API的中断只能被分配数值高于或等于5的优先级。在这种情况下,5或6的中断优先级是有效的,但3的中断优先级肯定是无效的。

不同的库实现期望以不同的方式指定中断的优先级。同样,这与针对ARM Cortex处理器的库特别相关,在这些库中,中断优先级在写入硬件寄存器之前会被移位。一些库会自己执行位移,而另一些库则希望在优先级传递给库函数之前执行位移。

同一架构的不同实现实现实现了不同数量的中断优先级位。例如,来自一个制造商的Cortex-M处理器可以实现3个优先级位,而来自另一制造商的Cortex-M处理器可以实现4个优先级位。
定义中断优先级的位可以分为定义优先权的位和定义子优先级的位。确保所有位都分配给指定优先权,这样子优先级就不会被使用。

在某些FreeRTOS端口中&#x

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值