快速体验FreeRTOS所有常用API(1)工程创建
快速体验FreeRTOS所有常用API(2)任务管理
快速体验FreeRTOS所有常用API(3)同步与互斥
快速体验FreeRTOS所有常用API(4)队列
快速体验FreeRTOS所有常用API(5)信号量、互斥量
快速体验FreeRTOS所有常用API(6)事件组
快速体验FreeRTOS所有常用API(7)任务通知
快速体验FreeRTOS所有常用API(8)软件定时器
快速体验FreeRTOS所有常用API(9)中断管理
快速体验FreeRTOS所有常用API(10)资源管理
快速体验FreeRTOS所有常用API(11)打印空闲栈、CPU占用比
十一、调试
该部分在上份代码基础上修改得来,代码下载链接:
https://wwzr.lanzout.com/in63o1lauwwh
密码:9bhf
该代码尽量做到最简,不添加多余的、不规范的代码。
内容主要包括:
- 打印任务空闲栈
- 打印所有任务栈信息
- 打印CPU占用比
最终实现效果:
- 使用串口打印出:当前任务空闲栈、所有任务栈信息、CPU占用比
11.1 打印任务空闲栈
在FreeRTOS中,要打印任务的空闲栈(空余空间),可以使用任务状态查询函数 uxTaskGetStackHighWaterMark
。这个函数返回任务栈的最小可用空间(以字为单位,32位系统中,1字=4字节=32位)
示例:
UBaseType_t freeStack;
// 获取任务空闲栈
freeStack= uxTaskGetStackHighWaterMark(NULL);
// 打印任务空闲栈 (以字为单位)
printf("Task %s free stack: %u words\n", pcTaskGetName(NULL), freeStack);
实例:
11.2 打印所有任务栈信息
要打印所有任务的栈信息,你可以使用FreeRTOS的任务列表查询函数 vTaskList
。
// 定义一个缓冲区,用于存储任务列表信息
char g_taskListBuffer[1024];
// 获取任务列表信息
vTaskList(g_taskListBuffer);
// 打印任务列表
printf("Task List:\n%s", g_taskListBuffer);
需要在stm32cubemx中使能use_stats_formatting_functions
参数。
实例:
每列的具体含义:
- Task: 任务的名称。
- State: 任务的状态。包括 “R”(运行)、“B”(阻塞)、“D”(删除)等。X表示使用该函数的任务。
- Priority: 任务的优先级。
- Stack: 任务的空闲栈。
- Num: 任务的编号。
11.3 CPU占用比
vTaskGetRunTimeStats
是一个 FreeRTOS 函数,用于获取系统中每个任务的运行时间统计信息。这个函数允许你了解每个任务在系统中的运行时间百分比,以及每个任务实际运行的时钟滴答数。
示例:
// 定义一个缓冲区,用于存储CPU占用比信息
char g_taskListBuffer[1024];
// 获取运行时间统计信息
vTaskGetRunTimeStats(g_taskListBuffer);
// 打印运行时间统计信息
printf("Run Time Stats:\n%s\n", g_taskListBuffer);
1 需要在stm32cubemx中使能generate_run_time_stats
参数。
2 该函数需要用到getRunTimeCounterValue()
函数来获取系统时间,但cubemx并未实例化这个函数。需要自己实现。
cubemx生成的:
需要自己实现:
实例:
11.4 空闲任务和钩子函数
FreeRTOS 中的空闲任务是一个特殊的任务,优先级为0。
通常用于在系统没有其他任务执行时执行一些低优先级的任务。这个任务的名称通常是 “Idle”。
此外,FreeRTOS 还提供了与空闲任务关联的钩子函数,空闲任务的循环每执行一次,就会调用一次钩子函数vApplicationIdleHook()
。
钩子函数****的作用:
- 测量系统的空闲时间:空闲任务能被执行就意味着所有的高优先级任务都停止了,所以测量空闲任务占据的时间,就可以算出处理器占用率。
- 让系统进入省电模式:空闲任务能被执行就意味着没有重要的事情要做,当然可以进入省电模式了。
- 使用vTaskDelete()删除的任务,由钩子函数来释放内存。
因此,我们改用空闲任务提供的钩子函数,来显示之前的调试信息,是比较合理的。
首先,需要在stm32cubemx中使能use_idle_hook
参数。
将调试代码,移到钩子函数中