热度 28
2012-12-6 11:39
1211 次阅读|
0 个评论
建立任务 /***************************************************************************************** 125 * 建立一个新任务 (CREATE A TASK) 127 * 描述 : 建立一个新任务。任务的建立可以在多任务环境启动之前 , 也可以在正在运行的任务中建立 . 中断处理程序中不能建立任务 . 一个任务必须为无限循环结构 ( 如下所示 ), 且不能有返回点。 129 * OSTaskCreate() 是为与先前的μ C/OS 版本保持兼容 , 新增的特性在 OSTaskCreateExt() 函数中 . 130 * 无论用户程序中是否产生中断 , 在初始化任务堆栈时 , 堆栈的结构必须与 CPU 中断后寄存器入栈的顺序结构相同 . 详细说明请参考所用处理器的手册。 133 * 参数 : task 是指向任务代码的指针。 135 * pdata 指向一个数据结构,该结构用来在建立任务时向任务传递参数。下例中说明 uC/OS 中的任务结构以及如何传递参数 pdata : 137 * void Task (void *pdata) 138 * { 139 * ... // 对参数 'pdata' 进行操作 140 * for (;;) { // 任务函数体 . 143 * // 在任务体中必须调用如下函数之一 : 144 * // OSMboxPend() 用于任务等待消息,消息通过中断或另外的任务发送给需要的任务 145 * // OSF1gPend() 用于任务等待事件标志中的事件标志 146 * // OSMutexPend() 任务需要独占资源 147 * // OSQPend() 用于任务等待消息 148 * // OSSemPend() 用于任务试图取得共享资源的使用权,任务需要与其它任务或中断 149 * 同步及任务需要等待特定事件的发生场合 150 * // OSTimeDly() 任务延时若干时钟节拍 151 * // OSTimeDlyHMSM() 任务延时若干时间 152 * // OSTaskSuspend() 挂起任务本身 153 * // OSTaskDel() 删除任务本身 154 * ... 156 * } 157 * ptos 为指向任务堆栈栈顶的指针。任务堆栈用来保存局部变量 , 函数参数 , 返回地址以及任务被中断时的 CPU 寄存器内容 . 任务堆栈的大小决定于任务的需要及预计的中断嵌套层数。计算堆栈的大小 , 需要知道任务的局部变量所占的空间 , 可能产生嵌套调用的函数,及中断嵌套所需空间。如果初始化常量 OS_STK_GROWTH 设为 1, 堆栈被设为从内存高地址向低地址增长,此时 ptos 应该指向任务堆栈空间的最高地址。反之 , 如果 OS_STK_GROWTH 设为 0, 堆栈将从内存的低地址向高地址增长。 164 * prio 为任务的优先级。每个任务必须有一个唯一的优先级作为标识。数字越小,优先级越高。 166 * 返回 : OS_NO_ERR 函数调用成功 ; 167 * OS_PRIO_EXIT 具有该优先级的任务已经存在 ; 168 * OS_PRIO_INVALID 参数指定的优先级大于 OS_LOWEST_PRIO; (i.e. = OS_LOWEST_PRIO) 169 * OS_NO_MORE_TCB 系统中没有 OS_TCB 可以分配给任务了。 170 * 171 * 注意 : 1 、任务堆栈必须声明为 OS_STK 类型。 172 * 2 、在任务中必须调用 uC/OS 提供的下述过程之一:延时等待、任务挂起、等待事件发生(等待信 173 * 号量,消息邮箱、消息队列),以使其他任务得到 CPU 。 174 * 3 、用户程序中不能使用优先级 0 , 1 , 2 , 3 ,以及 OS_LOWEST_PRIO-3,OS_LOWEST_PRIO-2, OS_LOWEST_PRIO-1, OS_LOWEST_PRIO 。这些优先级μ C/OS 系统保留,其余的 56 个优先级提供给应用程序。 177 ***********************************************************************************/ 181 INT8U OSTaskCreate ( void (*task)( void *pd), void *pdata, OS_STK *ptos, INT8U prio) OSTaskCreate (Task0,(void *)0, Task0Stk , 10); 交流QQ群:74204669