最近在STM32上用FreeRTOS开发程序,集成了Tracealyzer,使用J-LINK RTT流模式监控,程序在板子上能正常跑,任务可以通过串口和LED等观察到都正常运行调度。但是Tracealyzer上就是没有数据上来,编译都OK,运行也没啥报错。
1、反复核对集成Tracealyzer的步骤,没问题
2、反复核对相关头文件配置,没问题
3、反复检查Tracealyzer的配置,没问题
4、我的J-LINK一直提示clone,但能正常使用,我为了排除硬件原因,新买了一个,还是不行。
无果,反复折腾了两三天,没办法,只能静下心来好好读Tracealyzer的文档,里面以后Troubleshooting的内容,对着文字,一条一条的排查,最后发现一段:
突然想起,在官方的文档里要求把#include “trcRecorder.h” 放在FreeRTOSConfig.h的最后。我移植的时候,有抱语法错误,当时换了个地方放就没有错误了,就这样把这个错误放过了。
回过头来,从新解决报错的问题。由于是STM32CubeMX生产的代码环境,集成了CMSIS_OS,其中有一条报错说 SysTick_Handler() 这个中断函数在PORT.C和CMSIS_OS2.C两个文件中重定义了。查看代码发现:
1、此函数是在CMSIS_OS2.C中定义,且调用了一个xPortSysTickHandler()函数。
2、xPortSysTickHandler()函数在PORT.C中定义
3、FreeRTOSConfig.h文件中却定义#define xPortSysTickHandler SysTick_Handler
哈,xPortSysTickHandler()和SysTick_Handler()的这两个函数都是systick 的中断处理函数,为了保险起见,在工程中搜索这两个函数,发现没有任何其他引用,果断注释掉FreeRTOSConfig.h文件中#define xPortSysTickHandler SysTick_Handler。再试,问题完美解决。至于为什么FreeRTOSConfig.h中会这么定义,下次再研究,晚上12点了,睡觉!!!