28.12.2014 Views

uC/OS-II (Structure) - 경희대학교

uC/OS-II (Structure) - 경희대학교

uC/OS-II (Structure) - 경희대학교

SHOW MORE
SHOW LESS

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

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!