5、UCOSIII系统初始化和启动

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; 
}

 

你可能感兴趣的:(UCOSIII)