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不支持这个东东,所以这段程序直接就没有。。。。


本作品采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可。

仅有 1 条评论
  1. BronzeChromie

    遇到了和你一样的错误,系统给的值也是3,改了就能跑了。。。官方code很迷。。。

    BronzeChromie 回复
发表新评论