## 嵌入式操作系统中任务的相关操作(以uC/ OSiii为例)

1、任务的创建

void  OSTaskCreate (OS_TCB        *p_tcb,             //任务控制块 
CPU_CHAR    *p_name,         //名称 
OS_TASK_PTR     p_task,            //任务函数
void          *p_arg,             //传递参数
OS_PRIO           prio,                 //优先级 
 CPU_STK         *p_stk_base,   //栈基地址
 CPU_STK_SIZE      stk_limit,         //栈限,防止溢出
CPU_STK_SIZE      stk_size,         //栈大小 
 OS_MSG_QTY       q_size,            //内建消息大小 
 OS_TICK          time_quanta,  //时间片长度,默认10 ticks
 void          *p_ext,            //扩展tcb地址 
 OS_OPT          opt,                //任务可选项 
 OS_ERR        *p_err)             //保存错误标志

2、任务的删除

如果我们不想使用某个任务了就可将其删除,删除任务使用函数OSTaskDel(),函数 原型如下:
**void OSTaskDel (OS_TCB p_tcb,
OS_ERR p_err)

  1. 删除某个任务以后,它占用的OS_TCB和堆栈就可以再次利用来创建其他的任务。
  2. 尽管uC/OS III允许在系统运行中删除任务,但是应该尽量避免这种操作,如果这 个任务可能占有与其他任务共享的资源,在删除此任务之前这个被占有的资源没 有被释放就有可能导致奇怪的结果。

3、任务的挂起

当我们想暂停某个任务,但是又不想删除掉这个任务的时候就可以使用函数 OSTaskSuspend()来将这个任务挂起,函数原型如下:
void OSTaskSuspend ( OS_TCB *p_tcb,OS_ERR *p_err)

4、任务的恢复

当我们想要恢复某个被挂起的任务的时候可以调用函数OSTaskResume(), 函数原型如下:
void OSTaskResume (OS_TCB *p_tcb,OS_ERR *p_err)

5、任务的调度

uC/OS III中的任务调度是由任务调度器来自动完成的,任务调度器有2种: 任务级调度器和中断级调度器。
• 任务级调度器为函数OSSched()。(常在OSTimeDlyHMSM和OSTimeDly等函 数中调用)
• 中断级调度器为函数OSIntExit(),当退出外部中断服务函数的时候使用中断级任 务调度。(比如串口通信中的中断、嘀嗒定时器中断)

6、任务的调度点

  1. 释放信号量或者发送消息,也可通过配置相应的参数不发生任务调度。
  2. 使用延时函数OSTimeDly()或者OSTimeDlyHMSM()。
  3. 任务等待的事情还没发生(等待信号量,消息队列等)。
  4. 任务取消等待。
  5. 创建任务。
  6. 删除任务。
  7. 删除一个内核对象。
  8. 任务改变自身的优先级或者其他任务的优先级。
  9. 任务通过调用OSTaskSuspend()将自身挂起。
  10. 任务解挂某个挂起的任务
  11. 退出所有的嵌套中断。
  12. 通过OSSchedUnlock()给调度器解锁。
  13. 任务调用OSSchedRoundRobinYield()放弃其执行时间片。
  14. 用户调用OSSched()。

猜你喜欢

转载自blog.csdn.net/qq_46523260/article/details/106801127