0%

FreeRTOS 记录

FreeRTOS 一些记录。

FreeRTOS

  • 老版本的 FreeRTOS 如何下载?
    https://sourceforge.net/p/freertos/code/HEAD/tree/,点击 tags 进入,选择版本然后点击Download Snapshot按钮即可启动下载。

  • FreeRTOS 配置选项
    FreeRTOSConfig.h 的说明:https://www.freertos.org/a00110.html

  • 如何移植
    https://www.freertos.org/FreeRTOS-porting-guide.html

  • 中断优先级设置?

    在移植 5062 时遇到了 StartScheduler 函数内执行 SVC 0 指令后触发 Hardfault 的错误,调试发现是 SVC 中断被屏蔽所导致的。FreeRTOS 在 StartScheduler 前会 portDISABLE_INTERRUPTS,Cortex-M 是通过写 BASEPRI 来屏蔽中断的,5062 的BASRPRI 的值被写为 0x20,而 SVC 的优先级恰好也被设置成了 0x20,所以 SVC 中断被屏蔽了。在 SVC 中断被屏蔽时去触发它会产生一个用法错误 - Hardfaut。

    configMAX_SYSCALL_INTERRUPT_PRIORITY needs to be a raw priority value as it is written to the NVIC priority registers in the Cortex-M3 device, as documented in the ARM manuals. The priorities of 0..15 are not real Cortex-M3 priorities, and are simplified priorities for use in some library calls (because the real priorities are so complex on Cortex-M devices).
    If you want a simplified priority of 8, then you need to set configMAX_SYSCALL_INTERRUPT_PRIORITY to 0x8n, where n can be any value, but by convention, and for future proofing in case future STM32 parts implement more priority bits, should be set to f. Therefore, the priority you want is 0x8f.
    “the code app-faults at “svc 0” in vPortStartFirstTask”
    Presumably a hard fault because you are attempting a call to effectively a synchronous interrupt while simultaneously having that interrupt masked out.

  • FreeRTOS 只有在任务切换时才会检查栈当前栈是否溢出,所以不是所有的线程的栈溢出都能被检查到的。

  • 在移植 STM32L431RC 时遇到了上位机发送数据后,UART 接收线程却没有接收到数据的问题。

    UART 接收大致流程如下:

    用户线程:拿 semphr -> 读取数据
    UART 接收中断:给 semphr

    调试发现中断中给了 semphr ,但是线程没有拿到,原来是在拿 semphr 中的临界区出了问题:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    taskENTER_CRITICAL();
    const UBaseType_t uxMessagesWaiting = pxQueue->uxMessagesWaiting;
    if( uxMessagesWaiting > ( UBaseType_t ) 0 )
    {
    // Get data
    // Return
    }
    taskEXIT_CRITICAL();
    // Block current thread untill semphr is gived

    taskENTER_CRITICAL 是把优先级低于 CORTEX_NVIC_PRIO_BITS 的中断全部屏蔽。

    STM32L431RC 的抢占优先级数是 4,而我把 CORTEX_NVIC_PRIO_BITS 设置成了 3,刚好 UART 中断配的是最高优先级 0,所以 taskENTER_CRITICAL 实际上对 UART 中断不起作用,若在第 2 行后刚好来了一个 UART 接收中断,虽然中断内给了 semphr,但是中断返回后,第 4 行还是认为没有给 semphr,所以出错。

坚持原创技术分享,您的支持将鼓励我继续创作!