STM32 FreeRTOS 与 LibOpenCM3

Posted

技术标签:

【中文标题】STM32 FreeRTOS 与 LibOpenCM3【英文标题】:STM32 FreeRTOS with LibOpenCM3 【发布时间】:2019-02-26 19:30:39 【问题描述】:

我有一个 STM32 BluePill Board(STM32F103C8 with 8Mhz Quarz)并尝试上传一个用 LibOpenCM3 和 FreeRTOS 制作的小闪烁程序。但由于某种原因,FreeRTOS 挂在 vTaskStartScheduler() 中,sys_tick_handler 也没有做任何事情。

我没有使用调试器,只是在 sys_tick_handler 函数中放置了一个 gpio_reset,并在调用 vTaskStartScheduler 之后测试代码是否被执行,但它似乎没有做任何事情,我不知道为什么。 代码可在此处获得:https://gitlab.com/feldim2425/stm32-testing

更新:我使用 OpenOCD 进行了调试,发现它跳转到了 hard_fault_handler 更新 2:UsageFault-Status-Register 设置了 NOCP 位

【问题讨论】:

【参考方案1】:

好的,我找到了问题。如果您在自己的 sv_call_handler、pend_sv_handler 和 sys_tick_handler 的处理程序向量实现中调用它们,许多示例似乎依赖编译器优化来将 FreeRTOS 中的 vPortSVCHandler、xPortPendSVHandler 和 xPortSysTickHandler 直接链接到向量表中。但这在这里不起作用,函数必须由处理器直接调用。

将这 3 行添加到 FreeRTOSConfig.h 文件的底部并删除我自己的向量函数声明解决了问题:

#define vPortSVCHandler sv_call_handler
#define xPortPendSVHandler pend_sv_handler
#define xPortSysTickHandler sys_tick_handler

这里描述了修复:https://www.freertos.org/FreeRTOS_Support_Forum_Archive/January_2012/freertos_LPC1768_FreeRTOS_4964917.html

它是为 CMSIS 描述的,但唯一的区别(在这种情况下)只是向量/处理函数的名称。

【讨论】:

以上是关于STM32 FreeRTOS 与 LibOpenCM3的主要内容,如果未能解决你的问题,请参考以下文章

基于STM32与FreeRTOS的消息传递详解(HAL库)

基于STM32与FreeRTOS的消息传递详解(HAL库)

基于STM32与FreeRTOS的消息传递详解(HAL库)

使用STM32CubeMX创建FreeRTOS项目

使用STM32CubeMX创建FreeRTOS项目

使用STM32CubeMX创建FreeRTOS项目