c - 带有 LibOpenCM3 的 STM32 FreeRTOS

标签 c stm32 freertos libopencm3

我有一个 STM32 BluePill 开发板(STM32F103C8,带有 8Mhz Quarz)并尝试上传一个使用 LibOpenCM3 和 FreeRTOS 制作的小闪烁程序。但出于某种原因,FreeRTOS 在 vTaskStartScheduler() 中挂起,sys_tick_handler 也不执行任何操作。

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

更新:我用 OpenOCD 调试并发现它跳入了 hard_fault_handler 更新 2:UsageFault-Status-Register 设置了 NOCP 位

最佳答案

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

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

#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 描述的,但唯一的区别(在这种情况下)只是 vector/处理函数的名称。

关于c - 带有 LibOpenCM3 的 STM32 FreeRTOS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52459810/

相关文章:

stm32 - 如何调试定时器

c - 在应用加载和运行程序中

c - stm32l476v TIM15 CH2 PWM 无法从 cubeMx 工作

c - 首先使用 malloc 设置堆?

GCC 可以忽略函数的静态声明吗?

c - grep 是如何工作的?

C - 如何读取屏幕像素的颜色(快速)? (在 Windows 中)

c - STM32运行异步函数

c - 如何在 FreeRTOS 中重新启动任务

c - 我没有关闭管道末端的一个,有什么不对劲吗?