【UCOSIII内核学习】
UCOSIII中将已经就绪的任务放到任务就绪表里:优先级映射表和就绪任务列表
在优先级映射表中,bit31代表优先级0,因为这样通过计算前导零CLZ来找到最高优
先级任务。
在就绪任务列表中,通过数组OSRdyList[]来管理相同的或者不同的优先级下的各个
任务,譬如OSRdyList[4]就是管理优先级4下面的各个任务,这些任务间通过OSTCB
控制块的前后指针连接,形成链表。
UCOSIII自带的五个系统任务,空闲任务,时钟节拍任务,统计任务,定时任务,
中断服务管理任务。
UCOSIII任务调度:可剥夺型调度(任务级调度器和中断级调度器),时间片轮转调
度(调度在多个任务拥有相同的优先级下,可以设置单个时间片长度,也可以设置跳
过本次时间片调度)。
任务API
OSTaskDel()虽然允许用户自己来删除不想运行的任务,但是还是应该避免
这种操作,因为若任务A占有信号量X,删除A后,不释放X,则其他任务会因为无法得
到X而出现奇怪的情况。
OSTaskSuspend()和OSTaskResume()可以多次使用,但是次数要匹配才可以使得
一个任务成功从挂起中恢复。
【内部任务】
FreeRTOS中优先级0最悠闲,UCOS中MAX-1最悠闲
空闲任务优先级为MAX-1,优先级可以直接设计成 0~MAX-1
时钟节拍任务是为了跟踪正在延时的任务,任务优先级要略高(紧急)一些,
以及在指定时间内等待某个内核对象的任务。通过post让等待任务就绪,用于
任务同步。
统计任务用来统计CPU使用率和任务堆栈使用情况
定时任务
任务优先级默认为2。在OSInit()中调用OS_TmrInit()来创建定时任务。
中断服务管理函数,优先级最高,为0。负责“延迟”在中断中调用系
统post服务函数的行为。避免了在中断中做“把任务从等待列表中删除”
,“把任务放入就绪表”等耗时行为。(注:ucos通过关闭中断和任务
调度器上锁两种方式管理临界区代码)
空闲任务钩子函数hook,其中切记不能调用任何会使得钩子函数进入等待态的代码,
因为那样CPU就会无所事事。
【中断管理和时间管理】
直接发布和延迟发布:
直接发布模式下,UCOS通过关闭中断来保护临界段
延迟发布模式下,UCOS通过锁定任务调度器来保护临界段
延迟发布模式可以有效降低关闭中断的时间。
在临界段中,有两种保护代码不受干扰的方式,关闭中断和给任务调度器上锁
延时函数有 相对延时,周期延时,绝对延时
相对延时就是简单延时
在绝对延时中,任务总是按照一定的频率阻塞和唤醒,因为延时和唤醒都被定死了
【软件定时器】
在创建软件定时器的时候,周期延时中,dly是第一次带延迟的延时时间,period是
后面的周期延时值,理论上dly应该比period大才对。(其实也不一定,谁大谁小都
可以)
case OS_TMR_STATE_STOPPED:
if (p_tmr->Opt == OS_OPT_TMR_PERIODIC)
{
if (p_tmr->Dly == 0u)
{
remain = p_tmr->Period;
} else
{
remain = p_tmr->Dly;
}
} else
{
remain = p_tmr->Dly;
}
//dly就是周期定时的第一次带有延迟的延时值,以后都是period定时值
在软件定时的回调函数中,不允许产生使得回调函数进入堵塞或者被删除。
【任务内嵌信号量】就是FreeRTOS的任务通知TaskNotification
【同时等待多个内核对象】
UCOSlll只支持同时等待多个信号量和消息队列
UCOSIII中将已经就绪的任务放到任务就绪表里:优先级映射表和就绪任务列表
在优先级映射表中,bit31代表优先级0,因为这样通过计算前导零CLZ来找到最高优
先级任务。
在就绪任务列表中,通过数组OSRdyList[]来管理相同的或者不同的优先级下的各个
任务,譬如OSRdyList[4]就是管理优先级4下面的各个任务,这些任务间通过OSTCB
控制块的前后指针连接,形成链表。
UCOSIII自带的五个系统任务,空闲任务,时钟节拍任务,统计任务,定时任务,
中断服务管理任务。
UCOSIII任务调度:可剥夺型调度(任务级调度器和中断级调度器),时间片轮转调
度(调度在多个任务拥有相同的优先级下,可以设置单个时间片长度,也可以设置跳
过本次时间片调度)。
任务API
OSTaskDel()虽然允许用户自己来删除不想运行的任务,但是还是应该避免
这种操作,因为若任务A占有信号量X,删除A后,不释放X,则其他任务会因为无法得
到X而出现奇怪的情况。
OSTaskSuspend()和OSTaskResume()可以多次使用,但是次数要匹配才可以使得
一个任务成功从挂起中恢复。
【内部任务】
FreeRTOS中优先级0最悠闲,UCOS中MAX-1最悠闲
空闲任务优先级为MAX-1,优先级可以直接设计成 0~MAX-1
时钟节拍任务是为了跟踪正在延时的任务,任务优先级要略高(紧急)一些,
以及在指定时间内等待某个内核对象的任务。通过post让等待任务就绪,用于
任务同步。
统计任务用来统计CPU使用率和任务堆栈使用情况
定时任务
任务优先级默认为2。在OSInit()中调用OS_TmrInit()来创建定时任务。
中断服务管理函数,优先级最高,为0。负责“延迟”在中断中调用系
统post服务函数的行为。避免了在中断中做“把任务从等待列表中删除”
,“把任务放入就绪表”等耗时行为。(注:ucos通过关闭中断和任务
调度器上锁两种方式管理临界区代码)
空闲任务钩子函数hook,其中切记不能调用任何会使得钩子函数进入等待态的代码,
因为那样CPU就会无所事事。
【中断管理和时间管理】
直接发布和延迟发布:
直接发布模式下,UCOS通过关闭中断来保护临界段
延迟发布模式下,UCOS通过锁定任务调度器来保护临界段
延迟发布模式可以有效降低关闭中断的时间。
在临界段中,有两种保护代码不受干扰的方式,关闭中断和给任务调度器上锁
延时函数有 相对延时,周期延时,绝对延时
相对延时就是简单延时
在绝对延时中,任务总是按照一定的频率阻塞和唤醒,因为延时和唤醒都被定死了
【软件定时器】
在创建软件定时器的时候,周期延时中,dly是第一次带延迟的延时时间,period是
后面的周期延时值,理论上dly应该比period大才对。(其实也不一定,谁大谁小都
可以)
case OS_TMR_STATE_STOPPED:
if (p_tmr->Opt == OS_OPT_TMR_PERIODIC)
{
if (p_tmr->Dly == 0u)
{
remain = p_tmr->Period;
} else
{
remain = p_tmr->Dly;
}
} else
{
remain = p_tmr->Dly;
}
//dly就是周期定时的第一次带有延迟的延时值,以后都是period定时值
在软件定时的回调函数中,不允许产生使得回调函数进入堵塞或者被删除。
【任务内嵌信号量】就是FreeRTOS的任务通知TaskNotification
【同时等待多个内核对象】
UCOSlll只支持同时等待多个信号量和消息队列