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