【RTOS】快速体验FreeRTOS所有常用API(11)打印空闲栈、CPU占用比

快速体验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占用比

img

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);

实例:

img

img

11.2 打印所有任务栈信息

要打印所有任务的栈信息,你可以使用FreeRTOS的任务列表查询函数 vTaskList

// 定义一个缓冲区,用于存储任务列表信息
char g_taskListBuffer[1024];

// 获取任务列表信息
vTaskList(g_taskListBuffer);

// 打印任务列表
printf("Task List:\n%s", g_taskListBuffer);

需要在stm32cubemx中使能use_stats_formatting_functions参数。

img

实例:

img

img

每列的具体含义

  • 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参数。

img

2 该函数需要用到getRunTimeCounterValue()函数来获取系统时间,但cubemx并未实例化这个函数。需要自己实现。

cubemx生成的

img

需要自己实现

img

实例

img

img

11.4 空闲任务和钩子函数

FreeRTOS 中的空闲任务是一个特殊的任务,优先级为0。

通常用于在系统没有其他任务执行时执行一些低优先级的任务。这个任务的名称通常是 “Idle”。

此外,FreeRTOS 还提供了与空闲任务关联的钩子函数,空闲任务的循环每执行一次,就会调用一次钩子函数vApplicationIdleHook()

钩子函数****的作用

  • 测量系统的空闲时间:空闲任务能被执行就意味着所有的高优先级任务都停止了,所以测量空闲任务占据的时间,就可以算出处理器占用率。
  • 让系统进入省电模式:空闲任务能被执行就意味着没有重要的事情要做,当然可以进入省电模式了。
  • 使用vTaskDelete()删除的任务,由钩子函数来释放内存。

因此,我们改用空闲任务提供的钩子函数,来显示之前的调试信息,是比较合理的。

首先,需要在stm32cubemx中使能use_idle_hook参数。

img

将调试代码,移到钩子函数

img

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值