时间片轮转
中断服务任务
内置信号量 & 消息队列
uCos iii 文件组织
任务
一个任务task 拥有一个虚拟的独立的CPU, 任务内while(1); 无限循环。
OSSemPend
OS_Pend
挂起任务
OSSched
任务切换
OSTaskSemPend
阻塞任务,移出就绪表
激活并进入PendSV中断
挂起PendSV中断最高优先级
中断中切换上下文,立即执行
任务TCB
OS_TCB ledTCB;
任务堆栈
CPU_STK ledStk[200];
执行函数
(OS_TASK_PTR ) ledtask,
优先级
(OS_PRIO) 10,
时间片长
(OS_TICK) 5,
内置消息队列
(OS_MSG_QTY ) 5u,
同优先级内---------时间片轮转
设置一个时基中断的初值
OS_CPU_SysTickInit(7200);
PPL --- 72MHz
=== 0.1ms / 触发时基中断
创建任务时,设置时间片长
(OS_TICK) 5,
内信号量
OSTaskSemPend();
内信号量需创建信号量
OSSchedRoundRobinEn = DEF_TRUE;
开启轮转功能
OS_CFG_ISR_POST_DEFERRED_EN > 0u
开启中断服务队列后,
若触发时基中断,将消息发给中断服务任务
(中断服务任务 PRIO = 0)。
发消息给 TickTask 系统时基任务
发消息给 TmrTask 系统软定时器任务
采用OSTaskSemPost发送消息
OS_CPU_SysTickHandler();
内消息队列
*OSTaskQPend();
OS_Pend
OSSched
正文切换
中
止
继续处理
收到消息
任务内部
OS_SEM
Type
NamePtr
#
TailPtr *
HeadPtr *
Ctr
TS
OS_MUTEX
Type
NamePtr
#
TailPtr *
HeadPtr *
OwnerTCBPtr *
OwnerOriginalPrio
OwnerNestingPrio
TS
OS_FLAG_GRP
Type
NamePtr
#
TailPtr *
HeadPtr *
Flags
TS
OS_Q
Type
NamePtr
#
TailPtr *
HeadPtr *
MsgQ
OS_PEND_LIST
#
TailPtr *
HeadPtr *
OS_PEND_OBJ
Type
NamePtr
#
TailPtr *
HeadPtr *
OS_PEND_DATA
PrevPtr *
NextPtr *
PendObjPtr *
RdyMsgPtr *
RdyMsgSize
RdyTS
TCBPtr *
RdyObjPtr *
OS_MSG_Q
#
InPtr *
OutPtr *
NbrEntriesSize
NbrEntriesMax
OS_MSG_POOL [100]
NextPtr *
NbrFree
NbrUsed
NbrUsedMax
OS_MSG
NextPtr *
MsgPtr *
MsgTS
OS_INT_Q
Type
NextPtr *
MsgPtr *
Flags
OPT
TS
ObjPtr *
MsgSize
OS_MEM 区
Type
AddrPtr *
FreeListPtr *
NbrMax 100
NbrFree 75
NamePtr
BlkSize 字节
OS_TCB
StkPtr *
ExtPtr *
NextPtr *
TickNextPtr *
TickPrevPtr *
StkLimitPtr *
PrevPtr *
TickSpokePtr *
NamePtr
StkBasePtr
TaskEntryAddr
TaskEntryArg *
PendDataTblPtr *
PendON
PendStatus
TaskState
Prio
StkSize
Opt
PendDataTblEntries
TS
SemCtr
StkUsed
StkFree
TickCtrPrev
TickCtrMatch
TickRemain
TimeQuanta
TimeQuantaCtr
MsgPtr *
MsgSize
MsgQ
MsgQPendTime
MsgQPendTimeMax
FlagsPend
FlagsRdy
FlagsOpt
SuspendCtr
IntDisTimeMax
SchedLockTimeMax
CPUUsage
CPUUsageMax
CtxSwCtr
CyclesDelta
CyclesStart
CyclesTotal
CyclesTotalPrev
SemPendTime
SemPendTimeMax
RegTbl [ ]
OS_TMR
Type
NamePtr
CallbackPtrArg *
PrevPtr *
Remain
Dly
CallbackPtr
NextPtr *
Period
Opt
State
MsgSize
实例
OS_MSG
NextPtr *
MsgPtr *
MsgTS
MsgSize
OS_MSG
NextPtr *
MsgPtr *
MsgTS
MsgSize
OS_MSG
NextPtr *
MsgPtr *
MsgTS
MsgSize
OS_MSG
DATA DATA DATA
TCB
TCB
TCB
TCB
TCB
TCB
NextPtr * NextPtr * NextPtr *
PrevPtr * PrevPtr * PrevPtr *
NULL
NULL
OS_PEND_DATA
PrevPtr *
NextPtr *
PendObjPtr *
RdyMsgPtr *
RdyMsgSize
RdyTS
TCBPtr *
RdyObjPtr *
OS_PEND_DATA
PrevPtr *
NextPtr *
PendObjPtr *
RdyMsgPtr *
RdyMsgSize
RdyTS
TCBPtr *
RdyObjPtr *
NULL
NULL
TCB
TCB
PendDataTblPtr *
TCB
TCB
PendDataTblPtr *
TCB
TCB
PendDataTblPtr *
NULL
NULL
OSRdyList [32]
[0]
[1]
[2]
TailPtr *
HeadPtr *
#
TailPtr *
HeadPtr *
#
TailPtr *
HeadPtr *
#
全局变量
OSIntQInPtr*
OSIntQOutPt*
OSIntQOvfCtr
OSIntQTaskTCB
OSIntQNbrEntriesMax
OSIntQTaskTimeMax
#
OS_INT_Q
Type
NextPtr *
ObjPtr *
OS_INT_Q
Type
NextPtr *
ObjPtr *
MsgPtr *
Flags
OPT
TS
MsgSize
MsgPtr *
Flags
OPT
TS
MsgSize
DATA DATA DATA
OSRdyList [OSPrioCur ]
[OSPrioCur]
TailPtr *
HeadPtr *
#
OS_TMR
Type
NamePtr
CallbackPtrArg *
PrevPtr *
Remain
Dly
CallbackPtr
NextPtr *
Period
Opt
State
OS_TMR
Type
NamePtr
CallbackPtrArg *
PrevPtr *
Remain
Dly
CallbackPtr
NextPtr *
Period
Opt
State
DATA
Function
DATA
Function
DATA
Function
OS_TMR_SPOKE
FirstPtr *
NbrEntriesMax
NbrEntries
OSCfg_TmrWheel [17]
二维数组
FirstPtr *Max
OS_INT_Q [10]
#
FirstPtr *Max #
FirstPtr *5 3
FirstPtr *Max #
FirstPtr *Max #
[0]
[1]
[2]
[3]
[4]
NULL
NULL
全局变量
OSTmrTickCtr
OSTmrUpdateCtr
OSTmrUpdateCnt
Spoke = =
OSTmrTickCtr
OSCfg_TmrWheelSize
Ctr
17
OS_TICK_SPOKE
FirstPtr *
NbrEntriesMax
NbrEntries
全局变量
OSTickCtr
OSTickTaskTimeMax
OSTickTaskTCB
OSCfg_TickWheel [17]
二维数组
FirstPtr *Max #
FirstPtr *Max #
FirstPtr *5 3
FirstPtr *Max #
FirstPtr *Max #
[0]
[1]
[2]
[3]
[4]
Spoke = =
OSTickCtr
OSCfg_TickWheelSize
Ctr
17
实例
实例
实例
TCB
TCB
TCB
TCB
TCB
TCB
TickNextPtr * TickNextPtr * TickNextPtr *
TickPrevPtr * TickPrevPtr * TickPrevPtr *
NULL
NULL
OS_TickListInsert 添加TCB到Wheel
OS_TickListRemove 删除TCB
OS_TmrLink 添加TMR到Wheel
OS_TmrUnlink 删除TMR
用于TCB挂起后 倒计时
软件定时器
March
March
March
TickCtrMatch
TickCtrMatch TickCtrMatch
OS_TMR链表,左边等待时间最少 每次触发,只需检查链表第一个
TCB链表,左边等待时间最少 每次触发,只需检查链表第一个
加入链表时:
March = Period(周期) + OSTmrTickCtr
无溢出
加入链表时:
March = Period(周期) + OSTmrTickCtr
无溢出
全局变量
OSMemQty 区数
占用 25块
空白 75块
全局变量
OSPrioTbl [0]
映射表
Bit Map
从Tbl表第一个bit开始计算有
Prio个bit = 0,Prio为就绪的最
高优先级。
CPU_CntLeadZeros计算32bit
中左边开始有多少个0
OS_PRIO.C
OS_PrioInsert
OS_PrioRemove
OS_CORE.C
OS_RdyListInsert
OS_RdyListRemove
任务切换时,执行的是表中第一个可执行的TCB任务
OSTCBHighRdyPtr = OSRdyList[OSPrioHighRdy].HeadPtr;
时基中断 OSTimeTick();
OS_SchedRoundRobin(&OSRdyList
[OSPrioCur]);
OSPrioCur优先级就绪表的第一个
TCB任务,检查TimeQuantaCtr--;
OS_RdyListMoveHeadToTail(p_rdy
_list);
重置TimeQuantaCtr = TimeQuanta
调度任务
Pend挂起的任务,移出就绪表,放入Pendlist
OSPrioHighRdy = OS_PrioGetHighest();
OSSched();触发PendSV中断
32bit
OS_IntQPost();触发0优先级中断服务
任务,依次处理所有结构体中的消息
中断获得的所有信息
存放于OS_INT_Q结构体中
挂起队列
数据块
OS任务创建 Create 自定义对象
OS_Q中包含OS_MSG_Q
MsgQ
供给关系
这些都是有OS系统创建的数据
需要用户自定义的数据
OS_MSG_Q实例
信号量实例 默认=0
适用于单个任务等待消息
时基任务——OS_TickTask();
对象中包含OS_PEND_LIST实例
实例
局部变量
挂起队列 Pend_LIST
While(1)
程序运行到Pend,停止运行
OSSemPend();类似函数创建的
局部变量
OS_PEND_DATA pend_data;
停在Pend处的任务
自定义所有任务TCB 和 STACK
OS任务创建 Create TMR自定义
系统入口:Interface
时基中断:SysTick
主流程:main
硬件中断:Interpret
OS_SchedRoundRobin
激活时间片处理
OSTaskSemPost发信号量
激活时基任务OS_TickTask();
OSTaskSemPost发信号量
激活软定时器OS_TmrTask();
Prio级TimeQuantaCtr =0
OS_RdyListMoveHeadToTail
挂起的任务
TimeQuantaCtr计算轮辐
轮询某段轮辐中TCB队列
检查第一个TCB是否到期
检查正在运行的OSPrioCur
正在运行的:
OSPrioCur中第一个TCB
退出时基中断后
OSIntExit(); 立即调度
OS_PendListRemove (p_tcb);
OS_TaskRdy (p_tcb);
到期
到期
OSTmrTickCtr计算轮辐
同理流程
轮辐中的TCB或OS_TMR
按定时长度顺序从表头开始依次递增
获取信息OS_IntQPost发消息队列
激活优先级0的OS_IntQTask();
退出时基中断后
OSIntExit(); 立即调度
激活
OS_IntQTask();
轮询所有MSG
OS_IntQRePost(); 具体处理MSG
对象:Obj
任务:Task
阻塞任务,任务TCB加入
Obj的PendList队列
Pend申请资源
用户创建
无资源
申请成功
Timeout不等于0
加入到TickWheel队列
Obj实例 PendList 链表
附带资源
SEM、MUT、FLAG、MSG、Q
挂起的N个任务TCB组成链表
其他任务Post提供资源
Pend等待资源
等待。。。 获取。。。
申请成功
Pend函数 系统服务
申请成功
Post函数 系统服务
Post函数 就绪任务
OS_MEM 块/100字节
100字节
100字节
供给
初始化:Init
中断消息:OS_INT_Q[10]
系统默认
消息池:OS_MSG[100]
OS任务堆栈、TCB: Stack[128]
时基轮:OS_TICK_SPOKE[17]
TMR轮:OS_TMR_SPOKE[17]
时基Ctr: OSTickCtr
TMR的Ctr: OSTmrTickCtr
就绪表:OSRdyList[32] 映射Prio的BitMap:OSPrioTbl[0]
优先级个数无上限
全局索引:Global
OSRunning
OSTickCtr
OSTmrTickCtr
统计:
OSFlagQty
OSMemQty
OSMutexQty
OSQQty
OSSemQty
OSTaskQty
OSTmrQty
正文切换:
OSPrioCur
OSPrioHighRdy
OSPrioTbl [0]
OSRdyList[32]
OSTCBCurPtr *
OSTCBHighRdyPtr *
嵌套:
OSIntNestingCtr
OSSchedLockNestingCtr
OSTaskCtxSwCtr
QQ:1065956662
Q群:275591093
E-mail: [email protected]
仅供参考啊,难免有错,见谅见谅。
2014.3.17