@[toc]
空闲线程的运行时间分析
原因
- 开启TICKLESS模式后,在
PreSleepProcessing
和PostSleepProcessing
中打印ulExpectedIdleTime
变量,即空闲时间.输出如下
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-56thy2v3-1684831702598)(TICKLESS.assets/image-20230523161450180.png)]
- 代码如下
1 | void PreSleepProcessing(uint32_t *ulExpectedIdleTime) |
分析
- 为什么是349tick进入一次空闲线程?
- 分析
FREERTOS
源码,在portTASK_FUNCTION
函数中调用接口,写入空闲时间值 - 在赋值后打印变量
1 | if( xExpectedIdleTime >= configEXPECTED_IDLE_TIME_BEFORE_SLEEP ) |
输出如下
1 | xExpectedIdleTime = FFFF FD23 |
空闲执行时间没问题,传入函数后有问题.
进入
vPortSuppressTicksAndSleep
分析,找到如下代码
1 | /* Make sure the SysTick reload value does not overflow the counter. */ |
查找变量xMaximumPossibleSuppressedTicks
赋值
1 | /* The systick is a 24-bit counter. */ |
结论
- 当线程全部阻塞时,空闲线程时间实际为预计的解除阻塞时间 - 当前运行时间.
- 但是在进入TICKLESS后,为了确保 SysTick 重载值不会溢出计数器.所以限制了TICKLESS的低功耗休眠时间.
- 所以进入TICKLESS的最大时间为0XFFFFFF / (系统时钟 / 调度频率),在本机中为349.
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 wdfk-prog的个人博客!
评论