声明一下:这里用的是原子的教程和代码。
ucos iii有5个系统任务:空闲任务,时钟节拍任务,统计任务,定时任务,中断服务管理任务。而在系统初始化的时候最少哦要创建两个任务:空闲任务和时钟节拍任务。空闲任务的优先级应为最低OS_CFG_PRIO_MAX(默认为256)-1,中断服务管理任务的优先级应为0(最高),统计任务应为OS_CFG_PRIO_MAX-2,时钟节拍任务应为1
在ucos iii中创建任务一般在main文件上,在main()函数前通过宏定义一些任务的参数
定义任务的优先级,任务堆栈大小,创建任务控制块结构体,定义任务堆栈空间,申明任务函数。不过要注意在OSStart()(就是正式开启ucos iii)前只能创建一个任务,我们一般在main函数中创建一个start_task()开始任务,其它的任务在开始任务创建。
main()函数例程
int main(void){
OS_ERR err; //很重要的变量,用来存放函数错误是的返回值。
CPU_SR_ALLOC();
delay_init(); //时钟初始化。
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //中断分组配置。
OSInit(&err); //初始化UCOSIII
OS_CRITICAL_ENTER(); //进入临界区
OSTaskCreate( //创建开始任务。
(OS_TCB *)&StartTaskTCB, //任务控制块
(CPU_CHAR *)"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); //开启UCOS III
while(1);
}
注意事项
- CPU_Init()函数会创建空闲任务。
- 在创建任务前要进入临界区,就是要调用OS_CRITICAL_ENTER()函数,结束要掉用OS_CRITICAL_EXIT()函数退出临界区。
补充:
- 任务状态:休眠态,就绪态,运行态,等待态,中断服务态。
- 原子的UCOSIII任务时间片默认是5ms
- 延时函数是OSTimeDlyHMSM().
- 例子:OSTimeDlyHMSM(0,0,1,0,OS_OPT_TIME_HMSM_STRICT,&err); //延时1s。
- 删除任务时调用:OSTaskDel()函数
- 例子:OSTaskDel((OS_TCB*)&Task2_TaskTCB,&err); //参数写入要删除的任务控制块地址
- 挂起任务调用:OSTaskSuspend(),恢复任务调用:OSTaskResume()函数
- 挂起任务:OSTaskSuspend((OS_TCB*)&Task2_TaskTCB,&err);
- 恢复任务:OSTaskResume((OS_TCB*)&Task2_TaskTCB,&err);
- OSTaskResume()函数只能恢复OSTaskSuspend()挂起的函数。
- 任务选项的代表的含义