本帖最后由 TLLED 于 2018-4-21 09:43 编辑 低功耗模式实验2 i, t6 |% @) G 对于M4内核,FreeRTOS代码里已经提供tickless低功耗实现的代码。使用时只需要在FreeRTOSConfig.h文件中配置宏定义configUSE_TICKLESS_IDLE为1且系统运行满足以下两个条件时,系统内核会自动的调用低功耗宏定义函数portSUPPRESS_TICKS_AND_SLEEP(): 满足的条件: > 用户任务在挂起或阻塞态,系统当前运行空闲任务。 > 根据配置configEXPECTED_IDLE_TIME_BEFORE_SLEEP的大小,只有系统可运行于低功耗模式的 时钟节拍数大于等于这个参数时,系统才能进入低功耗模式。此参数在FreeRTOS.h中定义,定义的内容如下: 也可以在FreeRTOSConfig.h文件中重新定义。 > 在空闲任务中,调用vPortSuppressTicksAndSleep()函数进入低功耗模式。此函数在portmacro.h中被定义: 函数:vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime );是实现低功耗的具体程序,在port.c中定义。参数:xExpectedIdleTime是系统可以处于低功耗的系统节拍数。; D' O1 ~" @5 ?8 X1 H( J 低功耗实验模型: 程序执行条件: > 程序中创建两个任务: 任务1:vAppTicklessTask() -- 统计系统当前运行的节拍数。# V2 a% s( c, Y* M' I2 { r5 _ 任务2:vAppKeyTask() -- 接收信号量,唤醒任务。 6 V3 m5 Y; r1 ?2 Z- w6 X 程序函数源码:+ x% n( @6 j3 i" f6 [ 任务1的函数:& |7 R1 K6 ^, L5 u: Q. u j. W6 H# _ 任务2的函数:, ~8 G7 |+ i$ c3 z 程序执行结果: 1、任务1输出tick count: n ,板子上LED1闪烁 2、任务2在按下用户按键后,输出一帧数据,然后任务停止。 : F' v( }1 \- C8 ^ 疑问: 程序按照低功耗模式设置好后,两个任务不是应该都进入睡眠模式,按下板子上用户按键后唤醒任务。实现这个程序出现任务1一直在运行。6 V4 z$ z2 ^3 z% s6 v 4 ^6 q9 F5 i2 H. N0 @- |% I" Z 0 N/ K7 T+ F% I$ C6 U& p, @. ^ 7 b9 P& Q# ^# K2 q# i# f4 n2 ~( j & q0 d- I9 i6 ~/ d 0 S! w0 Z( ` t5 V% k |
实验4需要的那个软件我的电脑上装不上,正在查找原因。先把实验5做了