首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

用uc/OS-2操作系统实现省电模式

用uc/OS-2操作系统实现省电模式

用uc/OS-2操作系统实现省电模式


   
    嵌入式系统的低功耗设计越来越成为人们关心的焦点。一般的嵌入式MCU都有空闲和掉电两种省电模式,但如何在嵌入式操作系统中实现这两种模式则是开发者面临的一个难题。本文将给出这个问题的一种解决方案,它使用Philips lpc2214 MCU作为处理器构建硬件平台,并在其上运行uc/OS-2实时操作系统,通过合理地设置处理器的相关寄存器和在uc/OS-2上建立相应的任务,来实现MCU的掉电模式。

lpc2214简介

lpc2214是Philips公司的一款嵌入式微控制器(MCU),它采用ARM7TDMI内核,片上资源十分丰富,拥有16K RAM,256K Flash,两个标准串行端口,两个SPI端口,一个I2C端口,内部实时时钟,看门狗,A/D转换,外部存储器接口(最大支持64M)等。这样,只需一片lpc2214,加上少许外围电路,就可以轻松地组成一个嵌入式系统。
 
lpc2214具备两种省电模式:空闲(IDLE)和掉电(POWER-DOWN)。通过配置相应的寄存器,就可以使其进入相应的省电模式。空闲模式时,系统时钟一直有效,处理器,存储器系统和相关控制器及内部总线不再消耗功率,可通过中断使处理器恢复运行;掉电模式时,振荡器关闭,片内外设不再消耗功率,复位或者外部中断可以唤醒掉电模式。典型条件下,MCU的工作电流大概在60mA,而掉电模式下的静态电流只有10uA左右。

uc/OS-2简介

uc/OS-2属实时多任务操作系统,用ANSI C编写,含小部分汇编代码,可通过移植用于不同架构的微处理器。至今,从8位到64位,uc/OS-2已在超过40种不同架构的微处理器上运行,其应用领域广泛。
 
uc/OS-2是可抢占的实时操作系统,即当前正在运行的任务会被后来进入就绪态下的更高优先级的任务所抢占。这项工作是由调度器(scheduler)完成的。每当正在运行的任务结束自己对CPU的占用,或者一个新的任务建立时,调度器都会进行一次新的调度保证当前任务及就绪态任务中的最高优先级任务获得到CPU的使用权。

在操作系统中实现掉电功能
空闲和掉电这两种省电模式的实现方法几乎是相同的,只有寄存器和唤醒方式的不同,故本文只介绍掉电模式的实现。
 

lpc2214中的相关寄存器

    lpc2214中控制MCU进入空闲模式和掉电模式相关的寄存器是:
PCON:功率控制寄存器;
PCONP:外设功率控制寄存器;
    掉电模式的唤醒是通过外部中断实现的,与外部中断相关的寄存器是:
EXTINT:  外部中断标志寄存器;
 EXTWAKE: 外部中断唤醒寄存器;
EXTMODE: 外部中断方式寄存器;
EXTPOLAR:外部中断极性寄存器
lpc2214掉电功能的具体实现

51 c8051f(f020,f040) msp430 arm(2410,2510) fpga(xc3s4000) dsp(5116 dm642) keilc vc++ matlab linux protel Ten_layerPCB mpegx h.26x Rscode Turbocode ofdm VideoBroadcasting ldpc_code(now!)

    在这里通过一个简单的例子说明:系统复位后创建一个任务TaskStart(),它负责初始化与外部中断相关的寄存器,同时在该任务中建立N个用户任务Task1(), Task2(),...TaskN()和1个用于进入掉电模式的任务Task_Powerdown()。 uc/OS-2开始运行后,Task1()至TaskN()模拟N个实际任务的运行,Task_Powerdown()则负责在N个任务都空闲时将处理器切换进掉电模式。当有外部中断时,则在中断服务程序中将处理器唤醒。要说明的是,Task1()至TaskN()的优先级都必须高于Task_Powerdown()的优先级,且N+1不应大于系统最大任务数。主要代码及注释如下: 
int main (void)  //主函数,系统执行入口
{
OSInit(); //初始化uc/OS-2操作系统
OSTaskCreate(TaskStart,(void*)0, &TaskStartStk[TASK_STK_SIZE-1],0);
//建立第一个任务,优先级最高为0
 

OSStart(); //开始运行uc/OS-2             
 

return 0;  //其实永远不会返回
 

 }
 

 

void  TaskStart(void *pdata)  //创建N个用户任务和1个掉电任务
 

{
 

pdata = pdata;
 

OSTaskCreate(Task1,(void*)0,&TaskStk1[TASK_STK_SIZE - 1], 1); //创建任务Task1()
 

OSTaskCreate(Task2,(void*)0,&TaskStk2[TASK_STK_SIZE - 1], 2);//创建任务Task2()
 

         ... ...
 

OSTaskCreate(TaskN,(void*)0,&TaskStkN[TASK_STK_SIZE - 1], N);//创建任务TaskN()
 

OSTaskCreate(Task_Powerdown,(void*)0, &TaskStk[TASK_STK_SIZE - 1], N+1);
 

//创建掉电任务Task_Powerdown()
 

PCONP = 0x0000;//禁止所有片内外设
 

... ... //设置外部中断的相应寄存器
 

for(;;)
 

         {
 

             ... ... 
 

//任务代码,结束后释放CPU的使用权
 

          }
 

 
 

 

void  Task1(void *pdata)  //用户任务1
 

{
 

      pdata = pdata;
 

         for(;;)
 

         {
 

             ... ... //任务代码
 

          }
 

}
 

   
 

void  Task_Powerdown (void *pdata)   //MCU掉电任务,等待外部中断唤醒
 

{
 

     pdata = pdata;
 

        for(;;)
 

        {
 

PCON = 2; //使MCU进入掉电模式
 

... ...  //外部中断唤醒后,CPU交给用户任务
 

         }
 

}
 

 

void __irq IRQ_EINT1(void)  //外部中断的中断处理程序
 

{
 

while((EXTINT & 0x02)!=0)  //清除中断标志
 

{
 

            EXTINT = 0x02;
 

}
 

       VICVectAddr = 0x00; //中断处理结束
 

}
 

   
 

流程图见图1

 

 

图1    掉电模式流程图
 

 

结语
 

本文介绍了在lpc2214微控制器上运行uc/OS-2操作系统实现掉电的方法,简单明了。从中不难看出,这种方法有普遍意义,可以广泛地应用于各种嵌入式系统设计中。 

elQEGTmT.jpg
51 c8051f(f020,f040) msp430 arm(2410,2510) fpga(xc3s4000) dsp(5116 dm642) keilc vc++ matlab linux protel Ten_layerPCB mpegx h.26x Rscode Turbocode ofdm VideoBroadcasting ldpc_code(now!)
返回列表