uCOS-III是一个主要是运行在单片机上操作系统,可以实现并发,主要的功能就是任务、mutex、event的创建和使用。
调度器
调度器就是使用相关算法来决定当前需要执行的任务,调度器的核心有两个,一是调度算法,二是任务切换
不同系统之间的任务切换都是差不多的,而调度算法却不一样,FreeRTOS和uCOS的调度算法就不一样。
合作式调度器
FreeRTOS支持合作式调度
抢占式调度器
如果使用抢占式调度,最高优先级的任务一旦准备就绪,总能得到CPU的控制权,当一个运行着的任务使一个优先级比他高的任务进入了就绪态,当前任务的CPU使用权就被剥夺了,高优先级的任务立即得到CPU控制权。学习抢占式调度最重要的一点就是 : 优先级
时间片调度器
最常用的时间片调度算法是round-robin调度算法,实现round-robin算法需要给同优先级的任务之间分配一个专门的列表,用于记录当前就绪的任务,还需要给每个任务一个时间片。目前FreeRTOS和uCOS-III都支持round-robin算法。
任务创建和删除任务
OSTaskCreate()函数
void OSTaskCreate (OS_TCB *p_tcb,
//p_tcb: 指向任务控制块 OS_TCB
//TCB: Task Controller Block
//在ucos中用结构体OS_TCB来保存一个任务的所有信息
CPU_CHAR *p_name,
//"字符串",指定任务的个性化的名字,如,“sb250”
OS_TASK_PTR p_task,
//p_task 函数指针,指向任务的“任务函数”
void *p_arg,
//指针,指向的对象,将作为“任务函数”的参数传入
OS_PRIO prio,
//priority 任务级
//指定任务的优先级 "unsigned char"
//数字越小,优先级就越高
// [2, OS_CFG_PRIO_MAX - 2]
//STK: stack
//如下三个参数用来描述“任务栈”: stack
//"栈内存":用来保存任务执行过程中的一些参数,局部变量等等
//每个任务都需要有一个独立的栈空间!!!
//一般来说,定义一个全局的数组,用来当作任务的栈空间
CPU_STK *p_stk_base,
//p_stk_base指向任务栈的基址,任务栈数组的首地址
//任务栈数组的元素类型必须为 CPU_STK(CPU_INT32U)
CPU_STK_SIZE stk_limit,
//设置一个 任务栈的 下限值
//栈中剩余多少元素时“报警”