代码之家  ›  专栏  ›  技术社区  ›  feldim2425

带LibOpenCM3的STM32 FreeRTOS

  •  0
  • feldim2425  · 技术社区  · 6 年前

    我有一个STM32 BluePill板(带有8Mhz Quarz的STM32F103C8),并尝试上传一个用LibOpenCM3和FreeRTOS制作的小blink程序。但由于某些原因,FreeRTOS挂在vTaskStartScheduler()中,sys\u tick\u处理程序也不会执行任何操作。

    我没有使用调试器,只是在sys\u tick\u处理程序函数中放置了一个gpio\u reset,然后在vTaskStartScheduler调用之后测试代码是否被执行,但它似乎什么也没做,我不知道为什么。 代码可从以下位置获得: https://gitlab.com/feldim2425/stm32-testing

    更新:我用OpenOCD进行了调试,结果发现它跳入了hard\u fault\u处理程序 更新2:UsageFault状态寄存器设置了NOCP位

    1 回复  |  直到 6 年前
        1
  •  4
  •   feldim2425    6 年前

    好吧,我找到问题了。许多示例依赖于编译器优化,将FreeRTOS中的vportsvchHandler、xPortPendSVHandler和xPortSysTickHandler直接链接到向量表中,如果您在自己的sv\u call\u handler、pend\u sv\u handler和sys\u tick\u handler的处理程序向量实现中调用它们的话。但这在这里不起作用,函数必须由处理器直接调用。

    将这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,但唯一的区别(在本例中)是向量的名称。