社区导航

 
快捷导航
  • 首页
  • 论坛
  • 查看新帖
  • 最新回复
  • 社区活动
  • 联系管理员
  • 消灭零回复
  • E金币兑换
  • 干货
搜索
查看: 874|回复: 0

[资料分享] UCOS移植到MSP430过程与心得体会《4》

[复制链接]

3360

TA的帖子

421

TA的资源

五彩晶圆(中级)

Rank: 8Rank: 8

荣誉会员勋章

发表于 2013-11-29 19:32:00 | 显示全部楼层 |阅读模式


以下是任务切换过程:

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);                     
}
}
此帖出自MSP430论坛


回复

使用道具 举报

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

本版积分规则

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

小黑屋|手机版|Archiver|电子工程世界 ( 京ICP证 060456

GMT+8, 2018-6-24 00:20 , Processed in 0.060466 second(s), 12 queries , Gzip On, Redis On.

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