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

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()返回后,判断程序是否处于中断嵌套状态。 

你可能感兴趣的:(uC/OS-II内核架构解析(7)---uC/OS-II应用开发)