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

μC/OS-II在Cortex-M3系列单片机上的移植 03

μC/OS-II在Cortex-M3系列单片机上的移植 03

实现中断级任务切换。
        因为LM3S单片机目前只支持8位中断优先级中的高3位,所以这里把1左移5位即是00100000B,其宏定义为OS_CRITICAL_INT_PRIOEQU(1<<5)。
        arm CortexM3使用OSPendSV( )函数快捷地进行上下文切换。OSPendSV( )的C语言表述程序如下:
      OSPendSV:关中断;
        if(PSP !=NULL) {
          保存R4~R11到任务堆栈SP_process;
          OSTCBCur>OSTCBStkPtr = SP_process;
        }
        OSTaskSwHook( );
        OSPrioCur = OSPrioHighRdy;
        OSTCBCur = OSTCBHighRdy;
        PSP = OSTCBHighRdy>OSTCBStkPtr;
        从新任务堆栈中恢复R4~R11;
        恢复中断;
        异常返回;
        完成上述工作后,只要再根据目标板的实际情况编写Target目录中的3个文件,μC/OSII就可以运行在LM3S8962单片机上了。
      3  实际应用
        移植工作完成后,编写了一段程序,可以进行CAN通信,按键控制LED灯,通过RS232串口与主机相连实现对SD卡的读写等操作。下面是程序的部分代码:
      staticOS_STKTask_CardStk[TASK_CARD_STK_SIZE]; /*卡操作任务堆栈*/
      staticOS_STKGstkStart[TASK_START_STK_SIZE];/*启动任务的堆栈*/
      static OS_STKGstkLed[TASK_LED_STK_SIZE];/*LED任务的堆栈*/
      static OS_STKGstkKey[TASK_KEY_STK_SIZE];/*按键任务的堆栈*/
      static OS_STKGstkCan[TASK_CAN_STK_SIZE];/*CAN通信任务的堆栈*/
      OS_EVENT *Uart0ReviceMbox;/*串口接收数据邮箱*/
      OS_EVENT *DispSem;/*按键信号量 */
      OS_EVENT *DispSem1;/*CAN接收信号量*/
        在Main.H中定义任务优先级为:
      #defineTASK_START_PRIO0
      #defineTASK_CARD_PRIO1
      #defineTASK_LED_PRIO2
      #defineTASK_KEY_PRIO3
      #defineTASK_CAN_PRIO4
        其中创建任务的任务代码为:
      static void taskStart (void*parg) {
        (void)parg;
        DispSem = OSSemCreate(1);
        DispSem1 = OSSemCreate(0);
        targetInit();/*初始化目标单片机*/
        #if OS_TASK_STAT_EN > 0
        OSStatInit();/*使能统计功能*/
        #endif
        /*在这里创建其他任务*/
        OSTaskCreate (taskLed, (void *)0,&GstkLed[TASK_LED_STK_SIZE  1],
      TASK_LED_PRIO);/*初始化taskLed任务*/
        OSTaskCreate ( Task_Card,/*创建SD卡操作任务*/
          (void *)0,
          &Task_CardStk[TASK_CARD_STK_SIZE  1],
          TASK_CARD_PRIO );
        OSTaskCreate (taskKey, (void *)0,/*创建按键操作任务*/
          &GstkKey[TASK_KEY_STK_SIZE  1],
          TASK_KEY_PRIO);
        OSTaskCreate (taskCan, (void *)0,/*创建CAN操作任务 */
          &GstkCan[TASK_CAN_STK_SIZE  1],
          TASK_CAN_PRIO);
        while (1) {
          OSTaskSuspend(OS_PRIO_SELF);/*启动任务可在这里挂起*/
        }
      }
        SDExample为方便观察SD卡操作任务编写的GUI界面,选好与程序对应的串口波特率,连接好硬件。从图2可以看到,对SD卡可以进行成功操作。
返回列表