UCOSIII_多任务创建(一)

2020-02-29  本文已影响0人  飞向深空

UCOSIII是个多任务操作系统,对任务操作有创建、挂起、删除和调度等。

任务状态有:
休眠态:任务函数只是存储区的一段代码,不受UCOS控制
就绪态:任务在就绪表中已经登记,等待获取CPU使用权
运行态:任务正在运行
等待态:正在运行的任务需要等待某一个事件,像信号量、消息、事件标志组等,这时会暂时让出CPU使用权,进入等待状态
中断服务态:一个正在执行的任务被中断打断,CPU转而去执行中断服务程序,这时这个任务会被挂起,进入中断服务态

任务控制块OS_TCB:用来保存任务的信息,它是个结构体
任务堆栈CPU_STK:用来在切换任务和调用其它函数的时候保存现场,CPU_STK大小是4字节

创建一个任务需要定义控制块StartTaskTCB、优先级START_TASK_PRIO、堆栈START_TASK_STK[START_STK_SIZE]。
创建任务前需要初始化UCOSIII——OSInit(&err); err是接收错误时返回的错误码,用OS_ERR定义。
创建任务用OSTaskCreate(...)实现,创建好的任务直接进入就绪态。

   //任务优先级
#define START_TASK_PRIO     3
//任务堆栈大小    
#define START_STK_SIZE      512
//任务控制块
OS_TCB StartTaskTCB;
//任务堆栈  
CPU_STK START_TASK_STK[START_STK_SIZE];
//任务函数
void start_task(void *p_arg);

int main()
{   
    OS_ERR err;
    CPU_SR_ALLOC();

    
    OSInit(&err);       //初始化UCOSIII
    OS_CRITICAL_ENTER();    //进入临界区 
    //创建开始任务
    OSTaskCreate((OS_TCB    * )&StartTaskTCB,       //任务控制块
                 (CPU_CHAR  * )"start task",        //任务名字,自己起的
                 (OS_TASK_PTR )start_task,          //任务函数
                 (void      * )0,                   //传递给任务函数的参数
                 (OS_PRIO     )START_TASK_PRIO,     //任务优先级
                 (CPU_STK   * )&START_TASK_STK[0],  //任务堆栈基地址
                 (CPU_STK_SIZE)START_STK_SIZE/10,   //任务堆栈深度限位
                 (CPU_STK_SIZE)START_STK_SIZE,      //任务堆栈大小
                 (OS_MSG_QTY  )0,                   //任务内部消息队列能够接收的最大消息数目,为0时禁止接收消息
                 (OS_TICK     )0,                   //当使能时间片轮转时的时间片长度,为0时为默认长度,
                 (void      * )0,                   //用户补充的存储区
                 (OS_OPT      )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR, //任务选项
                 (OS_ERR    * )&err);               //存放该函数错误时的返回值 
    OS_CRITICAL_EXIT(); //退出临界区  
    OSStart(&err);  //开启UCOSIII
}
上一篇下一篇

猜你喜欢

热点阅读