您的位置:首页 > 运维架构 > 网站架构

【专题】uC/OS-II内核架构解析(7)---uC/OS-II应用开发

2010-05-11 15:54 288 查看

1. 应用开发步骤

(1) 包含uC/OS-II的总头文件includes.h;

(2) 定义任务栈的大小和任务栈;

(3) 分配任务优先级;

(4) 实现任务功能;

(5) 调用OSInit()函数初始化uC/OS-II的数据结构;

(6) 创建用户任务,启动uC/OS-II;

2. 编写任务函数

用户任务函数必须是无限循环,程序执行流由OS内核改变。在执行完用户代码后最好调用系统服务,主动把CPU使用权让给有需要的任务。

模式一:

void YourTask(void *pdata)

{

  for(;;)

    {

      /*用户代码*/

      调用uC/OS II的服务;

      OSMboxPend();

      OSQPend();

      OSSemPend();

      OSTimeDlyHMSM();

      /*用户代码*/

    }

 }

模式二(自删除任务)

  void YourTask(void *pdata)

  {

    /*用户代码*/

    OSTaskDel(OS_PRIO_SELF);

  } //这种任务运行完后就自我删除了。

3. 堆栈设计扩展

方法:中断堆栈和任务堆栈分开设计

原因:uC/OS-II占用RAM主要用于任务TCB、任务堆栈等方面,任务堆栈大是由于硬件设计中没有把中断堆栈和任务堆栈分开,造成了考虑任务堆栈大小时,不仅要计算任务中局部变量和函数嵌套层数,还要考虑中断的最大嵌套层数,导致大量RAM被浪费。可以把中断堆栈和任务堆栈分开设计,这样计算任务堆栈时,就不需要把中断处理(包括中断嵌套)中的内存占用计算到任务堆栈中,只需计算每个任务本身需要的内存大小即可。

4. 一些借鉴经验

(1) 编写中断程序时,有条件的情况下尽量使用汇编语言,这样可以避免一些编译器自身的操作,减少指针调整次数。

(2) 用C编写ISR时,有时要调用汇编函数,其中一些压栈的PC可能破坏堆栈结构,这就要调整堆栈,保证正确的格式。

(3)由于uC/OS-II中断处理原始设计中可能不调整SP,需要在调用OSIntExit()返回后,判断程序是否处于中断嵌套状态。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: