目录
前言
此篇文章是关于【STM32CubeIDE】Debug调试中相关于的FreeRTOS方面调试功能的基本教程。因此不适用于STM32的初学者或者不会FreeRTOS开发的。
教程内容包括:RTOS内核感知调试、FreeRTOS任务列表视图、FreeRTOS队列视图、FreeRTOS信号量视图、FreeRTOS定时器视图。
演示的STM32CubeIDE是汉化过的,没汉化的找对应英文就行。
演示版本STM32CubeIDE 1.15.0
【STM32CubeIDE】Debug调试基础的介绍(包含到不限于
工具栏、Debug 窗口介绍)
可看我的上一篇文章:【STM32CubeIDE】Debug调试——SWV
在这就不过多介绍,建议小白还是看一下。
基础配置
STM32CubeMX
在STM32CubeMX部分,要配置外设SYS。找到"Debug"设置将其更改为“Trace Asynchronous Sw”。
将 “TimeBase Source” 从 SysTick
更改为另一个 Timer
。
STM32CubeMX配置RTOS启用跟踪信息,如下图所示。
也可以在freeRTOSConfig.h
中将定义configUSE_TRACE_FACILITY
设置为 1
来启用跟踪信息。
要验证 RTOS 运行时统计信息,应用程序必须设置额外的时基。建议它的运行速度至少比用于处理 RTOS 滴答中断的时钟频率快 10 倍。在本例中选择TIM1,如下图所示。
注意:可以启用任何计时器,但不能选择SysTick和HAL 驱动程序选择的时基源。
为应用程序添加必要的外设、任务、队列、信号量和计时器后,生成代码并转到代码编辑部分。
程序
需要添加一些代码片段来启用所需的运行时统计信息。在“Src”文件夹中的 freertos.c
文件,并将以下行代码添加到代码中。
/* Functions needed when configGENERATE_RUN_TIME_STATS is on */
__weak void configureTimerForRunTimeStats(void)
{
HAL_TIM_Base_Start_IT(&htim1);//这里的定时器修改成上一步配置的定时器
}
extern volatile unsigned long ulHighFrequencyTimerTicks;
__weak unsigned long getRunTimeCounterValue(void)
{
return ulHighFrequencyTimerTicks;
}
如下图所示。
在 stm32f4xx_it.c 文件内使用选定的 IRQ 处理程序来执行,添加 ulHighFrequencyTimerTicks
来创建统计信息。如下图所示。
volatile unsigned long ulHighFrequencyTimerTicks = 0;
ulHighFrequencyTimerTicks++;
使用头文件 #include "queue.h"
调用 vQueueAddToRegistry()
函数,使队列和信号量视图能够显示对象。该函数将一个对象添加到队列注册表中,并采用两个参数。第一个参数是任务的句柄。第二个参数是任务的名称。如下图所示。
启用运行时统计信息的收集,文件 freeRTOSConfig.h
必须包含:
1、将定义configGENERATE_RUN_TIME_STATS
值设置为 1。
2、定义 portCONFIGURE_TIMER_FOR_RUN_TIME_STATS()
以调用配置计时器的函数。计时器用于性能分析,并定义 portGET_RUN_TIME_COUNTER_VALUE()
以调用从性能分析计时器读取当前值的函数。
如下图所示。
/* USER CODE BEGIN 2 */
/* Definitions needed when configGENERATE_RUN_TIME_STATS is on */
#define portCONFIGURE_TIMER_FOR_RUN_TIME_STATS configureTimerForRunTimeStats
#define portGET_RUN_TIME_COUNTER_VALUE getRunTimeCounterValue
/* USER CODE END 2 */
STM32CubeIDE
点击小虫子边上的下三
。
按图片选择。
选择在弹出窗口选择这个调试器,如下图。
进入调试器的设置。
如下图所示启用RTOS Proxy进行基础配置。
功能
在工程里点击这个在这里插入图片描述小虫子之后,就会进入Debug界面。下面教程默认已经进入到了Debug界面。
注意:进入Debug请确保stlink和单片机已正确与电脑相连。
RTOS内核感知调试
启用 RTOS 内核感知(这里的启动配置就是上一章节的STM32CubeIDE的配置)调试并启动调试后,所有线程都会显示在调试视图中。通过在调试视图中选择线程,线程的当前上下文将在各种视图中可视化。例如,变量、寄存器和编辑器视图反映了活动的堆栈帧。如下图所示。
FreeRTOS任务列表视图
打开FreeRTOS任务列表视图,如下图所示。
每种类型的任务参数都有一列,每个任务都有一行。默认情况下,由于性能原因,堆栈分析(“最小可用堆栈”列)处于禁用状态。要启用堆栈分析,请使用 FreeRTOS Task List view 工具栏中的 Toggle Stack Checking 按钮,如下图所示。
运行程序。
暂停程序。
如果调试运行了一段时间并且暂停了,可以看到FreeRTOS Task List窗口的任务信息,如下图所示。
如果项目是在 FreeRTOS.h 文件中定义了configRECORD_STACK_HIGH_ADDRESS
来构建(大约在第 400 行附近),如下图所示。
列信息将从 Min Free Stack 更改为 Stack Usage,如下图2所示。
FreeRTOS队列视图
打开FreeRTOS Queue视图,如下图所示。
FreeRTOS Queue默认视图始终最完整地显示,如下图所示。
FreeRTOS信号量视图
打开FreeRTOS Semaphores视图,如下图所示。
FreeRTOS Semaphores默认视图始终最完整地显示,如下图所示。
FreeRTOS定时器视图
打开FreeRTOS Tiners视图,如下图所示。
FreeRTOS Tiners默认视图始终最完整地显示,如下图所示。
参考资料:
1.STM32CubeIDE-FreeRTOS
2.How to enable FreeRTOS™ Run Time and Stack Usage view