ucosiii属于可剥夺型内核,CPU总是运行多个任务中优先级最高的那个任务。当CPU正运行某个低优先级任务时,若有高优先级任务准备就绪,该高级别任务会将CPU使用权占为己有。
1.系统初始化及任务概念·
从存储上讲,一个任务包括任务控制块(记录任务的各个属性),任务堆栈(保存任务的工作环境)和任务程序代码(执行函数)。
任务状态包括:睡眠(没有任务控制块),就绪(有任务控制块但没有CPU控制权),运行(正在使用CPU),等待(有CPU控制权但因为需要等待某个信号而暂时交出CPU控制权),中断服务(有CPU控制权但因为中断而交出)。
2.系统初始化OS_Init(&err)·
系统初始化·函数OS_Init(&err)会初始化堆栈,清除中断计数,任务管理等,并依次创建空闲任务(优先级很低),时钟任务(优先级较高),统计任务,定时模块。
任务堆栈:后进先出(LIFO),cpu.h中定义了 任务堆栈和栈深的数据类型( typedef CPU_INT32U CPU_STK; typedef CPU_ADDR CPU_STK_SIZE; typedef CPU_INT32U CPU_ADDR; )。
任务堆栈初始化:OS_Init(&err)在创建空闲任务时会调用 OS_IdleTaskInit(p_err); 进行初始化(os_core.c中)。
void OS_IdleTaskInit (OS_ERR *p_err)
{
#if (OS_CFG_DBG_EN == DEF_ENABLED)
OSIdleTaskCtr = 0u;
#endif /* --------------- CREATE THE IDLE TASK --------------- */
OSTaskCreate(&OSIdleTaskTCB,
(CPU_CHAR *)"uC/OS-III Idle Task",
OS_IdleTask,
DEF_NULL,
(OS_PRIO)(OS_CFG_PRIO_MAX - 1u),
OSCfg_IdleTaskStkBasePtr,
OSCfg_IdleTaskStkLimit,
OSCfg_IdleTaskStkSize,
0u,
0u,
DEF_NULL,
(OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR | OS_OPT_TASK_NO_TLS),
p_err);
}
任务控制块:os.h中定义了 typedef struct os_tcb OS_TCB; 任务控制块为一个结构体
*StkPtr:指向当前栈顶的指针;*ExtPtr:指向控制块扩展中用户定义数据的指针;*NextPtr:指向控制块列表中的下个控制块;
*PrevPtr:指向控制块列表中的前一个控制块; TaskState:记录任务状态; Prio:记录任务优先级
初始化优先级列表:OS_PrioInit(); 在os_prio.c文件中,同时定义了优先级列表,优先及初始化函数,获取优先级函数等。
初始化就绪列表: OS_RdyListInit(); 在os_core.c中。
创建空闲任务:OS_IdleTaskInit(p_err)优先级为最后一位
创建tick task:OS_TickTaskInit(p_err); 优先级较高
创建统计任务: OS_StatTaskInit(p_err);
初始化时钟管理模块:OS_TmrInit(p_err);
3.任务的创建、挂起、恢复、删除等。
依次定义控制块,任务函数,任务优先级,任务栈大小。
#define START_TASK_PRIO 3u
#define START_STK_SIZE 128
OS_TCB StartTaskTCB;
CPU_STK START_TASK_STK[START_STK_SIZE];
void Start_Task(void *p_arg);
#define TASK1_TASK_PRIO 6u
#define TASK1_STK_SIZE 128
OS_TCB TASK1_TCB;
CPU_STK TASK1_TASK_STK[TASK1_STK_SIZE];
void task1(void *p_arg);
在主函数中创建启动任务,在启动任务中创建其他任务。
OSInit(&err);
CPU_CRITICAL_ENTER();
OSTaskCreate(
(OS_TCB *) &StartTaskTCB,
(CPU_CHAR*) "start_task",
(OS_TASK_PTR) Start_Task,
(void*) 0u,
( 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) 0u,
(OS_TICK) 0u,
(void*) 0u,
(OS_OPT) OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR,
(OS_ERR*) &err);
CPU_CRITICAL_EXIT();
OSStart(&err);
CPU_CRITICAL_ENTER();
OSTaskCreate(
(OS_TCB *) &TASK1_TCB,
(CPU_CHAR*) "task1",
(OS_TASK_PTR) task1,
(void*) 0u,
( OS_PRIO ) TASK1_TASK_PRIO,
(CPU_STK *) &TASK1_TASK_STK[0],
(CPU_STK_SIZE)TASK1_STK_SIZE/10,
(CPU_STK_SIZE)TASK1_STK_SIZE,
(OS_MSG_QTY) 0u,
(OS_TICK) 0u,
(void*) 0u,
(OS_OPT) OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR,
(OS_ERR*) &err);
printf("start task creat start task1!\n");
CPU_CRITICAL_EXIT();
在其他任务中定义用户代码,实现相关功能。