搜索
bottom↓
回复: 9

如何在freertos下实现低功耗——MSP430F5438平台

[复制链接]
(260843281)

出0入0汤圆

发表于 2013-10-15 16:29:27 | 显示全部楼层 |阅读模式
0.前言
    MCU实现低功耗本质而言便是停止MCU工作,通过中断的方式重新唤醒MCU,这些中断可以包括外部IO中断,UART接收中断,定时器中断等等。如果结合嵌入式操作系统,可以在空任务或者空任务钩子函数中进入低功耗模式,在系统滴答时钟中断服务函数中重新回到正常工作模式。利用操作系统进入和退出低功耗模式,需要熟悉嵌入式操作系统的空任务和系统滴答时钟中断,下面结合MSP430F5438和FreeRTOS总结一下如何使用嵌入式操作系统实现低功耗工作。
1.进入低功耗模式
    多数嵌入式操作系统都包含一个空任务,空任务优先级最低且一直保持就绪状态,空任务可以用于统计CPU使用率,或者让MCU进入低功耗状态。如果不想修改空任务,还可以通过空任务的钩子函数插入实现低功耗的代码。在FreeRTOS中,若需要打开空任务钩子函数,需要在FreeRTOSConfig.h中定义configUSE_IDLE_HOOK
#define configUSE_IDLE_HOOK        1
那么在钩子函数中实现低功耗的代码如下
  1. void vApplicationIdleHook( void )
  2. {
  3.   /* Called on each iteration of the idle task.  In this case the idle task
  4.     just enters a low power mode. */
  5.   __bis_SR_register( LPM3_bits + GIE );
  6. }
复制代码
在这里可打开全局中断,若全局中断关闭那么系统可能再也“活”不过来了。
2.退出低功耗模式
    在大多数嵌入式操作系统中可以在系统滴答中断函数中退出低功耗模式。由于MSP430的退出低功耗的指令只能在中断中使用,所以一旦进入系统滴答中断函数,可先退出低功耗模式。具体的代码实现如下:
  1. #pragma vector=configTICK_VECTOR
  2. __interrupt __raw void vTickISREntry( void )
  3. {
  4. extern void vPortTickISR( void );

  5.         __bic_SR_register_on_exit( SCG1 + SCG0 + OSCOFF + CPUOFF );
  6.         vPortTickISR();
  7. }
复制代码
该段代码位于port.c中,在MSP430F5438分支中,系统滴答定时器采用TIMER0_A0所以configTICK_VECTOR被定义为
    #define configTICK_VECTOR                                TIMER0_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低功耗并不矛盾,反而带来了诸多方便。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
(260778102)

出0入0汤圆

发表于 2013-10-16 10:35:46 | 显示全部楼层
呵呵,我坐上沙发了,楼主你的那个modbus tcp 加 ucos的能否给我们讲讲啊
(260768401)

出0入0汤圆

 楼主| 发表于 2013-10-16 13:17:27 | 显示全部楼层
qwert1213131 发表于 2013-10-16 10:35
呵呵,我坐上沙发了,楼主你的那个modbus tcp 加 ucos的能否给我们讲讲啊

modbus + uIP没有操作系统的是有的!但是一直没有整理好!
(260762379)

出0入0汤圆

发表于 2013-10-16 14:57:49 | 显示全部楼层
xukai871105 发表于 2013-10-16 13:17
modbus + uIP没有操作系统的是有的!但是一直没有整理好!

楼主加油哈
(260762337)

出0入0汤圆

发表于 2013-10-16 14:58:31 | 显示全部楼层
xukai871105 发表于 2013-10-16 13:17
modbus + uIP没有操作系统的是有的!但是一直没有整理好!

我还在研读你以前写的帖子,相当不错
(199660516)

出0入10汤圆

发表于 2015-9-23 19:42:12 | 显示全部楼层
多谢楼主!
(199436830)

出0入0汤圆

发表于 2015-9-26 09:50:18 | 显示全部楼层
思路非常好
(199171814)

出0入0汤圆

发表于 2015-9-29 11:27:14 | 显示全部楼层
你好!想问问这个FREERTOS在处理普通的中断的时候,比如外部中断的时候   是不是也像UCOSII那样 OS_ENTER_CRITICAL()!
(196414325)

出0入0汤圆

发表于 2015-10-31 09:25:23 | 显示全部楼层
多谢楼主!
(193686699)

出0入0汤圆

发表于 2015-12-1 23:05:49 来自手机 | 显示全部楼层
期待后续
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子论坛 ( 公安交互式论坛备案:44190002001997 粤ICP备09047143号 )

GMT+8, 2022-1-20 16:57

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表