×
嵌入式 > 嵌入式开发 > 详情

UCOSIII系统初始化和启动

发布时间:2020-05-16 发布时间:
|

1、 UCOSIII系统初始化 


在使用UCOSIII之前我们必须先初始化UCOSIII,即函数OSInit()就是用来完成UCOSIII的初始化,而且OSInit()必须先于其他UCOSIII函数调用,包括OSStart()。


int main(void)

{

OS_ERR err;

CPU_SR_ALLOC();

 

/*外设初始化函数*/

 

delay_init(168);     //时钟初始化

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//中断分组配置

uart_init(115200);     //串口初始化

LED_Init();               //LED初始化

 

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

while(1);

}

从代码中我们可以看出,首先是OSInit()初始化UCOSIII,然后在main()函数中只创建一个start_task()任务,其他任务都在start_task任务中创建,再调用OSTaskCreate()函数创建任务时一定要调用OS_CRITICAL_ENTER()进入临界区,创建完成后调用OS_CRITICAL_EXIT()退出临界区,最后调用OSStart()开启UCOSIII。


注意:


OSStart()函数如下:


void  OSStart (OS_ERR  *p_err)

{

    if (OSRunning == OS_STATE_OS_STOPPED)

{

        OSPrioHighRdy   = OS_PrioGetHighest(); 

        OSPrioCur       = OSPrioHighRdy;

        OSTCBHighRdyPtr = OSRdyList[OSPrioHighRdy].HeadPtr;

        OSTCBCurPtr     = OSTCBHighRdyPtr;

        OSRunning       = OS_STATE_OS_RUNNING;

        OSStartHighRdy(); 

        *p_err           = OS_ERR_FATAL_RETURN; 

     }

 else 

       *p_err           = OS_ERR_OS_RUNNING; 

}


『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
发明专利在疫情影响下的逆势增长