美文网首页
UCOSIII_多任务创建(一)

UCOSIII_多任务创建(一)

作者: 飞向深空 | 来源:发表于2020-02-29 12:01 被阅读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
    }
    
    • 任务堆栈深度限位是指堆栈剩余量,当剩余量小于或等于该值表明堆栈快要用完,用来检测个确保堆栈不溢出
    • 没有参数传入函数传递给任务函数的参数就是0
    • 优先级数值越低,优先级越高,但不能使用系统任务的优先级()
    • 时间片长度在时间片轮转调度时使用,运行几个时间片就填几
    • OPT选项:
      OS_OPT_TASK_STK_CHK:检测任务堆栈
      OS_OPT_TASK_STK_CLR:清除任务堆栈
      OS_OPT_TASK_NONE:无选项
    • 最后要OSStart(&err); //开启UCOSIII
    • 进出临界区函数范围内的程序不会被打断
    • CPU_SR_ALLOC();是个宏定义了一个变量os_cpu_sr是用来存 cpu 状态寄存器用的,用到临界区这个宏必须声明

    相关文章

      网友评论

          本文标题:UCOSIII_多任务创建(一)

          本文链接:https://www.haomeiwen.com/subject/ajeuhhtx.html