FreeRTOS学习:优化系统
怎么精细的调整栈的大小
当开启其他任务时,为什么OLED不亮呢(游戏任务)?
因为游戏任务中的定时器的优先级太低了,并且是一直等待,所以无法运行游戏任务。
这件事说明了,要让定时器/中断的优先级要足够高
如何计算空闲的栈呢?
使用函数进行计算剩余的空间
整个栈都写0xa5a5a5a5
这样,如果被使用,写入的数据就不是0xa5a5a5a5,然后从下遍历,就能知道任务占用多少栈。然后就可以,在创建任务时,分配少量的栈
函数的使用
这样最后就将当前任务的句柄加上剩余空间打印到串口上
然后再根据剩余的空间进行修改栈的大小
打印所有任务的栈信息
使用函数
- vTaskList :获得任务的统计信息,形式为可读的字符串。注意,pcWriteBuffer必须足够大。
使用这个函数,定义个数组存放读取的数据
打印数组就可以了
想要使用这个函数,需要设置
USE_STATS_FORMATTING_FUNCTIONS | 统计格式化函数(支持打印任务状态) | Enabled |
但是为了不影响其他任务,应该在空闲任务中调用此函数
打开钩子函数(空闲任务)
使用
找出并改进大量消耗CPU的任务
使用函数
- vTaskGetRunTimeStats:获得任务的运行信息,形式为可读的字符串。注意,pcWriteBuffer必须足够大。
现象
函数的使用要求
宏定义开启:在FreeRTOSConfig.h文件中,需要将GENERATE_RUN_TIME_STATS宏定义设置为1(或者Enabled,不同版本表述可能有差异) 。这是启用运行时间统计功能的开关,只有开启后,vTaskGetRunTimeStats函数才能正常工作。
时间基准函数设置:还需要定义portGET_RUN_TIME_COUNTER_VALUE()宏,用于获取系统运行时间计数器的值。在基于不同硬件平台和 RTOS 移植时,该宏需要根据实际情况进行正确定义,例如在 STM32 平台上,可能会基于 SysTick 定时器来实现该宏,返回当前的系统滴答数。
GENERATE_RUN_TIME_STATS = Enabled(启用任务运行时间统计 )
使用
MPU6050的当不使用时CPU占用率4%,很高
当不使用时应该为<1%才对 所以得进行修改程序