本帖最后由 TLLED 于 2018-4-21 09:43 编辑 : P. c& A9 F+ x& k* @: s 低功耗模式实验& q* [; G- p* j7 ?4 B; x8 s 对于M4内核,FreeRTOS代码里已经提供tickless低功耗实现的代码。使用时只需要在FreeRTOSConfig.h文件中配置宏定义configUSE_TICKLESS_IDLE为1且系统运行满足以下两个条件时,系统内核会自动的调用低功耗宏定义函数portSUPPRESS_TICKS_AND_SLEEP(): 满足的条件: > 用户任务在挂起或阻塞态,系统当前运行空闲任务。 > 根据配置configEXPECTED_IDLE_TIME_BEFORE_SLEEP的大小,只有系统可运行于低功耗模式的 时钟节拍数大于等于这个参数时,系统才能进入低功耗模式。此参数在FreeRTOS.h中定义,定义的内容如下:7 Y/ k( w% F5 [3 X 也可以在FreeRTOSConfig.h文件中重新定义。/ F, X; n/ u6 I* y8 } > 在空闲任务中,调用vPortSuppressTicksAndSleep()函数进入低功耗模式。此函数在portmacro.h中被定义: 函数:vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime );是实现低功耗的具体程序,在port.c中定义。参数:xExpectedIdleTime是系统可以处于低功耗的系统节拍数。$ g7 G8 ^# o& C( s M 低功耗实验模型:. Z8 A+ q: t3 D; l3 l& ^& M 程序执行条件: > 程序中创建两个任务: 任务1:vAppTicklessTask() -- 统计系统当前运行的节拍数。: Y: q! t& U/ Y& `5 i ? 任务2:vAppKeyTask() -- 接收信号量,唤醒任务。 $ Z$ A. K! @& t; L$ @/ j % I3 j" U" D: Z9 |6 T 程序函数源码:' U6 H0 ^ g! K2 G- T! O: H 任务1的函数: 任务2的函数: # a+ `8 q; r/ q& x, ^# u: k2 ?8 g- J 程序执行结果: 1、任务1输出tick count: n ,板子上LED1闪烁" `) }8 c% U9 d. {" S' } 2、任务2在按下用户按键后,输出一帧数据,然后任务停止。 0 H1 P* n( ]" t9 x8 |6 x 疑问: 程序按照低功耗模式设置好后,两个任务不是应该都进入睡眠模式,按下板子上用户按键后唤醒任务。实现这个程序出现任务1一直在运行。 ! c4 @8 {5 {2 s7 q7 l 5 L% o( F; }4 d" r7 X8 j 2 N: }# [4 x4 |1 U( h# ? $ f/ h, [* n4 A0 I 0 ]1 v; I9 q; Q4 E& l+ B( \ |
实验4需要的那个软件我的电脑上装不上,正在查找原因。先把实验5做了