1900|0

2781

帖子

417

TA的资源

五彩晶圆(中级)

楼主
 

UCOS移植到MSP430过程与心得体会《4》 [复制链接]



以下是任务切换过程:

OSCtxSw
             push       sr                     ; emulate interrupt by also saving the SR
             PUSHALL                          ; push all registers              

             mov.w      &OSTCBCur, R13         ; OSTCBCur->OSTCBStkPtr = SP
             mov.w      SP, 0(R13)

             call       #OSTaskSwHook

             mov.b      &OSPrioHighRdy, R13    ; OSPrioCur = OSPrioHighRdy
             mov.b      R13, &OSPrioCur        ;

             mov.w      &OSTCBHighRdy, R13     ; OSTCBCur = OSTCBHighRdy
             mov.w      R13, &OSTCBCur         ;

             mov.w      @R13, SP               ; SP

OSTCBHighRdy->OSTCBStkPtr

             POPALL                           ; pop all registers

             reti         

//如果没有其他任务要运行则挂起当前任务.运行空任务.
//总的意思是: CPU让出10的时间段给别外的程序运行.如果时间到后,原来的任务,

void OS_TaskIdle (void *pdata)
{
#if OS_CRITICAL_METHOD == 3                       /* Allocate storage for CPU status register            */
     OS_CPU_SR cpu_sr;
#endif     


     pdata = pdata;                                /* Prevent compiler warning for not using 'pdata'      */
     for (;;) {
         OS_ENTER_CRITICAL();
         OSIdleCtr++;
         OS_EXIT_CRITICAL();
         OSTaskIdleHook();                         /* Call user definable HOOK                            */
     }
}


如任务Task 与Task1

void task(void *pdata)
{
//pdata = pdata;                      //如果编译器报警,则重新加入此行代码
     WDTCTL = WDT_MDLY_8;                 //设置时钟节拍间隔为32ms
     IE1    |= 0x01;                       //开看门狗定时器中断
     //P4SEL &= BIT0;         

     P4DIR |=0xff;
     //P4OUT=0xff;
while (1)
{      if(FlagLED==true)
         {
           LED=(LED==0x80)?(0x01):(LED<<1);
P4OUT=LED;
           FlagLED=false;
         }
         if(FlagLED==false)
         {
          //P4OUT=0x80;
          FlagLED=true;
         }

        // 将之改成10就成了流水灯.                                                         
         OSTimeDly(100);                  //定时函数括号内的内容为延时的时间,1S=100ms
     }
}
void task1(void *pdata)
{
WDTCTL=WDT_MDLY_8;         //如果

IE1|=0X01;
// P4DIR=0xFF;
while(1)
{     
    if(FlagLED==true)
    {
      LED=(LED==0x80)?(0x01):(LED<<1);
      P4OUT=LED;
      FlagLED=false;
    }
    if(FlagLED==false)
    {
     //P4OUT=0x80;
      P4OUT=~0xaa;
     FlagLED=true;
    }

     OSTimeDly(50);
}
}

任务Task1的优先级4 . Task的优先级为. 5 所以先定位到Task1的入口地址执行. 执行后遇到OSTimeDly() 任务挂起.切换到 Task 任务. 切换过程.如上< void OSTimeDly (INT16U ticks)>所示…如此反复.

从Main函数到任务切换的图如下所示

OSIint()
OSTaskCreate()
OSStartHighRdy()
OSTaskSwHook()
Task1()
OSTimeDly()
OS_Sched()
OSTaskSwHook()
Task()
OSTimeDly()
OS_Sched()
OSCtxSw()
OSTaskSwHook()
OSTaskIdleHook()


对于MSP430_UCOS的问题:

void task(void *pdata)
{
//pdata = pdata;                      //如果编译器报警,则重新加入此行代码
     WDTCTL = WDT_MDLY_32;                 //设置时钟节拍间隔为32ms
     IE1    |= 0x01;                       //开看门狗定时器中断
     P4DIR |=0xff;
while (1)
{      if(FlagLED==true)
         {
           LED=(LED==0x80)?(0x01):(LED<<1);
           P4OUT=LED;
           FlagLED=false;
         }
         if(FlagLED==false)
         {
          FlagLED=true;
         }                    
         OSTimeDly(10);                     
}
}
 
点赞 关注
个人签名

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表