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