|
本帖最后由 TLLED 于 2018-4-21 09:43 编辑 ; i7 ~' w+ i( Q6 E 低功耗模式实验 对于M4内核,FreeRTOS代码里已经提供tickless低功耗实现的代码。使用时只需要在FreeRTOSConfig.h文件中配置宏定义configUSE_TICKLESS_IDLE为1且系统运行满足以下两个条件时,系统内核会自动的调用低功耗宏定义函数portSUPPRESS_TICKS_AND_SLEEP(): 满足的条件: > 用户任务在挂起或阻塞态,系统当前运行空闲任务。4 W! d. z* `1 j* y. r > 根据配置configEXPECTED_IDLE_TIME_BEFORE_SLEEP的大小,只有系统可运行于低功耗模式的 时钟节拍数大于等于这个参数时,系统才能进入低功耗模式。此参数在FreeRTOS.h中定义,定义的内容如下:
也可以在FreeRTOSConfig.h文件中重新定义。 > 在空闲任务中,调用vPortSuppressTicksAndSleep()函数进入低功耗模式。此函数在portmacro.h中被定义:
函数:vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime );是实现低功耗的具体程序,在port.c中定义。参数:xExpectedIdleTime是系统可以处于低功耗的系统节拍数。2 }* c4 |) B3 B1 U" C 低功耗实验模型:
程序执行条件: > 程序中创建两个任务:$ D! S/ ]% {+ _+ L9 o( R4 A! _ 任务1:vAppTicklessTask() -- 统计系统当前运行的节拍数。 任务2:vAppKeyTask() -- 接收信号量,唤醒任务。 # d: p' ~2 ?4 v& _; d( H% P7 k/ x , g- |$ y) z2 c' ^. R8 K$ H 程序函数源码: 任务1的函数:
任务2的函数:9 P. ]" Z6 |- i! ?! O4 m8 v% U! P
程序执行结果: 1、任务1输出tick count: n ,板子上LED1闪烁* n& P, c1 m x' [9 _9 ? 2、任务2在按下用户按键后,输出一帧数据,然后任务停止。% m4 S* @) `( H/ o) Z& k4 H
疑问: 程序按照低功耗模式设置好后,两个任务不是应该都进入睡眠模式,按下板子上用户按键后唤醒任务。实现这个程序出现任务1一直在运行。4 a9 \* F ]/ J* y ' R' I4 ~+ L( u7 p/ } # i& `% ^( L0 M9 C" g6 |# t$ o " K- O D: i/ d( D $ m' b& b" o3 ]. P$ s: e, I7 N |
微信公众号
手机版
实验4需要的那个软件我的电脑上装不上,正在查找原因。先把实验5做了