Create successful ePaper yourself
Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.
MicroC/<strong>OS</strong><br />
/<strong>OS</strong>-<strong>II</strong><br />
<strong>Structure</strong><br />
<br />
<br />
Embedded System Lab. <strong>II</strong>
Contents<br />
• Introduction<br />
• Kernel <strong>Structure</strong><br />
• Task Management<br />
• Time Management<br />
• Event Control Block<br />
• Semaphore Management<br />
• Mutual Exclusive Semaphore<br />
• Event Flags Management<br />
• Message Mail Box Management<br />
• Message Queue Management<br />
• Memory Management<br />
• MicroC/<strong>OS</strong>-<strong>II</strong> Porting<br />
Embedded System Lab. <strong>II</strong> 1
Introduction<br />
Embedded System Lab. <strong>II</strong>
Introduction<br />
• MicroC/<strong>OS</strong>-<strong>II</strong> <br />
1992 Jean J. Labrosse <br />
<br />
, .<br />
: <br />
: http://www.ucos-ii.com( )<br />
‣ .<br />
Embedded System Lab. <strong>II</strong> 3
Introduction (Cont’d)<br />
• MicroC/<strong>OS</strong>-<strong>II</strong> Multitasking Preemptive Real time Kernel<br />
• MicroC/<strong>OS</strong>-<strong>II</strong> 64 .<br />
, 4 56 Task <br />
<strong>OS</strong>_LOWEST_PRIO <br />
.<br />
• Portable<br />
ANSI-C , <br />
.<br />
8Bit, 16Bit, 32Bit 64Bit, DSP Porting .<br />
• Realiable<br />
- <br />
• Romable<br />
• Scalable<br />
‣ FAA(Federal Aviation Administration) .(2000 7)<br />
Embedded System Lab. <strong>II</strong> 4
Introduction (Cont’d)<br />
• - <br />
• .<br />
– <br />
‣ <br />
<br />
(TCP/IP GUI )<br />
• <br />
• , , Mailbox, Queue, Semaphore, Memory partition<br />
<br />
• <br />
.<br />
(up to 255 levels deep)<br />
• <br />
<br />
<br />
Embedded System Lab. <strong>II</strong> 5
Kernel <strong>Structure</strong><br />
Embedded System Lab. <strong>II</strong>
Kernel <strong>Structure</strong><br />
<strong>uC</strong>/<strong>OS</strong>-<strong>II</strong> File <strong>Structure</strong><br />
Embedded System Lab. <strong>II</strong> 7
Kernel <strong>Structure</strong> (Cont’d)<br />
<br />
<strong>OS</strong>_ENTER_CRITICAL()<br />
<br />
<strong>OS</strong>_EXIT_CRITICAL()<br />
<strong>OS</strong>Init()<br />
<strong>OS</strong>Start()<br />
<strong>OS</strong>IntEnter()<br />
<strong>OS</strong>IntExit()<br />
<strong>OS</strong>SchedLock()<br />
<strong>OS</strong>SchedUnlock()<br />
<strong>OS</strong>_SCHED_LOCK_EN<br />
<strong>OS</strong>_SCHED_LOCK_EN<br />
<strong>OS</strong>Version()<br />
Embedded System Lab. <strong>II</strong> 8
Kernel <strong>Structure</strong> (Cont’d)<br />
• Critical Section, <strong>OS</strong>_ENTER_CRITICAL() & <strong>OS</strong>_EXIT_CRITICAL()<br />
MicroC/<strong>OS</strong>-<strong>II</strong> <strong>OS</strong>_ENTER_CRITICAL() <strong>OS</strong>_EXIT_CRITICAL()<br />
Interrupt <br />
<strong>OS</strong>_ENTER_CRITICAL() <strong>OS</strong>_EXIT_CRITICAL() Critical Section<br />
<br />
.<br />
<strong>OS</strong>_ENTER_CRITICAL();<br />
/* <strong>uC</strong>/<strong>OS</strong>-<strong>II</strong> critical code section */<br />
<strong>OS</strong>_EXIT_CRITICAL();<br />
.<br />
<strong>OS</strong>_ENTER_CRITICAL() <strong>OS</strong>_EXIT_CRITICAL() <br />
.<br />
(<strong>OS</strong>_CPU.H <strong>OS</strong>_CRITICAL_METHOD )<br />
‣ 1.<strong>OS</strong>_ENTER_CRITICAL() <strong>OS</strong>_EXIT_CRITICAL() /<br />
<br />
‣ 2. / Stack <br />
‣ 3. C <br />
<br />
Embedded System Lab. <strong>II</strong> 9
Kernel <strong>Structure</strong> (Cont’d)<br />
• Task – Infinite loop function<br />
MicroC/<strong>OS</strong>-<strong>II</strong> Task 64 .<br />
MicroC/<strong>OS</strong>-<strong>II</strong> 8 Idle, CPU Task <br />
.(ex. 1 -> )<br />
Task Task .<br />
void YourTask (void *pdata)<br />
{<br />
for (;;){<br />
/* USER CODE */<br />
Call one of <strong>uC</strong>/<strong>OS</strong>-<strong>II</strong>’s services:<br />
<strong>OS</strong>FlagPend();<br />
<strong>OS</strong>MboxPend();<br />
<strong>OS</strong>MutexPend();<br />
<strong>OS</strong>QPend();<br />
<strong>OS</strong>SemPend();<br />
<strong>OS</strong>TaskDel(<strong>OS</strong>_PRIO_SELF);<br />
<strong>OS</strong>TaskSuspend(<strong>OS</strong>_PRIO_SELF);<br />
<strong>OS</strong>TimeDly();<br />
<strong>OS</strong>TimeDlyHMSM();<br />
/* USER CODE */<br />
}<br />
}<br />
Embedded System Lab. <strong>II</strong> 10
Kernel <strong>Structure</strong> (Cont’d)<br />
• Task <br />
Embedded System Lab. <strong>II</strong> 11
Kernel <strong>Structure</strong> (Cont’d)<br />
• Task Control Block<br />
Task Task Task control block <strong>OS</strong>_TCB .<br />
<strong>OS</strong>_TCB RAM .<br />
<br />
‣ <strong>OS</strong>TCBStkPtr : Task .<br />
• .<br />
• .<br />
‣ <strong>OS</strong>TCBStat : Task , ucos.c <br />
‣ <strong>OS</strong>TCBDly : Task timeout <br />
.<br />
‣ <strong>OS</strong>TCBX, <strong>OS</strong>TCBY, <strong>OS</strong>TCBBitX, <strong>OS</strong>TCBBitY : Task <br />
<br />
‣ <strong>OS</strong>TCBNext, <strong>OS</strong>TCBPrev : <strong>OS</strong>_TCB .<br />
‣ <strong>OS</strong>TCBEventPtr : Event control block <br />
Embedded System Lab. <strong>II</strong> 12
Kernel <strong>Structure</strong> (Cont’d)<br />
• Task Control Block<br />
typedef struct os_tcb {<br />
<strong>OS</strong>_STK *<strong>OS</strong>TCBStkPtr; /* Pointer to current top of stack */<br />
#if <strong>OS</strong>_TASK_CREATE_EXT_EN > 0<br />
void *<strong>OS</strong>TCBExtPtr; /* Pointer to user definable data for TCB */<br />
<strong>OS</strong>_STK *<strong>OS</strong>TCBStkBottom; /* Pointer to bottom of stack */<br />
INT32U <strong>OS</strong>TCBStkSize; /* Size of task stack (in number of stack) */<br />
INT16U <strong>OS</strong>TCBOpt; /* Task options as passed by <strong>OS</strong>TaskCreateExt() */<br />
INT16U <strong>OS</strong>TCBId; /* Task ID (0..65535) */<br />
#endif<br />
struct os_tcb *<strong>OS</strong>TCBNext; /* Pointer to next TCB in the TCB list */<br />
struct os_tcb *<strong>OS</strong>TCBPrev; /* Pointer to previous TCB in the TCB list */<br />
#if ((<strong>OS</strong>_Q_EN > 0) && (<strong>OS</strong>_MAX_QS > 0)) || (<strong>OS</strong>_MBOX_EN > 0) || (<strong>OS</strong>_SEM_EN > 0) ||<br />
(<strong>OS</strong>_MUTEX_EN > 0)<br />
<strong>OS</strong>_EVENT *<strong>OS</strong>TCBEventPtr; /* Pointer to event control block */<br />
#endif<br />
#if ((<strong>OS</strong>_Q_EN > 0) && (<strong>OS</strong>_MAX_QS > 0)) || (<strong>OS</strong>_MBOX_EN > 0)<br />
void *<strong>OS</strong>TCBMsg;<br />
/* Message received from <strong>OS</strong>MboxPost() or <strong>OS</strong>QPost()<br />
#endif<br />
Embedded System Lab. <strong>II</strong> 13
Kernel <strong>Structure</strong> (Cont’d)<br />
• Task Control Block<br />
#if (<strong>OS</strong>_VERSION >= 251) && (<strong>OS</strong>_FLAG_EN > 0) && (<strong>OS</strong>_MAX_FLAGS > 0)<br />
#if <strong>OS</strong>_TASK_DEL_EN > 0<br />
<strong>OS</strong>_FLAG_NODE *<strong>OS</strong>TCBFlagNode; /* Pointer to event flag node */<br />
#endif<br />
<strong>OS</strong>_FLAGS <strong>OS</strong>TCBFlagsRdy; /* Event flags that made task ready to run */<br />
#endif<br />
INT16U <strong>OS</strong>TCBDly;<br />
/* Nbr ticks to delay task or, timeout waiting for event<br />
INT8U <strong>OS</strong>TCBStat; /* Task status */<br />
INT8U <strong>OS</strong>TCBPrio;<br />
/* Task priority (0 == highest, 63 == lowest)*/<br />
INT8U <strong>OS</strong>TCBX; /* Bit position in group corresponding to task priority (0..7) */<br />
INT8U <strong>OS</strong>TCBY; /* Index into ready table corresponding to task priority */<br />
INT8U <strong>OS</strong>TCBBitX; /*Bit mask to access bit position in ready table */<br />
INT8U <strong>OS</strong>TCBBitY; /*Bit mask to access bit position in ready group */<br />
#if <strong>OS</strong>_TASK_DEL_EN > 0<br />
BOOLEAN <strong>OS</strong>TCBDelReq; /* Indicates whether a task needs to delete */<br />
#endif<br />
} <strong>OS</strong>_TCB;<br />
Embedded System Lab. <strong>II</strong> 14
Kernel <strong>Structure</strong> (Cont’d)<br />
• Task Control Block<br />
<strong>OS</strong>TCBNext<br />
<strong>OS</strong>TCBNext<br />
<strong>OS</strong>TCBNext<br />
<strong>OS</strong>TCBNext<br />
<strong>OS</strong>TCBNext<br />
<strong>OS</strong>TCBNext<br />
<strong>OS</strong>TCBNext<br />
[0] 0<br />
[1] 0<br />
[2] 0<br />
[3] .<br />
.<br />
[61]<br />
[62]<br />
[63]<br />
0<br />
<br />
<br />
<br />
<strong>OS</strong>TCBHighRdy<br />
<strong>OS</strong>TCBCur<br />
ptcb<br />
<strong>OS</strong>TCBList<br />
0<br />
<strong>OS</strong>_TCB <strong>OS</strong>_TCB <strong>OS</strong>_TCB<br />
<strong>OS</strong>TCBNext <strong>OS</strong>TCBNext <strong>OS</strong>TCBNext<br />
<strong>OS</strong>TCBPrev <strong>OS</strong>TCBPrev <strong>OS</strong>TCBPrev<br />
<strong>OS</strong>TCBFreeList<br />
<br />
<strong>OS</strong>_TCB <strong>OS</strong>_TCB <strong>OS</strong>_TCB<br />
<strong>OS</strong>TCBNext <strong>OS</strong>TCBNext <strong>OS</strong>TCBNext<br />
Embedded System Lab. <strong>II</strong> 15
Kernel <strong>Structure</strong> (Cont’d)<br />
• Ready List<br />
<strong>OS</strong>RdyGrp <strong>OS</strong>RdyTbl[ ] Ready Task <br />
ready Task <br />
<strong>OS</strong>RdyGrp<br />
‣ Task <br />
‣ 8 (Task ID) <br />
‣ <strong>OS</strong>RdyGrp Ready <br />
<strong>OS</strong>RdyTbl[ ]<br />
‣ Ready <br />
Embedded System Lab. <strong>II</strong> 16
Kernel <strong>Structure</strong> (Cont’d)<br />
• Ready List<br />
Embedded System Lab. <strong>II</strong> 17
Kernel <strong>Structure</strong> (Cont’d)<br />
• <br />
<strong>OS</strong>RdyGrp |= <strong>OS</strong>MapTbl[prio >> 3];<br />
<strong>OS</strong>RdyTbl[prio >> 3] |= <strong>OS</strong>MapTbl[prio & 0x07];<br />
• <br />
if((<strong>OS</strong>RdyTbl[prio>>3] &= ~<strong>OS</strong>MapTbl[prio & 0x07]) == 0)<br />
<strong>OS</strong>RdyGrp &= ~<strong>OS</strong>MapTbl[prio >> 3];<br />
• <br />
y = <strong>OS</strong>UnMapTbl[<strong>OS</strong>RdyGrp];<br />
x = <strong>OS</strong>UnMapTbl[<strong>OS</strong>RdyTbl[y]];<br />
prio = (y
Kernel <strong>Structure</strong> (Cont’d)<br />
• Ready List <br />
Embedded System Lab. <strong>II</strong> 19
Kernel <strong>Structure</strong> (Cont’d)<br />
• Task Scheduling<br />
MicroC/<strong>OS</strong>-<strong>II</strong> Task <br />
Task Scheduling <strong>OS</strong>_Sched() .<br />
ISR Scheduling <strong>OS</strong>IntExit() .<br />
void <strong>OS</strong>_Sched (void)<br />
{<br />
#if <strong>OS</strong>_CRITICAL_METHOD == 3<br />
<strong>OS</strong>_CPU_SR cpu_sr;<br />
#endif<br />
INT8U y;<br />
}<br />
<strong>OS</strong>_ENTER_CRITICAL();<br />
if ((<strong>OS</strong>IntNesting == 0) && (<strong>OS</strong>LockNesting == 0)) {<br />
y = <strong>OS</strong>UnMapTbl[<strong>OS</strong>RdyGrp];<br />
<strong>OS</strong>PrioHighRdy = (INT8U)((y
Kernel <strong>Structure</strong> (Cont’d)<br />
• Task Context Switching<br />
<strong>OS</strong>_TASK_SW() <br />
Task <br />
Embedded System Lab. <strong>II</strong> 21
Kernel <strong>Structure</strong> (Cont’d)<br />
Task <br />
void <strong>OS</strong>CtxSw (void)<br />
{<br />
PUSH R1, R2, R3 and R4 onto the current stack;<br />
<strong>OS</strong>TCBCur-><strong>OS</strong>TCBStkPtr = SP;<br />
<strong>OS</strong>TCBCur = <strong>OS</strong>TCBHighRdy;<br />
SP = <strong>OS</strong>TCBHighRdy-><strong>OS</strong>TCBStkPtr;<br />
POP R4, R3, R2 and R1 from the new stack;<br />
Execute a return from interrupt instruction;<br />
}<br />
Embedded System Lab. <strong>II</strong> 22
Kernel <strong>Structure</strong> (Cont’d)<br />
• Scheduler /<br />
<strong>OS</strong>SchedLock() <strong>OS</strong>SchedUnlock() Scheduler .<br />
MicroC/<strong>OS</strong>-<strong>II</strong> 255 Scheduling .<br />
<strong>OS</strong>LockNesting 0 Scheduler .<br />
void <strong>OS</strong>SchedLock (void)<br />
{<br />
#if <strong>OS</strong>_CRITICAL_METHOD == 3<br />
<strong>OS</strong>_CPU_SR cpu_sr;<br />
#endif<br />
}<br />
if (<strong>OS</strong>Running == TRUE) {<br />
<strong>OS</strong>_ENTER_CRITICAL();<br />
if (<strong>OS</strong>LockNesting < 255) {<br />
<strong>OS</strong>LockNesting++;<br />
}<br />
<strong>OS</strong>_EXIT_CRITICAL();<br />
}<br />
Embedded System Lab. <strong>II</strong> 23
Kernel <strong>Structure</strong> (Cont’d)<br />
• Scheduler /<br />
void <strong>OS</strong>SchedUnlock (void)<br />
{<br />
#if <strong>OS</strong>_CRITICAL_METHOD == 3<br />
<strong>OS</strong>_CPU_SR cpu_sr;<br />
#endif<br />
}<br />
if (<strong>OS</strong>Running == TRUE) {<br />
<strong>OS</strong>_ENTER_CRITICAL();<br />
if (<strong>OS</strong>LockNesting > 0) {<br />
<strong>OS</strong>LockNesting--;<br />
if ((<strong>OS</strong>LockNesting == 0) && (<strong>OS</strong>IntNesting == 0)) {<br />
<strong>OS</strong>_EXIT_CRITICAL();<br />
<strong>OS</strong>_Sched();<br />
} else {<br />
<strong>OS</strong>_EXIT_CRITICAL();<br />
}<br />
} else {<br />
<strong>OS</strong>_EXIT_CRITICAL();<br />
}<br />
}<br />
Embedded System Lab. <strong>II</strong> 24
Kernel <strong>Structure</strong> (Cont’d)<br />
• Idle Task / <strong>OS</strong>_TaskIdle()<br />
MicroC/<strong>OS</strong>-<strong>II</strong> Idle Task .<br />
Idle Task Task .<br />
Idle Task (<strong>OS</strong>_LOWEST_PRIO) .<br />
Idle Task .<br />
void <strong>OS</strong>_TaskIdle (void *pdata)<br />
{<br />
#if <strong>OS</strong>_CRITICAL_METHOD == 3<br />
<strong>OS</strong>_CPU_SR cpu_sr;<br />
#endif<br />
}<br />
pdata = pdata;<br />
for (;;) {<br />
<strong>OS</strong>_ENTER_CRITICAL();<br />
<strong>OS</strong>IdleCtr++;<br />
<strong>OS</strong>_EXIT_CRITICAL();<br />
<strong>OS</strong>TaskIdleHook();<br />
}<br />
Embedded System Lab. <strong>II</strong> 25
Kernel <strong>Structure</strong> (Cont’d)<br />
• Task / <strong>OS</strong>_TaskStat()<br />
MicroC/<strong>OS</strong>-<strong>II</strong> .<br />
<strong>OS</strong>_CFG.H <strong>OS</strong>_TASK_STAT_EN 1 Task <br />
Task CPU 1 % .<br />
Task Task Task<br />
.<br />
void main (void)<br />
{<br />
<strong>OS</strong>Init(); /* Initialize <strong>uC</strong>/<strong>OS</strong>-<strong>II</strong> */<br />
/* Install <strong>uC</strong>/<strong>OS</strong>-<strong>II</strong>'s context switch vector */<br />
/* Create your startup task (for sake of discussion, TaskStart()) */<br />
<strong>OS</strong>Start(); /* Start multitasking */<br />
}<br />
void TaskStart (void *pdata)<br />
{<br />
/* Install and initialize <strong>uC</strong>/<strong>OS</strong>-<strong>II</strong>’s ticker */<br />
<strong>OS</strong>StatInit(); /* Initialize statistics task */<br />
/* Create your application task(s) */<br />
for (;;) {<br />
/* Code for TaskStart() goes here! */<br />
}<br />
}<br />
Embedded System Lab. <strong>II</strong> 26
Kernel <strong>Structure</strong> (Cont’d)<br />
• Task<br />
Embedded System Lab. <strong>II</strong> 27
Kernel <strong>Structure</strong> (Cont’d)<br />
• Task / <strong>OS</strong>StatInit()<br />
<strong>OS</strong>StatInit() Idle Task <br />
Idle (<strong>OS</strong>IdleCtr) .<br />
void <strong>OS</strong>StatInit (void)<br />
{<br />
#if <strong>OS</strong>_CRITICAL_METHOD == 3<br />
<strong>OS</strong>_CPU_SR cpu_sr;<br />
#endif<br />
}<br />
<strong>OS</strong>TimeDly(2);<br />
<strong>OS</strong>_ENTER_CRITICAL();<br />
<strong>OS</strong>IdleCtr = 0L;<br />
<strong>OS</strong>_EXIT_CRITICAL();<br />
<strong>OS</strong>TimeDly(<strong>OS</strong>_TICKS_PER_SEC);<br />
<strong>OS</strong>_ENTER_CRITICAL();<br />
<strong>OS</strong>IdleCtrMax = <strong>OS</strong>IdleCtr;<br />
<strong>OS</strong>StatRdy = TRUE;<br />
<strong>OS</strong>_EXIT_CRITICAL();<br />
Embedded System Lab. <strong>II</strong> 28
Kernel <strong>Structure</strong> (Cont’d)<br />
• Task<br />
void <strong>OS</strong>_TaskStat (void *pdata)<br />
{<br />
#if <strong>OS</strong>_CRITICAL_METHOD == 3<br />
<strong>OS</strong>_CPU_SR cpu_sr;<br />
#endif<br />
INT32U run;<br />
INT32U max;<br />
INT8S usage;<br />
pdata = pdata;<br />
while (<strong>OS</strong>StatRdy == FALSE){<br />
<strong>OS</strong>TimeDly(2 *<br />
<strong>OS</strong>_TICKS_PER_SEC);<br />
}<br />
max = <strong>OS</strong>IdleCtrMax / 100L;<br />
}<br />
for (;;) {<br />
<strong>OS</strong>_ENTER_CRITICAL();<br />
<strong>OS</strong>IdleCtrRun = <strong>OS</strong>IdleCtr;<br />
run = <strong>OS</strong>IdleCtr;<br />
<strong>OS</strong>IdleCtr = 0L;<br />
<strong>OS</strong>_EXIT_CRITICAL();<br />
if (max > 0L) {<br />
usage = (INT8S)(100L - run / max);<br />
if (usage >= 0) {<br />
<strong>OS</strong>CPUUsage = usage;<br />
} else {<br />
<strong>OS</strong>CPUUsage = 0;<br />
}<br />
} else {<br />
<strong>OS</strong>CPUUsage = 0;<br />
max = <strong>OS</strong>IdleCtrMax / 100L;<br />
}<br />
<strong>OS</strong>TaskStatHook();<br />
<strong>OS</strong>TimeDly(<strong>OS</strong>_TICKS_PER_SEC);<br />
}<br />
Embedded System Lab. <strong>II</strong> 29
Kernel <strong>Structure</strong> (Cont’d)<br />
• MicroC/<strong>OS</strong>-<strong>II</strong> Interrupt<br />
MicroC/<strong>OS</strong>-<strong>II</strong> Interrupt Service Routine (ISR) <br />
C Inline C ISR <br />
.<br />
Interrupt <br />
‣ <strong>OS</strong>IntEnter(), <strong>OS</strong>IntExit(), <strong>OS</strong>IntCtxSW()<br />
YourISR:<br />
Save all CPU registers;<br />
Call <strong>OS</strong>IntEnter() or, increment <strong>OS</strong>IntNesting directly;<br />
if (<strong>OS</strong>IntNesting == 1) {<br />
<strong>OS</strong>TCBCur-><strong>OS</strong>TCBStkPtr = SP;<br />
}<br />
Clear interrupting device;<br />
Re-enable interrupts (optional)<br />
Execute user code to service ISR;<br />
Call <strong>OS</strong>IntExit();<br />
Restore all CPU registers;<br />
Execute a return from interrupt instruction;<br />
<br />
Embedded System Lab. <strong>II</strong> 30
Kernel <strong>Structure</strong> (Cont’d)<br />
• MicroC/<strong>OS</strong>-<strong>II</strong> Interrupt<br />
Embedded System Lab. <strong>II</strong> 31
Kernel <strong>Structure</strong> (Cont’d)<br />
• Clock Tick / <strong>OS</strong>TimeTick()<br />
MicroC/<strong>OS</strong>-<strong>II</strong> Clock Tick <br />
Multitasking <strong>OS</strong>Start() Clock Tick<br />
Interrupt .<br />
Clock Tick <br />
‣ <strong>OS</strong>TimeTick(), <strong>OS</strong>TickISR()<br />
void <strong>OS</strong>TickISR(void)<br />
{<br />
Save processor registers;<br />
Call <strong>OS</strong>IntEnter() or increment <strong>OS</strong>IntNesting;<br />
if (<strong>OS</strong>IntNesting == 1) {<br />
<strong>OS</strong>TCBCur-><strong>OS</strong>TCBStkPtr = SP;<br />
}<br />
Post a 'dummy' message (e.g. (void *)1) to the tick mailbox;<br />
}<br />
Call <strong>OS</strong>IntExit();<br />
Restore processor registers;<br />
Execute a return from interrupt instruction;<br />
Embedded System Lab. <strong>II</strong> 32
Kernel <strong>Structure</strong> (Cont’d)<br />
• MicroC/<strong>OS</strong>-<strong>II</strong> <br />
MicroC/<strong>OS</strong>-<strong>II</strong> <strong>OS</strong>Init() <br />
<strong>OS</strong>Init() MicroC/<strong>OS</strong>-<strong>II</strong> <br />
<strong>OS</strong>_CFG.H #define <br />
.<br />
‣ <strong>OS</strong>_TASK_STAT_EN 1 <br />
‣ <strong>OS</strong>_FLAG_EN 1 <br />
‣ <strong>OS</strong>_LOWEST_PRIO 63 <br />
‣ <strong>OS</strong>_MAX_TASKS 62 <br />
Embedded System Lab. <strong>II</strong> 33
Kernel <strong>Structure</strong> (Cont’d)<br />
• MicroC/<strong>OS</strong>-<strong>II</strong> <br />
Embedded System Lab. <strong>II</strong> 34
Kernel <strong>Structure</strong> (Cont’d)<br />
• MicroC/<strong>OS</strong>-<strong>II</strong> <br />
Embedded System Lab. <strong>II</strong> 35
Kernel <strong>Structure</strong> (Cont’d)<br />
• MicroC/<strong>OS</strong>-<strong>II</strong> <br />
void main (void)<br />
{<br />
<strong>OS</strong>Init(); /* Initialize <strong>uC</strong>/<strong>OS</strong>-<strong>II</strong> */<br />
.<br />
.<br />
Create at least 1 task using either <strong>OS</strong>TaskCreate() or <strong>OS</strong>TaskCreateExt();<br />
.<br />
.<br />
<strong>OS</strong>Start(); /* Start multitasking! <strong>OS</strong>Start() will not return */<br />
}<br />
void <strong>OS</strong>Start (void)<br />
{<br />
INT8U y;<br />
INT8U x;<br />
if (<strong>OS</strong>Running == FALSE) {<br />
y = <strong>OS</strong>UnMapTbl[<strong>OS</strong>RdyGrp];<br />
x = <strong>OS</strong>UnMapTbl[<strong>OS</strong>RdyTbl[y]];<br />
<strong>OS</strong>PrioHighRdy = (INT8U)((y
Kernel <strong>Structure</strong> (Cont’d)<br />
• MicroC/<strong>OS</strong>-<strong>II</strong> <br />
Embedded System Lab. <strong>II</strong> 37
Task Management<br />
Embedded System Lab. <strong>II</strong>
Task Management<br />
• Task Management<br />
Task <br />
. , <br />
.<br />
void YourTask (void *pdata)<br />
{<br />
for (;;) {<br />
/* USER CODE */<br />
Call one of <strong>uC</strong>/<strong>OS</strong>-<strong>II</strong>'s services:<br />
<strong>OS</strong>FlagPend();<br />
<strong>OS</strong>MboxPend();<br />
<strong>OS</strong>MutexPend();<br />
<strong>OS</strong>QPend();<br />
<strong>OS</strong>SemPend();<br />
void YourTask (void *pdata)<br />
{<br />
/* USER CODE */<br />
<strong>OS</strong>TaskDel(<strong>OS</strong>_PRIO_SELF);<br />
}<br />
}<br />
}<br />
<strong>OS</strong>TaskSuspend(<strong>OS</strong>_PRIO_SELF);<br />
<strong>OS</strong>TimeDly();<br />
<strong>OS</strong>TimeDlyHMSM();<br />
/* USER CODE */<br />
Embedded System Lab. <strong>II</strong> 39
Task Management (Cont’d)<br />
• Task / <strong>OS</strong>TaskCreate() or <strong>OS</strong>TaskCreateExt()<br />
Task Multitasking ,<br />
Multitasking .<br />
Multitasking (<strong>OS</strong>Start() ), <br />
Task .<br />
) Interrupt Service Routine Task .<br />
<strong>OS</strong>TaskCreate( void (*task) (void *pd), void *pdata, <strong>OS</strong>_STK *ptos, INT8U<br />
prio )<br />
‣ : Task <br />
‣ : Task <br />
‣ : Task Stack <br />
‣ : Task <br />
<strong>OS</strong>TaskCreateExt() 9, <br />
.<br />
Embedded System Lab. <strong>II</strong> 40
Task Management (Cont’d)<br />
• Task / <strong>OS</strong>TaskCreate() or <strong>OS</strong>TaskCreateExt()<br />
INT8U <strong>OS</strong>TaskCreate (void (*task)(void *pd),<br />
void *pdata, <strong>OS</strong>_STK *ptos, INT8U prio)<br />
{<br />
#if <strong>OS</strong>_CRITICAL_METHOD == 3<br />
<strong>OS</strong>_CPU_SR cpu_sr;<br />
#endif<br />
void *psp;<br />
INT8U err;<br />
#if <strong>OS</strong>_ARG_CHK_EN > 0<br />
if (prio > <strong>OS</strong>_LOWEST_PRIO) {<br />
return (<strong>OS</strong>_PRIO_INVALID);<br />
}<br />
#endif<br />
<strong>OS</strong>_ENTER_CRITICAL();<br />
if (<strong>OS</strong>TCBPrioTbl[prio] == (<strong>OS</strong>_TCB *)0) {<br />
<strong>OS</strong>TCBPrioTbl[prio] = (<strong>OS</strong>_TCB *)1;<br />
<strong>OS</strong>_EXIT_CRITICAL();<br />
psp = (void *)<strong>OS</strong>TaskStkInit(task, pdata, ptos, 0);<br />
err = <strong>OS</strong>_TCBInit(prio, psp, (void *)0, 0, 0, (void *)0, 0);<br />
if (err == <strong>OS</strong>_NO_ERR) {<br />
<strong>OS</strong>_ENTER_CRITICAL();<br />
<strong>OS</strong>TaskCtr++;<br />
<strong>OS</strong>_EXIT_CRITICAL();<br />
if (<strong>OS</strong>Running == TRUE) {<br />
<strong>OS</strong>_Sched();<br />
}<br />
} else {<br />
<strong>OS</strong>_ENTER_CRITICAL();<br />
<strong>OS</strong>TCBPrioTbl[prio] = (<strong>OS</strong>_TCB *)0;<br />
<strong>OS</strong>_EXIT_CRITICAL();<br />
}<br />
return (err);<br />
}<br />
<strong>OS</strong>_EXIT_CRITICAL();<br />
return (<strong>OS</strong>_PRIO_EXIST);<br />
}<br />
Embedded System Lab. <strong>II</strong> 41
Task Management (Cont’d)<br />
• Task Stack<br />
Task Stack , <strong>OS</strong>_STK <br />
.<br />
Stack ( ) ()<br />
.<br />
static <strong>OS</strong>_STK MyTaskStack[stack_size];<br />
<strong>OS</strong>_STK MyTaskStack[stack_size];<br />
Static Stack<br />
<strong>OS</strong>_STK *pstk;pstk = (<strong>OS</strong>_STK *)malloc(stack_size);<br />
if (pstk != (<strong>OS</strong>_STK *)0) { /* Make sure malloc() has enough space */<br />
Create the task;<br />
}<br />
Using malloc() to allocate stack space for a task<br />
Embedded System Lab. <strong>II</strong> 42
Task Management (Cont’d)<br />
• Task Stack<br />
Stack C malloc() <br />
(Fragmentation) <br />
A (1Kb)<br />
Free(1Kb)<br />
Free heap<br />
(3Kb)<br />
B (1Kb)<br />
B (1Kb)<br />
C (1Kb)<br />
Free(1Kb)<br />
A, C <br />
( )<br />
Embedded System Lab. <strong>II</strong> 43
Task Management (Cont’d)<br />
• Task Stack <br />
(<strong>OS</strong>_STK_GROWTH = 0)<br />
<strong>OS</strong>_STK TaskStk[TASK_STK_SIZE];<br />
<strong>OS</strong>TaskCreate(task, pdata, &TaskStk[0], prio);<br />
(<strong>OS</strong>_STK_GROWTH = 1)<br />
<strong>OS</strong>_STK TaskStk[TASK_STK_SIZE];<br />
<strong>OS</strong>TaskCreate(task, pdata, &TaskStk[TASK_STK_SIZE-1], prio);<br />
, <br />
<strong>OS</strong>_STK TaskStk[TASK_STK_SIZE];<br />
#if <strong>OS</strong>_STK_GROWTH == 0<br />
<strong>OS</strong>TaskCreate(task, pdata, &TaskStk[0], prio);<br />
#else<br />
<strong>OS</strong>TaskCreate(task, pdata, &TaskStk[TASK_STK_SIZE-1], prio);<br />
#endif<br />
Embedded System Lab. <strong>II</strong> 44
Task Management (Cont’d)<br />
• Stack / <strong>OS</strong>TaskStkChk()<br />
Task Stack <br />
Stack <br />
<br />
‣ prio : <br />
‣ pdata : <strong>OS</strong>_STK_DATA .<br />
, <br />
(<strong>uC</strong><strong>OS</strong>_<strong>II</strong>.H )<br />
Embedded System Lab. <strong>II</strong> 45
Task Management (Cont’d)<br />
• Stack / <strong>OS</strong>TaskStkChk()<br />
Embedded System Lab. <strong>II</strong> 46
Task Management (Cont’d)<br />
• Task / <strong>OS</strong>TaskDelReq()<br />
Task , <br />
<br />
Task <strong>OS</strong>TaskDelReq()<br />
.<br />
<br />
‣ prio<br />
: <br />
void RequestorTask (void *pdata)<br />
{<br />
INT8U err;<br />
pdata = pdata;<br />
for (;;) {<br />
/* Application code */<br />
if ('TaskToBeDeleted()' needs to be deleted) {<br />
while (<strong>OS</strong>TaskDelReq(TASK_TO_DEL_PRIO) != <strong>OS</strong>_TASK_NOT_EXIST) {<br />
<strong>OS</strong>TimeDly(1);<br />
}<br />
}<br />
/* Application code */<br />
}<br />
}<br />
Task <br />
Embedded System Lab. <strong>II</strong> 47
Task Management (Cont’d)<br />
• Task / <strong>OS</strong>TaskDelReq()<br />
<strong>OS</strong>TaskDel() <br />
‣ : Idle Task , <br />
‣ <strong>OS</strong>_TCB <br />
• Ready list <br />
• MailBox, Queue, Semaphore <strong>OS</strong>_TCB <br />
‣ 0 : Task tick ISR <br />
<br />
‣ <strong>OS</strong>TCBStat <strong>OS</strong>_STAT_RDY <br />
‣ TCB <strong>OS</strong>TaskDelHook()<br />
‣ Task <br />
‣ <strong>OS</strong>_TCB <br />
• <br />
• <strong>OS</strong>TCBList <strong>OS</strong>_TCB <br />
• free <strong>OS</strong>_TCB list <strong>OS</strong>_TCB <br />
‣ : <strong>OS</strong>TaskDel() ISR <br />
<br />
Embedded System Lab. <strong>II</strong> 48
Task Management (Cont’d)<br />
• Task / <strong>OS</strong>TaskDelReq()<br />
void TaskToBeDeleted (void *pdata)<br />
{<br />
INT8U err;<br />
pdata = pdata;<br />
for (;;) {<br />
/* Application code */<br />
if (<strong>OS</strong>TaskDelReq(<strong>OS</strong>_PRIO_SELF) == <strong>OS</strong>_TASK_DEL_REQ) {<br />
Release any owned resources;<br />
De-allocate any dynamic memory;<br />
<strong>OS</strong>TaskDel(<strong>OS</strong>_PRIO_SELF);<br />
} else {<br />
/* Application code */<br />
}<br />
}<br />
}<br />
Task<br />
Embedded System Lab. <strong>II</strong> 49
Task Management (Cont’d)<br />
• Task / <strong>OS</strong>TaskChangePrio()<br />
Run Time .<br />
<br />
<br />
‣ Oldprio: <br />
‣ Newprio: <br />
<br />
‣ Task ready list Task <br />
ready list .<br />
‣ Task <br />
.<br />
‣ Task event waiting list <br />
waiting list .<br />
‣ Task <strong>OS</strong>_TCB <strong>OS</strong>TimeTick()<br />
.<br />
‣ enabled <strong>OS</strong>_TCB <strong>OS</strong>TCBX, <strong>OS</strong>TCBBitX, <strong>OS</strong>TCBY, <strong>OS</strong>TCBBitY<br />
.<br />
Embedded System Lab. <strong>II</strong> 50
Task Management (Cont’d)<br />
• Task / <strong>OS</strong>TaskSuspend()<br />
<br />
<br />
<br />
<br />
<br />
<br />
‣ prio: <br />
<strong>OS</strong>TaskSuspend() <br />
‣ Task Idle <br />
‣ Task priority <br />
‣ Task Ready List <br />
‣ <strong>OS</strong>_TCB <strong>OS</strong>_STAT_SUSPEND .<br />
‣ .<br />
Embedded System Lab. <strong>II</strong> 51
Task Management (Cont’d)<br />
• Task / <strong>OS</strong>TaskResume()<br />
<br />
<br />
<br />
‣ prio: <br />
<strong>OS</strong>TaskResume() <br />
‣ Task Idle <br />
‣ <strong>OS</strong>TCBStat (<strong>OS</strong>_TCB) <strong>OS</strong>_STAT_SUSPEND <br />
‣ <strong>OS</strong>TCBDly 0 : Task <br />
Task Task .<br />
Embedded System Lab. <strong>II</strong> 52
Task Management (Cont’d)<br />
• Task / <strong>OS</strong>TaskQuery()<br />
Task <br />
<br />
<br />
<br />
<br />
‣ prio: <br />
‣ Pdata: <br />
void MyTask (void *pdata)<br />
{<br />
<strong>OS</strong>_TCB MyTaskData;<br />
}<br />
pdata = pdata;<br />
for (;;) {<br />
/* User code */<br />
err = <strong>OS</strong>TaskQuery(10, &MyTaskData);<br />
/* Examine error code .. */<br />
/* User code */<br />
}<br />
Embedded System Lab. <strong>II</strong> 53
Time Management<br />
Embedded System Lab. <strong>II</strong>
Time Management<br />
• Time Management<br />
Time management configuration constants in <strong>OS</strong>_CFG.H.<br />
<strong>uC</strong>/<strong>OS</strong>-<strong>II</strong> Time Management Service<br />
Enabled when set to 1 in <strong>OS</strong>_CFG.H<br />
<strong>OS</strong>TimeDly()<br />
<strong>OS</strong>TimeDlyHMSM()<br />
<strong>OS</strong>_TIME_DLY_HMSM_EN<br />
<strong>OS</strong>TimeDlyResume()<br />
<strong>OS</strong>_TIME_DLY_RESUME_EN<br />
<strong>OS</strong>TimeGet()<br />
<strong>OS</strong>_TIME_GET_SET_EN<br />
<strong>OS</strong>TimeSet()<br />
<strong>OS</strong>_TIME_GET_SET_EN<br />
Embedded System Lab. <strong>II</strong> 55
Time Management (Cont’d)<br />
• Task / <strong>OS</strong>TimeDly()<br />
Clock tick(1~65535) <br />
.<br />
<br />
<strong>OS</strong>TimeDlyResume() .<br />
<br />
‣ Ticks: Clock tick<br />
Embedded System Lab. <strong>II</strong> 56
Time Management (Cont’d)<br />
• Task / <strong>OS</strong>TimeDly()<br />
Embedded System Lab. <strong>II</strong> 57
Time Management (Cont’d)<br />
• Task / <strong>OS</strong>TimeDlyHMSM()<br />
(H), (M), (S), (m) <br />
.<br />
<strong>uC</strong>/<strong>OS</strong>-<strong>II</strong> 256 .<br />
<strong>OS</strong>_TIME_DLY_HMSM_EN == 1 . (<strong>OS</strong>_CFG.H)<br />
<br />
‣ Hours: <br />
‣ Minutes: <br />
‣ Seconds: <br />
‣ Milli: <br />
Embedded System Lab. <strong>II</strong> 58
Time Management (Cont’d)<br />
• Task / <strong>OS</strong>TimeDlyResume()<br />
Task <br />
, Task <br />
Task .<br />
65,535 . <br />
.<br />
<strong>OS</strong>_TIME_DLY_RESUME_EN == 1 <br />
<br />
‣ prio: Taks <br />
Embedded System Lab. <strong>II</strong> 59
Time Management (Cont’d)<br />
• / <strong>OS</strong>TimeGet(), <strong>OS</strong>TimeSet()<br />
MicroC/<strong>OS</strong>-<strong>II</strong> Clock Tick Interrupt 32bit <br />
<strong>OS</strong>Start() 0<br />
, 4,294,967,295 Tick 0 .<br />
<strong>OS</strong>TimeGet(): .<br />
<strong>OS</strong>TimeSet(): .<br />
Embedded System Lab. <strong>II</strong> 60
Event Control Block<br />
Embedded System Lab. <strong>II</strong>
Event Control Block<br />
• Event Control Block<br />
Task ISR Event Control Block(ECB) Kernel Object <br />
Task .<br />
Embedded System Lab. <strong>II</strong> 62
Event Control Block (Cont’d)<br />
• Event Control Block <strong>Structure</strong><br />
typedef struct {<br />
INT8U <strong>OS</strong>EventType; /* Event type */<br />
INT8U <strong>OS</strong>EventGrp; /* Group for wait list */<br />
INT16U <strong>OS</strong>EventCnt; /* Count (when event is a semaphore) */<br />
void *<strong>OS</strong>EventPtr; /* Ptr to message or queue structure */<br />
INT8U <strong>OS</strong>EventTbl[<strong>OS</strong>_EVENT_TBL_SIZE]; /* Wait list for event to occur */<br />
} <strong>OS</strong>_EVENT;<br />
Embedded System Lab. <strong>II</strong> 63
Event Control Block (Cont’d)<br />
• Wait List<br />
Embedded System Lab. <strong>II</strong> 64
Event Control Block (Cont’d)<br />
• Wait List Operation<br />
Making a task wait for an event.<br />
pevent-><strong>OS</strong>EventGrp |= <strong>OS</strong>MapTbl[prio >> 3];<br />
pevent-><strong>OS</strong>EventTbl[prio >> 3] |= <strong>OS</strong>MapTbl[prio & 0x07];<br />
Removing a task from a wait list.<br />
if ((pevent-><strong>OS</strong>EventTbl[prio >> 3] &= ~<strong>OS</strong>MapTbl[prio & 0x07]) == 0) {<br />
pevent-><strong>OS</strong>EventGrp &= ~<strong>OS</strong>MapTbl[prio >> 3];<br />
}<br />
Finding the highest priority task waiting for the event.<br />
y = <strong>OS</strong>UnMapTbl[pevent-><strong>OS</strong>EventGrp];<br />
x = <strong>OS</strong>UnMapTbl[pevent-><strong>OS</strong>EventTbl[y]];<br />
prio = (y
Event Control Block (Cont’d)<br />
• Wait List Example<br />
Embedded System Lab. <strong>II</strong> 66
Event Control Block (Cont’d)<br />
• List of Free ECBs<br />
Embedded System Lab. <strong>II</strong> 67
Event Control Block (Cont’d)<br />
• Event Control Block / <strong>OS</strong>_EventWaitListInit()<br />
Semaphore, Mutex, Mailbox, Message Queue <br />
.<br />
Event Control Block Task <br />
.<br />
void <strong>OS</strong>_EventWaitListInit (<strong>OS</strong>_EVENT *pevent)<br />
{<br />
INT8U *ptbl;<br />
pevent-><strong>OS</strong>EventGrp = 0x00;<br />
ptbl = &pevent-><strong>OS</strong>EventTbl[0];<br />
#if <strong>OS</strong>_EVENT_TBL_SIZE > 0<br />
*ptbl++ = 0x00;<br />
#endif<br />
#if <strong>OS</strong>_EVENT_TBL_SIZE > 1<br />
*ptbl++ = 0x00;<br />
#endif<br />
#if <strong>OS</strong>_EVENT_TBL_SIZE > 2<br />
*ptbl++ = 0x00;<br />
#endif<br />
#if <strong>OS</strong>_EVENT_TBL_SIZE > 3<br />
*ptbl++ = 0x00;<br />
#endif<br />
#if <strong>OS</strong>_EVENT_TBL_SIZE > 4<br />
*ptbl++ = 0x00;<br />
#endif<br />
#if <strong>OS</strong>_EVENT_TBL_SIZE > 5<br />
*ptbl++ = 0x00;<br />
#endif<br />
#if <strong>OS</strong>_EVENT_TBL_SIZE > 6<br />
*ptbl++ = 0x00;<br />
#endif<br />
#if <strong>OS</strong>_EVENT_TBL_SIZE > 7<br />
*ptbl = 0x00;<br />
#endif<br />
}<br />
Embedded System Lab. <strong>II</strong> 68
Event Control Block (Cont’d)<br />
• Task / <strong>OS</strong>_EventTaskRdy()<br />
Event Control Block Task <br />
Task .<br />
• Task / <strong>OS</strong>_EventTaskWait()<br />
Task MicroC/<strong>OS</strong>-<strong>II</strong> , <br />
Event Control Block .<br />
• Task / <strong>OS</strong>_EventTO()<br />
.<br />
<strong>OS</strong>TimeTick() Task , <strong>OS</strong>SemPend(),<br />
<strong>OS</strong>MboxPend(), <strong>OS</strong>QPend() .<br />
Embedded System Lab. <strong>II</strong> 69
Semaphore Management<br />
Embedded System Lab. <strong>II</strong>
Semaphore Management<br />
• Semaphore Management<br />
Semaphore configuration constants in <strong>OS</strong>_CFG.H<br />
<strong>uC</strong>/<strong>OS</strong>-<strong>II</strong> Semaphore Service<br />
<strong>OS</strong>SemAccept()<br />
Enabled when set to 1 in <strong>OS</strong>_CFG.H<br />
<strong>OS</strong>_SEM_ACCEPT_EN<br />
<strong>OS</strong>SemCreate()<br />
<strong>OS</strong>SemDel()<br />
<strong>OS</strong>_SEM_DEL_EN<br />
<strong>OS</strong>SemPend()<br />
<strong>OS</strong>SemPost()<br />
<strong>OS</strong>SemQuery()<br />
<strong>OS</strong>_SEM_QUERY_EN<br />
Embedded System Lab. <strong>II</strong> 71
Semaphore Management (Cont’d)<br />
• Task, ISR, Semaphore <br />
Embedded System Lab. <strong>II</strong> 72
Semaphore Management (Cont’d)<br />
• Semaphore / <strong>OS</strong>SemCreate()<br />
Semaphore , 0 ~ 65535<br />
Semaphore .<br />
Semaphore <br />
Semaphore 0 .<br />
Semaphore <br />
1 .<br />
<br />
‣ cnt: Semaphore <br />
Embedded System Lab. <strong>II</strong> 73
Semaphore Management (Cont’d)<br />
• <strong>OS</strong>SemCreate() ECB<br />
Embedded System Lab. <strong>II</strong> 74
Semaphore Management (Cont’d)<br />
• Semaphore / <strong>OS</strong>SemDel()<br />
Semaphore Semaphore Task<br />
.<br />
• Semaphore / <strong>OS</strong>SemPend()<br />
Semaphore .<br />
<br />
‣ Pevent: Semaphore ECB .<br />
‣ Timeout: (Clock Tick ).<br />
‣ Err: .<br />
Embedded System Lab. <strong>II</strong> 75
Semaphore Management (Cont’d)<br />
• Semaphore / <strong>OS</strong>SemPost()<br />
Semaphore .<br />
<br />
‣ Pevent: Semaphore ECB .<br />
• Semaphore / <strong>OS</strong>SemAccept()<br />
Semaphore Task <br />
Semaphore <br />
<br />
‣ Pevent: Semaphore ECB <br />
Embedded System Lab. <strong>II</strong> 76
Semaphore Management (Cont’d)<br />
• Semaphore / <strong>OS</strong>SemQuery()<br />
Semaphore ECB .<br />
<br />
‣ Pevent: Semaphore ECB <br />
‣ Pdata: Semaphore <br />
Embedded System Lab. <strong>II</strong> 77
Mutual Exclusive Semaphore<br />
Embedded System Lab. <strong>II</strong>
Mutual Exclusive Semaphore<br />
• Mutual Exclusive Semaphore<br />
Task .<br />
Mutex MicroC/<strong>OS</strong>-<strong>II</strong> Semaphore <br />
Binary Semaphore.<br />
<br />
Mutex configuration constants in <strong>OS</strong>_CFG.H<br />
<strong>uC</strong>/<strong>OS</strong>-<strong>II</strong> Mutex Service<br />
<strong>OS</strong>MutexAccept()<br />
Enabled when set to 1 in <strong>OS</strong>_CFG.H<br />
<strong>OS</strong>_MUTEX_ACCEPT_EN<br />
<strong>OS</strong>MutexCreate()<br />
<strong>OS</strong>MutexDel()<br />
<strong>OS</strong>_MUTEX_DEL_EN<br />
<strong>OS</strong>MutexPend()<br />
<strong>OS</strong>MutexPost()<br />
<strong>OS</strong>MutexQuery()<br />
<strong>OS</strong>_MUTEX_QUERY_EN<br />
Embedded System Lab. <strong>II</strong> 79
Event Flags Management<br />
Embedded System Lab. <strong>II</strong>
Event Flags Management<br />
• Event Flags Management<br />
Event Flags 2 .<br />
‣ <br />
‣ Task <br />
Event Flags Task <br />
<br />
Event Flags configuration constants in <strong>OS</strong>_CFG.H<br />
<strong>uC</strong>/<strong>OS</strong>-<strong>II</strong> Event Flags Service<br />
<strong>OS</strong>FlagAccept()<br />
Enabled when set to 1 in <strong>OS</strong>_CFG.H<br />
<strong>OS</strong>_FLAG_ACCEPT_EN<br />
<strong>OS</strong>FlagCreate()<br />
<strong>OS</strong>FlagDel()<br />
<strong>OS</strong>_FLAG_DEL_EN<br />
<strong>OS</strong>FlagPend()<br />
<strong>OS</strong>FlagPost()<br />
<strong>OS</strong>FlagQuery()<br />
<strong>OS</strong>_FLAG_QUERY_EN<br />
Embedded System Lab. <strong>II</strong> 81
Event Flags Management (Cont’d)<br />
• Event Flags Service<br />
<br />
<strong>OS</strong>FlagCreat( )<br />
<strong>OS</strong>FlagDel( )<br />
<strong>OS</strong>FlagPost( )<br />
<strong>OS</strong>FlagAccept( )<br />
<strong>OS</strong>FlagPend( )<br />
<strong>OS</strong>FlagQuery( )<br />
<br />
ISR<br />
<strong>OS</strong>FlagPost( ) <strong>OS</strong>FlagAccept( )<br />
<strong>OS</strong>FlagQuery( )<br />
ISR<br />
Embedded System Lab. <strong>II</strong> 82
Event Flags Management (Cont’d)<br />
• Event Flags <br />
Event Flags Group <strong>Structure</strong><br />
typedef struct { /* Event Flag Group */<br />
INT8U <strong>OS</strong>FlagType; /* Should be set to <strong>OS</strong>_EVENT_TYPE_FLAG */<br />
void *<strong>OS</strong>FlagWaitList; /* Pointer to first NODE of task waiting on event flag*/<br />
<strong>OS</strong>_FLAGS <strong>OS</strong>FlagFlags; /* 8, 16 or 32 bit flags */<br />
} <strong>OS</strong>_FLAG_GRP;<br />
Event Flags Group Node <strong>Structure</strong><br />
typedef struct { /* Event Flag Wait List Node */<br />
void *<strong>OS</strong>FlagNodeNext; /* Pointer to next NODE in wait list */<br />
void *<strong>OS</strong>FlagNodePrev; /* Pointer to previous NODE in wait list */<br />
void *<strong>OS</strong>FlagNodeTCB; /* Pointer to TCB of waiting task */<br />
void *<strong>OS</strong>FlagNodeFlagGrp; /* Pointer to Event Flag Group */<br />
<strong>OS</strong>_FLAGS <strong>OS</strong>FlagNodeFlags; /* Event flag to wait on */<br />
INT8U <strong>OS</strong>FlagNodeWaitType; /* Type of wait: */<br />
} <strong>OS</strong>_FLAG_NODE;<br />
Embedded System Lab. <strong>II</strong> 83
Event Flags Management (Cont’d)<br />
• Event Flags Group, Event Flags Node, TCB <br />
<strong>OS</strong>_FLAG_GRP<br />
<strong>OS</strong>_FLAG_NODE<br />
<br />
<br />
<br />
<strong>OS</strong>_EVENT_<br />
TYPE_FLAG<br />
NULL<br />
AND OR<br />
<br />
<br />
<br />
AND OR<br />
<br />
<br />
<br />
NULL<br />
<br />
<br />
Embedded System Lab. <strong>II</strong> 84
Event Flags Management (Cont’d)<br />
• Event Flags Group / <strong>OS</strong>FlagsCreate()<br />
Event Flags Group .<br />
• Event Flags Group / <strong>OS</strong>FlagsDel()<br />
Event Flags Group .<br />
• Event / <strong>OS</strong>FlagPend()<br />
Event Flags Group .<br />
• Event Flags Group / <strong>OS</strong>FlagPost()<br />
Event Flags Group .<br />
• Event Flags Group / <strong>OS</strong>FlagQuery()<br />
Event Flags Group .<br />
Embedded System Lab. <strong>II</strong> 85
Message Mailbox<br />
Embedded System Lab. <strong>II</strong>
Message Mailbox Management<br />
• Message Mailbox<br />
Message Mailbox MicroC/<strong>OS</strong>-<strong>II</strong> Kernel Object, Task<br />
ISR Task .<br />
Mailbox configuration constants in <strong>OS</strong>_CFG.H<br />
MicroC/<strong>OS</strong>-<strong>II</strong> Mail Box Service<br />
<strong>OS</strong>MboxAccept()<br />
Enabled when set to 1 in <strong>OS</strong>_CFG.H<br />
<strong>OS</strong>_MBOX_ACCEPT_EN<br />
<strong>OS</strong>MboxCreate()<br />
<strong>OS</strong>MboxDel()<br />
<strong>OS</strong>_MBOX_DEL_EN<br />
<strong>OS</strong>MboxPend()<br />
<strong>OS</strong>MboxPost()<br />
<strong>OS</strong>MboxPostOpt()<br />
<strong>OS</strong>MboxQuery()<br />
<strong>OS</strong>_MBOX_P<strong>OS</strong>T_EN<br />
<strong>OS</strong>_MBOX_P<strong>OS</strong>T_OPT_EN<br />
<strong>OS</strong>_MBOX_QUERY_EN<br />
Embedded System Lab. <strong>II</strong> 87
Message Mailbox Management (Cont’d)<br />
• Task, ISR, Mailbox <br />
Embedded System Lab. <strong>II</strong> 88
Message Mailbox Management (Cont’d)<br />
• Mailbox / <strong>OS</strong>MboxCreate()<br />
Mailbox , Mailbox<br />
NULL .<br />
NULL <br />
Mailbox .<br />
<br />
‣ Msg: Mailbox <br />
Embedded System Lab. <strong>II</strong> 89
Message Mailbox Management (Cont’d)<br />
• <strong>OS</strong>MboxCreate() ECB<br />
Embedded System Lab. <strong>II</strong> 90
Message Mailbox Management (Cont’d)<br />
• Mailbox / <strong>OS</strong>MboxDel()<br />
Mailbox Mailbox Task <br />
.<br />
• Mailbox / <strong>OS</strong>MboxPend()<br />
Mailbox .<br />
<br />
‣ Pevent: Mailbox ECB <br />
‣ Timeout: (Clock Tick )<br />
‣ err: <br />
Embedded System Lab. <strong>II</strong> 91
Message Mailbox Management (Cont’d)<br />
• Mailbox / <strong>OS</strong>MboxPost()<br />
Mailbox .<br />
<br />
‣ Pevent: Mailbox ECB <br />
‣ Msg: <br />
• Mailbox / <strong>OS</strong>MboxPostOpt()<br />
Mailbox Task Broadcast <br />
<br />
‣ Pevent: Mailbox ECB <br />
‣ Timeout: (Clock Tick )<br />
Embedded System Lab. <strong>II</strong> 92
Message Mailbox Management (Cont’d)<br />
• / <strong>OS</strong>MboxAccept()<br />
Task .<br />
<br />
‣ Pevent: Mailbox ECB <br />
• Mailbox / <strong>OS</strong>MboxQuery()<br />
Mailbox ECB .<br />
<br />
‣ Pevent: Mailbox ECB <br />
‣ Pdata: Message Mailbox <br />
Embedded System Lab. <strong>II</strong> 93
Message Queue Mailbox<br />
Embedded System Lab. <strong>II</strong>
Message Queue Management<br />
• Message Queue<br />
Message Queue Task ISR Task<br />
Kernel Object., <br />
‘’ .<br />
Message queue configuration constants in <strong>OS</strong>_CFG.H.<br />
<strong>uC</strong>/<strong>OS</strong>-<strong>II</strong> Event Flag Service<br />
<strong>OS</strong>QAccept()<br />
Enabled when set to 1 in <strong>OS</strong>_CFG.H<br />
<strong>OS</strong>_Q_ACCEPT_EN<br />
<strong>OS</strong>QCreate()<br />
<strong>OS</strong>QDel()<br />
<strong>OS</strong>QFlush()<br />
<strong>OS</strong>_Q_DEL_EN<br />
<strong>OS</strong>_Q_FLUSH_EN<br />
<strong>OS</strong>QPend()<br />
<strong>OS</strong>QPost()<br />
<strong>OS</strong>QPostFront()<br />
<strong>OS</strong>QPostOpt()<br />
<strong>OS</strong>QQuery()<br />
<strong>OS</strong>_Q_P<strong>OS</strong>T_EN<br />
<strong>OS</strong>_Q_P<strong>OS</strong>T_FRONT_EN<br />
<strong>OS</strong>_Q_P<strong>OS</strong>T_OPT_EN<br />
<strong>OS</strong>_Q_QUERY_EN<br />
Embedded System Lab. <strong>II</strong> 95
Message Queue Management (Cont’d)<br />
• Task, ISR, Message Queue <br />
Embedded System Lab. <strong>II</strong> 96
Message Queue Management (Cont’d)<br />
• Message Queue <strong>Structure</strong><br />
Embedded System Lab. <strong>II</strong> 97
Message Queue Management (Cont’d)<br />
• List of free queue control blocks<br />
Embedded System Lab. <strong>II</strong> 98
Message Queue Management (Cont’d)<br />
• A message queue as a circular buffer of pointers<br />
Embedded System Lab. <strong>II</strong> 99
Message Queue Management (Cont’d)<br />
• Message Queue / <strong>OS</strong>QCreate()<br />
Message Queue , Message Queue <br />
<strong>OS</strong>QCreate() .<br />
<br />
‣ Start: <br />
void .<br />
void *MessageStorage[size]<br />
‣ Size: <br />
• Message Queue / <strong>OS</strong>QDel ()<br />
Message Queue , Message Queue <br />
Task .<br />
Embedded System Lab. <strong>II</strong> 100
Message Queue Management (Cont’d)<br />
• Message Queue / <strong>OS</strong>QPend()<br />
Message Queue .<br />
<br />
‣ Pevent: ECB <br />
‣ Timeout: (Clock Tick )<br />
‣ Err: <br />
• FIFO / <strong>OS</strong>QPost()<br />
FIFO Message Queue .<br />
<br />
‣ Pevent: ECB <br />
‣ Msg: . NULL .<br />
Embedded System Lab. <strong>II</strong> 101
Message Queue Management (Cont’d)<br />
• LIFO / <strong>OS</strong>QPostFront()<br />
LIFO Message Queue .<br />
<br />
‣ Pevent: ECB <br />
‣ Msg: . NULL .<br />
• FIFO LIFO / <strong>OS</strong>QPostOpt()<br />
<strong>OS</strong>QPostOpt() <strong>OS</strong>QPost() <strong>OS</strong>QPostFront() <br />
.<br />
Task Broadcast .<br />
Embedded System Lab. <strong>II</strong> 102
Message Queue Management (Cont’d)<br />
• / <strong>OS</strong>QAccept()<br />
.<br />
<strong>OS</strong>QPend() Task <br />
.<br />
<br />
‣ Pevent: ECB <br />
• Message Queue / <strong>OS</strong>QFlush()<br />
Message Queue , .<br />
• Message Queue / <strong>OS</strong>QQuery()<br />
Message Queue .<br />
<br />
• Pevent: ECB <br />
• Pdata: Message Queue <br />
Embedded System Lab. <strong>II</strong> 103
Message Queue Management (Cont’d)<br />
• Message Queue <br />
Embedded System Lab. <strong>II</strong> 104
Memory Management<br />
Embedded System Lab. <strong>II</strong>
Memory Management<br />
• Memory Management<br />
malloc()<br />
free() . .<br />
MicroC/<strong>OS</strong>-<strong>II</strong> malloc() free() <br />
<br />
.<br />
Memory management configuration constants in <strong>OS</strong>_CFG.H<br />
<strong>uC</strong>/<strong>OS</strong>-<strong>II</strong> Memory Service<br />
Enabled when set to 1 in <strong>OS</strong>_CFG.H<br />
<strong>OS</strong>MemCreate()<br />
<strong>OS</strong>MemGet()<br />
<strong>OS</strong>MemPut()<br />
<strong>OS</strong>MemQuery()<br />
<strong>OS</strong>_MEM_QUERY_EN<br />
Embedded System Lab. <strong>II</strong> 106
Memory Queue Management (Cont’d)<br />
• Memory Control Block<br />
Memory Control Block Data <strong>Structure</strong><br />
Typedef struct {<br />
void *<strong>OS</strong>MemAddr; // <br />
void *<strong>OS</strong>MemFreeList; // <br />
INT32U <strong>OS</strong>MemBlkSize; // <br />
INT32U <strong>OS</strong>MemNBlks; // <br />
INT32U <strong>OS</strong>MemNFree; // <br />
} <strong>OS</strong>_MEM;<br />
Embedded System Lab. <strong>II</strong> 107
Memory Queue Management (Cont’d)<br />
• Memory Partition<br />
Memory Partition<br />
Memory Partition<br />
Embedded System Lab. <strong>II</strong> 108
Memory Queue Management (Cont’d)<br />
Free Memory Control Block List<br />
Embedded System Lab. <strong>II</strong> 109
Memory Queue Management (Cont’d)<br />
• / <strong>OS</strong>MemCreate()<br />
<br />
32 100 <br />
<strong>OS</strong>_MEM *CommTxBuf;<br />
INT8U CommTxPart[100][32];<br />
void main (void)<br />
{<br />
INT8U err;<br />
<strong>OS</strong>Init();<br />
.<br />
.<br />
CommTxBuf = <strong>OS</strong>MemCreate(CommTxPart, 100, 32, &err);<br />
.<br />
.<br />
<strong>OS</strong>Start();<br />
}<br />
Embedded System Lab. <strong>II</strong> 110
Memory Queue Management (Cont’d)<br />
• <strong>OS</strong>MemCreate() <br />
Embedded System Lab. <strong>II</strong> 111
Memory Queue Management (Cont’d)<br />
• / <strong>OS</strong>MemGet()<br />
.<br />
<br />
‣ Pmem: <br />
‣ Err: <br />
• / <strong>OS</strong>MemPut()<br />
<br />
.<br />
<br />
‣ Pmem: <br />
‣ Pblk: <br />
Embedded System Lab. <strong>II</strong> 112
Memory Queue Management (Cont’d)<br />
• / <strong>OS</strong>MemQuery()<br />
.<br />
<br />
‣ Pmem: <br />
‣ Pdata: <br />
Embedded System Lab. <strong>II</strong> 113
Memory Queue Management (Cont’d)<br />
• <br />
Embedded System Lab. <strong>II</strong> 114
MicroC/<strong>OS</strong><br />
/<strong>OS</strong>-<strong>II</strong> Porting<br />
Embedded System Lab. <strong>II</strong>
MicroC/<strong>OS</strong><br />
/<strong>OS</strong>-<strong>II</strong> Porting<br />
• Porting<br />
Real Time kernel <br />
.<br />
, MicroC/<strong>OS</strong>-<strong>II</strong> .<br />
• Porting MicroC/<strong>OS</strong>-<strong>II</strong><br />
MicroC/<strong>OS</strong>-<strong>II</strong> C .<br />
C .<br />
• MicroC/<strong>OS</strong>-<strong>II</strong> <br />
C<br />
C , <br />
<br />
<br />
<br />
<br />
Embedded System Lab. <strong>II</strong> 116
MicroC/<strong>OS</strong><br />
/<strong>OS</strong>-<strong>II</strong> Porting (Cont’d)<br />
<strong>uC</strong>/<strong>OS</strong>-<strong>II</strong> File <strong>Structure</strong><br />
Embedded System Lab. <strong>II</strong> 117
MicroC/<strong>OS</strong><br />
/<strong>OS</strong>-<strong>II</strong> Porting (Cont’d)<br />
<br />
<br />
<br />
<strong>OS</strong>_CPU.H<br />
#define , <br />
<strong>OS</strong>_CPU_A.ASM<br />
<strong>OS</strong>_CPU_C.C<br />
C (Low-Level)<br />
<br />
.<br />
C <br />
C <br />
<br />
<br />
<br />
<strong>OS</strong>_CFG.H<br />
MicroC/<strong>OS</strong>-<strong>II</strong> <br />
INCLUDES.H<br />
C , <br />
.<br />
Embedded System Lab. <strong>II</strong> 118
MicroC/<strong>OS</strong><br />
/<strong>OS</strong>-<strong>II</strong> Porting (Cont’d)<br />
• <strong>OS</strong>_CPU.H<br />
, C <br />
.<br />
‣ Ex) 16 , Integer 16 32<br />
, Integer 32 .<br />
typedef unsigned char BOOLEAN;<br />
typedef unsigned char INT8U; /* 8 */<br />
typedef signed char INT8S; /* 8 */<br />
typedef unsigned int INT16U; /* 16 */<br />
typedef signed int INT16S; /* 16 */<br />
typedef unsigned long INT32U; /* 32 */<br />
typedef signed long INT32S; /* 32 */<br />
typedef float FP32; /* */<br />
typedef double FP64; /* */<br />
typedef unsigned int <strong>OS</strong>_STK; /* 16 */<br />
Embedded System Lab. <strong>II</strong> 119
MicroC/<strong>OS</strong><br />
/<strong>OS</strong>-<strong>II</strong> Porting (Cont’d)<br />
• <strong>OS</strong>_CPU.H<br />
<strong>OS</strong>_ENTER_CRITICAL() <strong>OS</strong>_EXIT_CRITICAL()<br />
‣ MicroC/<strong>OS</strong>-<strong>II</strong> Critical Section <br />
<br />
‣ <strong>OS</strong>_CPU.H <strong>OS</strong>_ENTER_CRITICAL() <strong>OS</strong>_EXIT_CRITICAL() <br />
.<br />
{<br />
}<br />
.<br />
<strong>OS</strong>_ENTER_CRITICAL();<br />
/* MicroC/<strong>OS</strong>-<strong>II</strong> Critical Section Code */<br />
<strong>OS</strong>_EXIT_CRITICAL();<br />
.<br />
Embedded System Lab. <strong>II</strong> 120
MicroC/<strong>OS</strong><br />
/<strong>OS</strong>-<strong>II</strong> Porting (Cont’d)<br />
• <strong>OS</strong>_ENTER_CRITICAL() <strong>OS</strong>_EXIT_CRITICAL()<br />
<strong>OS</strong>_CRITICAL_METHOD == 1<br />
‣ <strong>OS</strong>_ENTER_CRITICAL(): <br />
‣ <strong>OS</strong>_EXIT_CRITICA(): <br />
‣ : MicroC/<strong>OS</strong>-<strong>II</strong> <br />
.<br />
#define <strong>OS</strong>_ENTER_CRITICAL() disable_int() /* */<br />
#define <strong>OS</strong>_EXIT_CRITICAL() enable_int() /* */<br />
<strong>OS</strong>_CRITICAL_METHOD == 2<br />
‣ <strong>OS</strong>_ENTER_CRITICAL(): <br />
‣ <strong>OS</strong>_EXIT_CRITICAL(): <br />
#define <strong>OS</strong>_ENTER_CRITICAL() \<br />
asm(“ PUSH PSW”); \<br />
asm(“ DI”);<br />
#define <strong>OS</strong>_EXIT_CRITICAL() \<br />
asm(“POP PSW”);<br />
Embedded System Lab. <strong>II</strong> 121
MicroC/<strong>OS</strong><br />
/<strong>OS</strong>-<strong>II</strong> Porting (Cont’d)<br />
• <strong>OS</strong>_ENTER_CRITICAL() <strong>OS</strong>_EXIT_CRITICAL()<br />
<strong>OS</strong>_CRITICAL_METHOD == 3<br />
‣ PSW C <br />
.<br />
#define <strong>OS</strong>_ENTER_CRITICAL() \<br />
cpu_sr = get_processor_psw();<br />
disalble_interrupts();<br />
#define <strong>OS</strong>_EXIT_CRITICAL() \<br />
set_processor_psw(cpu_sr);<br />
Embedded System Lab. <strong>II</strong> 122
MicroC/<strong>OS</strong><br />
/<strong>OS</strong>-<strong>II</strong> Porting (Cont’d)<br />
• <strong>OS</strong>_CPU_C.C<br />
C <br />
, 10 C <br />
<strong>OS</strong>TaskStkInit() .<br />
<strong>OS</strong>TaskStkInit()<br />
<strong>OS</strong>TaskCreateHook()<br />
<strong>OS</strong>TaskDelHook()<br />
<strong>OS</strong>TaskSwHook()<br />
<strong>OS</strong>TaskIdleHook()<br />
<strong>OS</strong>TaskStatHook()<br />
<strong>OS</strong>TimeTickHook()<br />
<strong>OS</strong>InitHookBegin()<br />
<strong>OS</strong>InitHookEnd()<br />
<strong>OS</strong>TCBInitHook()<br />
Embedded System Lab. <strong>II</strong> 123
MicroC/<strong>OS</strong><br />
/<strong>OS</strong>-<strong>II</strong> Porting (Cont’d)<br />
• <strong>OS</strong>TaskStkInit()<br />
<strong>OS</strong>TaskStkInit() <strong>OS</strong>TaskCreate() <strong>OS</strong>TaskCreateExt()<br />
<br />
.<br />
<strong>OS</strong>_STK *<strong>OS</strong>TaskStkInit ( void (*task) (void *pd), void *pdata, <strong>OS</strong>_STK *ptos, INT16U opt )<br />
{<br />
(1) (pdata) <br />
(2) ISR ;<br />
(3) .<br />
(4) .<br />
}<br />
<strong>OS</strong>TaskStkInit() <br />
Embedded System Lab. <strong>II</strong> 124
MicroC/<strong>OS</strong><br />
/<strong>OS</strong>-<strong>II</strong> Porting (Cont’d)<br />
• <strong>OS</strong>_CPU_A.ASM<br />
<br />
, 4 .<br />
, 4 <br />
C .<br />
<strong>OS</strong>StartHighRdy()<br />
<strong>OS</strong>CtxSw()<br />
<strong>OS</strong>IntCtxSw()<br />
<strong>OS</strong>TickISR()<br />
Embedded System Lab. <strong>II</strong> 125
MicroC/<strong>OS</strong><br />
/<strong>OS</strong>-<strong>II</strong> Porting (Cont’d)<br />
• <strong>OS</strong>StartHighRdy()<br />
<strong>OS</strong>StartHighRdy() <strong>OS</strong>Start() <br />
Task .<br />
.<br />
void <strong>OS</strong>StartHighRdy()<br />
{<br />
(1) <strong>OS</strong>TaskSwHook() ;<br />
(2) <strong>OS</strong>Running = TRUE;<br />
(3) Task :<br />
Stack pointer = <strong>OS</strong>TCBHighRdy-><strong>OS</strong>TCBStkPtr;<br />
(4) Task ;<br />
(5) ;<br />
}<br />
Embedded System Lab. <strong>II</strong> 126
MicroC/<strong>OS</strong><br />
/<strong>OS</strong>-<strong>II</strong> Porting (Cont’d)<br />
• <strong>OS</strong>CtxSw()<br />
Task <br />
TRAP . ISR, TRAP <br />
<strong>OS</strong>CtxSw() .<br />
<strong>OS</strong>CtxSw() TaskTask <br />
MicroC/<strong>OS</strong>-<strong>II</strong> .<br />
Void <strong>OS</strong>CtxSw(void)<br />
{<br />
(1) ;<br />
(2) Task Task TCB <br />
<strong>OS</strong>TCBCur-><strong>OS</strong>TCBStkPtr = ;<br />
(3) <strong>OS</strong>TaskSwHook();<br />
(4) <strong>OS</strong>TCBCur = <strong>OS</strong>TCBHighRdy;<br />
(5) <strong>OS</strong>PrioCur = <strong>OS</strong>PrioHighRdy;<br />
(6) Task :<br />
= <strong>OS</strong>TCBHighRdy-><strong>OS</strong>TCBStkPtr;<br />
(7) Task ;<br />
(8) ;<br />
}<br />
Embedded System Lab. <strong>II</strong> 127
MicroC/<strong>OS</strong><br />
/<strong>OS</strong>-<strong>II</strong> Porting (Cont’d)<br />
• <strong>OS</strong>TickISR()<br />
MicroC/<strong>OS</strong>-<strong>II</strong> <br />
.<br />
Void <strong>OS</strong>TickISR(void)<br />
{<br />
(1) ;<br />
(2) <strong>OS</strong>IntEnter() <strong>OS</strong>IntNesting 1 ;<br />
(3) if( <strong>OS</strong>IntNesting == 1) {<br />
<strong>OS</strong>TCBCur-><strong>OS</strong>TCBStkPtr = ;<br />
}<br />
(4) ;<br />
(5) ( );<br />
(6) <strong>OS</strong>TimeTick();<br />
(7) <strong>OS</strong>IntExit();<br />
(8) ;<br />
(9) ;<br />
}<br />
Embedded System Lab. <strong>II</strong> 128
MicroC/<strong>OS</strong><br />
/<strong>OS</strong>-<strong>II</strong> Porting (Cont’d)<br />
• <strong>OS</strong>IntCtxSw()<br />
<strong>OS</strong>IntCtxSw() <strong>OS</strong>IntExit() ISR <br />
Void <strong>OS</strong>IntCtxSw(void)<br />
{<br />
(1) <strong>OS</strong>TaskSwHook() ;<br />
(2) <strong>OS</strong>TCBCur = <strong>OS</strong>TCBHighRdy();<br />
(3) <strong>OS</strong>PrioCur = <strong>OS</strong>PrioHighRdy();<br />
(4) Task :<br />
= <strong>OS</strong>TCBHighRdy-><strong>OS</strong>TCBStkPtr;<br />
(5) Task ;<br />
(6) <br />
}<br />
Embedded System Lab. <strong>II</strong> 129