如何在FreeRTOS下实现低功耗——MSP430F5438平台
来源:互联网 发布:阿里云4核8g 编辑:程序博客网 时间:2024/06/05 05:37
0.前言
MCU实现低功耗本质而言便是停止MCU工作,通过中断的方式重新唤醒MCU,这些中断可以包括外部IO中断,UART接收中断,定时器中断等等。如果结合嵌入式操作系统,可以在空任务或者空任务钩子函数中进入低功耗模式,在系统滴答时钟中断服务函数中重新回到正常工作模式。利用操作系统进入和退出低功耗模式,需要熟悉嵌入式操作系统的空任务和系统滴答时钟中断,下面结合MSP430F5438和FreeRTOS总结一下如何使用嵌入式操作系统实现低功耗工作。
1.进入低功耗模式
多数嵌入式操作系统都包含一个空任务,空任务优先级最低且一直保持就绪状态,空任务可以用于统计CPU使用率,或者让MCU进入低功耗状态。如果不想修改空任务,还可以通过空任务的钩子函数插入实现低功耗的代码。在FreeRTOS中,若需要打开空任务钩子函数,需要在FreeRTOSConfig.h中定义configUSE_IDLE_HOOK
#define configUSE_IDLE_HOOK 1
钩子函数中实现低功耗的代码如下
void vApplicationIdleHook( void ){ /* Called on each iteration of the idle task. In this case the idle task just enters a low power mode. */ __bis_SR_register( LPM3_bits + GIE );}
在这里可打开全局中断,若全局中断关闭那么系统可能再也“活”不过来了。
2.退出低功耗模式
在大多数嵌入式操作系统中可以在系统滴答中断函数中退出低功耗模式。由于MSP430的退出低功耗的指令只能在中断中使用,所以一旦进入系统滴答中断函数,可先退出低功耗模式。具体的代码实现如下:
#pragma vector=configTICK_VECTOR__interrupt __raw void vTickISREntry( void ){extern void vPortTickISR( void );__bic_SR_register_on_exit( SCG1 + SCG0 + OSCOFF + CPUOFF );vPortTickISR();}该段代码位于port.c中,在MSP430F5438分支中,系统滴答定时器采用TIMER0_A0所以configTICK_VECTOR被定义为
#define configTICK_VECTORTIMER0_A0_VECTOR
其他相关的定义可以查看FreeRTOSConfig.h文件
3.实现过程
例如某任务在t1时刻调用阻塞API,例如vTaskDelay,此时任务交出CPU使用权由OS进行任务调度。t2时刻,由于没有其他就绪任务,OS运行空任务,在空任务的最后进入空任务钩子函数,在空任务钩子函数中MCU进入低功耗模式,此时可进入LPM3模式。t3时刻MCU进入低功耗模式之后,MCU停止工作。t4时刻,由于系统滴答时钟中断服务函数中,MCU重新处于活跃状态,并且通过指令退出低功耗模式,此时OS任务调度器再次工作,若此时任务再次处于就绪状态便重新运行该任务。
以上便是如何利用OS实现低功耗的基本方法,但是t3时刻和t4时刻是有反复的。例如,系统滴答时钟ISR发生之后,OS任务调度器中并没有就绪的任务,只能再次运行空任务,通过空任务再次进入低功耗模式,如此反复直到某任务就绪便执行任务代码。
通过以上的分析,使用嵌入式操作系统和实现MCU低功耗并不矛盾,反而带来了诸多方便。
- 如何在FreeRTOS下实现低功耗——MSP430F5438平台
- FreeRTOS 8.2.1在MSP430 上的低功耗实现
- 无人机如何在低功耗前提下实现超远距离图传 | 硬创公开课
- FreeRTOS学习8--低功耗tickless
- FreeRTOS低功耗之tickless模式
- FreeRTOS 低功耗之 tickless 模式
- FreeRTOS的Tickless低功耗源码分析
- Zigbee低功耗—终端节点休眠实现
- 在STM32F中使用UCOSII如何支持低功耗模式
- 前后台系统的低功耗编程思想——STM8平台
- 前后台系统的低功耗编程思想——STM8平台
- 嵌入式系统——低功耗设计
- STM32低功耗——转载
- 低功耗无线通信技术——ZigBee
- 如何开发低功耗应用?
- STM8L151G6U6 之实现低功耗
- IC设计基础系列之低功耗篇1:(数字IC)低功耗设计入门(一)——低功耗设计目的与功耗的类型
- 低功耗蓝牙开发技术概述(二)——控制器(下)
- Servlet 生成 验证码
- tca6416 keyboard driver
- 海量数据处理面试题
- UVa 10242 - Fourth Point !!
- Java反射
- 如何在FreeRTOS下实现低功耗——MSP430F5438平台
- Windows PowellShell脚本:定时下载文件
- U盘安装redhat
- 预编译头文件来自编译器的早期版本,或者预编译头为 C++ 而在 C 中使用它(或相反)
- Java基础——异常(Exception)概述
- 让立方体颜色渐变
- 第八周 计算函数值的程序
- 日期是NaN 转化成UTC格式时间
- Oracle中TO_DATE、TO_CHAR格式