FreeRTOS移植遇到的一点问题
FreeRTOS移植的整个过程应该来说还是比较容易的,不过,最近往CM4核上移植的时候出现了一个比较有意思的问题,这里记录一下.
问题描述
当开启vTaskStartScheduler()
的时候,程序没有运行起来,而是跳到一个汇编里面,从代码上看是一个无限循环:
portFORCE_INLINE static void vPortRaiseBASEPRI( void )
{
uint32_t ulNewBASEPRI;
__asm volatile
(
" mov %0, %1 \n" \
" msr basepri, %0 \n" \
" isb \n" \
" dsb \n" \
:"=r" (ulNewBASEPRI) : "i" ( configMAX_SYSCALL_INTERRUPT_PRIORITY ) : "memory"
);
}
完全不懂汇编的我怎么可能看的懂这个汇编呀,网上看看也有其它人遇到同样的问题,不过没有写相应的解决方法,只是说可能和中断优先级的设置有关系,无奈,没有什么好的方法,就追着程序进去看看好了。
解决方法
单步调试发现程序是运行到下面一步出现的问题:
// in port.c line 341
#ifdef configPRIO_BITS
{
/* Check the FreeRTOS configuration that defines the number of
priority bits matches the number of priority bits actually queried
from the hardware. */
configASSERT( ( portMAX_PRIGROUP_BITS - ulMaxPRIGROUPValue ) == configPRIO_BITS );
}
#endif
实际是configASSERT
失败导致的,你说说,好好的asseret
就简单写写不好吗,还搞个汇编在这。
找到问题的根源就好办了,直接将config里面的configPRIO_BITS
改正确就可以了。我这里是从4改成了3。
一点补充
之前往CM0上移植没有出现过类似的问题,究其原因是CM0不支持这个东东,所以这段程序直接就没有。。。。
最后更新于 2018-06-27 03:15:28 并被添加「」标签,已有 5806 位童鞋阅读过。
本作品采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可。
遇到了和你一样的错误,系统给的值也是3,改了就能跑了。。。官方code很迷。。。