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

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

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

保存其他寄存器到堆栈
  *(stk) =(INT32U)0x11111111L;//R11
  *(stk) =(INT32U)0x10101010L;//R10
  *(stk) =(INT32U)0x09090909L;//R9
  *(stk) =(INT32U)0x08080808L;//R8
  *(stk) =(INT32U)0x07070707L;//R7
  *(stk) =(INT32U)0x06060606L;//R6
  *(stk) =(INT32U)0x05050505L;//R5
  *(stk) =(INT32U)0x04040404L;//R4
  return(stk);
}
(3) OS_CPU_A.ASM文件
  μC/OSII的移植需要编写5个简单的汇编语言函数。
  ① OS_ENTER _CRITICAL( ): 关闭中断源。
  ② OS_EXIT_CRITICAL( ): 重开中断源。
  ③ OSStartHighRdy( ): 运行当前优先级最高的任务。
  ④ OSCtxSw( ): 一个任务放弃CPU使用权时调用。
  ⑤ OSIntCtxSw(): 在退出中断服务函数OSIntExit( )中被调用,实现中断级任务切换。
  因为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卡操
返回列表