一、前言
目标:使用STM32单片机创建两个Freertos任务,并在Treacelyzer软件上显示任务视图。
Tracelyzer软件可以使用流模式和快照模式,本次实验使用流模式。
流模式只能使用J-link实现,板载的ST-link可以转化为J-link,但是单独购买的ST-link不可以转换,你也可以尝试,小心变砖。
二、使用STM32cube创建freertos任务
1.选择单片机型号
2.配置IO口
以上就创建完成代码,下面开始串口移植。
在usart.c中添加头文件
#include "stdio.h"
在usart.c的最后添加重定向函数,可能不同板子的重定向函数不同,或者使用其他的重定向函数。
#if 1
#pragma import(__use_no_semihosting)
struct __FILE
{
int handle;
};
FILE __stdout;
void _sys_exit(int x)
{
x = x;
}
int fputc(int ch, FILE *f)
{
while((USART1->ISR&0X40)==0);
USART1->TDR = (uint8_t) ch;
return ch;
}
#endif
在freertos.c中添加头文件
#include "stdio.h"
在两个任务中添加打印代码
我们看到两个任务已经实现了,接下来开始移植Tracealyzer代码。
三、移植Tracelzer代码
这时候编译出现四个错误,先不要管。
修改配置文件trcConfig.h,删除#error "Trace Recorder: Please include your processor's header file here and remove this line.",并#include处理器头文件。
将硬件移植配置为Tracealyzer针对Cortex-M提供的实现。其他架构的处理器,如果没有现存的移植,需要用户自行提供一个硬件定时器来产生时间戳。
#define TRC_CFG_HARDWARE_PORT TRC_HARDWARE_PORT_ARM_Cortex_M
将跟踪模式设置为流模式
#define TRC_CFG_RECORDER_MODE TRC_RECORDER_MODE_STREAMING
设置所使用的FreeRTOS的版本,这里使用的是FreeRTOS v10.2.1版本。(打开FreeRTOS.h文件,最上面有版本号)
#define TRC_CFG_FREERTOS_VERSION TRC_FREERTOS_VERSION_10_2_1
在FreeRTOSConfig.h配置文件中使能跟踪功能:
#define configUSE_TRACE_FACILITY 1
还是在FreeRTOSConfig.h下
#include "trcRecorder.h"
在main函数中调用vTraceEnable(TRC_INIT)初始化并使能跟踪,调用的位置须在硬件完成初始化之后,第一个内核对象创建之前。
vTraceEnable(TRC_INIT);
在freestos.c中加入等待软件启动函数,烧写单片机之后,并不执行,当等待软件启动之后,才开始启动。
vTraceEnable(TRC_START_AWAIT_HOST); //等待软件启动
现在编译没有错误了,只有警告,警告是因为Tracealyzer软件中有些包我们没有用,并不影响使用,不用管。
以上移植已经结束了,下面开始接入Tracealyze软件,并分析。
四、Tracealyzer软件使用并分析
红的的是Task1,绿色的是Task2,因为Task1的优先级高于Task2,所以先于Task2执行,而当Task1和Task2发生冲突之后,Task1会打断Task2的执行,下面我进行演示。
修改代码中Task1的延时时间
重新捕获,可以发现,当Task1来临时,会让Task2进入等待状态
以上就实现了STM32+Freertos+Tracelyzer的简单功能,若有错误的地方,请不吝赐教。