本帖最后由 TLLED 于 2018-4-21 09:43 编辑 & j* Q9 w. g5 P& o9 y8 b 低功耗模式实验, T) N8 Z( r4 Q% k" }; \* s, x 对于M4内核,FreeRTOS代码里已经提供tickless低功耗实现的代码。使用时只需要在FreeRTOSConfig.h文件中配置宏定义configUSE_TICKLESS_IDLE为1且系统运行满足以下两个条件时,系统内核会自动的调用低功耗宏定义函数portSUPPRESS_TICKS_AND_SLEEP(): 满足的条件:' W2 \- q! C7 x > 用户任务在挂起或阻塞态,系统当前运行空闲任务。: c6 I' v; y* _4 q3 y) H# { > 根据配置configEXPECTED_IDLE_TIME_BEFORE_SLEEP的大小,只有系统可运行于低功耗模式的 时钟节拍数大于等于这个参数时,系统才能进入低功耗模式。此参数在FreeRTOS.h中定义,定义的内容如下: 也可以在FreeRTOSConfig.h文件中重新定义。 > 在空闲任务中,调用vPortSuppressTicksAndSleep()函数进入低功耗模式。此函数在portmacro.h中被定义:- ?1 ~/ T) q) w+ e; t9 d 函数:vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime );是实现低功耗的具体程序,在port.c中定义。参数:xExpectedIdleTime是系统可以处于低功耗的系统节拍数。; d! W1 g* M& d3 C" X 低功耗实验模型:; g- g$ U# w' h0 O# z, p$ e 程序执行条件: > 程序中创建两个任务:4 E! a8 N& j, e 任务1:vAppTicklessTask() -- 统计系统当前运行的节拍数。 任务2:vAppKeyTask() -- 接收信号量,唤醒任务。 ) n$ o8 x8 h M6 b7 H' M1 G9 u & l' g! D5 K, N* [8 k- V3 E& z& j4 S 程序函数源码: 任务1的函数: 任务2的函数:' A' T6 X* U |) @/ [. h. P 0 B' M2 ]4 A3 k7 ^- m6 M. @" v 程序执行结果: , n! q9 j/ R9 _- S. ` 1、任务1输出tick count: n ,板子上LED1闪烁 2、任务2在按下用户按键后,输出一帧数据,然后任务停止。- h J o: k6 ? 8 q( Y. x! D; K5 s6 c& y( m, U 疑问:- g1 B4 [. H9 s: D! W 程序按照低功耗模式设置好后,两个任务不是应该都进入睡眠模式,按下板子上用户按键后唤醒任务。实现这个程序出现任务1一直在运行。$ d$ F- ]6 X+ D; j1 |' K! z / q6 p5 C0 S* h, C0 |! l8 v7 [1 W& } 3 x5 q$ H; [5 q8 b( }4 { $ l5 q) f& o# C- d2 b 1 } F4 }/ v5 r $ S6 Q6 k: Y* F / q* ~3 |0 Z: _' O, @4 O |
实验4需要的那个软件我的电脑上装不上,正在查找原因。先把实验5做了