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

系统μC/OS-II在P89V51RD2中的移植 03

系统μC/OS-II在P89V51RD2中的移植 03

μ C/OS-II的启动函数OSStart()调用OSStartHighRdy()来使就绪态任务中 优先级最高的任务开始运行,我们通过将任务模拟栈的有效长度内的数据复制到系统硬件堆栈,然后使用紧接着的两字节来改写X_CP的值。使可重入函数仿真堆栈指针指向该任务模拟栈的最高地址,这样做是因为Keil C51使用的可重入函数仿真堆栈的增长方向是向下的,和系统硬件堆栈的增长方向相反。这样就完成了OSStartHighRdy()的移植。
  OSCtxSw()和OSIntCtxSw()两个汇编函数的功能主要完成任务的切换。不同的是OSCtxSw()在任务级调用,而OSIntCtxSw()是在中断推出时调用。
  对于在P89V51RD2上的移植而言,这两个函数的实现基本相同。只是OSIntCtxSw()在中断调用中 由于OSIntExit()和自身对硬件堆栈的影响,需要将要保存的SP指针向下调整4个字节,以消除影响。μC/OS-II在需要任务切换时,根据CPU是否处在中断状态选择调用其中一个函数。如图2堆栈结构 所示,任务切换时先保存当前任务堆栈内容,方法是:用SP-OSStkStart 得出保存字节数。
  将其写入任务模拟堆栈最低地址内。以任务模拟堆栈最低地址为起址,以OSStkStart为系统硬件堆栈起址,由系统堆栈向用户堆栈拷贝数据。循环SP-OSStkStart次,每次拷贝前先将各自栈指针增1。其次恢复最高优先级任务系统堆栈方法是:获得最高优先级任务用户堆栈最低地址,从中取出长度。以最高优先级任务用户模拟堆栈最低地址为起址,以OSStkStart 为系统堆栈起址,由任务模拟堆栈向系统堆栈拷贝数据。循环“有效长度”数值指示的次数。每次拷贝前先将各自栈指针增1。
  μC/OS-II要求用户提供一个周期性的时钟源,来实现时间的延迟和超时功能。在P89V51RD2中我们通过定时器T0来提供时钟源。频率设为50Hz。T0的初始化函数在OS_CPU_C.C实现。时钟节拍中断服务子程序的编写也很简单,示意性代码如下:
  void OSTickISR(void)
  {
  保存处理器寄存器;
  调用OSIntEnter();
  定时器计数器重装;
  调用OSTimeTick();
  调用OSIntExit();
  恢复处理器寄存器;
  执行中断返回指令;
  }
  μC/OS-II 移植代码的测试
  完成μC/OS-II移植后,就要对移植的代码进行测试。测试移植的μC/OS-II是否能够完成任务调度、时间管理、任务管  
理与同步等功能,是否能够启动多 任务环境。在P89V51RD2的移植中,编写简单的测试程序进行多任务的测试。测试程序创建了4任务,任务AA,BB,CC和LedFlash优先级分别为2,3,4,5。任务AA延时一秒通过串口输出一 次,任务BB延时3秒通过串口输出一次,任务CC延时6秒通过串口输出一次。
  LedFlash等待信号量有效时,对P1.1口进行一次取反操作。P1.1连接LED惊醒观察。定时器中断服务子 程序定时发出信号量。这样任务LedFlash实现LED的闪烁功能。
  μC/OS-II测试程序的文件结构,硬件测试结果和Keil C51的软件仿真结果如图3所示。结果表明μC/OS-II在P89V51RD2上 的移植是成功的。

图3 μC/OS-II的测试程序的文件结构,软件仿真和硬件运行测试结果

  结语
  通过μC/OS-II在P89V51RD2上的移植,掌握了μC/OS-II内核的工作原理和移植方法,测试程序表明移植代码可以稳定可靠的运行,实现了多任务的管理和调度。μC/OS-II实时操作系统的移入,不但可以提高系统的实时性、可靠性和稳定性,还提高了应用软件的可移植性,降低了开发人员的工作量。
返回列表