ucos-ii kernel structure

43
uCOSII Kernel Structure 936317 許許許 936719 許許許 uCOSII Kernel Memory Management

Upload: vishal-patel

Post on 22-Nov-2014

346 views

Category:

Documents


8 download

TRANSCRIPT

Page 1: uCOS-II Kernel Structure

uCOSII Kernel Structure936317 許哲宇 936719 丁俊宏

uCOSII KernelMemory Management

OUTLINE Introduction Kernel Structure Overview Mutual Exclusion Task Management Interrupts Clock ticks uCOSII initialization

Introduction microCOS-II The Real-Time Kernel is a highly portable ROMable very scalable preemptive real-time multitasking kernel (RTOS) for microprocessors and microcontrollers microCOS-II can manage up to 63 application tasks Over 100 microprocessor ports are available to DOWNLOAD Reference httpwwwucos-iicom Jean J Labrosse

About microCOS-II

Structure Overview

Mutual Exclusion Critical sectiondisable interrupt OSSchedLock()disable scheduling OSSemPend()semaphore

Critical section Critical Section

Shared resource region should implement mutual exclusion

Disable InterruptOS_ENTER_CRITICAL()

Enable InterruptOS_EXIT_CRITICAL()

Defined in OS_CPUH

void Function(void) OS_ENTER_CRITICAL() Operate shared data OS_EXIT_CRITICAL()

OSSchedLock()void Function (void) OSSchedLock()

You can access shared data in here (interrupts are recognized)

OSSchedUnlock()

OSSemPend() OS_EVENT SharedDataSemvoid Function (void) INT8U err OSSemPend(SharedDataSem 0 amperr) You can access shared data in here (interrupts are recognized) OSSemPost(SharedDataSem)

Task Management Task introduction Task format Task scheduling

Task introduction Task is a single instance of program Task thinks it has all CPU control itself Task has its own stack and own set of CPU registers backup in its stack Task is assigned a unique priority (highest 0 ~ lowest 63) Task is an infinite loop and never returns 1048698 Task has states microCOS-II saves task records in Task Control Block(TCB)

Task format Task is an infinite loop Return type is void because nothing

will be returned Parameter is a void pointer type so

that you can pass anything you want

void YourTask (void pdata) for () User Code Text uCOS-II System Call User Code Text

OSMboxPend() uCOS-II System Call OSQPend() OSSemPend() OSTaskDel(OS_PRIO_SELF) OSTaskSuspend(OS_PRIO_SELF) OSTimeDly() OSTimeDlyHMSM()

Task scheduling Task State Transfer Diagram (TSTD) Task Control Block (TCB) Task Scheduler Task Pending Task Creation Task Deletion

TSTD

diams Running ndash task has control of the processor and executing its job diams Ready ndash task is ready to execute but its priority is less than the running task diams Waiting ndash task requires the occurrence of an event to continue diams ISR ndash task is paused because the processor is handling an interrupt diams Dormant ndash task resides in memory but not seen by the scheduler

TCB A TCB contains task stack pointer priority

number delay time value task state and some useful information for this task

OSTCBStkPtr OSTCBExtPtr OSTCBStkBottom OSTCBStkSize OSTCBOpt OSTCBId OSTCBNext OSTCBPrev OSTCBEventPtr OSTCBMsg OSTCBDly OSTCBStat OSTCBPrio OSTCBX OSTCBY OSTCBBitX OSTCBBitY OSTCBDelReq

TCB (cont)StkPtr ExtPtr StkBottom StkSize Opt Id Next Prev EventPtr Msg Dly Stat Prio X Y BitX BitY DelReq

Stack

Event Msg

NextPrev NextPrev NextPrevOSTCBList

00

Delay timeState

Delete request

Priority information

TCB (cont)

OSTCBFReeListOSTCBtbl[OS_MAX_TASKS+OS_N_SYS_TASK]

Task Scheduling amp Context Switch In microCOS-II task scheduling if performed on following conditions diams A task is createddeleted diams A task changes state minus On interrupt exit minus On post signal minus On pending event minus On task suspension If the scheduler chooses a new task to run context switch occurs

Task Scheduler Preemptive Kernel Not support time quantum

Task Scheduler (cont) Principle select the highest priority

task from Ready List How to select the priority task from a

Ready List

Ready List PriorityGet the highest priority

Modify priority state

Double-linked List with

priority field

TASK 1

NEXTPREV

Priority

TASK 2

NEXTPREV

Priority

TASK 3

NEXTPREV

Priority

TASK 4

NEXTPREV

Priority0

0OSTCBList

Task Scheduler (cont)TASK 1

NEXTPREV

Priority

TASK 2

NEXTPREV

Priority

TASK 3

NEXTPREV

Priority

TASK 4

NEXTPREV

Priority0

0OSTCBList

Method 1Get the highest priority

Modify priority state

Get the First one in the Ready List Time Complexity O(1)

Selection sort for each changeTime Complexity O(N)

Task Scheduler (cont)TASK 1

NEXTPREV

Priority

TASK 2

NEXTPREV

Priority

TASK 3

NEXTPREV

Priority

TASK 4

NEXTPREV

Priority0

0OSTCBList

Method 2Get the highest priority

Modify priority state

Use a Ready Table a Priority TCB Table and one variable to selectTime Complexity O(1)

Maintain a Ready Table a Priority TCB Tabke and one variableTime Complexity O(1)

Task Scheduler (cont)

TASK 1

NEXTPREV

Priority

TASK 2

NEXTPREV

Priority

TASK 3

NEXTPREV

Priority

TASK 4

NEXTPREV

Priority0

0OSTCBList

Task Scheduler (cont)Get the highest priority

0 0 0 0 0 1 0 00 0 0 0 0 0 0 00 0 1 1 0 1 0 00 0 0 0 0 0 0 00 1 0 0 0 0 1 01 0 0 0 0 0 1 10 0 0 0 0 0 0 01 0 0 0 0 0 0 0

1OSRdyGrp

0101101

TASK 1

NEXTPREV

Priority

TASK 2

NEXTPREV

Priority

TASK 3

NEXTPREV

Priority

TASK 4

NEXTPREV

Priority0

0OSTCBList

Task Scheduler (cont)Modify priority stateOSRdyGrp |= OSMapTbl[prio gtgt 3]OSRdyTbl[prio gtgt 3] |= OSMapTbl[prio amp 0x07]

Task Scheduler (cont)0 0 0 0 0 1 0 00 0 0 0 0 0 0 00 0 1 1 0 1 0 00 0 0 0 0 0 0 00 1 0 0 0 0 1 01 0 0 0 0 0 1 10 0 0 0 0 0 0 01 0 0 0 0 0 0 0

1 0 1 1 0 1 0 1

0 0 0 1 1 1 1 1

OSRdyGrp

Task Priority = 31

3

1

7

1

31

OSSched(void)void OSSched (void) INT8U y OS_ENTER_CRITICAL() if ((OSLockNesting | OSIntNesting) == 0) y = OSUnMapTbl[OSRdyGrp] OSPrioHighRdy = (INT8U)((y ltlt 3) + OSUnMapTbl[OSRdyTbl[y]]) if (OSPrioHighRdy = OSPrioCur) OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy] OSCtxSwCtr++ OS_TASK_SW() OS_EXIT_CRITICAL()

Task Pending Task pending occur when interrupt

raise When waiting some event message

or semaphore When one task delays itself When one task is preempted by

higher priority task

OSMBoxPend()OSQPend()OSSemPend()

OSTaskSuspend()OSTimeDly()OSTimeDlyHMSM()

Task Creation OSTaskCreate() OSTaskCreateExt() Create task before OSStart() or in Running state But not permit to create task in ISR

OSTaskCreate() Check priority

number

Check OSTCBPrioTbl OSTaskStkInit()

OSTCBInit() OSTaskCtr++ OSSched()

if (OSRunning)

OSStackCheck

OSTaskCreateExt() Check priority

number

Check OSTCBPrioTbl OSTaskStkInit()

OSTCBInit() OSTaskCtr++ OSSched()

if (OSRunning)

Task Deletion

TASK 1

NEXTPREV

Priority

TASK 2

NEXTPREV

Priority

TASK 3

NEXTPREV

Priority

TASK 4

NEXTPREV

Priority0

0OSTCBList

Interrupts Interrupt Service RoutineStep1save CPU registersStep2call OSIntEnter () or OSIntNesting add one directlyStep3execution the service codeStep4call OSIntExit() Step5restore CPU registersStep6call interrupt return instruction

Context switch

Clock ticks 10-100Hz void OSTickISR(void) OSTimeTick() OSTimeTick() execution time is in proportion to number of Task TASK 1

NEXTPREV OSTCBDly

TASK 2NEXTPREV OSTCBDly

TASK 3NEXTPREV OSTCBDly

TASK 4NEXTPREV OSTCBDly 0

0OSTCBList

OSTimeTick() if (ptcb-gtOSTCBDly = 0) if (--ptcb-gtOSTCBDly == 0) if ((ptcb-gtOSTCBStat amp OS_STAT_SUSPEND)) OSRdyGrp |= ptcb-gtOSTCBBitY OSRdyTbl[ptcb-gtOSTCBY] |= ptcb-gtOSTCBBitX else ptcb-gtOSTCBDly = 1

Time Management Using clock tick to implement time delays and timeouts OSTimeDly() OSTimeDlyHMSM() OSTimeDlyResume() OSTimeGet() OSTimeSet() Defined in OS_TimeC

OSTimeDly()void OSTimeDly (INT16U ticks) if (ticks gt 0)

OS_ENTER_CRITICAL() if ((OSRdyTbl[OSTCBCur-gtOSTCBY] amp= ~OSTCBCur-gtOSTCBBitX) == 0) OSRdyGrp amp= ~OSTCBCur-gtOSTCBBitY OSTCBCur-gtOSTCBDly = ticks

OS_EXIT_CRITICAL() OSSched()

uCOSII initialization OSIint() initialize all variables and data structure for system Defined in OS_COREC

OSPrioCur = 0OSPrioHighRdy = 0OSTCBCur = NULLOSTCBHighRdy = OLOSTime = 0OSIntNesting = 0OSLockNesting = 0 OSCtxSwCtr = 0OSTaskCtr = 2OSRunning = FALSEOSCPUUsage = 0OSIdleCtrMax = 0L OSIdleCtrRun = 0LOSIdleCtr = 0LOSStatRdy = FALSE

Free TCB List

Free Event List

Free Queue List

Free Memory List

Create a TaskPriority = 6

OSPrioCur = 6OSPrioHighRdy = 6OSTCBCur OSTCBHighRdy OSTime = 0OSIntNesting = 0OSLockNesting = 0 OSCtxSwCtr = 0OSTaskCtr = 3OSRunning = TRUEOSCPUUsage = 0OSIdleCtrMax = 0L OSIdleCtrRun = 0LOSIdleCtr = 0LOSStatRdy = FALSE

Message Mail boxes

Waiting List

  • Slide 1
  • Slide 2
  • Slide 3
  • Slide 4
  • Slide 5
  • Slide 6
  • Slide 7
  • Slide 8
  • Slide 9
  • Slide 10
  • Slide 11
  • Slide 12
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Slide 17
  • Slide 18
  • Slide 19
  • Slide 20
  • Slide 21
  • Slide 22
  • Slide 23
  • Slide 24
  • Slide 25
  • Slide 26
  • Slide 27
  • Slide 28
  • Slide 29
  • Slide 30
  • Slide 31
  • Slide 32
  • Slide 33
  • Slide 34
  • Slide 35
  • Slide 36
  • Slide 37
  • Slide 38
  • Slide 39
  • Slide 40
  • Slide 41
  • Slide 42
  • Slide 43
Page 2: uCOS-II Kernel Structure

OUTLINE Introduction Kernel Structure Overview Mutual Exclusion Task Management Interrupts Clock ticks uCOSII initialization

Introduction microCOS-II The Real-Time Kernel is a highly portable ROMable very scalable preemptive real-time multitasking kernel (RTOS) for microprocessors and microcontrollers microCOS-II can manage up to 63 application tasks Over 100 microprocessor ports are available to DOWNLOAD Reference httpwwwucos-iicom Jean J Labrosse

About microCOS-II

Structure Overview

Mutual Exclusion Critical sectiondisable interrupt OSSchedLock()disable scheduling OSSemPend()semaphore

Critical section Critical Section

Shared resource region should implement mutual exclusion

Disable InterruptOS_ENTER_CRITICAL()

Enable InterruptOS_EXIT_CRITICAL()

Defined in OS_CPUH

void Function(void) OS_ENTER_CRITICAL() Operate shared data OS_EXIT_CRITICAL()

OSSchedLock()void Function (void) OSSchedLock()

You can access shared data in here (interrupts are recognized)

OSSchedUnlock()

OSSemPend() OS_EVENT SharedDataSemvoid Function (void) INT8U err OSSemPend(SharedDataSem 0 amperr) You can access shared data in here (interrupts are recognized) OSSemPost(SharedDataSem)

Task Management Task introduction Task format Task scheduling

Task introduction Task is a single instance of program Task thinks it has all CPU control itself Task has its own stack and own set of CPU registers backup in its stack Task is assigned a unique priority (highest 0 ~ lowest 63) Task is an infinite loop and never returns 1048698 Task has states microCOS-II saves task records in Task Control Block(TCB)

Task format Task is an infinite loop Return type is void because nothing

will be returned Parameter is a void pointer type so

that you can pass anything you want

void YourTask (void pdata) for () User Code Text uCOS-II System Call User Code Text

OSMboxPend() uCOS-II System Call OSQPend() OSSemPend() OSTaskDel(OS_PRIO_SELF) OSTaskSuspend(OS_PRIO_SELF) OSTimeDly() OSTimeDlyHMSM()

Task scheduling Task State Transfer Diagram (TSTD) Task Control Block (TCB) Task Scheduler Task Pending Task Creation Task Deletion

TSTD

diams Running ndash task has control of the processor and executing its job diams Ready ndash task is ready to execute but its priority is less than the running task diams Waiting ndash task requires the occurrence of an event to continue diams ISR ndash task is paused because the processor is handling an interrupt diams Dormant ndash task resides in memory but not seen by the scheduler

TCB A TCB contains task stack pointer priority

number delay time value task state and some useful information for this task

OSTCBStkPtr OSTCBExtPtr OSTCBStkBottom OSTCBStkSize OSTCBOpt OSTCBId OSTCBNext OSTCBPrev OSTCBEventPtr OSTCBMsg OSTCBDly OSTCBStat OSTCBPrio OSTCBX OSTCBY OSTCBBitX OSTCBBitY OSTCBDelReq

TCB (cont)StkPtr ExtPtr StkBottom StkSize Opt Id Next Prev EventPtr Msg Dly Stat Prio X Y BitX BitY DelReq

Stack

Event Msg

NextPrev NextPrev NextPrevOSTCBList

00

Delay timeState

Delete request

Priority information

TCB (cont)

OSTCBFReeListOSTCBtbl[OS_MAX_TASKS+OS_N_SYS_TASK]

Task Scheduling amp Context Switch In microCOS-II task scheduling if performed on following conditions diams A task is createddeleted diams A task changes state minus On interrupt exit minus On post signal minus On pending event minus On task suspension If the scheduler chooses a new task to run context switch occurs

Task Scheduler Preemptive Kernel Not support time quantum

Task Scheduler (cont) Principle select the highest priority

task from Ready List How to select the priority task from a

Ready List

Ready List PriorityGet the highest priority

Modify priority state

Double-linked List with

priority field

TASK 1

NEXTPREV

Priority

TASK 2

NEXTPREV

Priority

TASK 3

NEXTPREV

Priority

TASK 4

NEXTPREV

Priority0

0OSTCBList

Task Scheduler (cont)TASK 1

NEXTPREV

Priority

TASK 2

NEXTPREV

Priority

TASK 3

NEXTPREV

Priority

TASK 4

NEXTPREV

Priority0

0OSTCBList

Method 1Get the highest priority

Modify priority state

Get the First one in the Ready List Time Complexity O(1)

Selection sort for each changeTime Complexity O(N)

Task Scheduler (cont)TASK 1

NEXTPREV

Priority

TASK 2

NEXTPREV

Priority

TASK 3

NEXTPREV

Priority

TASK 4

NEXTPREV

Priority0

0OSTCBList

Method 2Get the highest priority

Modify priority state

Use a Ready Table a Priority TCB Table and one variable to selectTime Complexity O(1)

Maintain a Ready Table a Priority TCB Tabke and one variableTime Complexity O(1)

Task Scheduler (cont)

TASK 1

NEXTPREV

Priority

TASK 2

NEXTPREV

Priority

TASK 3

NEXTPREV

Priority

TASK 4

NEXTPREV

Priority0

0OSTCBList

Task Scheduler (cont)Get the highest priority

0 0 0 0 0 1 0 00 0 0 0 0 0 0 00 0 1 1 0 1 0 00 0 0 0 0 0 0 00 1 0 0 0 0 1 01 0 0 0 0 0 1 10 0 0 0 0 0 0 01 0 0 0 0 0 0 0

1OSRdyGrp

0101101

TASK 1

NEXTPREV

Priority

TASK 2

NEXTPREV

Priority

TASK 3

NEXTPREV

Priority

TASK 4

NEXTPREV

Priority0

0OSTCBList

Task Scheduler (cont)Modify priority stateOSRdyGrp |= OSMapTbl[prio gtgt 3]OSRdyTbl[prio gtgt 3] |= OSMapTbl[prio amp 0x07]

Task Scheduler (cont)0 0 0 0 0 1 0 00 0 0 0 0 0 0 00 0 1 1 0 1 0 00 0 0 0 0 0 0 00 1 0 0 0 0 1 01 0 0 0 0 0 1 10 0 0 0 0 0 0 01 0 0 0 0 0 0 0

1 0 1 1 0 1 0 1

0 0 0 1 1 1 1 1

OSRdyGrp

Task Priority = 31

3

1

7

1

31

OSSched(void)void OSSched (void) INT8U y OS_ENTER_CRITICAL() if ((OSLockNesting | OSIntNesting) == 0) y = OSUnMapTbl[OSRdyGrp] OSPrioHighRdy = (INT8U)((y ltlt 3) + OSUnMapTbl[OSRdyTbl[y]]) if (OSPrioHighRdy = OSPrioCur) OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy] OSCtxSwCtr++ OS_TASK_SW() OS_EXIT_CRITICAL()

Task Pending Task pending occur when interrupt

raise When waiting some event message

or semaphore When one task delays itself When one task is preempted by

higher priority task

OSMBoxPend()OSQPend()OSSemPend()

OSTaskSuspend()OSTimeDly()OSTimeDlyHMSM()

Task Creation OSTaskCreate() OSTaskCreateExt() Create task before OSStart() or in Running state But not permit to create task in ISR

OSTaskCreate() Check priority

number

Check OSTCBPrioTbl OSTaskStkInit()

OSTCBInit() OSTaskCtr++ OSSched()

if (OSRunning)

OSStackCheck

OSTaskCreateExt() Check priority

number

Check OSTCBPrioTbl OSTaskStkInit()

OSTCBInit() OSTaskCtr++ OSSched()

if (OSRunning)

Task Deletion

TASK 1

NEXTPREV

Priority

TASK 2

NEXTPREV

Priority

TASK 3

NEXTPREV

Priority

TASK 4

NEXTPREV

Priority0

0OSTCBList

Interrupts Interrupt Service RoutineStep1save CPU registersStep2call OSIntEnter () or OSIntNesting add one directlyStep3execution the service codeStep4call OSIntExit() Step5restore CPU registersStep6call interrupt return instruction

Context switch

Clock ticks 10-100Hz void OSTickISR(void) OSTimeTick() OSTimeTick() execution time is in proportion to number of Task TASK 1

NEXTPREV OSTCBDly

TASK 2NEXTPREV OSTCBDly

TASK 3NEXTPREV OSTCBDly

TASK 4NEXTPREV OSTCBDly 0

0OSTCBList

OSTimeTick() if (ptcb-gtOSTCBDly = 0) if (--ptcb-gtOSTCBDly == 0) if ((ptcb-gtOSTCBStat amp OS_STAT_SUSPEND)) OSRdyGrp |= ptcb-gtOSTCBBitY OSRdyTbl[ptcb-gtOSTCBY] |= ptcb-gtOSTCBBitX else ptcb-gtOSTCBDly = 1

Time Management Using clock tick to implement time delays and timeouts OSTimeDly() OSTimeDlyHMSM() OSTimeDlyResume() OSTimeGet() OSTimeSet() Defined in OS_TimeC

OSTimeDly()void OSTimeDly (INT16U ticks) if (ticks gt 0)

OS_ENTER_CRITICAL() if ((OSRdyTbl[OSTCBCur-gtOSTCBY] amp= ~OSTCBCur-gtOSTCBBitX) == 0) OSRdyGrp amp= ~OSTCBCur-gtOSTCBBitY OSTCBCur-gtOSTCBDly = ticks

OS_EXIT_CRITICAL() OSSched()

uCOSII initialization OSIint() initialize all variables and data structure for system Defined in OS_COREC

OSPrioCur = 0OSPrioHighRdy = 0OSTCBCur = NULLOSTCBHighRdy = OLOSTime = 0OSIntNesting = 0OSLockNesting = 0 OSCtxSwCtr = 0OSTaskCtr = 2OSRunning = FALSEOSCPUUsage = 0OSIdleCtrMax = 0L OSIdleCtrRun = 0LOSIdleCtr = 0LOSStatRdy = FALSE

Free TCB List

Free Event List

Free Queue List

Free Memory List

Create a TaskPriority = 6

OSPrioCur = 6OSPrioHighRdy = 6OSTCBCur OSTCBHighRdy OSTime = 0OSIntNesting = 0OSLockNesting = 0 OSCtxSwCtr = 0OSTaskCtr = 3OSRunning = TRUEOSCPUUsage = 0OSIdleCtrMax = 0L OSIdleCtrRun = 0LOSIdleCtr = 0LOSStatRdy = FALSE

Message Mail boxes

Waiting List

  • Slide 1
  • Slide 2
  • Slide 3
  • Slide 4
  • Slide 5
  • Slide 6
  • Slide 7
  • Slide 8
  • Slide 9
  • Slide 10
  • Slide 11
  • Slide 12
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Slide 17
  • Slide 18
  • Slide 19
  • Slide 20
  • Slide 21
  • Slide 22
  • Slide 23
  • Slide 24
  • Slide 25
  • Slide 26
  • Slide 27
  • Slide 28
  • Slide 29
  • Slide 30
  • Slide 31
  • Slide 32
  • Slide 33
  • Slide 34
  • Slide 35
  • Slide 36
  • Slide 37
  • Slide 38
  • Slide 39
  • Slide 40
  • Slide 41
  • Slide 42
  • Slide 43
Page 3: uCOS-II Kernel Structure

Introduction microCOS-II The Real-Time Kernel is a highly portable ROMable very scalable preemptive real-time multitasking kernel (RTOS) for microprocessors and microcontrollers microCOS-II can manage up to 63 application tasks Over 100 microprocessor ports are available to DOWNLOAD Reference httpwwwucos-iicom Jean J Labrosse

About microCOS-II

Structure Overview

Mutual Exclusion Critical sectiondisable interrupt OSSchedLock()disable scheduling OSSemPend()semaphore

Critical section Critical Section

Shared resource region should implement mutual exclusion

Disable InterruptOS_ENTER_CRITICAL()

Enable InterruptOS_EXIT_CRITICAL()

Defined in OS_CPUH

void Function(void) OS_ENTER_CRITICAL() Operate shared data OS_EXIT_CRITICAL()

OSSchedLock()void Function (void) OSSchedLock()

You can access shared data in here (interrupts are recognized)

OSSchedUnlock()

OSSemPend() OS_EVENT SharedDataSemvoid Function (void) INT8U err OSSemPend(SharedDataSem 0 amperr) You can access shared data in here (interrupts are recognized) OSSemPost(SharedDataSem)

Task Management Task introduction Task format Task scheduling

Task introduction Task is a single instance of program Task thinks it has all CPU control itself Task has its own stack and own set of CPU registers backup in its stack Task is assigned a unique priority (highest 0 ~ lowest 63) Task is an infinite loop and never returns 1048698 Task has states microCOS-II saves task records in Task Control Block(TCB)

Task format Task is an infinite loop Return type is void because nothing

will be returned Parameter is a void pointer type so

that you can pass anything you want

void YourTask (void pdata) for () User Code Text uCOS-II System Call User Code Text

OSMboxPend() uCOS-II System Call OSQPend() OSSemPend() OSTaskDel(OS_PRIO_SELF) OSTaskSuspend(OS_PRIO_SELF) OSTimeDly() OSTimeDlyHMSM()

Task scheduling Task State Transfer Diagram (TSTD) Task Control Block (TCB) Task Scheduler Task Pending Task Creation Task Deletion

TSTD

diams Running ndash task has control of the processor and executing its job diams Ready ndash task is ready to execute but its priority is less than the running task diams Waiting ndash task requires the occurrence of an event to continue diams ISR ndash task is paused because the processor is handling an interrupt diams Dormant ndash task resides in memory but not seen by the scheduler

TCB A TCB contains task stack pointer priority

number delay time value task state and some useful information for this task

OSTCBStkPtr OSTCBExtPtr OSTCBStkBottom OSTCBStkSize OSTCBOpt OSTCBId OSTCBNext OSTCBPrev OSTCBEventPtr OSTCBMsg OSTCBDly OSTCBStat OSTCBPrio OSTCBX OSTCBY OSTCBBitX OSTCBBitY OSTCBDelReq

TCB (cont)StkPtr ExtPtr StkBottom StkSize Opt Id Next Prev EventPtr Msg Dly Stat Prio X Y BitX BitY DelReq

Stack

Event Msg

NextPrev NextPrev NextPrevOSTCBList

00

Delay timeState

Delete request

Priority information

TCB (cont)

OSTCBFReeListOSTCBtbl[OS_MAX_TASKS+OS_N_SYS_TASK]

Task Scheduling amp Context Switch In microCOS-II task scheduling if performed on following conditions diams A task is createddeleted diams A task changes state minus On interrupt exit minus On post signal minus On pending event minus On task suspension If the scheduler chooses a new task to run context switch occurs

Task Scheduler Preemptive Kernel Not support time quantum

Task Scheduler (cont) Principle select the highest priority

task from Ready List How to select the priority task from a

Ready List

Ready List PriorityGet the highest priority

Modify priority state

Double-linked List with

priority field

TASK 1

NEXTPREV

Priority

TASK 2

NEXTPREV

Priority

TASK 3

NEXTPREV

Priority

TASK 4

NEXTPREV

Priority0

0OSTCBList

Task Scheduler (cont)TASK 1

NEXTPREV

Priority

TASK 2

NEXTPREV

Priority

TASK 3

NEXTPREV

Priority

TASK 4

NEXTPREV

Priority0

0OSTCBList

Method 1Get the highest priority

Modify priority state

Get the First one in the Ready List Time Complexity O(1)

Selection sort for each changeTime Complexity O(N)

Task Scheduler (cont)TASK 1

NEXTPREV

Priority

TASK 2

NEXTPREV

Priority

TASK 3

NEXTPREV

Priority

TASK 4

NEXTPREV

Priority0

0OSTCBList

Method 2Get the highest priority

Modify priority state

Use a Ready Table a Priority TCB Table and one variable to selectTime Complexity O(1)

Maintain a Ready Table a Priority TCB Tabke and one variableTime Complexity O(1)

Task Scheduler (cont)

TASK 1

NEXTPREV

Priority

TASK 2

NEXTPREV

Priority

TASK 3

NEXTPREV

Priority

TASK 4

NEXTPREV

Priority0

0OSTCBList

Task Scheduler (cont)Get the highest priority

0 0 0 0 0 1 0 00 0 0 0 0 0 0 00 0 1 1 0 1 0 00 0 0 0 0 0 0 00 1 0 0 0 0 1 01 0 0 0 0 0 1 10 0 0 0 0 0 0 01 0 0 0 0 0 0 0

1OSRdyGrp

0101101

TASK 1

NEXTPREV

Priority

TASK 2

NEXTPREV

Priority

TASK 3

NEXTPREV

Priority

TASK 4

NEXTPREV

Priority0

0OSTCBList

Task Scheduler (cont)Modify priority stateOSRdyGrp |= OSMapTbl[prio gtgt 3]OSRdyTbl[prio gtgt 3] |= OSMapTbl[prio amp 0x07]

Task Scheduler (cont)0 0 0 0 0 1 0 00 0 0 0 0 0 0 00 0 1 1 0 1 0 00 0 0 0 0 0 0 00 1 0 0 0 0 1 01 0 0 0 0 0 1 10 0 0 0 0 0 0 01 0 0 0 0 0 0 0

1 0 1 1 0 1 0 1

0 0 0 1 1 1 1 1

OSRdyGrp

Task Priority = 31

3

1

7

1

31

OSSched(void)void OSSched (void) INT8U y OS_ENTER_CRITICAL() if ((OSLockNesting | OSIntNesting) == 0) y = OSUnMapTbl[OSRdyGrp] OSPrioHighRdy = (INT8U)((y ltlt 3) + OSUnMapTbl[OSRdyTbl[y]]) if (OSPrioHighRdy = OSPrioCur) OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy] OSCtxSwCtr++ OS_TASK_SW() OS_EXIT_CRITICAL()

Task Pending Task pending occur when interrupt

raise When waiting some event message

or semaphore When one task delays itself When one task is preempted by

higher priority task

OSMBoxPend()OSQPend()OSSemPend()

OSTaskSuspend()OSTimeDly()OSTimeDlyHMSM()

Task Creation OSTaskCreate() OSTaskCreateExt() Create task before OSStart() or in Running state But not permit to create task in ISR

OSTaskCreate() Check priority

number

Check OSTCBPrioTbl OSTaskStkInit()

OSTCBInit() OSTaskCtr++ OSSched()

if (OSRunning)

OSStackCheck

OSTaskCreateExt() Check priority

number

Check OSTCBPrioTbl OSTaskStkInit()

OSTCBInit() OSTaskCtr++ OSSched()

if (OSRunning)

Task Deletion

TASK 1

NEXTPREV

Priority

TASK 2

NEXTPREV

Priority

TASK 3

NEXTPREV

Priority

TASK 4

NEXTPREV

Priority0

0OSTCBList

Interrupts Interrupt Service RoutineStep1save CPU registersStep2call OSIntEnter () or OSIntNesting add one directlyStep3execution the service codeStep4call OSIntExit() Step5restore CPU registersStep6call interrupt return instruction

Context switch

Clock ticks 10-100Hz void OSTickISR(void) OSTimeTick() OSTimeTick() execution time is in proportion to number of Task TASK 1

NEXTPREV OSTCBDly

TASK 2NEXTPREV OSTCBDly

TASK 3NEXTPREV OSTCBDly

TASK 4NEXTPREV OSTCBDly 0

0OSTCBList

OSTimeTick() if (ptcb-gtOSTCBDly = 0) if (--ptcb-gtOSTCBDly == 0) if ((ptcb-gtOSTCBStat amp OS_STAT_SUSPEND)) OSRdyGrp |= ptcb-gtOSTCBBitY OSRdyTbl[ptcb-gtOSTCBY] |= ptcb-gtOSTCBBitX else ptcb-gtOSTCBDly = 1

Time Management Using clock tick to implement time delays and timeouts OSTimeDly() OSTimeDlyHMSM() OSTimeDlyResume() OSTimeGet() OSTimeSet() Defined in OS_TimeC

OSTimeDly()void OSTimeDly (INT16U ticks) if (ticks gt 0)

OS_ENTER_CRITICAL() if ((OSRdyTbl[OSTCBCur-gtOSTCBY] amp= ~OSTCBCur-gtOSTCBBitX) == 0) OSRdyGrp amp= ~OSTCBCur-gtOSTCBBitY OSTCBCur-gtOSTCBDly = ticks

OS_EXIT_CRITICAL() OSSched()

uCOSII initialization OSIint() initialize all variables and data structure for system Defined in OS_COREC

OSPrioCur = 0OSPrioHighRdy = 0OSTCBCur = NULLOSTCBHighRdy = OLOSTime = 0OSIntNesting = 0OSLockNesting = 0 OSCtxSwCtr = 0OSTaskCtr = 2OSRunning = FALSEOSCPUUsage = 0OSIdleCtrMax = 0L OSIdleCtrRun = 0LOSIdleCtr = 0LOSStatRdy = FALSE

Free TCB List

Free Event List

Free Queue List

Free Memory List

Create a TaskPriority = 6

OSPrioCur = 6OSPrioHighRdy = 6OSTCBCur OSTCBHighRdy OSTime = 0OSIntNesting = 0OSLockNesting = 0 OSCtxSwCtr = 0OSTaskCtr = 3OSRunning = TRUEOSCPUUsage = 0OSIdleCtrMax = 0L OSIdleCtrRun = 0LOSIdleCtr = 0LOSStatRdy = FALSE

Message Mail boxes

Waiting List

  • Slide 1
  • Slide 2
  • Slide 3
  • Slide 4
  • Slide 5
  • Slide 6
  • Slide 7
  • Slide 8
  • Slide 9
  • Slide 10
  • Slide 11
  • Slide 12
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Slide 17
  • Slide 18
  • Slide 19
  • Slide 20
  • Slide 21
  • Slide 22
  • Slide 23
  • Slide 24
  • Slide 25
  • Slide 26
  • Slide 27
  • Slide 28
  • Slide 29
  • Slide 30
  • Slide 31
  • Slide 32
  • Slide 33
  • Slide 34
  • Slide 35
  • Slide 36
  • Slide 37
  • Slide 38
  • Slide 39
  • Slide 40
  • Slide 41
  • Slide 42
  • Slide 43
Page 4: uCOS-II Kernel Structure

About microCOS-II

Structure Overview

Mutual Exclusion Critical sectiondisable interrupt OSSchedLock()disable scheduling OSSemPend()semaphore

Critical section Critical Section

Shared resource region should implement mutual exclusion

Disable InterruptOS_ENTER_CRITICAL()

Enable InterruptOS_EXIT_CRITICAL()

Defined in OS_CPUH

void Function(void) OS_ENTER_CRITICAL() Operate shared data OS_EXIT_CRITICAL()

OSSchedLock()void Function (void) OSSchedLock()

You can access shared data in here (interrupts are recognized)

OSSchedUnlock()

OSSemPend() OS_EVENT SharedDataSemvoid Function (void) INT8U err OSSemPend(SharedDataSem 0 amperr) You can access shared data in here (interrupts are recognized) OSSemPost(SharedDataSem)

Task Management Task introduction Task format Task scheduling

Task introduction Task is a single instance of program Task thinks it has all CPU control itself Task has its own stack and own set of CPU registers backup in its stack Task is assigned a unique priority (highest 0 ~ lowest 63) Task is an infinite loop and never returns 1048698 Task has states microCOS-II saves task records in Task Control Block(TCB)

Task format Task is an infinite loop Return type is void because nothing

will be returned Parameter is a void pointer type so

that you can pass anything you want

void YourTask (void pdata) for () User Code Text uCOS-II System Call User Code Text

OSMboxPend() uCOS-II System Call OSQPend() OSSemPend() OSTaskDel(OS_PRIO_SELF) OSTaskSuspend(OS_PRIO_SELF) OSTimeDly() OSTimeDlyHMSM()

Task scheduling Task State Transfer Diagram (TSTD) Task Control Block (TCB) Task Scheduler Task Pending Task Creation Task Deletion

TSTD

diams Running ndash task has control of the processor and executing its job diams Ready ndash task is ready to execute but its priority is less than the running task diams Waiting ndash task requires the occurrence of an event to continue diams ISR ndash task is paused because the processor is handling an interrupt diams Dormant ndash task resides in memory but not seen by the scheduler

TCB A TCB contains task stack pointer priority

number delay time value task state and some useful information for this task

OSTCBStkPtr OSTCBExtPtr OSTCBStkBottom OSTCBStkSize OSTCBOpt OSTCBId OSTCBNext OSTCBPrev OSTCBEventPtr OSTCBMsg OSTCBDly OSTCBStat OSTCBPrio OSTCBX OSTCBY OSTCBBitX OSTCBBitY OSTCBDelReq

TCB (cont)StkPtr ExtPtr StkBottom StkSize Opt Id Next Prev EventPtr Msg Dly Stat Prio X Y BitX BitY DelReq

Stack

Event Msg

NextPrev NextPrev NextPrevOSTCBList

00

Delay timeState

Delete request

Priority information

TCB (cont)

OSTCBFReeListOSTCBtbl[OS_MAX_TASKS+OS_N_SYS_TASK]

Task Scheduling amp Context Switch In microCOS-II task scheduling if performed on following conditions diams A task is createddeleted diams A task changes state minus On interrupt exit minus On post signal minus On pending event minus On task suspension If the scheduler chooses a new task to run context switch occurs

Task Scheduler Preemptive Kernel Not support time quantum

Task Scheduler (cont) Principle select the highest priority

task from Ready List How to select the priority task from a

Ready List

Ready List PriorityGet the highest priority

Modify priority state

Double-linked List with

priority field

TASK 1

NEXTPREV

Priority

TASK 2

NEXTPREV

Priority

TASK 3

NEXTPREV

Priority

TASK 4

NEXTPREV

Priority0

0OSTCBList

Task Scheduler (cont)TASK 1

NEXTPREV

Priority

TASK 2

NEXTPREV

Priority

TASK 3

NEXTPREV

Priority

TASK 4

NEXTPREV

Priority0

0OSTCBList

Method 1Get the highest priority

Modify priority state

Get the First one in the Ready List Time Complexity O(1)

Selection sort for each changeTime Complexity O(N)

Task Scheduler (cont)TASK 1

NEXTPREV

Priority

TASK 2

NEXTPREV

Priority

TASK 3

NEXTPREV

Priority

TASK 4

NEXTPREV

Priority0

0OSTCBList

Method 2Get the highest priority

Modify priority state

Use a Ready Table a Priority TCB Table and one variable to selectTime Complexity O(1)

Maintain a Ready Table a Priority TCB Tabke and one variableTime Complexity O(1)

Task Scheduler (cont)

TASK 1

NEXTPREV

Priority

TASK 2

NEXTPREV

Priority

TASK 3

NEXTPREV

Priority

TASK 4

NEXTPREV

Priority0

0OSTCBList

Task Scheduler (cont)Get the highest priority

0 0 0 0 0 1 0 00 0 0 0 0 0 0 00 0 1 1 0 1 0 00 0 0 0 0 0 0 00 1 0 0 0 0 1 01 0 0 0 0 0 1 10 0 0 0 0 0 0 01 0 0 0 0 0 0 0

1OSRdyGrp

0101101

TASK 1

NEXTPREV

Priority

TASK 2

NEXTPREV

Priority

TASK 3

NEXTPREV

Priority

TASK 4

NEXTPREV

Priority0

0OSTCBList

Task Scheduler (cont)Modify priority stateOSRdyGrp |= OSMapTbl[prio gtgt 3]OSRdyTbl[prio gtgt 3] |= OSMapTbl[prio amp 0x07]

Task Scheduler (cont)0 0 0 0 0 1 0 00 0 0 0 0 0 0 00 0 1 1 0 1 0 00 0 0 0 0 0 0 00 1 0 0 0 0 1 01 0 0 0 0 0 1 10 0 0 0 0 0 0 01 0 0 0 0 0 0 0

1 0 1 1 0 1 0 1

0 0 0 1 1 1 1 1

OSRdyGrp

Task Priority = 31

3

1

7

1

31

OSSched(void)void OSSched (void) INT8U y OS_ENTER_CRITICAL() if ((OSLockNesting | OSIntNesting) == 0) y = OSUnMapTbl[OSRdyGrp] OSPrioHighRdy = (INT8U)((y ltlt 3) + OSUnMapTbl[OSRdyTbl[y]]) if (OSPrioHighRdy = OSPrioCur) OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy] OSCtxSwCtr++ OS_TASK_SW() OS_EXIT_CRITICAL()

Task Pending Task pending occur when interrupt

raise When waiting some event message

or semaphore When one task delays itself When one task is preempted by

higher priority task

OSMBoxPend()OSQPend()OSSemPend()

OSTaskSuspend()OSTimeDly()OSTimeDlyHMSM()

Task Creation OSTaskCreate() OSTaskCreateExt() Create task before OSStart() or in Running state But not permit to create task in ISR

OSTaskCreate() Check priority

number

Check OSTCBPrioTbl OSTaskStkInit()

OSTCBInit() OSTaskCtr++ OSSched()

if (OSRunning)

OSStackCheck

OSTaskCreateExt() Check priority

number

Check OSTCBPrioTbl OSTaskStkInit()

OSTCBInit() OSTaskCtr++ OSSched()

if (OSRunning)

Task Deletion

TASK 1

NEXTPREV

Priority

TASK 2

NEXTPREV

Priority

TASK 3

NEXTPREV

Priority

TASK 4

NEXTPREV

Priority0

0OSTCBList

Interrupts Interrupt Service RoutineStep1save CPU registersStep2call OSIntEnter () or OSIntNesting add one directlyStep3execution the service codeStep4call OSIntExit() Step5restore CPU registersStep6call interrupt return instruction

Context switch

Clock ticks 10-100Hz void OSTickISR(void) OSTimeTick() OSTimeTick() execution time is in proportion to number of Task TASK 1

NEXTPREV OSTCBDly

TASK 2NEXTPREV OSTCBDly

TASK 3NEXTPREV OSTCBDly

TASK 4NEXTPREV OSTCBDly 0

0OSTCBList

OSTimeTick() if (ptcb-gtOSTCBDly = 0) if (--ptcb-gtOSTCBDly == 0) if ((ptcb-gtOSTCBStat amp OS_STAT_SUSPEND)) OSRdyGrp |= ptcb-gtOSTCBBitY OSRdyTbl[ptcb-gtOSTCBY] |= ptcb-gtOSTCBBitX else ptcb-gtOSTCBDly = 1

Time Management Using clock tick to implement time delays and timeouts OSTimeDly() OSTimeDlyHMSM() OSTimeDlyResume() OSTimeGet() OSTimeSet() Defined in OS_TimeC

OSTimeDly()void OSTimeDly (INT16U ticks) if (ticks gt 0)

OS_ENTER_CRITICAL() if ((OSRdyTbl[OSTCBCur-gtOSTCBY] amp= ~OSTCBCur-gtOSTCBBitX) == 0) OSRdyGrp amp= ~OSTCBCur-gtOSTCBBitY OSTCBCur-gtOSTCBDly = ticks

OS_EXIT_CRITICAL() OSSched()

uCOSII initialization OSIint() initialize all variables and data structure for system Defined in OS_COREC

OSPrioCur = 0OSPrioHighRdy = 0OSTCBCur = NULLOSTCBHighRdy = OLOSTime = 0OSIntNesting = 0OSLockNesting = 0 OSCtxSwCtr = 0OSTaskCtr = 2OSRunning = FALSEOSCPUUsage = 0OSIdleCtrMax = 0L OSIdleCtrRun = 0LOSIdleCtr = 0LOSStatRdy = FALSE

Free TCB List

Free Event List

Free Queue List

Free Memory List

Create a TaskPriority = 6

OSPrioCur = 6OSPrioHighRdy = 6OSTCBCur OSTCBHighRdy OSTime = 0OSIntNesting = 0OSLockNesting = 0 OSCtxSwCtr = 0OSTaskCtr = 3OSRunning = TRUEOSCPUUsage = 0OSIdleCtrMax = 0L OSIdleCtrRun = 0LOSIdleCtr = 0LOSStatRdy = FALSE

Message Mail boxes

Waiting List

  • Slide 1
  • Slide 2
  • Slide 3
  • Slide 4
  • Slide 5
  • Slide 6
  • Slide 7
  • Slide 8
  • Slide 9
  • Slide 10
  • Slide 11
  • Slide 12
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Slide 17
  • Slide 18
  • Slide 19
  • Slide 20
  • Slide 21
  • Slide 22
  • Slide 23
  • Slide 24
  • Slide 25
  • Slide 26
  • Slide 27
  • Slide 28
  • Slide 29
  • Slide 30
  • Slide 31
  • Slide 32
  • Slide 33
  • Slide 34
  • Slide 35
  • Slide 36
  • Slide 37
  • Slide 38
  • Slide 39
  • Slide 40
  • Slide 41
  • Slide 42
  • Slide 43
Page 5: uCOS-II Kernel Structure

Structure Overview

Mutual Exclusion Critical sectiondisable interrupt OSSchedLock()disable scheduling OSSemPend()semaphore

Critical section Critical Section

Shared resource region should implement mutual exclusion

Disable InterruptOS_ENTER_CRITICAL()

Enable InterruptOS_EXIT_CRITICAL()

Defined in OS_CPUH

void Function(void) OS_ENTER_CRITICAL() Operate shared data OS_EXIT_CRITICAL()

OSSchedLock()void Function (void) OSSchedLock()

You can access shared data in here (interrupts are recognized)

OSSchedUnlock()

OSSemPend() OS_EVENT SharedDataSemvoid Function (void) INT8U err OSSemPend(SharedDataSem 0 amperr) You can access shared data in here (interrupts are recognized) OSSemPost(SharedDataSem)

Task Management Task introduction Task format Task scheduling

Task introduction Task is a single instance of program Task thinks it has all CPU control itself Task has its own stack and own set of CPU registers backup in its stack Task is assigned a unique priority (highest 0 ~ lowest 63) Task is an infinite loop and never returns 1048698 Task has states microCOS-II saves task records in Task Control Block(TCB)

Task format Task is an infinite loop Return type is void because nothing

will be returned Parameter is a void pointer type so

that you can pass anything you want

void YourTask (void pdata) for () User Code Text uCOS-II System Call User Code Text

OSMboxPend() uCOS-II System Call OSQPend() OSSemPend() OSTaskDel(OS_PRIO_SELF) OSTaskSuspend(OS_PRIO_SELF) OSTimeDly() OSTimeDlyHMSM()

Task scheduling Task State Transfer Diagram (TSTD) Task Control Block (TCB) Task Scheduler Task Pending Task Creation Task Deletion

TSTD

diams Running ndash task has control of the processor and executing its job diams Ready ndash task is ready to execute but its priority is less than the running task diams Waiting ndash task requires the occurrence of an event to continue diams ISR ndash task is paused because the processor is handling an interrupt diams Dormant ndash task resides in memory but not seen by the scheduler

TCB A TCB contains task stack pointer priority

number delay time value task state and some useful information for this task

OSTCBStkPtr OSTCBExtPtr OSTCBStkBottom OSTCBStkSize OSTCBOpt OSTCBId OSTCBNext OSTCBPrev OSTCBEventPtr OSTCBMsg OSTCBDly OSTCBStat OSTCBPrio OSTCBX OSTCBY OSTCBBitX OSTCBBitY OSTCBDelReq

TCB (cont)StkPtr ExtPtr StkBottom StkSize Opt Id Next Prev EventPtr Msg Dly Stat Prio X Y BitX BitY DelReq

Stack

Event Msg

NextPrev NextPrev NextPrevOSTCBList

00

Delay timeState

Delete request

Priority information

TCB (cont)

OSTCBFReeListOSTCBtbl[OS_MAX_TASKS+OS_N_SYS_TASK]

Task Scheduling amp Context Switch In microCOS-II task scheduling if performed on following conditions diams A task is createddeleted diams A task changes state minus On interrupt exit minus On post signal minus On pending event minus On task suspension If the scheduler chooses a new task to run context switch occurs

Task Scheduler Preemptive Kernel Not support time quantum

Task Scheduler (cont) Principle select the highest priority

task from Ready List How to select the priority task from a

Ready List

Ready List PriorityGet the highest priority

Modify priority state

Double-linked List with

priority field

TASK 1

NEXTPREV

Priority

TASK 2

NEXTPREV

Priority

TASK 3

NEXTPREV

Priority

TASK 4

NEXTPREV

Priority0

0OSTCBList

Task Scheduler (cont)TASK 1

NEXTPREV

Priority

TASK 2

NEXTPREV

Priority

TASK 3

NEXTPREV

Priority

TASK 4

NEXTPREV

Priority0

0OSTCBList

Method 1Get the highest priority

Modify priority state

Get the First one in the Ready List Time Complexity O(1)

Selection sort for each changeTime Complexity O(N)

Task Scheduler (cont)TASK 1

NEXTPREV

Priority

TASK 2

NEXTPREV

Priority

TASK 3

NEXTPREV

Priority

TASK 4

NEXTPREV

Priority0

0OSTCBList

Method 2Get the highest priority

Modify priority state

Use a Ready Table a Priority TCB Table and one variable to selectTime Complexity O(1)

Maintain a Ready Table a Priority TCB Tabke and one variableTime Complexity O(1)

Task Scheduler (cont)

TASK 1

NEXTPREV

Priority

TASK 2

NEXTPREV

Priority

TASK 3

NEXTPREV

Priority

TASK 4

NEXTPREV

Priority0

0OSTCBList

Task Scheduler (cont)Get the highest priority

0 0 0 0 0 1 0 00 0 0 0 0 0 0 00 0 1 1 0 1 0 00 0 0 0 0 0 0 00 1 0 0 0 0 1 01 0 0 0 0 0 1 10 0 0 0 0 0 0 01 0 0 0 0 0 0 0

1OSRdyGrp

0101101

TASK 1

NEXTPREV

Priority

TASK 2

NEXTPREV

Priority

TASK 3

NEXTPREV

Priority

TASK 4

NEXTPREV

Priority0

0OSTCBList

Task Scheduler (cont)Modify priority stateOSRdyGrp |= OSMapTbl[prio gtgt 3]OSRdyTbl[prio gtgt 3] |= OSMapTbl[prio amp 0x07]

Task Scheduler (cont)0 0 0 0 0 1 0 00 0 0 0 0 0 0 00 0 1 1 0 1 0 00 0 0 0 0 0 0 00 1 0 0 0 0 1 01 0 0 0 0 0 1 10 0 0 0 0 0 0 01 0 0 0 0 0 0 0

1 0 1 1 0 1 0 1

0 0 0 1 1 1 1 1

OSRdyGrp

Task Priority = 31

3

1

7

1

31

OSSched(void)void OSSched (void) INT8U y OS_ENTER_CRITICAL() if ((OSLockNesting | OSIntNesting) == 0) y = OSUnMapTbl[OSRdyGrp] OSPrioHighRdy = (INT8U)((y ltlt 3) + OSUnMapTbl[OSRdyTbl[y]]) if (OSPrioHighRdy = OSPrioCur) OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy] OSCtxSwCtr++ OS_TASK_SW() OS_EXIT_CRITICAL()

Task Pending Task pending occur when interrupt

raise When waiting some event message

or semaphore When one task delays itself When one task is preempted by

higher priority task

OSMBoxPend()OSQPend()OSSemPend()

OSTaskSuspend()OSTimeDly()OSTimeDlyHMSM()

Task Creation OSTaskCreate() OSTaskCreateExt() Create task before OSStart() or in Running state But not permit to create task in ISR

OSTaskCreate() Check priority

number

Check OSTCBPrioTbl OSTaskStkInit()

OSTCBInit() OSTaskCtr++ OSSched()

if (OSRunning)

OSStackCheck

OSTaskCreateExt() Check priority

number

Check OSTCBPrioTbl OSTaskStkInit()

OSTCBInit() OSTaskCtr++ OSSched()

if (OSRunning)

Task Deletion

TASK 1

NEXTPREV

Priority

TASK 2

NEXTPREV

Priority

TASK 3

NEXTPREV

Priority

TASK 4

NEXTPREV

Priority0

0OSTCBList

Interrupts Interrupt Service RoutineStep1save CPU registersStep2call OSIntEnter () or OSIntNesting add one directlyStep3execution the service codeStep4call OSIntExit() Step5restore CPU registersStep6call interrupt return instruction

Context switch

Clock ticks 10-100Hz void OSTickISR(void) OSTimeTick() OSTimeTick() execution time is in proportion to number of Task TASK 1

NEXTPREV OSTCBDly

TASK 2NEXTPREV OSTCBDly

TASK 3NEXTPREV OSTCBDly

TASK 4NEXTPREV OSTCBDly 0

0OSTCBList

OSTimeTick() if (ptcb-gtOSTCBDly = 0) if (--ptcb-gtOSTCBDly == 0) if ((ptcb-gtOSTCBStat amp OS_STAT_SUSPEND)) OSRdyGrp |= ptcb-gtOSTCBBitY OSRdyTbl[ptcb-gtOSTCBY] |= ptcb-gtOSTCBBitX else ptcb-gtOSTCBDly = 1

Time Management Using clock tick to implement time delays and timeouts OSTimeDly() OSTimeDlyHMSM() OSTimeDlyResume() OSTimeGet() OSTimeSet() Defined in OS_TimeC

OSTimeDly()void OSTimeDly (INT16U ticks) if (ticks gt 0)

OS_ENTER_CRITICAL() if ((OSRdyTbl[OSTCBCur-gtOSTCBY] amp= ~OSTCBCur-gtOSTCBBitX) == 0) OSRdyGrp amp= ~OSTCBCur-gtOSTCBBitY OSTCBCur-gtOSTCBDly = ticks

OS_EXIT_CRITICAL() OSSched()

uCOSII initialization OSIint() initialize all variables and data structure for system Defined in OS_COREC

OSPrioCur = 0OSPrioHighRdy = 0OSTCBCur = NULLOSTCBHighRdy = OLOSTime = 0OSIntNesting = 0OSLockNesting = 0 OSCtxSwCtr = 0OSTaskCtr = 2OSRunning = FALSEOSCPUUsage = 0OSIdleCtrMax = 0L OSIdleCtrRun = 0LOSIdleCtr = 0LOSStatRdy = FALSE

Free TCB List

Free Event List

Free Queue List

Free Memory List

Create a TaskPriority = 6

OSPrioCur = 6OSPrioHighRdy = 6OSTCBCur OSTCBHighRdy OSTime = 0OSIntNesting = 0OSLockNesting = 0 OSCtxSwCtr = 0OSTaskCtr = 3OSRunning = TRUEOSCPUUsage = 0OSIdleCtrMax = 0L OSIdleCtrRun = 0LOSIdleCtr = 0LOSStatRdy = FALSE

Message Mail boxes

Waiting List

  • Slide 1
  • Slide 2
  • Slide 3
  • Slide 4
  • Slide 5
  • Slide 6
  • Slide 7
  • Slide 8
  • Slide 9
  • Slide 10
  • Slide 11
  • Slide 12
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Slide 17
  • Slide 18
  • Slide 19
  • Slide 20
  • Slide 21
  • Slide 22
  • Slide 23
  • Slide 24
  • Slide 25
  • Slide 26
  • Slide 27
  • Slide 28
  • Slide 29
  • Slide 30
  • Slide 31
  • Slide 32
  • Slide 33
  • Slide 34
  • Slide 35
  • Slide 36
  • Slide 37
  • Slide 38
  • Slide 39
  • Slide 40
  • Slide 41
  • Slide 42
  • Slide 43
Page 6: uCOS-II Kernel Structure

Mutual Exclusion Critical sectiondisable interrupt OSSchedLock()disable scheduling OSSemPend()semaphore

Critical section Critical Section

Shared resource region should implement mutual exclusion

Disable InterruptOS_ENTER_CRITICAL()

Enable InterruptOS_EXIT_CRITICAL()

Defined in OS_CPUH

void Function(void) OS_ENTER_CRITICAL() Operate shared data OS_EXIT_CRITICAL()

OSSchedLock()void Function (void) OSSchedLock()

You can access shared data in here (interrupts are recognized)

OSSchedUnlock()

OSSemPend() OS_EVENT SharedDataSemvoid Function (void) INT8U err OSSemPend(SharedDataSem 0 amperr) You can access shared data in here (interrupts are recognized) OSSemPost(SharedDataSem)

Task Management Task introduction Task format Task scheduling

Task introduction Task is a single instance of program Task thinks it has all CPU control itself Task has its own stack and own set of CPU registers backup in its stack Task is assigned a unique priority (highest 0 ~ lowest 63) Task is an infinite loop and never returns 1048698 Task has states microCOS-II saves task records in Task Control Block(TCB)

Task format Task is an infinite loop Return type is void because nothing

will be returned Parameter is a void pointer type so

that you can pass anything you want

void YourTask (void pdata) for () User Code Text uCOS-II System Call User Code Text

OSMboxPend() uCOS-II System Call OSQPend() OSSemPend() OSTaskDel(OS_PRIO_SELF) OSTaskSuspend(OS_PRIO_SELF) OSTimeDly() OSTimeDlyHMSM()

Task scheduling Task State Transfer Diagram (TSTD) Task Control Block (TCB) Task Scheduler Task Pending Task Creation Task Deletion

TSTD

diams Running ndash task has control of the processor and executing its job diams Ready ndash task is ready to execute but its priority is less than the running task diams Waiting ndash task requires the occurrence of an event to continue diams ISR ndash task is paused because the processor is handling an interrupt diams Dormant ndash task resides in memory but not seen by the scheduler

TCB A TCB contains task stack pointer priority

number delay time value task state and some useful information for this task

OSTCBStkPtr OSTCBExtPtr OSTCBStkBottom OSTCBStkSize OSTCBOpt OSTCBId OSTCBNext OSTCBPrev OSTCBEventPtr OSTCBMsg OSTCBDly OSTCBStat OSTCBPrio OSTCBX OSTCBY OSTCBBitX OSTCBBitY OSTCBDelReq

TCB (cont)StkPtr ExtPtr StkBottom StkSize Opt Id Next Prev EventPtr Msg Dly Stat Prio X Y BitX BitY DelReq

Stack

Event Msg

NextPrev NextPrev NextPrevOSTCBList

00

Delay timeState

Delete request

Priority information

TCB (cont)

OSTCBFReeListOSTCBtbl[OS_MAX_TASKS+OS_N_SYS_TASK]

Task Scheduling amp Context Switch In microCOS-II task scheduling if performed on following conditions diams A task is createddeleted diams A task changes state minus On interrupt exit minus On post signal minus On pending event minus On task suspension If the scheduler chooses a new task to run context switch occurs

Task Scheduler Preemptive Kernel Not support time quantum

Task Scheduler (cont) Principle select the highest priority

task from Ready List How to select the priority task from a

Ready List

Ready List PriorityGet the highest priority

Modify priority state

Double-linked List with

priority field

TASK 1

NEXTPREV

Priority

TASK 2

NEXTPREV

Priority

TASK 3

NEXTPREV

Priority

TASK 4

NEXTPREV

Priority0

0OSTCBList

Task Scheduler (cont)TASK 1

NEXTPREV

Priority

TASK 2

NEXTPREV

Priority

TASK 3

NEXTPREV

Priority

TASK 4

NEXTPREV

Priority0

0OSTCBList

Method 1Get the highest priority

Modify priority state

Get the First one in the Ready List Time Complexity O(1)

Selection sort for each changeTime Complexity O(N)

Task Scheduler (cont)TASK 1

NEXTPREV

Priority

TASK 2

NEXTPREV

Priority

TASK 3

NEXTPREV

Priority

TASK 4

NEXTPREV

Priority0

0OSTCBList

Method 2Get the highest priority

Modify priority state

Use a Ready Table a Priority TCB Table and one variable to selectTime Complexity O(1)

Maintain a Ready Table a Priority TCB Tabke and one variableTime Complexity O(1)

Task Scheduler (cont)

TASK 1

NEXTPREV

Priority

TASK 2

NEXTPREV

Priority

TASK 3

NEXTPREV

Priority

TASK 4

NEXTPREV

Priority0

0OSTCBList

Task Scheduler (cont)Get the highest priority

0 0 0 0 0 1 0 00 0 0 0 0 0 0 00 0 1 1 0 1 0 00 0 0 0 0 0 0 00 1 0 0 0 0 1 01 0 0 0 0 0 1 10 0 0 0 0 0 0 01 0 0 0 0 0 0 0

1OSRdyGrp

0101101

TASK 1

NEXTPREV

Priority

TASK 2

NEXTPREV

Priority

TASK 3

NEXTPREV

Priority

TASK 4

NEXTPREV

Priority0

0OSTCBList

Task Scheduler (cont)Modify priority stateOSRdyGrp |= OSMapTbl[prio gtgt 3]OSRdyTbl[prio gtgt 3] |= OSMapTbl[prio amp 0x07]

Task Scheduler (cont)0 0 0 0 0 1 0 00 0 0 0 0 0 0 00 0 1 1 0 1 0 00 0 0 0 0 0 0 00 1 0 0 0 0 1 01 0 0 0 0 0 1 10 0 0 0 0 0 0 01 0 0 0 0 0 0 0

1 0 1 1 0 1 0 1

0 0 0 1 1 1 1 1

OSRdyGrp

Task Priority = 31

3

1

7

1

31

OSSched(void)void OSSched (void) INT8U y OS_ENTER_CRITICAL() if ((OSLockNesting | OSIntNesting) == 0) y = OSUnMapTbl[OSRdyGrp] OSPrioHighRdy = (INT8U)((y ltlt 3) + OSUnMapTbl[OSRdyTbl[y]]) if (OSPrioHighRdy = OSPrioCur) OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy] OSCtxSwCtr++ OS_TASK_SW() OS_EXIT_CRITICAL()

Task Pending Task pending occur when interrupt

raise When waiting some event message

or semaphore When one task delays itself When one task is preempted by

higher priority task

OSMBoxPend()OSQPend()OSSemPend()

OSTaskSuspend()OSTimeDly()OSTimeDlyHMSM()

Task Creation OSTaskCreate() OSTaskCreateExt() Create task before OSStart() or in Running state But not permit to create task in ISR

OSTaskCreate() Check priority

number

Check OSTCBPrioTbl OSTaskStkInit()

OSTCBInit() OSTaskCtr++ OSSched()

if (OSRunning)

OSStackCheck

OSTaskCreateExt() Check priority

number

Check OSTCBPrioTbl OSTaskStkInit()

OSTCBInit() OSTaskCtr++ OSSched()

if (OSRunning)

Task Deletion

TASK 1

NEXTPREV

Priority

TASK 2

NEXTPREV

Priority

TASK 3

NEXTPREV

Priority

TASK 4

NEXTPREV

Priority0

0OSTCBList

Interrupts Interrupt Service RoutineStep1save CPU registersStep2call OSIntEnter () or OSIntNesting add one directlyStep3execution the service codeStep4call OSIntExit() Step5restore CPU registersStep6call interrupt return instruction

Context switch

Clock ticks 10-100Hz void OSTickISR(void) OSTimeTick() OSTimeTick() execution time is in proportion to number of Task TASK 1

NEXTPREV OSTCBDly

TASK 2NEXTPREV OSTCBDly

TASK 3NEXTPREV OSTCBDly

TASK 4NEXTPREV OSTCBDly 0

0OSTCBList

OSTimeTick() if (ptcb-gtOSTCBDly = 0) if (--ptcb-gtOSTCBDly == 0) if ((ptcb-gtOSTCBStat amp OS_STAT_SUSPEND)) OSRdyGrp |= ptcb-gtOSTCBBitY OSRdyTbl[ptcb-gtOSTCBY] |= ptcb-gtOSTCBBitX else ptcb-gtOSTCBDly = 1

Time Management Using clock tick to implement time delays and timeouts OSTimeDly() OSTimeDlyHMSM() OSTimeDlyResume() OSTimeGet() OSTimeSet() Defined in OS_TimeC

OSTimeDly()void OSTimeDly (INT16U ticks) if (ticks gt 0)

OS_ENTER_CRITICAL() if ((OSRdyTbl[OSTCBCur-gtOSTCBY] amp= ~OSTCBCur-gtOSTCBBitX) == 0) OSRdyGrp amp= ~OSTCBCur-gtOSTCBBitY OSTCBCur-gtOSTCBDly = ticks

OS_EXIT_CRITICAL() OSSched()

uCOSII initialization OSIint() initialize all variables and data structure for system Defined in OS_COREC

OSPrioCur = 0OSPrioHighRdy = 0OSTCBCur = NULLOSTCBHighRdy = OLOSTime = 0OSIntNesting = 0OSLockNesting = 0 OSCtxSwCtr = 0OSTaskCtr = 2OSRunning = FALSEOSCPUUsage = 0OSIdleCtrMax = 0L OSIdleCtrRun = 0LOSIdleCtr = 0LOSStatRdy = FALSE

Free TCB List

Free Event List

Free Queue List

Free Memory List

Create a TaskPriority = 6

OSPrioCur = 6OSPrioHighRdy = 6OSTCBCur OSTCBHighRdy OSTime = 0OSIntNesting = 0OSLockNesting = 0 OSCtxSwCtr = 0OSTaskCtr = 3OSRunning = TRUEOSCPUUsage = 0OSIdleCtrMax = 0L OSIdleCtrRun = 0LOSIdleCtr = 0LOSStatRdy = FALSE

Message Mail boxes

Waiting List

  • Slide 1
  • Slide 2
  • Slide 3
  • Slide 4
  • Slide 5
  • Slide 6
  • Slide 7
  • Slide 8
  • Slide 9
  • Slide 10
  • Slide 11
  • Slide 12
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Slide 17
  • Slide 18
  • Slide 19
  • Slide 20
  • Slide 21
  • Slide 22
  • Slide 23
  • Slide 24
  • Slide 25
  • Slide 26
  • Slide 27
  • Slide 28
  • Slide 29
  • Slide 30
  • Slide 31
  • Slide 32
  • Slide 33
  • Slide 34
  • Slide 35
  • Slide 36
  • Slide 37
  • Slide 38
  • Slide 39
  • Slide 40
  • Slide 41
  • Slide 42
  • Slide 43
Page 7: uCOS-II Kernel Structure

Critical section Critical Section

Shared resource region should implement mutual exclusion

Disable InterruptOS_ENTER_CRITICAL()

Enable InterruptOS_EXIT_CRITICAL()

Defined in OS_CPUH

void Function(void) OS_ENTER_CRITICAL() Operate shared data OS_EXIT_CRITICAL()

OSSchedLock()void Function (void) OSSchedLock()

You can access shared data in here (interrupts are recognized)

OSSchedUnlock()

OSSemPend() OS_EVENT SharedDataSemvoid Function (void) INT8U err OSSemPend(SharedDataSem 0 amperr) You can access shared data in here (interrupts are recognized) OSSemPost(SharedDataSem)

Task Management Task introduction Task format Task scheduling

Task introduction Task is a single instance of program Task thinks it has all CPU control itself Task has its own stack and own set of CPU registers backup in its stack Task is assigned a unique priority (highest 0 ~ lowest 63) Task is an infinite loop and never returns 1048698 Task has states microCOS-II saves task records in Task Control Block(TCB)

Task format Task is an infinite loop Return type is void because nothing

will be returned Parameter is a void pointer type so

that you can pass anything you want

void YourTask (void pdata) for () User Code Text uCOS-II System Call User Code Text

OSMboxPend() uCOS-II System Call OSQPend() OSSemPend() OSTaskDel(OS_PRIO_SELF) OSTaskSuspend(OS_PRIO_SELF) OSTimeDly() OSTimeDlyHMSM()

Task scheduling Task State Transfer Diagram (TSTD) Task Control Block (TCB) Task Scheduler Task Pending Task Creation Task Deletion

TSTD

diams Running ndash task has control of the processor and executing its job diams Ready ndash task is ready to execute but its priority is less than the running task diams Waiting ndash task requires the occurrence of an event to continue diams ISR ndash task is paused because the processor is handling an interrupt diams Dormant ndash task resides in memory but not seen by the scheduler

TCB A TCB contains task stack pointer priority

number delay time value task state and some useful information for this task

OSTCBStkPtr OSTCBExtPtr OSTCBStkBottom OSTCBStkSize OSTCBOpt OSTCBId OSTCBNext OSTCBPrev OSTCBEventPtr OSTCBMsg OSTCBDly OSTCBStat OSTCBPrio OSTCBX OSTCBY OSTCBBitX OSTCBBitY OSTCBDelReq

TCB (cont)StkPtr ExtPtr StkBottom StkSize Opt Id Next Prev EventPtr Msg Dly Stat Prio X Y BitX BitY DelReq

Stack

Event Msg

NextPrev NextPrev NextPrevOSTCBList

00

Delay timeState

Delete request

Priority information

TCB (cont)

OSTCBFReeListOSTCBtbl[OS_MAX_TASKS+OS_N_SYS_TASK]

Task Scheduling amp Context Switch In microCOS-II task scheduling if performed on following conditions diams A task is createddeleted diams A task changes state minus On interrupt exit minus On post signal minus On pending event minus On task suspension If the scheduler chooses a new task to run context switch occurs

Task Scheduler Preemptive Kernel Not support time quantum

Task Scheduler (cont) Principle select the highest priority

task from Ready List How to select the priority task from a

Ready List

Ready List PriorityGet the highest priority

Modify priority state

Double-linked List with

priority field

TASK 1

NEXTPREV

Priority

TASK 2

NEXTPREV

Priority

TASK 3

NEXTPREV

Priority

TASK 4

NEXTPREV

Priority0

0OSTCBList

Task Scheduler (cont)TASK 1

NEXTPREV

Priority

TASK 2

NEXTPREV

Priority

TASK 3

NEXTPREV

Priority

TASK 4

NEXTPREV

Priority0

0OSTCBList

Method 1Get the highest priority

Modify priority state

Get the First one in the Ready List Time Complexity O(1)

Selection sort for each changeTime Complexity O(N)

Task Scheduler (cont)TASK 1

NEXTPREV

Priority

TASK 2

NEXTPREV

Priority

TASK 3

NEXTPREV

Priority

TASK 4

NEXTPREV

Priority0

0OSTCBList

Method 2Get the highest priority

Modify priority state

Use a Ready Table a Priority TCB Table and one variable to selectTime Complexity O(1)

Maintain a Ready Table a Priority TCB Tabke and one variableTime Complexity O(1)

Task Scheduler (cont)

TASK 1

NEXTPREV

Priority

TASK 2

NEXTPREV

Priority

TASK 3

NEXTPREV

Priority

TASK 4

NEXTPREV

Priority0

0OSTCBList

Task Scheduler (cont)Get the highest priority

0 0 0 0 0 1 0 00 0 0 0 0 0 0 00 0 1 1 0 1 0 00 0 0 0 0 0 0 00 1 0 0 0 0 1 01 0 0 0 0 0 1 10 0 0 0 0 0 0 01 0 0 0 0 0 0 0

1OSRdyGrp

0101101

TASK 1

NEXTPREV

Priority

TASK 2

NEXTPREV

Priority

TASK 3

NEXTPREV

Priority

TASK 4

NEXTPREV

Priority0

0OSTCBList

Task Scheduler (cont)Modify priority stateOSRdyGrp |= OSMapTbl[prio gtgt 3]OSRdyTbl[prio gtgt 3] |= OSMapTbl[prio amp 0x07]

Task Scheduler (cont)0 0 0 0 0 1 0 00 0 0 0 0 0 0 00 0 1 1 0 1 0 00 0 0 0 0 0 0 00 1 0 0 0 0 1 01 0 0 0 0 0 1 10 0 0 0 0 0 0 01 0 0 0 0 0 0 0

1 0 1 1 0 1 0 1

0 0 0 1 1 1 1 1

OSRdyGrp

Task Priority = 31

3

1

7

1

31

OSSched(void)void OSSched (void) INT8U y OS_ENTER_CRITICAL() if ((OSLockNesting | OSIntNesting) == 0) y = OSUnMapTbl[OSRdyGrp] OSPrioHighRdy = (INT8U)((y ltlt 3) + OSUnMapTbl[OSRdyTbl[y]]) if (OSPrioHighRdy = OSPrioCur) OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy] OSCtxSwCtr++ OS_TASK_SW() OS_EXIT_CRITICAL()

Task Pending Task pending occur when interrupt

raise When waiting some event message

or semaphore When one task delays itself When one task is preempted by

higher priority task

OSMBoxPend()OSQPend()OSSemPend()

OSTaskSuspend()OSTimeDly()OSTimeDlyHMSM()

Task Creation OSTaskCreate() OSTaskCreateExt() Create task before OSStart() or in Running state But not permit to create task in ISR

OSTaskCreate() Check priority

number

Check OSTCBPrioTbl OSTaskStkInit()

OSTCBInit() OSTaskCtr++ OSSched()

if (OSRunning)

OSStackCheck

OSTaskCreateExt() Check priority

number

Check OSTCBPrioTbl OSTaskStkInit()

OSTCBInit() OSTaskCtr++ OSSched()

if (OSRunning)

Task Deletion

TASK 1

NEXTPREV

Priority

TASK 2

NEXTPREV

Priority

TASK 3

NEXTPREV

Priority

TASK 4

NEXTPREV

Priority0

0OSTCBList

Interrupts Interrupt Service RoutineStep1save CPU registersStep2call OSIntEnter () or OSIntNesting add one directlyStep3execution the service codeStep4call OSIntExit() Step5restore CPU registersStep6call interrupt return instruction

Context switch

Clock ticks 10-100Hz void OSTickISR(void) OSTimeTick() OSTimeTick() execution time is in proportion to number of Task TASK 1

NEXTPREV OSTCBDly

TASK 2NEXTPREV OSTCBDly

TASK 3NEXTPREV OSTCBDly

TASK 4NEXTPREV OSTCBDly 0

0OSTCBList

OSTimeTick() if (ptcb-gtOSTCBDly = 0) if (--ptcb-gtOSTCBDly == 0) if ((ptcb-gtOSTCBStat amp OS_STAT_SUSPEND)) OSRdyGrp |= ptcb-gtOSTCBBitY OSRdyTbl[ptcb-gtOSTCBY] |= ptcb-gtOSTCBBitX else ptcb-gtOSTCBDly = 1

Time Management Using clock tick to implement time delays and timeouts OSTimeDly() OSTimeDlyHMSM() OSTimeDlyResume() OSTimeGet() OSTimeSet() Defined in OS_TimeC

OSTimeDly()void OSTimeDly (INT16U ticks) if (ticks gt 0)

OS_ENTER_CRITICAL() if ((OSRdyTbl[OSTCBCur-gtOSTCBY] amp= ~OSTCBCur-gtOSTCBBitX) == 0) OSRdyGrp amp= ~OSTCBCur-gtOSTCBBitY OSTCBCur-gtOSTCBDly = ticks

OS_EXIT_CRITICAL() OSSched()

uCOSII initialization OSIint() initialize all variables and data structure for system Defined in OS_COREC

OSPrioCur = 0OSPrioHighRdy = 0OSTCBCur = NULLOSTCBHighRdy = OLOSTime = 0OSIntNesting = 0OSLockNesting = 0 OSCtxSwCtr = 0OSTaskCtr = 2OSRunning = FALSEOSCPUUsage = 0OSIdleCtrMax = 0L OSIdleCtrRun = 0LOSIdleCtr = 0LOSStatRdy = FALSE

Free TCB List

Free Event List

Free Queue List

Free Memory List

Create a TaskPriority = 6

OSPrioCur = 6OSPrioHighRdy = 6OSTCBCur OSTCBHighRdy OSTime = 0OSIntNesting = 0OSLockNesting = 0 OSCtxSwCtr = 0OSTaskCtr = 3OSRunning = TRUEOSCPUUsage = 0OSIdleCtrMax = 0L OSIdleCtrRun = 0LOSIdleCtr = 0LOSStatRdy = FALSE

Message Mail boxes

Waiting List

  • Slide 1
  • Slide 2
  • Slide 3
  • Slide 4
  • Slide 5
  • Slide 6
  • Slide 7
  • Slide 8
  • Slide 9
  • Slide 10
  • Slide 11
  • Slide 12
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Slide 17
  • Slide 18
  • Slide 19
  • Slide 20
  • Slide 21
  • Slide 22
  • Slide 23
  • Slide 24
  • Slide 25
  • Slide 26
  • Slide 27
  • Slide 28
  • Slide 29
  • Slide 30
  • Slide 31
  • Slide 32
  • Slide 33
  • Slide 34
  • Slide 35
  • Slide 36
  • Slide 37
  • Slide 38
  • Slide 39
  • Slide 40
  • Slide 41
  • Slide 42
  • Slide 43
Page 8: uCOS-II Kernel Structure

OSSchedLock()void Function (void) OSSchedLock()

You can access shared data in here (interrupts are recognized)

OSSchedUnlock()

OSSemPend() OS_EVENT SharedDataSemvoid Function (void) INT8U err OSSemPend(SharedDataSem 0 amperr) You can access shared data in here (interrupts are recognized) OSSemPost(SharedDataSem)

Task Management Task introduction Task format Task scheduling

Task introduction Task is a single instance of program Task thinks it has all CPU control itself Task has its own stack and own set of CPU registers backup in its stack Task is assigned a unique priority (highest 0 ~ lowest 63) Task is an infinite loop and never returns 1048698 Task has states microCOS-II saves task records in Task Control Block(TCB)

Task format Task is an infinite loop Return type is void because nothing

will be returned Parameter is a void pointer type so

that you can pass anything you want

void YourTask (void pdata) for () User Code Text uCOS-II System Call User Code Text

OSMboxPend() uCOS-II System Call OSQPend() OSSemPend() OSTaskDel(OS_PRIO_SELF) OSTaskSuspend(OS_PRIO_SELF) OSTimeDly() OSTimeDlyHMSM()

Task scheduling Task State Transfer Diagram (TSTD) Task Control Block (TCB) Task Scheduler Task Pending Task Creation Task Deletion

TSTD

diams Running ndash task has control of the processor and executing its job diams Ready ndash task is ready to execute but its priority is less than the running task diams Waiting ndash task requires the occurrence of an event to continue diams ISR ndash task is paused because the processor is handling an interrupt diams Dormant ndash task resides in memory but not seen by the scheduler

TCB A TCB contains task stack pointer priority

number delay time value task state and some useful information for this task

OSTCBStkPtr OSTCBExtPtr OSTCBStkBottom OSTCBStkSize OSTCBOpt OSTCBId OSTCBNext OSTCBPrev OSTCBEventPtr OSTCBMsg OSTCBDly OSTCBStat OSTCBPrio OSTCBX OSTCBY OSTCBBitX OSTCBBitY OSTCBDelReq

TCB (cont)StkPtr ExtPtr StkBottom StkSize Opt Id Next Prev EventPtr Msg Dly Stat Prio X Y BitX BitY DelReq

Stack

Event Msg

NextPrev NextPrev NextPrevOSTCBList

00

Delay timeState

Delete request

Priority information

TCB (cont)

OSTCBFReeListOSTCBtbl[OS_MAX_TASKS+OS_N_SYS_TASK]

Task Scheduling amp Context Switch In microCOS-II task scheduling if performed on following conditions diams A task is createddeleted diams A task changes state minus On interrupt exit minus On post signal minus On pending event minus On task suspension If the scheduler chooses a new task to run context switch occurs

Task Scheduler Preemptive Kernel Not support time quantum

Task Scheduler (cont) Principle select the highest priority

task from Ready List How to select the priority task from a

Ready List

Ready List PriorityGet the highest priority

Modify priority state

Double-linked List with

priority field

TASK 1

NEXTPREV

Priority

TASK 2

NEXTPREV

Priority

TASK 3

NEXTPREV

Priority

TASK 4

NEXTPREV

Priority0

0OSTCBList

Task Scheduler (cont)TASK 1

NEXTPREV

Priority

TASK 2

NEXTPREV

Priority

TASK 3

NEXTPREV

Priority

TASK 4

NEXTPREV

Priority0

0OSTCBList

Method 1Get the highest priority

Modify priority state

Get the First one in the Ready List Time Complexity O(1)

Selection sort for each changeTime Complexity O(N)

Task Scheduler (cont)TASK 1

NEXTPREV

Priority

TASK 2

NEXTPREV

Priority

TASK 3

NEXTPREV

Priority

TASK 4

NEXTPREV

Priority0

0OSTCBList

Method 2Get the highest priority

Modify priority state

Use a Ready Table a Priority TCB Table and one variable to selectTime Complexity O(1)

Maintain a Ready Table a Priority TCB Tabke and one variableTime Complexity O(1)

Task Scheduler (cont)

TASK 1

NEXTPREV

Priority

TASK 2

NEXTPREV

Priority

TASK 3

NEXTPREV

Priority

TASK 4

NEXTPREV

Priority0

0OSTCBList

Task Scheduler (cont)Get the highest priority

0 0 0 0 0 1 0 00 0 0 0 0 0 0 00 0 1 1 0 1 0 00 0 0 0 0 0 0 00 1 0 0 0 0 1 01 0 0 0 0 0 1 10 0 0 0 0 0 0 01 0 0 0 0 0 0 0

1OSRdyGrp

0101101

TASK 1

NEXTPREV

Priority

TASK 2

NEXTPREV

Priority

TASK 3

NEXTPREV

Priority

TASK 4

NEXTPREV

Priority0

0OSTCBList

Task Scheduler (cont)Modify priority stateOSRdyGrp |= OSMapTbl[prio gtgt 3]OSRdyTbl[prio gtgt 3] |= OSMapTbl[prio amp 0x07]

Task Scheduler (cont)0 0 0 0 0 1 0 00 0 0 0 0 0 0 00 0 1 1 0 1 0 00 0 0 0 0 0 0 00 1 0 0 0 0 1 01 0 0 0 0 0 1 10 0 0 0 0 0 0 01 0 0 0 0 0 0 0

1 0 1 1 0 1 0 1

0 0 0 1 1 1 1 1

OSRdyGrp

Task Priority = 31

3

1

7

1

31

OSSched(void)void OSSched (void) INT8U y OS_ENTER_CRITICAL() if ((OSLockNesting | OSIntNesting) == 0) y = OSUnMapTbl[OSRdyGrp] OSPrioHighRdy = (INT8U)((y ltlt 3) + OSUnMapTbl[OSRdyTbl[y]]) if (OSPrioHighRdy = OSPrioCur) OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy] OSCtxSwCtr++ OS_TASK_SW() OS_EXIT_CRITICAL()

Task Pending Task pending occur when interrupt

raise When waiting some event message

or semaphore When one task delays itself When one task is preempted by

higher priority task

OSMBoxPend()OSQPend()OSSemPend()

OSTaskSuspend()OSTimeDly()OSTimeDlyHMSM()

Task Creation OSTaskCreate() OSTaskCreateExt() Create task before OSStart() or in Running state But not permit to create task in ISR

OSTaskCreate() Check priority

number

Check OSTCBPrioTbl OSTaskStkInit()

OSTCBInit() OSTaskCtr++ OSSched()

if (OSRunning)

OSStackCheck

OSTaskCreateExt() Check priority

number

Check OSTCBPrioTbl OSTaskStkInit()

OSTCBInit() OSTaskCtr++ OSSched()

if (OSRunning)

Task Deletion

TASK 1

NEXTPREV

Priority

TASK 2

NEXTPREV

Priority

TASK 3

NEXTPREV

Priority

TASK 4

NEXTPREV

Priority0

0OSTCBList

Interrupts Interrupt Service RoutineStep1save CPU registersStep2call OSIntEnter () or OSIntNesting add one directlyStep3execution the service codeStep4call OSIntExit() Step5restore CPU registersStep6call interrupt return instruction

Context switch

Clock ticks 10-100Hz void OSTickISR(void) OSTimeTick() OSTimeTick() execution time is in proportion to number of Task TASK 1

NEXTPREV OSTCBDly

TASK 2NEXTPREV OSTCBDly

TASK 3NEXTPREV OSTCBDly

TASK 4NEXTPREV OSTCBDly 0

0OSTCBList

OSTimeTick() if (ptcb-gtOSTCBDly = 0) if (--ptcb-gtOSTCBDly == 0) if ((ptcb-gtOSTCBStat amp OS_STAT_SUSPEND)) OSRdyGrp |= ptcb-gtOSTCBBitY OSRdyTbl[ptcb-gtOSTCBY] |= ptcb-gtOSTCBBitX else ptcb-gtOSTCBDly = 1

Time Management Using clock tick to implement time delays and timeouts OSTimeDly() OSTimeDlyHMSM() OSTimeDlyResume() OSTimeGet() OSTimeSet() Defined in OS_TimeC

OSTimeDly()void OSTimeDly (INT16U ticks) if (ticks gt 0)

OS_ENTER_CRITICAL() if ((OSRdyTbl[OSTCBCur-gtOSTCBY] amp= ~OSTCBCur-gtOSTCBBitX) == 0) OSRdyGrp amp= ~OSTCBCur-gtOSTCBBitY OSTCBCur-gtOSTCBDly = ticks

OS_EXIT_CRITICAL() OSSched()

uCOSII initialization OSIint() initialize all variables and data structure for system Defined in OS_COREC

OSPrioCur = 0OSPrioHighRdy = 0OSTCBCur = NULLOSTCBHighRdy = OLOSTime = 0OSIntNesting = 0OSLockNesting = 0 OSCtxSwCtr = 0OSTaskCtr = 2OSRunning = FALSEOSCPUUsage = 0OSIdleCtrMax = 0L OSIdleCtrRun = 0LOSIdleCtr = 0LOSStatRdy = FALSE

Free TCB List

Free Event List

Free Queue List

Free Memory List

Create a TaskPriority = 6

OSPrioCur = 6OSPrioHighRdy = 6OSTCBCur OSTCBHighRdy OSTime = 0OSIntNesting = 0OSLockNesting = 0 OSCtxSwCtr = 0OSTaskCtr = 3OSRunning = TRUEOSCPUUsage = 0OSIdleCtrMax = 0L OSIdleCtrRun = 0LOSIdleCtr = 0LOSStatRdy = FALSE

Message Mail boxes

Waiting List

  • Slide 1
  • Slide 2
  • Slide 3
  • Slide 4
  • Slide 5
  • Slide 6
  • Slide 7
  • Slide 8
  • Slide 9
  • Slide 10
  • Slide 11
  • Slide 12
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Slide 17
  • Slide 18
  • Slide 19
  • Slide 20
  • Slide 21
  • Slide 22
  • Slide 23
  • Slide 24
  • Slide 25
  • Slide 26
  • Slide 27
  • Slide 28
  • Slide 29
  • Slide 30
  • Slide 31
  • Slide 32
  • Slide 33
  • Slide 34
  • Slide 35
  • Slide 36
  • Slide 37
  • Slide 38
  • Slide 39
  • Slide 40
  • Slide 41
  • Slide 42
  • Slide 43
Page 9: uCOS-II Kernel Structure

OSSemPend() OS_EVENT SharedDataSemvoid Function (void) INT8U err OSSemPend(SharedDataSem 0 amperr) You can access shared data in here (interrupts are recognized) OSSemPost(SharedDataSem)

Task Management Task introduction Task format Task scheduling

Task introduction Task is a single instance of program Task thinks it has all CPU control itself Task has its own stack and own set of CPU registers backup in its stack Task is assigned a unique priority (highest 0 ~ lowest 63) Task is an infinite loop and never returns 1048698 Task has states microCOS-II saves task records in Task Control Block(TCB)

Task format Task is an infinite loop Return type is void because nothing

will be returned Parameter is a void pointer type so

that you can pass anything you want

void YourTask (void pdata) for () User Code Text uCOS-II System Call User Code Text

OSMboxPend() uCOS-II System Call OSQPend() OSSemPend() OSTaskDel(OS_PRIO_SELF) OSTaskSuspend(OS_PRIO_SELF) OSTimeDly() OSTimeDlyHMSM()

Task scheduling Task State Transfer Diagram (TSTD) Task Control Block (TCB) Task Scheduler Task Pending Task Creation Task Deletion

TSTD

diams Running ndash task has control of the processor and executing its job diams Ready ndash task is ready to execute but its priority is less than the running task diams Waiting ndash task requires the occurrence of an event to continue diams ISR ndash task is paused because the processor is handling an interrupt diams Dormant ndash task resides in memory but not seen by the scheduler

TCB A TCB contains task stack pointer priority

number delay time value task state and some useful information for this task

OSTCBStkPtr OSTCBExtPtr OSTCBStkBottom OSTCBStkSize OSTCBOpt OSTCBId OSTCBNext OSTCBPrev OSTCBEventPtr OSTCBMsg OSTCBDly OSTCBStat OSTCBPrio OSTCBX OSTCBY OSTCBBitX OSTCBBitY OSTCBDelReq

TCB (cont)StkPtr ExtPtr StkBottom StkSize Opt Id Next Prev EventPtr Msg Dly Stat Prio X Y BitX BitY DelReq

Stack

Event Msg

NextPrev NextPrev NextPrevOSTCBList

00

Delay timeState

Delete request

Priority information

TCB (cont)

OSTCBFReeListOSTCBtbl[OS_MAX_TASKS+OS_N_SYS_TASK]

Task Scheduling amp Context Switch In microCOS-II task scheduling if performed on following conditions diams A task is createddeleted diams A task changes state minus On interrupt exit minus On post signal minus On pending event minus On task suspension If the scheduler chooses a new task to run context switch occurs

Task Scheduler Preemptive Kernel Not support time quantum

Task Scheduler (cont) Principle select the highest priority

task from Ready List How to select the priority task from a

Ready List

Ready List PriorityGet the highest priority

Modify priority state

Double-linked List with

priority field

TASK 1

NEXTPREV

Priority

TASK 2

NEXTPREV

Priority

TASK 3

NEXTPREV

Priority

TASK 4

NEXTPREV

Priority0

0OSTCBList

Task Scheduler (cont)TASK 1

NEXTPREV

Priority

TASK 2

NEXTPREV

Priority

TASK 3

NEXTPREV

Priority

TASK 4

NEXTPREV

Priority0

0OSTCBList

Method 1Get the highest priority

Modify priority state

Get the First one in the Ready List Time Complexity O(1)

Selection sort for each changeTime Complexity O(N)

Task Scheduler (cont)TASK 1

NEXTPREV

Priority

TASK 2

NEXTPREV

Priority

TASK 3

NEXTPREV

Priority

TASK 4

NEXTPREV

Priority0

0OSTCBList

Method 2Get the highest priority

Modify priority state

Use a Ready Table a Priority TCB Table and one variable to selectTime Complexity O(1)

Maintain a Ready Table a Priority TCB Tabke and one variableTime Complexity O(1)

Task Scheduler (cont)

TASK 1

NEXTPREV

Priority

TASK 2

NEXTPREV

Priority

TASK 3

NEXTPREV

Priority

TASK 4

NEXTPREV

Priority0

0OSTCBList

Task Scheduler (cont)Get the highest priority

0 0 0 0 0 1 0 00 0 0 0 0 0 0 00 0 1 1 0 1 0 00 0 0 0 0 0 0 00 1 0 0 0 0 1 01 0 0 0 0 0 1 10 0 0 0 0 0 0 01 0 0 0 0 0 0 0

1OSRdyGrp

0101101

TASK 1

NEXTPREV

Priority

TASK 2

NEXTPREV

Priority

TASK 3

NEXTPREV

Priority

TASK 4

NEXTPREV

Priority0

0OSTCBList

Task Scheduler (cont)Modify priority stateOSRdyGrp |= OSMapTbl[prio gtgt 3]OSRdyTbl[prio gtgt 3] |= OSMapTbl[prio amp 0x07]

Task Scheduler (cont)0 0 0 0 0 1 0 00 0 0 0 0 0 0 00 0 1 1 0 1 0 00 0 0 0 0 0 0 00 1 0 0 0 0 1 01 0 0 0 0 0 1 10 0 0 0 0 0 0 01 0 0 0 0 0 0 0

1 0 1 1 0 1 0 1

0 0 0 1 1 1 1 1

OSRdyGrp

Task Priority = 31

3

1

7

1

31

OSSched(void)void OSSched (void) INT8U y OS_ENTER_CRITICAL() if ((OSLockNesting | OSIntNesting) == 0) y = OSUnMapTbl[OSRdyGrp] OSPrioHighRdy = (INT8U)((y ltlt 3) + OSUnMapTbl[OSRdyTbl[y]]) if (OSPrioHighRdy = OSPrioCur) OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy] OSCtxSwCtr++ OS_TASK_SW() OS_EXIT_CRITICAL()

Task Pending Task pending occur when interrupt

raise When waiting some event message

or semaphore When one task delays itself When one task is preempted by

higher priority task

OSMBoxPend()OSQPend()OSSemPend()

OSTaskSuspend()OSTimeDly()OSTimeDlyHMSM()

Task Creation OSTaskCreate() OSTaskCreateExt() Create task before OSStart() or in Running state But not permit to create task in ISR

OSTaskCreate() Check priority

number

Check OSTCBPrioTbl OSTaskStkInit()

OSTCBInit() OSTaskCtr++ OSSched()

if (OSRunning)

OSStackCheck

OSTaskCreateExt() Check priority

number

Check OSTCBPrioTbl OSTaskStkInit()

OSTCBInit() OSTaskCtr++ OSSched()

if (OSRunning)

Task Deletion

TASK 1

NEXTPREV

Priority

TASK 2

NEXTPREV

Priority

TASK 3

NEXTPREV

Priority

TASK 4

NEXTPREV

Priority0

0OSTCBList

Interrupts Interrupt Service RoutineStep1save CPU registersStep2call OSIntEnter () or OSIntNesting add one directlyStep3execution the service codeStep4call OSIntExit() Step5restore CPU registersStep6call interrupt return instruction

Context switch

Clock ticks 10-100Hz void OSTickISR(void) OSTimeTick() OSTimeTick() execution time is in proportion to number of Task TASK 1

NEXTPREV OSTCBDly

TASK 2NEXTPREV OSTCBDly

TASK 3NEXTPREV OSTCBDly

TASK 4NEXTPREV OSTCBDly 0

0OSTCBList

OSTimeTick() if (ptcb-gtOSTCBDly = 0) if (--ptcb-gtOSTCBDly == 0) if ((ptcb-gtOSTCBStat amp OS_STAT_SUSPEND)) OSRdyGrp |= ptcb-gtOSTCBBitY OSRdyTbl[ptcb-gtOSTCBY] |= ptcb-gtOSTCBBitX else ptcb-gtOSTCBDly = 1

Time Management Using clock tick to implement time delays and timeouts OSTimeDly() OSTimeDlyHMSM() OSTimeDlyResume() OSTimeGet() OSTimeSet() Defined in OS_TimeC

OSTimeDly()void OSTimeDly (INT16U ticks) if (ticks gt 0)

OS_ENTER_CRITICAL() if ((OSRdyTbl[OSTCBCur-gtOSTCBY] amp= ~OSTCBCur-gtOSTCBBitX) == 0) OSRdyGrp amp= ~OSTCBCur-gtOSTCBBitY OSTCBCur-gtOSTCBDly = ticks

OS_EXIT_CRITICAL() OSSched()

uCOSII initialization OSIint() initialize all variables and data structure for system Defined in OS_COREC

OSPrioCur = 0OSPrioHighRdy = 0OSTCBCur = NULLOSTCBHighRdy = OLOSTime = 0OSIntNesting = 0OSLockNesting = 0 OSCtxSwCtr = 0OSTaskCtr = 2OSRunning = FALSEOSCPUUsage = 0OSIdleCtrMax = 0L OSIdleCtrRun = 0LOSIdleCtr = 0LOSStatRdy = FALSE

Free TCB List

Free Event List

Free Queue List

Free Memory List

Create a TaskPriority = 6

OSPrioCur = 6OSPrioHighRdy = 6OSTCBCur OSTCBHighRdy OSTime = 0OSIntNesting = 0OSLockNesting = 0 OSCtxSwCtr = 0OSTaskCtr = 3OSRunning = TRUEOSCPUUsage = 0OSIdleCtrMax = 0L OSIdleCtrRun = 0LOSIdleCtr = 0LOSStatRdy = FALSE

Message Mail boxes

Waiting List

  • Slide 1
  • Slide 2
  • Slide 3
  • Slide 4
  • Slide 5
  • Slide 6
  • Slide 7
  • Slide 8
  • Slide 9
  • Slide 10
  • Slide 11
  • Slide 12
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Slide 17
  • Slide 18
  • Slide 19
  • Slide 20
  • Slide 21
  • Slide 22
  • Slide 23
  • Slide 24
  • Slide 25
  • Slide 26
  • Slide 27
  • Slide 28
  • Slide 29
  • Slide 30
  • Slide 31
  • Slide 32
  • Slide 33
  • Slide 34
  • Slide 35
  • Slide 36
  • Slide 37
  • Slide 38
  • Slide 39
  • Slide 40
  • Slide 41
  • Slide 42
  • Slide 43
Page 10: uCOS-II Kernel Structure

Task Management Task introduction Task format Task scheduling

Task introduction Task is a single instance of program Task thinks it has all CPU control itself Task has its own stack and own set of CPU registers backup in its stack Task is assigned a unique priority (highest 0 ~ lowest 63) Task is an infinite loop and never returns 1048698 Task has states microCOS-II saves task records in Task Control Block(TCB)

Task format Task is an infinite loop Return type is void because nothing

will be returned Parameter is a void pointer type so

that you can pass anything you want

void YourTask (void pdata) for () User Code Text uCOS-II System Call User Code Text

OSMboxPend() uCOS-II System Call OSQPend() OSSemPend() OSTaskDel(OS_PRIO_SELF) OSTaskSuspend(OS_PRIO_SELF) OSTimeDly() OSTimeDlyHMSM()

Task scheduling Task State Transfer Diagram (TSTD) Task Control Block (TCB) Task Scheduler Task Pending Task Creation Task Deletion

TSTD

diams Running ndash task has control of the processor and executing its job diams Ready ndash task is ready to execute but its priority is less than the running task diams Waiting ndash task requires the occurrence of an event to continue diams ISR ndash task is paused because the processor is handling an interrupt diams Dormant ndash task resides in memory but not seen by the scheduler

TCB A TCB contains task stack pointer priority

number delay time value task state and some useful information for this task

OSTCBStkPtr OSTCBExtPtr OSTCBStkBottom OSTCBStkSize OSTCBOpt OSTCBId OSTCBNext OSTCBPrev OSTCBEventPtr OSTCBMsg OSTCBDly OSTCBStat OSTCBPrio OSTCBX OSTCBY OSTCBBitX OSTCBBitY OSTCBDelReq

TCB (cont)StkPtr ExtPtr StkBottom StkSize Opt Id Next Prev EventPtr Msg Dly Stat Prio X Y BitX BitY DelReq

Stack

Event Msg

NextPrev NextPrev NextPrevOSTCBList

00

Delay timeState

Delete request

Priority information

TCB (cont)

OSTCBFReeListOSTCBtbl[OS_MAX_TASKS+OS_N_SYS_TASK]

Task Scheduling amp Context Switch In microCOS-II task scheduling if performed on following conditions diams A task is createddeleted diams A task changes state minus On interrupt exit minus On post signal minus On pending event minus On task suspension If the scheduler chooses a new task to run context switch occurs

Task Scheduler Preemptive Kernel Not support time quantum

Task Scheduler (cont) Principle select the highest priority

task from Ready List How to select the priority task from a

Ready List

Ready List PriorityGet the highest priority

Modify priority state

Double-linked List with

priority field

TASK 1

NEXTPREV

Priority

TASK 2

NEXTPREV

Priority

TASK 3

NEXTPREV

Priority

TASK 4

NEXTPREV

Priority0

0OSTCBList

Task Scheduler (cont)TASK 1

NEXTPREV

Priority

TASK 2

NEXTPREV

Priority

TASK 3

NEXTPREV

Priority

TASK 4

NEXTPREV

Priority0

0OSTCBList

Method 1Get the highest priority

Modify priority state

Get the First one in the Ready List Time Complexity O(1)

Selection sort for each changeTime Complexity O(N)

Task Scheduler (cont)TASK 1

NEXTPREV

Priority

TASK 2

NEXTPREV

Priority

TASK 3

NEXTPREV

Priority

TASK 4

NEXTPREV

Priority0

0OSTCBList

Method 2Get the highest priority

Modify priority state

Use a Ready Table a Priority TCB Table and one variable to selectTime Complexity O(1)

Maintain a Ready Table a Priority TCB Tabke and one variableTime Complexity O(1)

Task Scheduler (cont)

TASK 1

NEXTPREV

Priority

TASK 2

NEXTPREV

Priority

TASK 3

NEXTPREV

Priority

TASK 4

NEXTPREV

Priority0

0OSTCBList

Task Scheduler (cont)Get the highest priority

0 0 0 0 0 1 0 00 0 0 0 0 0 0 00 0 1 1 0 1 0 00 0 0 0 0 0 0 00 1 0 0 0 0 1 01 0 0 0 0 0 1 10 0 0 0 0 0 0 01 0 0 0 0 0 0 0

1OSRdyGrp

0101101

TASK 1

NEXTPREV

Priority

TASK 2

NEXTPREV

Priority

TASK 3

NEXTPREV

Priority

TASK 4

NEXTPREV

Priority0

0OSTCBList

Task Scheduler (cont)Modify priority stateOSRdyGrp |= OSMapTbl[prio gtgt 3]OSRdyTbl[prio gtgt 3] |= OSMapTbl[prio amp 0x07]

Task Scheduler (cont)0 0 0 0 0 1 0 00 0 0 0 0 0 0 00 0 1 1 0 1 0 00 0 0 0 0 0 0 00 1 0 0 0 0 1 01 0 0 0 0 0 1 10 0 0 0 0 0 0 01 0 0 0 0 0 0 0

1 0 1 1 0 1 0 1

0 0 0 1 1 1 1 1

OSRdyGrp

Task Priority = 31

3

1

7

1

31

OSSched(void)void OSSched (void) INT8U y OS_ENTER_CRITICAL() if ((OSLockNesting | OSIntNesting) == 0) y = OSUnMapTbl[OSRdyGrp] OSPrioHighRdy = (INT8U)((y ltlt 3) + OSUnMapTbl[OSRdyTbl[y]]) if (OSPrioHighRdy = OSPrioCur) OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy] OSCtxSwCtr++ OS_TASK_SW() OS_EXIT_CRITICAL()

Task Pending Task pending occur when interrupt

raise When waiting some event message

or semaphore When one task delays itself When one task is preempted by

higher priority task

OSMBoxPend()OSQPend()OSSemPend()

OSTaskSuspend()OSTimeDly()OSTimeDlyHMSM()

Task Creation OSTaskCreate() OSTaskCreateExt() Create task before OSStart() or in Running state But not permit to create task in ISR

OSTaskCreate() Check priority

number

Check OSTCBPrioTbl OSTaskStkInit()

OSTCBInit() OSTaskCtr++ OSSched()

if (OSRunning)

OSStackCheck

OSTaskCreateExt() Check priority

number

Check OSTCBPrioTbl OSTaskStkInit()

OSTCBInit() OSTaskCtr++ OSSched()

if (OSRunning)

Task Deletion

TASK 1

NEXTPREV

Priority

TASK 2

NEXTPREV

Priority

TASK 3

NEXTPREV

Priority

TASK 4

NEXTPREV

Priority0

0OSTCBList

Interrupts Interrupt Service RoutineStep1save CPU registersStep2call OSIntEnter () or OSIntNesting add one directlyStep3execution the service codeStep4call OSIntExit() Step5restore CPU registersStep6call interrupt return instruction

Context switch

Clock ticks 10-100Hz void OSTickISR(void) OSTimeTick() OSTimeTick() execution time is in proportion to number of Task TASK 1

NEXTPREV OSTCBDly

TASK 2NEXTPREV OSTCBDly

TASK 3NEXTPREV OSTCBDly

TASK 4NEXTPREV OSTCBDly 0

0OSTCBList

OSTimeTick() if (ptcb-gtOSTCBDly = 0) if (--ptcb-gtOSTCBDly == 0) if ((ptcb-gtOSTCBStat amp OS_STAT_SUSPEND)) OSRdyGrp |= ptcb-gtOSTCBBitY OSRdyTbl[ptcb-gtOSTCBY] |= ptcb-gtOSTCBBitX else ptcb-gtOSTCBDly = 1

Time Management Using clock tick to implement time delays and timeouts OSTimeDly() OSTimeDlyHMSM() OSTimeDlyResume() OSTimeGet() OSTimeSet() Defined in OS_TimeC

OSTimeDly()void OSTimeDly (INT16U ticks) if (ticks gt 0)

OS_ENTER_CRITICAL() if ((OSRdyTbl[OSTCBCur-gtOSTCBY] amp= ~OSTCBCur-gtOSTCBBitX) == 0) OSRdyGrp amp= ~OSTCBCur-gtOSTCBBitY OSTCBCur-gtOSTCBDly = ticks

OS_EXIT_CRITICAL() OSSched()

uCOSII initialization OSIint() initialize all variables and data structure for system Defined in OS_COREC

OSPrioCur = 0OSPrioHighRdy = 0OSTCBCur = NULLOSTCBHighRdy = OLOSTime = 0OSIntNesting = 0OSLockNesting = 0 OSCtxSwCtr = 0OSTaskCtr = 2OSRunning = FALSEOSCPUUsage = 0OSIdleCtrMax = 0L OSIdleCtrRun = 0LOSIdleCtr = 0LOSStatRdy = FALSE

Free TCB List

Free Event List

Free Queue List

Free Memory List

Create a TaskPriority = 6

OSPrioCur = 6OSPrioHighRdy = 6OSTCBCur OSTCBHighRdy OSTime = 0OSIntNesting = 0OSLockNesting = 0 OSCtxSwCtr = 0OSTaskCtr = 3OSRunning = TRUEOSCPUUsage = 0OSIdleCtrMax = 0L OSIdleCtrRun = 0LOSIdleCtr = 0LOSStatRdy = FALSE

Message Mail boxes

Waiting List

  • Slide 1
  • Slide 2
  • Slide 3
  • Slide 4
  • Slide 5
  • Slide 6
  • Slide 7
  • Slide 8
  • Slide 9
  • Slide 10
  • Slide 11
  • Slide 12
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Slide 17
  • Slide 18
  • Slide 19
  • Slide 20
  • Slide 21
  • Slide 22
  • Slide 23
  • Slide 24
  • Slide 25
  • Slide 26
  • Slide 27
  • Slide 28
  • Slide 29
  • Slide 30
  • Slide 31
  • Slide 32
  • Slide 33
  • Slide 34
  • Slide 35
  • Slide 36
  • Slide 37
  • Slide 38
  • Slide 39
  • Slide 40
  • Slide 41
  • Slide 42
  • Slide 43
Page 11: uCOS-II Kernel Structure

Task introduction Task is a single instance of program Task thinks it has all CPU control itself Task has its own stack and own set of CPU registers backup in its stack Task is assigned a unique priority (highest 0 ~ lowest 63) Task is an infinite loop and never returns 1048698 Task has states microCOS-II saves task records in Task Control Block(TCB)

Task format Task is an infinite loop Return type is void because nothing

will be returned Parameter is a void pointer type so

that you can pass anything you want

void YourTask (void pdata) for () User Code Text uCOS-II System Call User Code Text

OSMboxPend() uCOS-II System Call OSQPend() OSSemPend() OSTaskDel(OS_PRIO_SELF) OSTaskSuspend(OS_PRIO_SELF) OSTimeDly() OSTimeDlyHMSM()

Task scheduling Task State Transfer Diagram (TSTD) Task Control Block (TCB) Task Scheduler Task Pending Task Creation Task Deletion

TSTD

diams Running ndash task has control of the processor and executing its job diams Ready ndash task is ready to execute but its priority is less than the running task diams Waiting ndash task requires the occurrence of an event to continue diams ISR ndash task is paused because the processor is handling an interrupt diams Dormant ndash task resides in memory but not seen by the scheduler

TCB A TCB contains task stack pointer priority

number delay time value task state and some useful information for this task

OSTCBStkPtr OSTCBExtPtr OSTCBStkBottom OSTCBStkSize OSTCBOpt OSTCBId OSTCBNext OSTCBPrev OSTCBEventPtr OSTCBMsg OSTCBDly OSTCBStat OSTCBPrio OSTCBX OSTCBY OSTCBBitX OSTCBBitY OSTCBDelReq

TCB (cont)StkPtr ExtPtr StkBottom StkSize Opt Id Next Prev EventPtr Msg Dly Stat Prio X Y BitX BitY DelReq

Stack

Event Msg

NextPrev NextPrev NextPrevOSTCBList

00

Delay timeState

Delete request

Priority information

TCB (cont)

OSTCBFReeListOSTCBtbl[OS_MAX_TASKS+OS_N_SYS_TASK]

Task Scheduling amp Context Switch In microCOS-II task scheduling if performed on following conditions diams A task is createddeleted diams A task changes state minus On interrupt exit minus On post signal minus On pending event minus On task suspension If the scheduler chooses a new task to run context switch occurs

Task Scheduler Preemptive Kernel Not support time quantum

Task Scheduler (cont) Principle select the highest priority

task from Ready List How to select the priority task from a

Ready List

Ready List PriorityGet the highest priority

Modify priority state

Double-linked List with

priority field

TASK 1

NEXTPREV

Priority

TASK 2

NEXTPREV

Priority

TASK 3

NEXTPREV

Priority

TASK 4

NEXTPREV

Priority0

0OSTCBList

Task Scheduler (cont)TASK 1

NEXTPREV

Priority

TASK 2

NEXTPREV

Priority

TASK 3

NEXTPREV

Priority

TASK 4

NEXTPREV

Priority0

0OSTCBList

Method 1Get the highest priority

Modify priority state

Get the First one in the Ready List Time Complexity O(1)

Selection sort for each changeTime Complexity O(N)

Task Scheduler (cont)TASK 1

NEXTPREV

Priority

TASK 2

NEXTPREV

Priority

TASK 3

NEXTPREV

Priority

TASK 4

NEXTPREV

Priority0

0OSTCBList

Method 2Get the highest priority

Modify priority state

Use a Ready Table a Priority TCB Table and one variable to selectTime Complexity O(1)

Maintain a Ready Table a Priority TCB Tabke and one variableTime Complexity O(1)

Task Scheduler (cont)

TASK 1

NEXTPREV

Priority

TASK 2

NEXTPREV

Priority

TASK 3

NEXTPREV

Priority

TASK 4

NEXTPREV

Priority0

0OSTCBList

Task Scheduler (cont)Get the highest priority

0 0 0 0 0 1 0 00 0 0 0 0 0 0 00 0 1 1 0 1 0 00 0 0 0 0 0 0 00 1 0 0 0 0 1 01 0 0 0 0 0 1 10 0 0 0 0 0 0 01 0 0 0 0 0 0 0

1OSRdyGrp

0101101

TASK 1

NEXTPREV

Priority

TASK 2

NEXTPREV

Priority

TASK 3

NEXTPREV

Priority

TASK 4

NEXTPREV

Priority0

0OSTCBList

Task Scheduler (cont)Modify priority stateOSRdyGrp |= OSMapTbl[prio gtgt 3]OSRdyTbl[prio gtgt 3] |= OSMapTbl[prio amp 0x07]

Task Scheduler (cont)0 0 0 0 0 1 0 00 0 0 0 0 0 0 00 0 1 1 0 1 0 00 0 0 0 0 0 0 00 1 0 0 0 0 1 01 0 0 0 0 0 1 10 0 0 0 0 0 0 01 0 0 0 0 0 0 0

1 0 1 1 0 1 0 1

0 0 0 1 1 1 1 1

OSRdyGrp

Task Priority = 31

3

1

7

1

31

OSSched(void)void OSSched (void) INT8U y OS_ENTER_CRITICAL() if ((OSLockNesting | OSIntNesting) == 0) y = OSUnMapTbl[OSRdyGrp] OSPrioHighRdy = (INT8U)((y ltlt 3) + OSUnMapTbl[OSRdyTbl[y]]) if (OSPrioHighRdy = OSPrioCur) OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy] OSCtxSwCtr++ OS_TASK_SW() OS_EXIT_CRITICAL()

Task Pending Task pending occur when interrupt

raise When waiting some event message

or semaphore When one task delays itself When one task is preempted by

higher priority task

OSMBoxPend()OSQPend()OSSemPend()

OSTaskSuspend()OSTimeDly()OSTimeDlyHMSM()

Task Creation OSTaskCreate() OSTaskCreateExt() Create task before OSStart() or in Running state But not permit to create task in ISR

OSTaskCreate() Check priority

number

Check OSTCBPrioTbl OSTaskStkInit()

OSTCBInit() OSTaskCtr++ OSSched()

if (OSRunning)

OSStackCheck

OSTaskCreateExt() Check priority

number

Check OSTCBPrioTbl OSTaskStkInit()

OSTCBInit() OSTaskCtr++ OSSched()

if (OSRunning)

Task Deletion

TASK 1

NEXTPREV

Priority

TASK 2

NEXTPREV

Priority

TASK 3

NEXTPREV

Priority

TASK 4

NEXTPREV

Priority0

0OSTCBList

Interrupts Interrupt Service RoutineStep1save CPU registersStep2call OSIntEnter () or OSIntNesting add one directlyStep3execution the service codeStep4call OSIntExit() Step5restore CPU registersStep6call interrupt return instruction

Context switch

Clock ticks 10-100Hz void OSTickISR(void) OSTimeTick() OSTimeTick() execution time is in proportion to number of Task TASK 1

NEXTPREV OSTCBDly

TASK 2NEXTPREV OSTCBDly

TASK 3NEXTPREV OSTCBDly

TASK 4NEXTPREV OSTCBDly 0

0OSTCBList

OSTimeTick() if (ptcb-gtOSTCBDly = 0) if (--ptcb-gtOSTCBDly == 0) if ((ptcb-gtOSTCBStat amp OS_STAT_SUSPEND)) OSRdyGrp |= ptcb-gtOSTCBBitY OSRdyTbl[ptcb-gtOSTCBY] |= ptcb-gtOSTCBBitX else ptcb-gtOSTCBDly = 1

Time Management Using clock tick to implement time delays and timeouts OSTimeDly() OSTimeDlyHMSM() OSTimeDlyResume() OSTimeGet() OSTimeSet() Defined in OS_TimeC

OSTimeDly()void OSTimeDly (INT16U ticks) if (ticks gt 0)

OS_ENTER_CRITICAL() if ((OSRdyTbl[OSTCBCur-gtOSTCBY] amp= ~OSTCBCur-gtOSTCBBitX) == 0) OSRdyGrp amp= ~OSTCBCur-gtOSTCBBitY OSTCBCur-gtOSTCBDly = ticks

OS_EXIT_CRITICAL() OSSched()

uCOSII initialization OSIint() initialize all variables and data structure for system Defined in OS_COREC

OSPrioCur = 0OSPrioHighRdy = 0OSTCBCur = NULLOSTCBHighRdy = OLOSTime = 0OSIntNesting = 0OSLockNesting = 0 OSCtxSwCtr = 0OSTaskCtr = 2OSRunning = FALSEOSCPUUsage = 0OSIdleCtrMax = 0L OSIdleCtrRun = 0LOSIdleCtr = 0LOSStatRdy = FALSE

Free TCB List

Free Event List

Free Queue List

Free Memory List

Create a TaskPriority = 6

OSPrioCur = 6OSPrioHighRdy = 6OSTCBCur OSTCBHighRdy OSTime = 0OSIntNesting = 0OSLockNesting = 0 OSCtxSwCtr = 0OSTaskCtr = 3OSRunning = TRUEOSCPUUsage = 0OSIdleCtrMax = 0L OSIdleCtrRun = 0LOSIdleCtr = 0LOSStatRdy = FALSE

Message Mail boxes

Waiting List

  • Slide 1
  • Slide 2
  • Slide 3
  • Slide 4
  • Slide 5
  • Slide 6
  • Slide 7
  • Slide 8
  • Slide 9
  • Slide 10
  • Slide 11
  • Slide 12
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Slide 17
  • Slide 18
  • Slide 19
  • Slide 20
  • Slide 21
  • Slide 22
  • Slide 23
  • Slide 24
  • Slide 25
  • Slide 26
  • Slide 27
  • Slide 28
  • Slide 29
  • Slide 30
  • Slide 31
  • Slide 32
  • Slide 33
  • Slide 34
  • Slide 35
  • Slide 36
  • Slide 37
  • Slide 38
  • Slide 39
  • Slide 40
  • Slide 41
  • Slide 42
  • Slide 43
Page 12: uCOS-II Kernel Structure

Task format Task is an infinite loop Return type is void because nothing

will be returned Parameter is a void pointer type so

that you can pass anything you want

void YourTask (void pdata) for () User Code Text uCOS-II System Call User Code Text

OSMboxPend() uCOS-II System Call OSQPend() OSSemPend() OSTaskDel(OS_PRIO_SELF) OSTaskSuspend(OS_PRIO_SELF) OSTimeDly() OSTimeDlyHMSM()

Task scheduling Task State Transfer Diagram (TSTD) Task Control Block (TCB) Task Scheduler Task Pending Task Creation Task Deletion

TSTD

diams Running ndash task has control of the processor and executing its job diams Ready ndash task is ready to execute but its priority is less than the running task diams Waiting ndash task requires the occurrence of an event to continue diams ISR ndash task is paused because the processor is handling an interrupt diams Dormant ndash task resides in memory but not seen by the scheduler

TCB A TCB contains task stack pointer priority

number delay time value task state and some useful information for this task

OSTCBStkPtr OSTCBExtPtr OSTCBStkBottom OSTCBStkSize OSTCBOpt OSTCBId OSTCBNext OSTCBPrev OSTCBEventPtr OSTCBMsg OSTCBDly OSTCBStat OSTCBPrio OSTCBX OSTCBY OSTCBBitX OSTCBBitY OSTCBDelReq

TCB (cont)StkPtr ExtPtr StkBottom StkSize Opt Id Next Prev EventPtr Msg Dly Stat Prio X Y BitX BitY DelReq

Stack

Event Msg

NextPrev NextPrev NextPrevOSTCBList

00

Delay timeState

Delete request

Priority information

TCB (cont)

OSTCBFReeListOSTCBtbl[OS_MAX_TASKS+OS_N_SYS_TASK]

Task Scheduling amp Context Switch In microCOS-II task scheduling if performed on following conditions diams A task is createddeleted diams A task changes state minus On interrupt exit minus On post signal minus On pending event minus On task suspension If the scheduler chooses a new task to run context switch occurs

Task Scheduler Preemptive Kernel Not support time quantum

Task Scheduler (cont) Principle select the highest priority

task from Ready List How to select the priority task from a

Ready List

Ready List PriorityGet the highest priority

Modify priority state

Double-linked List with

priority field

TASK 1

NEXTPREV

Priority

TASK 2

NEXTPREV

Priority

TASK 3

NEXTPREV

Priority

TASK 4

NEXTPREV

Priority0

0OSTCBList

Task Scheduler (cont)TASK 1

NEXTPREV

Priority

TASK 2

NEXTPREV

Priority

TASK 3

NEXTPREV

Priority

TASK 4

NEXTPREV

Priority0

0OSTCBList

Method 1Get the highest priority

Modify priority state

Get the First one in the Ready List Time Complexity O(1)

Selection sort for each changeTime Complexity O(N)

Task Scheduler (cont)TASK 1

NEXTPREV

Priority

TASK 2

NEXTPREV

Priority

TASK 3

NEXTPREV

Priority

TASK 4

NEXTPREV

Priority0

0OSTCBList

Method 2Get the highest priority

Modify priority state

Use a Ready Table a Priority TCB Table and one variable to selectTime Complexity O(1)

Maintain a Ready Table a Priority TCB Tabke and one variableTime Complexity O(1)

Task Scheduler (cont)

TASK 1

NEXTPREV

Priority

TASK 2

NEXTPREV

Priority

TASK 3

NEXTPREV

Priority

TASK 4

NEXTPREV

Priority0

0OSTCBList

Task Scheduler (cont)Get the highest priority

0 0 0 0 0 1 0 00 0 0 0 0 0 0 00 0 1 1 0 1 0 00 0 0 0 0 0 0 00 1 0 0 0 0 1 01 0 0 0 0 0 1 10 0 0 0 0 0 0 01 0 0 0 0 0 0 0

1OSRdyGrp

0101101

TASK 1

NEXTPREV

Priority

TASK 2

NEXTPREV

Priority

TASK 3

NEXTPREV

Priority

TASK 4

NEXTPREV

Priority0

0OSTCBList

Task Scheduler (cont)Modify priority stateOSRdyGrp |= OSMapTbl[prio gtgt 3]OSRdyTbl[prio gtgt 3] |= OSMapTbl[prio amp 0x07]

Task Scheduler (cont)0 0 0 0 0 1 0 00 0 0 0 0 0 0 00 0 1 1 0 1 0 00 0 0 0 0 0 0 00 1 0 0 0 0 1 01 0 0 0 0 0 1 10 0 0 0 0 0 0 01 0 0 0 0 0 0 0

1 0 1 1 0 1 0 1

0 0 0 1 1 1 1 1

OSRdyGrp

Task Priority = 31

3

1

7

1

31

OSSched(void)void OSSched (void) INT8U y OS_ENTER_CRITICAL() if ((OSLockNesting | OSIntNesting) == 0) y = OSUnMapTbl[OSRdyGrp] OSPrioHighRdy = (INT8U)((y ltlt 3) + OSUnMapTbl[OSRdyTbl[y]]) if (OSPrioHighRdy = OSPrioCur) OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy] OSCtxSwCtr++ OS_TASK_SW() OS_EXIT_CRITICAL()

Task Pending Task pending occur when interrupt

raise When waiting some event message

or semaphore When one task delays itself When one task is preempted by

higher priority task

OSMBoxPend()OSQPend()OSSemPend()

OSTaskSuspend()OSTimeDly()OSTimeDlyHMSM()

Task Creation OSTaskCreate() OSTaskCreateExt() Create task before OSStart() or in Running state But not permit to create task in ISR

OSTaskCreate() Check priority

number

Check OSTCBPrioTbl OSTaskStkInit()

OSTCBInit() OSTaskCtr++ OSSched()

if (OSRunning)

OSStackCheck

OSTaskCreateExt() Check priority

number

Check OSTCBPrioTbl OSTaskStkInit()

OSTCBInit() OSTaskCtr++ OSSched()

if (OSRunning)

Task Deletion

TASK 1

NEXTPREV

Priority

TASK 2

NEXTPREV

Priority

TASK 3

NEXTPREV

Priority

TASK 4

NEXTPREV

Priority0

0OSTCBList

Interrupts Interrupt Service RoutineStep1save CPU registersStep2call OSIntEnter () or OSIntNesting add one directlyStep3execution the service codeStep4call OSIntExit() Step5restore CPU registersStep6call interrupt return instruction

Context switch

Clock ticks 10-100Hz void OSTickISR(void) OSTimeTick() OSTimeTick() execution time is in proportion to number of Task TASK 1

NEXTPREV OSTCBDly

TASK 2NEXTPREV OSTCBDly

TASK 3NEXTPREV OSTCBDly

TASK 4NEXTPREV OSTCBDly 0

0OSTCBList

OSTimeTick() if (ptcb-gtOSTCBDly = 0) if (--ptcb-gtOSTCBDly == 0) if ((ptcb-gtOSTCBStat amp OS_STAT_SUSPEND)) OSRdyGrp |= ptcb-gtOSTCBBitY OSRdyTbl[ptcb-gtOSTCBY] |= ptcb-gtOSTCBBitX else ptcb-gtOSTCBDly = 1

Time Management Using clock tick to implement time delays and timeouts OSTimeDly() OSTimeDlyHMSM() OSTimeDlyResume() OSTimeGet() OSTimeSet() Defined in OS_TimeC

OSTimeDly()void OSTimeDly (INT16U ticks) if (ticks gt 0)

OS_ENTER_CRITICAL() if ((OSRdyTbl[OSTCBCur-gtOSTCBY] amp= ~OSTCBCur-gtOSTCBBitX) == 0) OSRdyGrp amp= ~OSTCBCur-gtOSTCBBitY OSTCBCur-gtOSTCBDly = ticks

OS_EXIT_CRITICAL() OSSched()

uCOSII initialization OSIint() initialize all variables and data structure for system Defined in OS_COREC

OSPrioCur = 0OSPrioHighRdy = 0OSTCBCur = NULLOSTCBHighRdy = OLOSTime = 0OSIntNesting = 0OSLockNesting = 0 OSCtxSwCtr = 0OSTaskCtr = 2OSRunning = FALSEOSCPUUsage = 0OSIdleCtrMax = 0L OSIdleCtrRun = 0LOSIdleCtr = 0LOSStatRdy = FALSE

Free TCB List

Free Event List

Free Queue List

Free Memory List

Create a TaskPriority = 6

OSPrioCur = 6OSPrioHighRdy = 6OSTCBCur OSTCBHighRdy OSTime = 0OSIntNesting = 0OSLockNesting = 0 OSCtxSwCtr = 0OSTaskCtr = 3OSRunning = TRUEOSCPUUsage = 0OSIdleCtrMax = 0L OSIdleCtrRun = 0LOSIdleCtr = 0LOSStatRdy = FALSE

Message Mail boxes

Waiting List

  • Slide 1
  • Slide 2
  • Slide 3
  • Slide 4
  • Slide 5
  • Slide 6
  • Slide 7
  • Slide 8
  • Slide 9
  • Slide 10
  • Slide 11
  • Slide 12
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Slide 17
  • Slide 18
  • Slide 19
  • Slide 20
  • Slide 21
  • Slide 22
  • Slide 23
  • Slide 24
  • Slide 25
  • Slide 26
  • Slide 27
  • Slide 28
  • Slide 29
  • Slide 30
  • Slide 31
  • Slide 32
  • Slide 33
  • Slide 34
  • Slide 35
  • Slide 36
  • Slide 37
  • Slide 38
  • Slide 39
  • Slide 40
  • Slide 41
  • Slide 42
  • Slide 43
Page 13: uCOS-II Kernel Structure

Task scheduling Task State Transfer Diagram (TSTD) Task Control Block (TCB) Task Scheduler Task Pending Task Creation Task Deletion

TSTD

diams Running ndash task has control of the processor and executing its job diams Ready ndash task is ready to execute but its priority is less than the running task diams Waiting ndash task requires the occurrence of an event to continue diams ISR ndash task is paused because the processor is handling an interrupt diams Dormant ndash task resides in memory but not seen by the scheduler

TCB A TCB contains task stack pointer priority

number delay time value task state and some useful information for this task

OSTCBStkPtr OSTCBExtPtr OSTCBStkBottom OSTCBStkSize OSTCBOpt OSTCBId OSTCBNext OSTCBPrev OSTCBEventPtr OSTCBMsg OSTCBDly OSTCBStat OSTCBPrio OSTCBX OSTCBY OSTCBBitX OSTCBBitY OSTCBDelReq

TCB (cont)StkPtr ExtPtr StkBottom StkSize Opt Id Next Prev EventPtr Msg Dly Stat Prio X Y BitX BitY DelReq

Stack

Event Msg

NextPrev NextPrev NextPrevOSTCBList

00

Delay timeState

Delete request

Priority information

TCB (cont)

OSTCBFReeListOSTCBtbl[OS_MAX_TASKS+OS_N_SYS_TASK]

Task Scheduling amp Context Switch In microCOS-II task scheduling if performed on following conditions diams A task is createddeleted diams A task changes state minus On interrupt exit minus On post signal minus On pending event minus On task suspension If the scheduler chooses a new task to run context switch occurs

Task Scheduler Preemptive Kernel Not support time quantum

Task Scheduler (cont) Principle select the highest priority

task from Ready List How to select the priority task from a

Ready List

Ready List PriorityGet the highest priority

Modify priority state

Double-linked List with

priority field

TASK 1

NEXTPREV

Priority

TASK 2

NEXTPREV

Priority

TASK 3

NEXTPREV

Priority

TASK 4

NEXTPREV

Priority0

0OSTCBList

Task Scheduler (cont)TASK 1

NEXTPREV

Priority

TASK 2

NEXTPREV

Priority

TASK 3

NEXTPREV

Priority

TASK 4

NEXTPREV

Priority0

0OSTCBList

Method 1Get the highest priority

Modify priority state

Get the First one in the Ready List Time Complexity O(1)

Selection sort for each changeTime Complexity O(N)

Task Scheduler (cont)TASK 1

NEXTPREV

Priority

TASK 2

NEXTPREV

Priority

TASK 3

NEXTPREV

Priority

TASK 4

NEXTPREV

Priority0

0OSTCBList

Method 2Get the highest priority

Modify priority state

Use a Ready Table a Priority TCB Table and one variable to selectTime Complexity O(1)

Maintain a Ready Table a Priority TCB Tabke and one variableTime Complexity O(1)

Task Scheduler (cont)

TASK 1

NEXTPREV

Priority

TASK 2

NEXTPREV

Priority

TASK 3

NEXTPREV

Priority

TASK 4

NEXTPREV

Priority0

0OSTCBList

Task Scheduler (cont)Get the highest priority

0 0 0 0 0 1 0 00 0 0 0 0 0 0 00 0 1 1 0 1 0 00 0 0 0 0 0 0 00 1 0 0 0 0 1 01 0 0 0 0 0 1 10 0 0 0 0 0 0 01 0 0 0 0 0 0 0

1OSRdyGrp

0101101

TASK 1

NEXTPREV

Priority

TASK 2

NEXTPREV

Priority

TASK 3

NEXTPREV

Priority

TASK 4

NEXTPREV

Priority0

0OSTCBList

Task Scheduler (cont)Modify priority stateOSRdyGrp |= OSMapTbl[prio gtgt 3]OSRdyTbl[prio gtgt 3] |= OSMapTbl[prio amp 0x07]

Task Scheduler (cont)0 0 0 0 0 1 0 00 0 0 0 0 0 0 00 0 1 1 0 1 0 00 0 0 0 0 0 0 00 1 0 0 0 0 1 01 0 0 0 0 0 1 10 0 0 0 0 0 0 01 0 0 0 0 0 0 0

1 0 1 1 0 1 0 1

0 0 0 1 1 1 1 1

OSRdyGrp

Task Priority = 31

3

1

7

1

31

OSSched(void)void OSSched (void) INT8U y OS_ENTER_CRITICAL() if ((OSLockNesting | OSIntNesting) == 0) y = OSUnMapTbl[OSRdyGrp] OSPrioHighRdy = (INT8U)((y ltlt 3) + OSUnMapTbl[OSRdyTbl[y]]) if (OSPrioHighRdy = OSPrioCur) OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy] OSCtxSwCtr++ OS_TASK_SW() OS_EXIT_CRITICAL()

Task Pending Task pending occur when interrupt

raise When waiting some event message

or semaphore When one task delays itself When one task is preempted by

higher priority task

OSMBoxPend()OSQPend()OSSemPend()

OSTaskSuspend()OSTimeDly()OSTimeDlyHMSM()

Task Creation OSTaskCreate() OSTaskCreateExt() Create task before OSStart() or in Running state But not permit to create task in ISR

OSTaskCreate() Check priority

number

Check OSTCBPrioTbl OSTaskStkInit()

OSTCBInit() OSTaskCtr++ OSSched()

if (OSRunning)

OSStackCheck

OSTaskCreateExt() Check priority

number

Check OSTCBPrioTbl OSTaskStkInit()

OSTCBInit() OSTaskCtr++ OSSched()

if (OSRunning)

Task Deletion

TASK 1

NEXTPREV

Priority

TASK 2

NEXTPREV

Priority

TASK 3

NEXTPREV

Priority

TASK 4

NEXTPREV

Priority0

0OSTCBList

Interrupts Interrupt Service RoutineStep1save CPU registersStep2call OSIntEnter () or OSIntNesting add one directlyStep3execution the service codeStep4call OSIntExit() Step5restore CPU registersStep6call interrupt return instruction

Context switch

Clock ticks 10-100Hz void OSTickISR(void) OSTimeTick() OSTimeTick() execution time is in proportion to number of Task TASK 1

NEXTPREV OSTCBDly

TASK 2NEXTPREV OSTCBDly

TASK 3NEXTPREV OSTCBDly

TASK 4NEXTPREV OSTCBDly 0

0OSTCBList

OSTimeTick() if (ptcb-gtOSTCBDly = 0) if (--ptcb-gtOSTCBDly == 0) if ((ptcb-gtOSTCBStat amp OS_STAT_SUSPEND)) OSRdyGrp |= ptcb-gtOSTCBBitY OSRdyTbl[ptcb-gtOSTCBY] |= ptcb-gtOSTCBBitX else ptcb-gtOSTCBDly = 1

Time Management Using clock tick to implement time delays and timeouts OSTimeDly() OSTimeDlyHMSM() OSTimeDlyResume() OSTimeGet() OSTimeSet() Defined in OS_TimeC

OSTimeDly()void OSTimeDly (INT16U ticks) if (ticks gt 0)

OS_ENTER_CRITICAL() if ((OSRdyTbl[OSTCBCur-gtOSTCBY] amp= ~OSTCBCur-gtOSTCBBitX) == 0) OSRdyGrp amp= ~OSTCBCur-gtOSTCBBitY OSTCBCur-gtOSTCBDly = ticks

OS_EXIT_CRITICAL() OSSched()

uCOSII initialization OSIint() initialize all variables and data structure for system Defined in OS_COREC

OSPrioCur = 0OSPrioHighRdy = 0OSTCBCur = NULLOSTCBHighRdy = OLOSTime = 0OSIntNesting = 0OSLockNesting = 0 OSCtxSwCtr = 0OSTaskCtr = 2OSRunning = FALSEOSCPUUsage = 0OSIdleCtrMax = 0L OSIdleCtrRun = 0LOSIdleCtr = 0LOSStatRdy = FALSE

Free TCB List

Free Event List

Free Queue List

Free Memory List

Create a TaskPriority = 6

OSPrioCur = 6OSPrioHighRdy = 6OSTCBCur OSTCBHighRdy OSTime = 0OSIntNesting = 0OSLockNesting = 0 OSCtxSwCtr = 0OSTaskCtr = 3OSRunning = TRUEOSCPUUsage = 0OSIdleCtrMax = 0L OSIdleCtrRun = 0LOSIdleCtr = 0LOSStatRdy = FALSE

Message Mail boxes

Waiting List

  • Slide 1
  • Slide 2
  • Slide 3
  • Slide 4
  • Slide 5
  • Slide 6
  • Slide 7
  • Slide 8
  • Slide 9
  • Slide 10
  • Slide 11
  • Slide 12
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Slide 17
  • Slide 18
  • Slide 19
  • Slide 20
  • Slide 21
  • Slide 22
  • Slide 23
  • Slide 24
  • Slide 25
  • Slide 26
  • Slide 27
  • Slide 28
  • Slide 29
  • Slide 30
  • Slide 31
  • Slide 32
  • Slide 33
  • Slide 34
  • Slide 35
  • Slide 36
  • Slide 37
  • Slide 38
  • Slide 39
  • Slide 40
  • Slide 41
  • Slide 42
  • Slide 43
Page 14: uCOS-II Kernel Structure

TSTD

diams Running ndash task has control of the processor and executing its job diams Ready ndash task is ready to execute but its priority is less than the running task diams Waiting ndash task requires the occurrence of an event to continue diams ISR ndash task is paused because the processor is handling an interrupt diams Dormant ndash task resides in memory but not seen by the scheduler

TCB A TCB contains task stack pointer priority

number delay time value task state and some useful information for this task

OSTCBStkPtr OSTCBExtPtr OSTCBStkBottom OSTCBStkSize OSTCBOpt OSTCBId OSTCBNext OSTCBPrev OSTCBEventPtr OSTCBMsg OSTCBDly OSTCBStat OSTCBPrio OSTCBX OSTCBY OSTCBBitX OSTCBBitY OSTCBDelReq

TCB (cont)StkPtr ExtPtr StkBottom StkSize Opt Id Next Prev EventPtr Msg Dly Stat Prio X Y BitX BitY DelReq

Stack

Event Msg

NextPrev NextPrev NextPrevOSTCBList

00

Delay timeState

Delete request

Priority information

TCB (cont)

OSTCBFReeListOSTCBtbl[OS_MAX_TASKS+OS_N_SYS_TASK]

Task Scheduling amp Context Switch In microCOS-II task scheduling if performed on following conditions diams A task is createddeleted diams A task changes state minus On interrupt exit minus On post signal minus On pending event minus On task suspension If the scheduler chooses a new task to run context switch occurs

Task Scheduler Preemptive Kernel Not support time quantum

Task Scheduler (cont) Principle select the highest priority

task from Ready List How to select the priority task from a

Ready List

Ready List PriorityGet the highest priority

Modify priority state

Double-linked List with

priority field

TASK 1

NEXTPREV

Priority

TASK 2

NEXTPREV

Priority

TASK 3

NEXTPREV

Priority

TASK 4

NEXTPREV

Priority0

0OSTCBList

Task Scheduler (cont)TASK 1

NEXTPREV

Priority

TASK 2

NEXTPREV

Priority

TASK 3

NEXTPREV

Priority

TASK 4

NEXTPREV

Priority0

0OSTCBList

Method 1Get the highest priority

Modify priority state

Get the First one in the Ready List Time Complexity O(1)

Selection sort for each changeTime Complexity O(N)

Task Scheduler (cont)TASK 1

NEXTPREV

Priority

TASK 2

NEXTPREV

Priority

TASK 3

NEXTPREV

Priority

TASK 4

NEXTPREV

Priority0

0OSTCBList

Method 2Get the highest priority

Modify priority state

Use a Ready Table a Priority TCB Table and one variable to selectTime Complexity O(1)

Maintain a Ready Table a Priority TCB Tabke and one variableTime Complexity O(1)

Task Scheduler (cont)

TASK 1

NEXTPREV

Priority

TASK 2

NEXTPREV

Priority

TASK 3

NEXTPREV

Priority

TASK 4

NEXTPREV

Priority0

0OSTCBList

Task Scheduler (cont)Get the highest priority

0 0 0 0 0 1 0 00 0 0 0 0 0 0 00 0 1 1 0 1 0 00 0 0 0 0 0 0 00 1 0 0 0 0 1 01 0 0 0 0 0 1 10 0 0 0 0 0 0 01 0 0 0 0 0 0 0

1OSRdyGrp

0101101

TASK 1

NEXTPREV

Priority

TASK 2

NEXTPREV

Priority

TASK 3

NEXTPREV

Priority

TASK 4

NEXTPREV

Priority0

0OSTCBList

Task Scheduler (cont)Modify priority stateOSRdyGrp |= OSMapTbl[prio gtgt 3]OSRdyTbl[prio gtgt 3] |= OSMapTbl[prio amp 0x07]

Task Scheduler (cont)0 0 0 0 0 1 0 00 0 0 0 0 0 0 00 0 1 1 0 1 0 00 0 0 0 0 0 0 00 1 0 0 0 0 1 01 0 0 0 0 0 1 10 0 0 0 0 0 0 01 0 0 0 0 0 0 0

1 0 1 1 0 1 0 1

0 0 0 1 1 1 1 1

OSRdyGrp

Task Priority = 31

3

1

7

1

31

OSSched(void)void OSSched (void) INT8U y OS_ENTER_CRITICAL() if ((OSLockNesting | OSIntNesting) == 0) y = OSUnMapTbl[OSRdyGrp] OSPrioHighRdy = (INT8U)((y ltlt 3) + OSUnMapTbl[OSRdyTbl[y]]) if (OSPrioHighRdy = OSPrioCur) OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy] OSCtxSwCtr++ OS_TASK_SW() OS_EXIT_CRITICAL()

Task Pending Task pending occur when interrupt

raise When waiting some event message

or semaphore When one task delays itself When one task is preempted by

higher priority task

OSMBoxPend()OSQPend()OSSemPend()

OSTaskSuspend()OSTimeDly()OSTimeDlyHMSM()

Task Creation OSTaskCreate() OSTaskCreateExt() Create task before OSStart() or in Running state But not permit to create task in ISR

OSTaskCreate() Check priority

number

Check OSTCBPrioTbl OSTaskStkInit()

OSTCBInit() OSTaskCtr++ OSSched()

if (OSRunning)

OSStackCheck

OSTaskCreateExt() Check priority

number

Check OSTCBPrioTbl OSTaskStkInit()

OSTCBInit() OSTaskCtr++ OSSched()

if (OSRunning)

Task Deletion

TASK 1

NEXTPREV

Priority

TASK 2

NEXTPREV

Priority

TASK 3

NEXTPREV

Priority

TASK 4

NEXTPREV

Priority0

0OSTCBList

Interrupts Interrupt Service RoutineStep1save CPU registersStep2call OSIntEnter () or OSIntNesting add one directlyStep3execution the service codeStep4call OSIntExit() Step5restore CPU registersStep6call interrupt return instruction

Context switch

Clock ticks 10-100Hz void OSTickISR(void) OSTimeTick() OSTimeTick() execution time is in proportion to number of Task TASK 1

NEXTPREV OSTCBDly

TASK 2NEXTPREV OSTCBDly

TASK 3NEXTPREV OSTCBDly

TASK 4NEXTPREV OSTCBDly 0

0OSTCBList

OSTimeTick() if (ptcb-gtOSTCBDly = 0) if (--ptcb-gtOSTCBDly == 0) if ((ptcb-gtOSTCBStat amp OS_STAT_SUSPEND)) OSRdyGrp |= ptcb-gtOSTCBBitY OSRdyTbl[ptcb-gtOSTCBY] |= ptcb-gtOSTCBBitX else ptcb-gtOSTCBDly = 1

Time Management Using clock tick to implement time delays and timeouts OSTimeDly() OSTimeDlyHMSM() OSTimeDlyResume() OSTimeGet() OSTimeSet() Defined in OS_TimeC

OSTimeDly()void OSTimeDly (INT16U ticks) if (ticks gt 0)

OS_ENTER_CRITICAL() if ((OSRdyTbl[OSTCBCur-gtOSTCBY] amp= ~OSTCBCur-gtOSTCBBitX) == 0) OSRdyGrp amp= ~OSTCBCur-gtOSTCBBitY OSTCBCur-gtOSTCBDly = ticks

OS_EXIT_CRITICAL() OSSched()

uCOSII initialization OSIint() initialize all variables and data structure for system Defined in OS_COREC

OSPrioCur = 0OSPrioHighRdy = 0OSTCBCur = NULLOSTCBHighRdy = OLOSTime = 0OSIntNesting = 0OSLockNesting = 0 OSCtxSwCtr = 0OSTaskCtr = 2OSRunning = FALSEOSCPUUsage = 0OSIdleCtrMax = 0L OSIdleCtrRun = 0LOSIdleCtr = 0LOSStatRdy = FALSE

Free TCB List

Free Event List

Free Queue List

Free Memory List

Create a TaskPriority = 6

OSPrioCur = 6OSPrioHighRdy = 6OSTCBCur OSTCBHighRdy OSTime = 0OSIntNesting = 0OSLockNesting = 0 OSCtxSwCtr = 0OSTaskCtr = 3OSRunning = TRUEOSCPUUsage = 0OSIdleCtrMax = 0L OSIdleCtrRun = 0LOSIdleCtr = 0LOSStatRdy = FALSE

Message Mail boxes

Waiting List

  • Slide 1
  • Slide 2
  • Slide 3
  • Slide 4
  • Slide 5
  • Slide 6
  • Slide 7
  • Slide 8
  • Slide 9
  • Slide 10
  • Slide 11
  • Slide 12
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Slide 17
  • Slide 18
  • Slide 19
  • Slide 20
  • Slide 21
  • Slide 22
  • Slide 23
  • Slide 24
  • Slide 25
  • Slide 26
  • Slide 27
  • Slide 28
  • Slide 29
  • Slide 30
  • Slide 31
  • Slide 32
  • Slide 33
  • Slide 34
  • Slide 35
  • Slide 36
  • Slide 37
  • Slide 38
  • Slide 39
  • Slide 40
  • Slide 41
  • Slide 42
  • Slide 43
Page 15: uCOS-II Kernel Structure

TCB A TCB contains task stack pointer priority

number delay time value task state and some useful information for this task

OSTCBStkPtr OSTCBExtPtr OSTCBStkBottom OSTCBStkSize OSTCBOpt OSTCBId OSTCBNext OSTCBPrev OSTCBEventPtr OSTCBMsg OSTCBDly OSTCBStat OSTCBPrio OSTCBX OSTCBY OSTCBBitX OSTCBBitY OSTCBDelReq

TCB (cont)StkPtr ExtPtr StkBottom StkSize Opt Id Next Prev EventPtr Msg Dly Stat Prio X Y BitX BitY DelReq

Stack

Event Msg

NextPrev NextPrev NextPrevOSTCBList

00

Delay timeState

Delete request

Priority information

TCB (cont)

OSTCBFReeListOSTCBtbl[OS_MAX_TASKS+OS_N_SYS_TASK]

Task Scheduling amp Context Switch In microCOS-II task scheduling if performed on following conditions diams A task is createddeleted diams A task changes state minus On interrupt exit minus On post signal minus On pending event minus On task suspension If the scheduler chooses a new task to run context switch occurs

Task Scheduler Preemptive Kernel Not support time quantum

Task Scheduler (cont) Principle select the highest priority

task from Ready List How to select the priority task from a

Ready List

Ready List PriorityGet the highest priority

Modify priority state

Double-linked List with

priority field

TASK 1

NEXTPREV

Priority

TASK 2

NEXTPREV

Priority

TASK 3

NEXTPREV

Priority

TASK 4

NEXTPREV

Priority0

0OSTCBList

Task Scheduler (cont)TASK 1

NEXTPREV

Priority

TASK 2

NEXTPREV

Priority

TASK 3

NEXTPREV

Priority

TASK 4

NEXTPREV

Priority0

0OSTCBList

Method 1Get the highest priority

Modify priority state

Get the First one in the Ready List Time Complexity O(1)

Selection sort for each changeTime Complexity O(N)

Task Scheduler (cont)TASK 1

NEXTPREV

Priority

TASK 2

NEXTPREV

Priority

TASK 3

NEXTPREV

Priority

TASK 4

NEXTPREV

Priority0

0OSTCBList

Method 2Get the highest priority

Modify priority state

Use a Ready Table a Priority TCB Table and one variable to selectTime Complexity O(1)

Maintain a Ready Table a Priority TCB Tabke and one variableTime Complexity O(1)

Task Scheduler (cont)

TASK 1

NEXTPREV

Priority

TASK 2

NEXTPREV

Priority

TASK 3

NEXTPREV

Priority

TASK 4

NEXTPREV

Priority0

0OSTCBList

Task Scheduler (cont)Get the highest priority

0 0 0 0 0 1 0 00 0 0 0 0 0 0 00 0 1 1 0 1 0 00 0 0 0 0 0 0 00 1 0 0 0 0 1 01 0 0 0 0 0 1 10 0 0 0 0 0 0 01 0 0 0 0 0 0 0

1OSRdyGrp

0101101

TASK 1

NEXTPREV

Priority

TASK 2

NEXTPREV

Priority

TASK 3

NEXTPREV

Priority

TASK 4

NEXTPREV

Priority0

0OSTCBList

Task Scheduler (cont)Modify priority stateOSRdyGrp |= OSMapTbl[prio gtgt 3]OSRdyTbl[prio gtgt 3] |= OSMapTbl[prio amp 0x07]

Task Scheduler (cont)0 0 0 0 0 1 0 00 0 0 0 0 0 0 00 0 1 1 0 1 0 00 0 0 0 0 0 0 00 1 0 0 0 0 1 01 0 0 0 0 0 1 10 0 0 0 0 0 0 01 0 0 0 0 0 0 0

1 0 1 1 0 1 0 1

0 0 0 1 1 1 1 1

OSRdyGrp

Task Priority = 31

3

1

7

1

31

OSSched(void)void OSSched (void) INT8U y OS_ENTER_CRITICAL() if ((OSLockNesting | OSIntNesting) == 0) y = OSUnMapTbl[OSRdyGrp] OSPrioHighRdy = (INT8U)((y ltlt 3) + OSUnMapTbl[OSRdyTbl[y]]) if (OSPrioHighRdy = OSPrioCur) OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy] OSCtxSwCtr++ OS_TASK_SW() OS_EXIT_CRITICAL()

Task Pending Task pending occur when interrupt

raise When waiting some event message

or semaphore When one task delays itself When one task is preempted by

higher priority task

OSMBoxPend()OSQPend()OSSemPend()

OSTaskSuspend()OSTimeDly()OSTimeDlyHMSM()

Task Creation OSTaskCreate() OSTaskCreateExt() Create task before OSStart() or in Running state But not permit to create task in ISR

OSTaskCreate() Check priority

number

Check OSTCBPrioTbl OSTaskStkInit()

OSTCBInit() OSTaskCtr++ OSSched()

if (OSRunning)

OSStackCheck

OSTaskCreateExt() Check priority

number

Check OSTCBPrioTbl OSTaskStkInit()

OSTCBInit() OSTaskCtr++ OSSched()

if (OSRunning)

Task Deletion

TASK 1

NEXTPREV

Priority

TASK 2

NEXTPREV

Priority

TASK 3

NEXTPREV

Priority

TASK 4

NEXTPREV

Priority0

0OSTCBList

Interrupts Interrupt Service RoutineStep1save CPU registersStep2call OSIntEnter () or OSIntNesting add one directlyStep3execution the service codeStep4call OSIntExit() Step5restore CPU registersStep6call interrupt return instruction

Context switch

Clock ticks 10-100Hz void OSTickISR(void) OSTimeTick() OSTimeTick() execution time is in proportion to number of Task TASK 1

NEXTPREV OSTCBDly

TASK 2NEXTPREV OSTCBDly

TASK 3NEXTPREV OSTCBDly

TASK 4NEXTPREV OSTCBDly 0

0OSTCBList

OSTimeTick() if (ptcb-gtOSTCBDly = 0) if (--ptcb-gtOSTCBDly == 0) if ((ptcb-gtOSTCBStat amp OS_STAT_SUSPEND)) OSRdyGrp |= ptcb-gtOSTCBBitY OSRdyTbl[ptcb-gtOSTCBY] |= ptcb-gtOSTCBBitX else ptcb-gtOSTCBDly = 1

Time Management Using clock tick to implement time delays and timeouts OSTimeDly() OSTimeDlyHMSM() OSTimeDlyResume() OSTimeGet() OSTimeSet() Defined in OS_TimeC

OSTimeDly()void OSTimeDly (INT16U ticks) if (ticks gt 0)

OS_ENTER_CRITICAL() if ((OSRdyTbl[OSTCBCur-gtOSTCBY] amp= ~OSTCBCur-gtOSTCBBitX) == 0) OSRdyGrp amp= ~OSTCBCur-gtOSTCBBitY OSTCBCur-gtOSTCBDly = ticks

OS_EXIT_CRITICAL() OSSched()

uCOSII initialization OSIint() initialize all variables and data structure for system Defined in OS_COREC

OSPrioCur = 0OSPrioHighRdy = 0OSTCBCur = NULLOSTCBHighRdy = OLOSTime = 0OSIntNesting = 0OSLockNesting = 0 OSCtxSwCtr = 0OSTaskCtr = 2OSRunning = FALSEOSCPUUsage = 0OSIdleCtrMax = 0L OSIdleCtrRun = 0LOSIdleCtr = 0LOSStatRdy = FALSE

Free TCB List

Free Event List

Free Queue List

Free Memory List

Create a TaskPriority = 6

OSPrioCur = 6OSPrioHighRdy = 6OSTCBCur OSTCBHighRdy OSTime = 0OSIntNesting = 0OSLockNesting = 0 OSCtxSwCtr = 0OSTaskCtr = 3OSRunning = TRUEOSCPUUsage = 0OSIdleCtrMax = 0L OSIdleCtrRun = 0LOSIdleCtr = 0LOSStatRdy = FALSE

Message Mail boxes

Waiting List

  • Slide 1
  • Slide 2
  • Slide 3
  • Slide 4
  • Slide 5
  • Slide 6
  • Slide 7
  • Slide 8
  • Slide 9
  • Slide 10
  • Slide 11
  • Slide 12
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Slide 17
  • Slide 18
  • Slide 19
  • Slide 20
  • Slide 21
  • Slide 22
  • Slide 23
  • Slide 24
  • Slide 25
  • Slide 26
  • Slide 27
  • Slide 28
  • Slide 29
  • Slide 30
  • Slide 31
  • Slide 32
  • Slide 33
  • Slide 34
  • Slide 35
  • Slide 36
  • Slide 37
  • Slide 38
  • Slide 39
  • Slide 40
  • Slide 41
  • Slide 42
  • Slide 43
Page 16: uCOS-II Kernel Structure

TCB (cont)StkPtr ExtPtr StkBottom StkSize Opt Id Next Prev EventPtr Msg Dly Stat Prio X Y BitX BitY DelReq

Stack

Event Msg

NextPrev NextPrev NextPrevOSTCBList

00

Delay timeState

Delete request

Priority information

TCB (cont)

OSTCBFReeListOSTCBtbl[OS_MAX_TASKS+OS_N_SYS_TASK]

Task Scheduling amp Context Switch In microCOS-II task scheduling if performed on following conditions diams A task is createddeleted diams A task changes state minus On interrupt exit minus On post signal minus On pending event minus On task suspension If the scheduler chooses a new task to run context switch occurs

Task Scheduler Preemptive Kernel Not support time quantum

Task Scheduler (cont) Principle select the highest priority

task from Ready List How to select the priority task from a

Ready List

Ready List PriorityGet the highest priority

Modify priority state

Double-linked List with

priority field

TASK 1

NEXTPREV

Priority

TASK 2

NEXTPREV

Priority

TASK 3

NEXTPREV

Priority

TASK 4

NEXTPREV

Priority0

0OSTCBList

Task Scheduler (cont)TASK 1

NEXTPREV

Priority

TASK 2

NEXTPREV

Priority

TASK 3

NEXTPREV

Priority

TASK 4

NEXTPREV

Priority0

0OSTCBList

Method 1Get the highest priority

Modify priority state

Get the First one in the Ready List Time Complexity O(1)

Selection sort for each changeTime Complexity O(N)

Task Scheduler (cont)TASK 1

NEXTPREV

Priority

TASK 2

NEXTPREV

Priority

TASK 3

NEXTPREV

Priority

TASK 4

NEXTPREV

Priority0

0OSTCBList

Method 2Get the highest priority

Modify priority state

Use a Ready Table a Priority TCB Table and one variable to selectTime Complexity O(1)

Maintain a Ready Table a Priority TCB Tabke and one variableTime Complexity O(1)

Task Scheduler (cont)

TASK 1

NEXTPREV

Priority

TASK 2

NEXTPREV

Priority

TASK 3

NEXTPREV

Priority

TASK 4

NEXTPREV

Priority0

0OSTCBList

Task Scheduler (cont)Get the highest priority

0 0 0 0 0 1 0 00 0 0 0 0 0 0 00 0 1 1 0 1 0 00 0 0 0 0 0 0 00 1 0 0 0 0 1 01 0 0 0 0 0 1 10 0 0 0 0 0 0 01 0 0 0 0 0 0 0

1OSRdyGrp

0101101

TASK 1

NEXTPREV

Priority

TASK 2

NEXTPREV

Priority

TASK 3

NEXTPREV

Priority

TASK 4

NEXTPREV

Priority0

0OSTCBList

Task Scheduler (cont)Modify priority stateOSRdyGrp |= OSMapTbl[prio gtgt 3]OSRdyTbl[prio gtgt 3] |= OSMapTbl[prio amp 0x07]

Task Scheduler (cont)0 0 0 0 0 1 0 00 0 0 0 0 0 0 00 0 1 1 0 1 0 00 0 0 0 0 0 0 00 1 0 0 0 0 1 01 0 0 0 0 0 1 10 0 0 0 0 0 0 01 0 0 0 0 0 0 0

1 0 1 1 0 1 0 1

0 0 0 1 1 1 1 1

OSRdyGrp

Task Priority = 31

3

1

7

1

31

OSSched(void)void OSSched (void) INT8U y OS_ENTER_CRITICAL() if ((OSLockNesting | OSIntNesting) == 0) y = OSUnMapTbl[OSRdyGrp] OSPrioHighRdy = (INT8U)((y ltlt 3) + OSUnMapTbl[OSRdyTbl[y]]) if (OSPrioHighRdy = OSPrioCur) OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy] OSCtxSwCtr++ OS_TASK_SW() OS_EXIT_CRITICAL()

Task Pending Task pending occur when interrupt

raise When waiting some event message

or semaphore When one task delays itself When one task is preempted by

higher priority task

OSMBoxPend()OSQPend()OSSemPend()

OSTaskSuspend()OSTimeDly()OSTimeDlyHMSM()

Task Creation OSTaskCreate() OSTaskCreateExt() Create task before OSStart() or in Running state But not permit to create task in ISR

OSTaskCreate() Check priority

number

Check OSTCBPrioTbl OSTaskStkInit()

OSTCBInit() OSTaskCtr++ OSSched()

if (OSRunning)

OSStackCheck

OSTaskCreateExt() Check priority

number

Check OSTCBPrioTbl OSTaskStkInit()

OSTCBInit() OSTaskCtr++ OSSched()

if (OSRunning)

Task Deletion

TASK 1

NEXTPREV

Priority

TASK 2

NEXTPREV

Priority

TASK 3

NEXTPREV

Priority

TASK 4

NEXTPREV

Priority0

0OSTCBList

Interrupts Interrupt Service RoutineStep1save CPU registersStep2call OSIntEnter () or OSIntNesting add one directlyStep3execution the service codeStep4call OSIntExit() Step5restore CPU registersStep6call interrupt return instruction

Context switch

Clock ticks 10-100Hz void OSTickISR(void) OSTimeTick() OSTimeTick() execution time is in proportion to number of Task TASK 1

NEXTPREV OSTCBDly

TASK 2NEXTPREV OSTCBDly

TASK 3NEXTPREV OSTCBDly

TASK 4NEXTPREV OSTCBDly 0

0OSTCBList

OSTimeTick() if (ptcb-gtOSTCBDly = 0) if (--ptcb-gtOSTCBDly == 0) if ((ptcb-gtOSTCBStat amp OS_STAT_SUSPEND)) OSRdyGrp |= ptcb-gtOSTCBBitY OSRdyTbl[ptcb-gtOSTCBY] |= ptcb-gtOSTCBBitX else ptcb-gtOSTCBDly = 1

Time Management Using clock tick to implement time delays and timeouts OSTimeDly() OSTimeDlyHMSM() OSTimeDlyResume() OSTimeGet() OSTimeSet() Defined in OS_TimeC

OSTimeDly()void OSTimeDly (INT16U ticks) if (ticks gt 0)

OS_ENTER_CRITICAL() if ((OSRdyTbl[OSTCBCur-gtOSTCBY] amp= ~OSTCBCur-gtOSTCBBitX) == 0) OSRdyGrp amp= ~OSTCBCur-gtOSTCBBitY OSTCBCur-gtOSTCBDly = ticks

OS_EXIT_CRITICAL() OSSched()

uCOSII initialization OSIint() initialize all variables and data structure for system Defined in OS_COREC

OSPrioCur = 0OSPrioHighRdy = 0OSTCBCur = NULLOSTCBHighRdy = OLOSTime = 0OSIntNesting = 0OSLockNesting = 0 OSCtxSwCtr = 0OSTaskCtr = 2OSRunning = FALSEOSCPUUsage = 0OSIdleCtrMax = 0L OSIdleCtrRun = 0LOSIdleCtr = 0LOSStatRdy = FALSE

Free TCB List

Free Event List

Free Queue List

Free Memory List

Create a TaskPriority = 6

OSPrioCur = 6OSPrioHighRdy = 6OSTCBCur OSTCBHighRdy OSTime = 0OSIntNesting = 0OSLockNesting = 0 OSCtxSwCtr = 0OSTaskCtr = 3OSRunning = TRUEOSCPUUsage = 0OSIdleCtrMax = 0L OSIdleCtrRun = 0LOSIdleCtr = 0LOSStatRdy = FALSE

Message Mail boxes

Waiting List

  • Slide 1
  • Slide 2
  • Slide 3
  • Slide 4
  • Slide 5
  • Slide 6
  • Slide 7
  • Slide 8
  • Slide 9
  • Slide 10
  • Slide 11
  • Slide 12
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Slide 17
  • Slide 18
  • Slide 19
  • Slide 20
  • Slide 21
  • Slide 22
  • Slide 23
  • Slide 24
  • Slide 25
  • Slide 26
  • Slide 27
  • Slide 28
  • Slide 29
  • Slide 30
  • Slide 31
  • Slide 32
  • Slide 33
  • Slide 34
  • Slide 35
  • Slide 36
  • Slide 37
  • Slide 38
  • Slide 39
  • Slide 40
  • Slide 41
  • Slide 42
  • Slide 43
Page 17: uCOS-II Kernel Structure

TCB (cont)

OSTCBFReeListOSTCBtbl[OS_MAX_TASKS+OS_N_SYS_TASK]

Task Scheduling amp Context Switch In microCOS-II task scheduling if performed on following conditions diams A task is createddeleted diams A task changes state minus On interrupt exit minus On post signal minus On pending event minus On task suspension If the scheduler chooses a new task to run context switch occurs

Task Scheduler Preemptive Kernel Not support time quantum

Task Scheduler (cont) Principle select the highest priority

task from Ready List How to select the priority task from a

Ready List

Ready List PriorityGet the highest priority

Modify priority state

Double-linked List with

priority field

TASK 1

NEXTPREV

Priority

TASK 2

NEXTPREV

Priority

TASK 3

NEXTPREV

Priority

TASK 4

NEXTPREV

Priority0

0OSTCBList

Task Scheduler (cont)TASK 1

NEXTPREV

Priority

TASK 2

NEXTPREV

Priority

TASK 3

NEXTPREV

Priority

TASK 4

NEXTPREV

Priority0

0OSTCBList

Method 1Get the highest priority

Modify priority state

Get the First one in the Ready List Time Complexity O(1)

Selection sort for each changeTime Complexity O(N)

Task Scheduler (cont)TASK 1

NEXTPREV

Priority

TASK 2

NEXTPREV

Priority

TASK 3

NEXTPREV

Priority

TASK 4

NEXTPREV

Priority0

0OSTCBList

Method 2Get the highest priority

Modify priority state

Use a Ready Table a Priority TCB Table and one variable to selectTime Complexity O(1)

Maintain a Ready Table a Priority TCB Tabke and one variableTime Complexity O(1)

Task Scheduler (cont)

TASK 1

NEXTPREV

Priority

TASK 2

NEXTPREV

Priority

TASK 3

NEXTPREV

Priority

TASK 4

NEXTPREV

Priority0

0OSTCBList

Task Scheduler (cont)Get the highest priority

0 0 0 0 0 1 0 00 0 0 0 0 0 0 00 0 1 1 0 1 0 00 0 0 0 0 0 0 00 1 0 0 0 0 1 01 0 0 0 0 0 1 10 0 0 0 0 0 0 01 0 0 0 0 0 0 0

1OSRdyGrp

0101101

TASK 1

NEXTPREV

Priority

TASK 2

NEXTPREV

Priority

TASK 3

NEXTPREV

Priority

TASK 4

NEXTPREV

Priority0

0OSTCBList

Task Scheduler (cont)Modify priority stateOSRdyGrp |= OSMapTbl[prio gtgt 3]OSRdyTbl[prio gtgt 3] |= OSMapTbl[prio amp 0x07]

Task Scheduler (cont)0 0 0 0 0 1 0 00 0 0 0 0 0 0 00 0 1 1 0 1 0 00 0 0 0 0 0 0 00 1 0 0 0 0 1 01 0 0 0 0 0 1 10 0 0 0 0 0 0 01 0 0 0 0 0 0 0

1 0 1 1 0 1 0 1

0 0 0 1 1 1 1 1

OSRdyGrp

Task Priority = 31

3

1

7

1

31

OSSched(void)void OSSched (void) INT8U y OS_ENTER_CRITICAL() if ((OSLockNesting | OSIntNesting) == 0) y = OSUnMapTbl[OSRdyGrp] OSPrioHighRdy = (INT8U)((y ltlt 3) + OSUnMapTbl[OSRdyTbl[y]]) if (OSPrioHighRdy = OSPrioCur) OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy] OSCtxSwCtr++ OS_TASK_SW() OS_EXIT_CRITICAL()

Task Pending Task pending occur when interrupt

raise When waiting some event message

or semaphore When one task delays itself When one task is preempted by

higher priority task

OSMBoxPend()OSQPend()OSSemPend()

OSTaskSuspend()OSTimeDly()OSTimeDlyHMSM()

Task Creation OSTaskCreate() OSTaskCreateExt() Create task before OSStart() or in Running state But not permit to create task in ISR

OSTaskCreate() Check priority

number

Check OSTCBPrioTbl OSTaskStkInit()

OSTCBInit() OSTaskCtr++ OSSched()

if (OSRunning)

OSStackCheck

OSTaskCreateExt() Check priority

number

Check OSTCBPrioTbl OSTaskStkInit()

OSTCBInit() OSTaskCtr++ OSSched()

if (OSRunning)

Task Deletion

TASK 1

NEXTPREV

Priority

TASK 2

NEXTPREV

Priority

TASK 3

NEXTPREV

Priority

TASK 4

NEXTPREV

Priority0

0OSTCBList

Interrupts Interrupt Service RoutineStep1save CPU registersStep2call OSIntEnter () or OSIntNesting add one directlyStep3execution the service codeStep4call OSIntExit() Step5restore CPU registersStep6call interrupt return instruction

Context switch

Clock ticks 10-100Hz void OSTickISR(void) OSTimeTick() OSTimeTick() execution time is in proportion to number of Task TASK 1

NEXTPREV OSTCBDly

TASK 2NEXTPREV OSTCBDly

TASK 3NEXTPREV OSTCBDly

TASK 4NEXTPREV OSTCBDly 0

0OSTCBList

OSTimeTick() if (ptcb-gtOSTCBDly = 0) if (--ptcb-gtOSTCBDly == 0) if ((ptcb-gtOSTCBStat amp OS_STAT_SUSPEND)) OSRdyGrp |= ptcb-gtOSTCBBitY OSRdyTbl[ptcb-gtOSTCBY] |= ptcb-gtOSTCBBitX else ptcb-gtOSTCBDly = 1

Time Management Using clock tick to implement time delays and timeouts OSTimeDly() OSTimeDlyHMSM() OSTimeDlyResume() OSTimeGet() OSTimeSet() Defined in OS_TimeC

OSTimeDly()void OSTimeDly (INT16U ticks) if (ticks gt 0)

OS_ENTER_CRITICAL() if ((OSRdyTbl[OSTCBCur-gtOSTCBY] amp= ~OSTCBCur-gtOSTCBBitX) == 0) OSRdyGrp amp= ~OSTCBCur-gtOSTCBBitY OSTCBCur-gtOSTCBDly = ticks

OS_EXIT_CRITICAL() OSSched()

uCOSII initialization OSIint() initialize all variables and data structure for system Defined in OS_COREC

OSPrioCur = 0OSPrioHighRdy = 0OSTCBCur = NULLOSTCBHighRdy = OLOSTime = 0OSIntNesting = 0OSLockNesting = 0 OSCtxSwCtr = 0OSTaskCtr = 2OSRunning = FALSEOSCPUUsage = 0OSIdleCtrMax = 0L OSIdleCtrRun = 0LOSIdleCtr = 0LOSStatRdy = FALSE

Free TCB List

Free Event List

Free Queue List

Free Memory List

Create a TaskPriority = 6

OSPrioCur = 6OSPrioHighRdy = 6OSTCBCur OSTCBHighRdy OSTime = 0OSIntNesting = 0OSLockNesting = 0 OSCtxSwCtr = 0OSTaskCtr = 3OSRunning = TRUEOSCPUUsage = 0OSIdleCtrMax = 0L OSIdleCtrRun = 0LOSIdleCtr = 0LOSStatRdy = FALSE

Message Mail boxes

Waiting List

  • Slide 1
  • Slide 2
  • Slide 3
  • Slide 4
  • Slide 5
  • Slide 6
  • Slide 7
  • Slide 8
  • Slide 9
  • Slide 10
  • Slide 11
  • Slide 12
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Slide 17
  • Slide 18
  • Slide 19
  • Slide 20
  • Slide 21
  • Slide 22
  • Slide 23
  • Slide 24
  • Slide 25
  • Slide 26
  • Slide 27
  • Slide 28
  • Slide 29
  • Slide 30
  • Slide 31
  • Slide 32
  • Slide 33
  • Slide 34
  • Slide 35
  • Slide 36
  • Slide 37
  • Slide 38
  • Slide 39
  • Slide 40
  • Slide 41
  • Slide 42
  • Slide 43
Page 18: uCOS-II Kernel Structure

Task Scheduling amp Context Switch In microCOS-II task scheduling if performed on following conditions diams A task is createddeleted diams A task changes state minus On interrupt exit minus On post signal minus On pending event minus On task suspension If the scheduler chooses a new task to run context switch occurs

Task Scheduler Preemptive Kernel Not support time quantum

Task Scheduler (cont) Principle select the highest priority

task from Ready List How to select the priority task from a

Ready List

Ready List PriorityGet the highest priority

Modify priority state

Double-linked List with

priority field

TASK 1

NEXTPREV

Priority

TASK 2

NEXTPREV

Priority

TASK 3

NEXTPREV

Priority

TASK 4

NEXTPREV

Priority0

0OSTCBList

Task Scheduler (cont)TASK 1

NEXTPREV

Priority

TASK 2

NEXTPREV

Priority

TASK 3

NEXTPREV

Priority

TASK 4

NEXTPREV

Priority0

0OSTCBList

Method 1Get the highest priority

Modify priority state

Get the First one in the Ready List Time Complexity O(1)

Selection sort for each changeTime Complexity O(N)

Task Scheduler (cont)TASK 1

NEXTPREV

Priority

TASK 2

NEXTPREV

Priority

TASK 3

NEXTPREV

Priority

TASK 4

NEXTPREV

Priority0

0OSTCBList

Method 2Get the highest priority

Modify priority state

Use a Ready Table a Priority TCB Table and one variable to selectTime Complexity O(1)

Maintain a Ready Table a Priority TCB Tabke and one variableTime Complexity O(1)

Task Scheduler (cont)

TASK 1

NEXTPREV

Priority

TASK 2

NEXTPREV

Priority

TASK 3

NEXTPREV

Priority

TASK 4

NEXTPREV

Priority0

0OSTCBList

Task Scheduler (cont)Get the highest priority

0 0 0 0 0 1 0 00 0 0 0 0 0 0 00 0 1 1 0 1 0 00 0 0 0 0 0 0 00 1 0 0 0 0 1 01 0 0 0 0 0 1 10 0 0 0 0 0 0 01 0 0 0 0 0 0 0

1OSRdyGrp

0101101

TASK 1

NEXTPREV

Priority

TASK 2

NEXTPREV

Priority

TASK 3

NEXTPREV

Priority

TASK 4

NEXTPREV

Priority0

0OSTCBList

Task Scheduler (cont)Modify priority stateOSRdyGrp |= OSMapTbl[prio gtgt 3]OSRdyTbl[prio gtgt 3] |= OSMapTbl[prio amp 0x07]

Task Scheduler (cont)0 0 0 0 0 1 0 00 0 0 0 0 0 0 00 0 1 1 0 1 0 00 0 0 0 0 0 0 00 1 0 0 0 0 1 01 0 0 0 0 0 1 10 0 0 0 0 0 0 01 0 0 0 0 0 0 0

1 0 1 1 0 1 0 1

0 0 0 1 1 1 1 1

OSRdyGrp

Task Priority = 31

3

1

7

1

31

OSSched(void)void OSSched (void) INT8U y OS_ENTER_CRITICAL() if ((OSLockNesting | OSIntNesting) == 0) y = OSUnMapTbl[OSRdyGrp] OSPrioHighRdy = (INT8U)((y ltlt 3) + OSUnMapTbl[OSRdyTbl[y]]) if (OSPrioHighRdy = OSPrioCur) OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy] OSCtxSwCtr++ OS_TASK_SW() OS_EXIT_CRITICAL()

Task Pending Task pending occur when interrupt

raise When waiting some event message

or semaphore When one task delays itself When one task is preempted by

higher priority task

OSMBoxPend()OSQPend()OSSemPend()

OSTaskSuspend()OSTimeDly()OSTimeDlyHMSM()

Task Creation OSTaskCreate() OSTaskCreateExt() Create task before OSStart() or in Running state But not permit to create task in ISR

OSTaskCreate() Check priority

number

Check OSTCBPrioTbl OSTaskStkInit()

OSTCBInit() OSTaskCtr++ OSSched()

if (OSRunning)

OSStackCheck

OSTaskCreateExt() Check priority

number

Check OSTCBPrioTbl OSTaskStkInit()

OSTCBInit() OSTaskCtr++ OSSched()

if (OSRunning)

Task Deletion

TASK 1

NEXTPREV

Priority

TASK 2

NEXTPREV

Priority

TASK 3

NEXTPREV

Priority

TASK 4

NEXTPREV

Priority0

0OSTCBList

Interrupts Interrupt Service RoutineStep1save CPU registersStep2call OSIntEnter () or OSIntNesting add one directlyStep3execution the service codeStep4call OSIntExit() Step5restore CPU registersStep6call interrupt return instruction

Context switch

Clock ticks 10-100Hz void OSTickISR(void) OSTimeTick() OSTimeTick() execution time is in proportion to number of Task TASK 1

NEXTPREV OSTCBDly

TASK 2NEXTPREV OSTCBDly

TASK 3NEXTPREV OSTCBDly

TASK 4NEXTPREV OSTCBDly 0

0OSTCBList

OSTimeTick() if (ptcb-gtOSTCBDly = 0) if (--ptcb-gtOSTCBDly == 0) if ((ptcb-gtOSTCBStat amp OS_STAT_SUSPEND)) OSRdyGrp |= ptcb-gtOSTCBBitY OSRdyTbl[ptcb-gtOSTCBY] |= ptcb-gtOSTCBBitX else ptcb-gtOSTCBDly = 1

Time Management Using clock tick to implement time delays and timeouts OSTimeDly() OSTimeDlyHMSM() OSTimeDlyResume() OSTimeGet() OSTimeSet() Defined in OS_TimeC

OSTimeDly()void OSTimeDly (INT16U ticks) if (ticks gt 0)

OS_ENTER_CRITICAL() if ((OSRdyTbl[OSTCBCur-gtOSTCBY] amp= ~OSTCBCur-gtOSTCBBitX) == 0) OSRdyGrp amp= ~OSTCBCur-gtOSTCBBitY OSTCBCur-gtOSTCBDly = ticks

OS_EXIT_CRITICAL() OSSched()

uCOSII initialization OSIint() initialize all variables and data structure for system Defined in OS_COREC

OSPrioCur = 0OSPrioHighRdy = 0OSTCBCur = NULLOSTCBHighRdy = OLOSTime = 0OSIntNesting = 0OSLockNesting = 0 OSCtxSwCtr = 0OSTaskCtr = 2OSRunning = FALSEOSCPUUsage = 0OSIdleCtrMax = 0L OSIdleCtrRun = 0LOSIdleCtr = 0LOSStatRdy = FALSE

Free TCB List

Free Event List

Free Queue List

Free Memory List

Create a TaskPriority = 6

OSPrioCur = 6OSPrioHighRdy = 6OSTCBCur OSTCBHighRdy OSTime = 0OSIntNesting = 0OSLockNesting = 0 OSCtxSwCtr = 0OSTaskCtr = 3OSRunning = TRUEOSCPUUsage = 0OSIdleCtrMax = 0L OSIdleCtrRun = 0LOSIdleCtr = 0LOSStatRdy = FALSE

Message Mail boxes

Waiting List

  • Slide 1
  • Slide 2
  • Slide 3
  • Slide 4
  • Slide 5
  • Slide 6
  • Slide 7
  • Slide 8
  • Slide 9
  • Slide 10
  • Slide 11
  • Slide 12
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Slide 17
  • Slide 18
  • Slide 19
  • Slide 20
  • Slide 21
  • Slide 22
  • Slide 23
  • Slide 24
  • Slide 25
  • Slide 26
  • Slide 27
  • Slide 28
  • Slide 29
  • Slide 30
  • Slide 31
  • Slide 32
  • Slide 33
  • Slide 34
  • Slide 35
  • Slide 36
  • Slide 37
  • Slide 38
  • Slide 39
  • Slide 40
  • Slide 41
  • Slide 42
  • Slide 43
Page 19: uCOS-II Kernel Structure

Task Scheduler Preemptive Kernel Not support time quantum

Task Scheduler (cont) Principle select the highest priority

task from Ready List How to select the priority task from a

Ready List

Ready List PriorityGet the highest priority

Modify priority state

Double-linked List with

priority field

TASK 1

NEXTPREV

Priority

TASK 2

NEXTPREV

Priority

TASK 3

NEXTPREV

Priority

TASK 4

NEXTPREV

Priority0

0OSTCBList

Task Scheduler (cont)TASK 1

NEXTPREV

Priority

TASK 2

NEXTPREV

Priority

TASK 3

NEXTPREV

Priority

TASK 4

NEXTPREV

Priority0

0OSTCBList

Method 1Get the highest priority

Modify priority state

Get the First one in the Ready List Time Complexity O(1)

Selection sort for each changeTime Complexity O(N)

Task Scheduler (cont)TASK 1

NEXTPREV

Priority

TASK 2

NEXTPREV

Priority

TASK 3

NEXTPREV

Priority

TASK 4

NEXTPREV

Priority0

0OSTCBList

Method 2Get the highest priority

Modify priority state

Use a Ready Table a Priority TCB Table and one variable to selectTime Complexity O(1)

Maintain a Ready Table a Priority TCB Tabke and one variableTime Complexity O(1)

Task Scheduler (cont)

TASK 1

NEXTPREV

Priority

TASK 2

NEXTPREV

Priority

TASK 3

NEXTPREV

Priority

TASK 4

NEXTPREV

Priority0

0OSTCBList

Task Scheduler (cont)Get the highest priority

0 0 0 0 0 1 0 00 0 0 0 0 0 0 00 0 1 1 0 1 0 00 0 0 0 0 0 0 00 1 0 0 0 0 1 01 0 0 0 0 0 1 10 0 0 0 0 0 0 01 0 0 0 0 0 0 0

1OSRdyGrp

0101101

TASK 1

NEXTPREV

Priority

TASK 2

NEXTPREV

Priority

TASK 3

NEXTPREV

Priority

TASK 4

NEXTPREV

Priority0

0OSTCBList

Task Scheduler (cont)Modify priority stateOSRdyGrp |= OSMapTbl[prio gtgt 3]OSRdyTbl[prio gtgt 3] |= OSMapTbl[prio amp 0x07]

Task Scheduler (cont)0 0 0 0 0 1 0 00 0 0 0 0 0 0 00 0 1 1 0 1 0 00 0 0 0 0 0 0 00 1 0 0 0 0 1 01 0 0 0 0 0 1 10 0 0 0 0 0 0 01 0 0 0 0 0 0 0

1 0 1 1 0 1 0 1

0 0 0 1 1 1 1 1

OSRdyGrp

Task Priority = 31

3

1

7

1

31

OSSched(void)void OSSched (void) INT8U y OS_ENTER_CRITICAL() if ((OSLockNesting | OSIntNesting) == 0) y = OSUnMapTbl[OSRdyGrp] OSPrioHighRdy = (INT8U)((y ltlt 3) + OSUnMapTbl[OSRdyTbl[y]]) if (OSPrioHighRdy = OSPrioCur) OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy] OSCtxSwCtr++ OS_TASK_SW() OS_EXIT_CRITICAL()

Task Pending Task pending occur when interrupt

raise When waiting some event message

or semaphore When one task delays itself When one task is preempted by

higher priority task

OSMBoxPend()OSQPend()OSSemPend()

OSTaskSuspend()OSTimeDly()OSTimeDlyHMSM()

Task Creation OSTaskCreate() OSTaskCreateExt() Create task before OSStart() or in Running state But not permit to create task in ISR

OSTaskCreate() Check priority

number

Check OSTCBPrioTbl OSTaskStkInit()

OSTCBInit() OSTaskCtr++ OSSched()

if (OSRunning)

OSStackCheck

OSTaskCreateExt() Check priority

number

Check OSTCBPrioTbl OSTaskStkInit()

OSTCBInit() OSTaskCtr++ OSSched()

if (OSRunning)

Task Deletion

TASK 1

NEXTPREV

Priority

TASK 2

NEXTPREV

Priority

TASK 3

NEXTPREV

Priority

TASK 4

NEXTPREV

Priority0

0OSTCBList

Interrupts Interrupt Service RoutineStep1save CPU registersStep2call OSIntEnter () or OSIntNesting add one directlyStep3execution the service codeStep4call OSIntExit() Step5restore CPU registersStep6call interrupt return instruction

Context switch

Clock ticks 10-100Hz void OSTickISR(void) OSTimeTick() OSTimeTick() execution time is in proportion to number of Task TASK 1

NEXTPREV OSTCBDly

TASK 2NEXTPREV OSTCBDly

TASK 3NEXTPREV OSTCBDly

TASK 4NEXTPREV OSTCBDly 0

0OSTCBList

OSTimeTick() if (ptcb-gtOSTCBDly = 0) if (--ptcb-gtOSTCBDly == 0) if ((ptcb-gtOSTCBStat amp OS_STAT_SUSPEND)) OSRdyGrp |= ptcb-gtOSTCBBitY OSRdyTbl[ptcb-gtOSTCBY] |= ptcb-gtOSTCBBitX else ptcb-gtOSTCBDly = 1

Time Management Using clock tick to implement time delays and timeouts OSTimeDly() OSTimeDlyHMSM() OSTimeDlyResume() OSTimeGet() OSTimeSet() Defined in OS_TimeC

OSTimeDly()void OSTimeDly (INT16U ticks) if (ticks gt 0)

OS_ENTER_CRITICAL() if ((OSRdyTbl[OSTCBCur-gtOSTCBY] amp= ~OSTCBCur-gtOSTCBBitX) == 0) OSRdyGrp amp= ~OSTCBCur-gtOSTCBBitY OSTCBCur-gtOSTCBDly = ticks

OS_EXIT_CRITICAL() OSSched()

uCOSII initialization OSIint() initialize all variables and data structure for system Defined in OS_COREC

OSPrioCur = 0OSPrioHighRdy = 0OSTCBCur = NULLOSTCBHighRdy = OLOSTime = 0OSIntNesting = 0OSLockNesting = 0 OSCtxSwCtr = 0OSTaskCtr = 2OSRunning = FALSEOSCPUUsage = 0OSIdleCtrMax = 0L OSIdleCtrRun = 0LOSIdleCtr = 0LOSStatRdy = FALSE

Free TCB List

Free Event List

Free Queue List

Free Memory List

Create a TaskPriority = 6

OSPrioCur = 6OSPrioHighRdy = 6OSTCBCur OSTCBHighRdy OSTime = 0OSIntNesting = 0OSLockNesting = 0 OSCtxSwCtr = 0OSTaskCtr = 3OSRunning = TRUEOSCPUUsage = 0OSIdleCtrMax = 0L OSIdleCtrRun = 0LOSIdleCtr = 0LOSStatRdy = FALSE

Message Mail boxes

Waiting List

  • Slide 1
  • Slide 2
  • Slide 3
  • Slide 4
  • Slide 5
  • Slide 6
  • Slide 7
  • Slide 8
  • Slide 9
  • Slide 10
  • Slide 11
  • Slide 12
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Slide 17
  • Slide 18
  • Slide 19
  • Slide 20
  • Slide 21
  • Slide 22
  • Slide 23
  • Slide 24
  • Slide 25
  • Slide 26
  • Slide 27
  • Slide 28
  • Slide 29
  • Slide 30
  • Slide 31
  • Slide 32
  • Slide 33
  • Slide 34
  • Slide 35
  • Slide 36
  • Slide 37
  • Slide 38
  • Slide 39
  • Slide 40
  • Slide 41
  • Slide 42
  • Slide 43
Page 20: uCOS-II Kernel Structure

Task Scheduler (cont) Principle select the highest priority

task from Ready List How to select the priority task from a

Ready List

Ready List PriorityGet the highest priority

Modify priority state

Double-linked List with

priority field

TASK 1

NEXTPREV

Priority

TASK 2

NEXTPREV

Priority

TASK 3

NEXTPREV

Priority

TASK 4

NEXTPREV

Priority0

0OSTCBList

Task Scheduler (cont)TASK 1

NEXTPREV

Priority

TASK 2

NEXTPREV

Priority

TASK 3

NEXTPREV

Priority

TASK 4

NEXTPREV

Priority0

0OSTCBList

Method 1Get the highest priority

Modify priority state

Get the First one in the Ready List Time Complexity O(1)

Selection sort for each changeTime Complexity O(N)

Task Scheduler (cont)TASK 1

NEXTPREV

Priority

TASK 2

NEXTPREV

Priority

TASK 3

NEXTPREV

Priority

TASK 4

NEXTPREV

Priority0

0OSTCBList

Method 2Get the highest priority

Modify priority state

Use a Ready Table a Priority TCB Table and one variable to selectTime Complexity O(1)

Maintain a Ready Table a Priority TCB Tabke and one variableTime Complexity O(1)

Task Scheduler (cont)

TASK 1

NEXTPREV

Priority

TASK 2

NEXTPREV

Priority

TASK 3

NEXTPREV

Priority

TASK 4

NEXTPREV

Priority0

0OSTCBList

Task Scheduler (cont)Get the highest priority

0 0 0 0 0 1 0 00 0 0 0 0 0 0 00 0 1 1 0 1 0 00 0 0 0 0 0 0 00 1 0 0 0 0 1 01 0 0 0 0 0 1 10 0 0 0 0 0 0 01 0 0 0 0 0 0 0

1OSRdyGrp

0101101

TASK 1

NEXTPREV

Priority

TASK 2

NEXTPREV

Priority

TASK 3

NEXTPREV

Priority

TASK 4

NEXTPREV

Priority0

0OSTCBList

Task Scheduler (cont)Modify priority stateOSRdyGrp |= OSMapTbl[prio gtgt 3]OSRdyTbl[prio gtgt 3] |= OSMapTbl[prio amp 0x07]

Task Scheduler (cont)0 0 0 0 0 1 0 00 0 0 0 0 0 0 00 0 1 1 0 1 0 00 0 0 0 0 0 0 00 1 0 0 0 0 1 01 0 0 0 0 0 1 10 0 0 0 0 0 0 01 0 0 0 0 0 0 0

1 0 1 1 0 1 0 1

0 0 0 1 1 1 1 1

OSRdyGrp

Task Priority = 31

3

1

7

1

31

OSSched(void)void OSSched (void) INT8U y OS_ENTER_CRITICAL() if ((OSLockNesting | OSIntNesting) == 0) y = OSUnMapTbl[OSRdyGrp] OSPrioHighRdy = (INT8U)((y ltlt 3) + OSUnMapTbl[OSRdyTbl[y]]) if (OSPrioHighRdy = OSPrioCur) OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy] OSCtxSwCtr++ OS_TASK_SW() OS_EXIT_CRITICAL()

Task Pending Task pending occur when interrupt

raise When waiting some event message

or semaphore When one task delays itself When one task is preempted by

higher priority task

OSMBoxPend()OSQPend()OSSemPend()

OSTaskSuspend()OSTimeDly()OSTimeDlyHMSM()

Task Creation OSTaskCreate() OSTaskCreateExt() Create task before OSStart() or in Running state But not permit to create task in ISR

OSTaskCreate() Check priority

number

Check OSTCBPrioTbl OSTaskStkInit()

OSTCBInit() OSTaskCtr++ OSSched()

if (OSRunning)

OSStackCheck

OSTaskCreateExt() Check priority

number

Check OSTCBPrioTbl OSTaskStkInit()

OSTCBInit() OSTaskCtr++ OSSched()

if (OSRunning)

Task Deletion

TASK 1

NEXTPREV

Priority

TASK 2

NEXTPREV

Priority

TASK 3

NEXTPREV

Priority

TASK 4

NEXTPREV

Priority0

0OSTCBList

Interrupts Interrupt Service RoutineStep1save CPU registersStep2call OSIntEnter () or OSIntNesting add one directlyStep3execution the service codeStep4call OSIntExit() Step5restore CPU registersStep6call interrupt return instruction

Context switch

Clock ticks 10-100Hz void OSTickISR(void) OSTimeTick() OSTimeTick() execution time is in proportion to number of Task TASK 1

NEXTPREV OSTCBDly

TASK 2NEXTPREV OSTCBDly

TASK 3NEXTPREV OSTCBDly

TASK 4NEXTPREV OSTCBDly 0

0OSTCBList

OSTimeTick() if (ptcb-gtOSTCBDly = 0) if (--ptcb-gtOSTCBDly == 0) if ((ptcb-gtOSTCBStat amp OS_STAT_SUSPEND)) OSRdyGrp |= ptcb-gtOSTCBBitY OSRdyTbl[ptcb-gtOSTCBY] |= ptcb-gtOSTCBBitX else ptcb-gtOSTCBDly = 1

Time Management Using clock tick to implement time delays and timeouts OSTimeDly() OSTimeDlyHMSM() OSTimeDlyResume() OSTimeGet() OSTimeSet() Defined in OS_TimeC

OSTimeDly()void OSTimeDly (INT16U ticks) if (ticks gt 0)

OS_ENTER_CRITICAL() if ((OSRdyTbl[OSTCBCur-gtOSTCBY] amp= ~OSTCBCur-gtOSTCBBitX) == 0) OSRdyGrp amp= ~OSTCBCur-gtOSTCBBitY OSTCBCur-gtOSTCBDly = ticks

OS_EXIT_CRITICAL() OSSched()

uCOSII initialization OSIint() initialize all variables and data structure for system Defined in OS_COREC

OSPrioCur = 0OSPrioHighRdy = 0OSTCBCur = NULLOSTCBHighRdy = OLOSTime = 0OSIntNesting = 0OSLockNesting = 0 OSCtxSwCtr = 0OSTaskCtr = 2OSRunning = FALSEOSCPUUsage = 0OSIdleCtrMax = 0L OSIdleCtrRun = 0LOSIdleCtr = 0LOSStatRdy = FALSE

Free TCB List

Free Event List

Free Queue List

Free Memory List

Create a TaskPriority = 6

OSPrioCur = 6OSPrioHighRdy = 6OSTCBCur OSTCBHighRdy OSTime = 0OSIntNesting = 0OSLockNesting = 0 OSCtxSwCtr = 0OSTaskCtr = 3OSRunning = TRUEOSCPUUsage = 0OSIdleCtrMax = 0L OSIdleCtrRun = 0LOSIdleCtr = 0LOSStatRdy = FALSE

Message Mail boxes

Waiting List

  • Slide 1
  • Slide 2
  • Slide 3
  • Slide 4
  • Slide 5
  • Slide 6
  • Slide 7
  • Slide 8
  • Slide 9
  • Slide 10
  • Slide 11
  • Slide 12
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Slide 17
  • Slide 18
  • Slide 19
  • Slide 20
  • Slide 21
  • Slide 22
  • Slide 23
  • Slide 24
  • Slide 25
  • Slide 26
  • Slide 27
  • Slide 28
  • Slide 29
  • Slide 30
  • Slide 31
  • Slide 32
  • Slide 33
  • Slide 34
  • Slide 35
  • Slide 36
  • Slide 37
  • Slide 38
  • Slide 39
  • Slide 40
  • Slide 41
  • Slide 42
  • Slide 43
Page 21: uCOS-II Kernel Structure

Task Scheduler (cont)TASK 1

NEXTPREV

Priority

TASK 2

NEXTPREV

Priority

TASK 3

NEXTPREV

Priority

TASK 4

NEXTPREV

Priority0

0OSTCBList

Method 1Get the highest priority

Modify priority state

Get the First one in the Ready List Time Complexity O(1)

Selection sort for each changeTime Complexity O(N)

Task Scheduler (cont)TASK 1

NEXTPREV

Priority

TASK 2

NEXTPREV

Priority

TASK 3

NEXTPREV

Priority

TASK 4

NEXTPREV

Priority0

0OSTCBList

Method 2Get the highest priority

Modify priority state

Use a Ready Table a Priority TCB Table and one variable to selectTime Complexity O(1)

Maintain a Ready Table a Priority TCB Tabke and one variableTime Complexity O(1)

Task Scheduler (cont)

TASK 1

NEXTPREV

Priority

TASK 2

NEXTPREV

Priority

TASK 3

NEXTPREV

Priority

TASK 4

NEXTPREV

Priority0

0OSTCBList

Task Scheduler (cont)Get the highest priority

0 0 0 0 0 1 0 00 0 0 0 0 0 0 00 0 1 1 0 1 0 00 0 0 0 0 0 0 00 1 0 0 0 0 1 01 0 0 0 0 0 1 10 0 0 0 0 0 0 01 0 0 0 0 0 0 0

1OSRdyGrp

0101101

TASK 1

NEXTPREV

Priority

TASK 2

NEXTPREV

Priority

TASK 3

NEXTPREV

Priority

TASK 4

NEXTPREV

Priority0

0OSTCBList

Task Scheduler (cont)Modify priority stateOSRdyGrp |= OSMapTbl[prio gtgt 3]OSRdyTbl[prio gtgt 3] |= OSMapTbl[prio amp 0x07]

Task Scheduler (cont)0 0 0 0 0 1 0 00 0 0 0 0 0 0 00 0 1 1 0 1 0 00 0 0 0 0 0 0 00 1 0 0 0 0 1 01 0 0 0 0 0 1 10 0 0 0 0 0 0 01 0 0 0 0 0 0 0

1 0 1 1 0 1 0 1

0 0 0 1 1 1 1 1

OSRdyGrp

Task Priority = 31

3

1

7

1

31

OSSched(void)void OSSched (void) INT8U y OS_ENTER_CRITICAL() if ((OSLockNesting | OSIntNesting) == 0) y = OSUnMapTbl[OSRdyGrp] OSPrioHighRdy = (INT8U)((y ltlt 3) + OSUnMapTbl[OSRdyTbl[y]]) if (OSPrioHighRdy = OSPrioCur) OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy] OSCtxSwCtr++ OS_TASK_SW() OS_EXIT_CRITICAL()

Task Pending Task pending occur when interrupt

raise When waiting some event message

or semaphore When one task delays itself When one task is preempted by

higher priority task

OSMBoxPend()OSQPend()OSSemPend()

OSTaskSuspend()OSTimeDly()OSTimeDlyHMSM()

Task Creation OSTaskCreate() OSTaskCreateExt() Create task before OSStart() or in Running state But not permit to create task in ISR

OSTaskCreate() Check priority

number

Check OSTCBPrioTbl OSTaskStkInit()

OSTCBInit() OSTaskCtr++ OSSched()

if (OSRunning)

OSStackCheck

OSTaskCreateExt() Check priority

number

Check OSTCBPrioTbl OSTaskStkInit()

OSTCBInit() OSTaskCtr++ OSSched()

if (OSRunning)

Task Deletion

TASK 1

NEXTPREV

Priority

TASK 2

NEXTPREV

Priority

TASK 3

NEXTPREV

Priority

TASK 4

NEXTPREV

Priority0

0OSTCBList

Interrupts Interrupt Service RoutineStep1save CPU registersStep2call OSIntEnter () or OSIntNesting add one directlyStep3execution the service codeStep4call OSIntExit() Step5restore CPU registersStep6call interrupt return instruction

Context switch

Clock ticks 10-100Hz void OSTickISR(void) OSTimeTick() OSTimeTick() execution time is in proportion to number of Task TASK 1

NEXTPREV OSTCBDly

TASK 2NEXTPREV OSTCBDly

TASK 3NEXTPREV OSTCBDly

TASK 4NEXTPREV OSTCBDly 0

0OSTCBList

OSTimeTick() if (ptcb-gtOSTCBDly = 0) if (--ptcb-gtOSTCBDly == 0) if ((ptcb-gtOSTCBStat amp OS_STAT_SUSPEND)) OSRdyGrp |= ptcb-gtOSTCBBitY OSRdyTbl[ptcb-gtOSTCBY] |= ptcb-gtOSTCBBitX else ptcb-gtOSTCBDly = 1

Time Management Using clock tick to implement time delays and timeouts OSTimeDly() OSTimeDlyHMSM() OSTimeDlyResume() OSTimeGet() OSTimeSet() Defined in OS_TimeC

OSTimeDly()void OSTimeDly (INT16U ticks) if (ticks gt 0)

OS_ENTER_CRITICAL() if ((OSRdyTbl[OSTCBCur-gtOSTCBY] amp= ~OSTCBCur-gtOSTCBBitX) == 0) OSRdyGrp amp= ~OSTCBCur-gtOSTCBBitY OSTCBCur-gtOSTCBDly = ticks

OS_EXIT_CRITICAL() OSSched()

uCOSII initialization OSIint() initialize all variables and data structure for system Defined in OS_COREC

OSPrioCur = 0OSPrioHighRdy = 0OSTCBCur = NULLOSTCBHighRdy = OLOSTime = 0OSIntNesting = 0OSLockNesting = 0 OSCtxSwCtr = 0OSTaskCtr = 2OSRunning = FALSEOSCPUUsage = 0OSIdleCtrMax = 0L OSIdleCtrRun = 0LOSIdleCtr = 0LOSStatRdy = FALSE

Free TCB List

Free Event List

Free Queue List

Free Memory List

Create a TaskPriority = 6

OSPrioCur = 6OSPrioHighRdy = 6OSTCBCur OSTCBHighRdy OSTime = 0OSIntNesting = 0OSLockNesting = 0 OSCtxSwCtr = 0OSTaskCtr = 3OSRunning = TRUEOSCPUUsage = 0OSIdleCtrMax = 0L OSIdleCtrRun = 0LOSIdleCtr = 0LOSStatRdy = FALSE

Message Mail boxes

Waiting List

  • Slide 1
  • Slide 2
  • Slide 3
  • Slide 4
  • Slide 5
  • Slide 6
  • Slide 7
  • Slide 8
  • Slide 9
  • Slide 10
  • Slide 11
  • Slide 12
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Slide 17
  • Slide 18
  • Slide 19
  • Slide 20
  • Slide 21
  • Slide 22
  • Slide 23
  • Slide 24
  • Slide 25
  • Slide 26
  • Slide 27
  • Slide 28
  • Slide 29
  • Slide 30
  • Slide 31
  • Slide 32
  • Slide 33
  • Slide 34
  • Slide 35
  • Slide 36
  • Slide 37
  • Slide 38
  • Slide 39
  • Slide 40
  • Slide 41
  • Slide 42
  • Slide 43
Page 22: uCOS-II Kernel Structure

Task Scheduler (cont)TASK 1

NEXTPREV

Priority

TASK 2

NEXTPREV

Priority

TASK 3

NEXTPREV

Priority

TASK 4

NEXTPREV

Priority0

0OSTCBList

Method 2Get the highest priority

Modify priority state

Use a Ready Table a Priority TCB Table and one variable to selectTime Complexity O(1)

Maintain a Ready Table a Priority TCB Tabke and one variableTime Complexity O(1)

Task Scheduler (cont)

TASK 1

NEXTPREV

Priority

TASK 2

NEXTPREV

Priority

TASK 3

NEXTPREV

Priority

TASK 4

NEXTPREV

Priority0

0OSTCBList

Task Scheduler (cont)Get the highest priority

0 0 0 0 0 1 0 00 0 0 0 0 0 0 00 0 1 1 0 1 0 00 0 0 0 0 0 0 00 1 0 0 0 0 1 01 0 0 0 0 0 1 10 0 0 0 0 0 0 01 0 0 0 0 0 0 0

1OSRdyGrp

0101101

TASK 1

NEXTPREV

Priority

TASK 2

NEXTPREV

Priority

TASK 3

NEXTPREV

Priority

TASK 4

NEXTPREV

Priority0

0OSTCBList

Task Scheduler (cont)Modify priority stateOSRdyGrp |= OSMapTbl[prio gtgt 3]OSRdyTbl[prio gtgt 3] |= OSMapTbl[prio amp 0x07]

Task Scheduler (cont)0 0 0 0 0 1 0 00 0 0 0 0 0 0 00 0 1 1 0 1 0 00 0 0 0 0 0 0 00 1 0 0 0 0 1 01 0 0 0 0 0 1 10 0 0 0 0 0 0 01 0 0 0 0 0 0 0

1 0 1 1 0 1 0 1

0 0 0 1 1 1 1 1

OSRdyGrp

Task Priority = 31

3

1

7

1

31

OSSched(void)void OSSched (void) INT8U y OS_ENTER_CRITICAL() if ((OSLockNesting | OSIntNesting) == 0) y = OSUnMapTbl[OSRdyGrp] OSPrioHighRdy = (INT8U)((y ltlt 3) + OSUnMapTbl[OSRdyTbl[y]]) if (OSPrioHighRdy = OSPrioCur) OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy] OSCtxSwCtr++ OS_TASK_SW() OS_EXIT_CRITICAL()

Task Pending Task pending occur when interrupt

raise When waiting some event message

or semaphore When one task delays itself When one task is preempted by

higher priority task

OSMBoxPend()OSQPend()OSSemPend()

OSTaskSuspend()OSTimeDly()OSTimeDlyHMSM()

Task Creation OSTaskCreate() OSTaskCreateExt() Create task before OSStart() or in Running state But not permit to create task in ISR

OSTaskCreate() Check priority

number

Check OSTCBPrioTbl OSTaskStkInit()

OSTCBInit() OSTaskCtr++ OSSched()

if (OSRunning)

OSStackCheck

OSTaskCreateExt() Check priority

number

Check OSTCBPrioTbl OSTaskStkInit()

OSTCBInit() OSTaskCtr++ OSSched()

if (OSRunning)

Task Deletion

TASK 1

NEXTPREV

Priority

TASK 2

NEXTPREV

Priority

TASK 3

NEXTPREV

Priority

TASK 4

NEXTPREV

Priority0

0OSTCBList

Interrupts Interrupt Service RoutineStep1save CPU registersStep2call OSIntEnter () or OSIntNesting add one directlyStep3execution the service codeStep4call OSIntExit() Step5restore CPU registersStep6call interrupt return instruction

Context switch

Clock ticks 10-100Hz void OSTickISR(void) OSTimeTick() OSTimeTick() execution time is in proportion to number of Task TASK 1

NEXTPREV OSTCBDly

TASK 2NEXTPREV OSTCBDly

TASK 3NEXTPREV OSTCBDly

TASK 4NEXTPREV OSTCBDly 0

0OSTCBList

OSTimeTick() if (ptcb-gtOSTCBDly = 0) if (--ptcb-gtOSTCBDly == 0) if ((ptcb-gtOSTCBStat amp OS_STAT_SUSPEND)) OSRdyGrp |= ptcb-gtOSTCBBitY OSRdyTbl[ptcb-gtOSTCBY] |= ptcb-gtOSTCBBitX else ptcb-gtOSTCBDly = 1

Time Management Using clock tick to implement time delays and timeouts OSTimeDly() OSTimeDlyHMSM() OSTimeDlyResume() OSTimeGet() OSTimeSet() Defined in OS_TimeC

OSTimeDly()void OSTimeDly (INT16U ticks) if (ticks gt 0)

OS_ENTER_CRITICAL() if ((OSRdyTbl[OSTCBCur-gtOSTCBY] amp= ~OSTCBCur-gtOSTCBBitX) == 0) OSRdyGrp amp= ~OSTCBCur-gtOSTCBBitY OSTCBCur-gtOSTCBDly = ticks

OS_EXIT_CRITICAL() OSSched()

uCOSII initialization OSIint() initialize all variables and data structure for system Defined in OS_COREC

OSPrioCur = 0OSPrioHighRdy = 0OSTCBCur = NULLOSTCBHighRdy = OLOSTime = 0OSIntNesting = 0OSLockNesting = 0 OSCtxSwCtr = 0OSTaskCtr = 2OSRunning = FALSEOSCPUUsage = 0OSIdleCtrMax = 0L OSIdleCtrRun = 0LOSIdleCtr = 0LOSStatRdy = FALSE

Free TCB List

Free Event List

Free Queue List

Free Memory List

Create a TaskPriority = 6

OSPrioCur = 6OSPrioHighRdy = 6OSTCBCur OSTCBHighRdy OSTime = 0OSIntNesting = 0OSLockNesting = 0 OSCtxSwCtr = 0OSTaskCtr = 3OSRunning = TRUEOSCPUUsage = 0OSIdleCtrMax = 0L OSIdleCtrRun = 0LOSIdleCtr = 0LOSStatRdy = FALSE

Message Mail boxes

Waiting List

  • Slide 1
  • Slide 2
  • Slide 3
  • Slide 4
  • Slide 5
  • Slide 6
  • Slide 7
  • Slide 8
  • Slide 9
  • Slide 10
  • Slide 11
  • Slide 12
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Slide 17
  • Slide 18
  • Slide 19
  • Slide 20
  • Slide 21
  • Slide 22
  • Slide 23
  • Slide 24
  • Slide 25
  • Slide 26
  • Slide 27
  • Slide 28
  • Slide 29
  • Slide 30
  • Slide 31
  • Slide 32
  • Slide 33
  • Slide 34
  • Slide 35
  • Slide 36
  • Slide 37
  • Slide 38
  • Slide 39
  • Slide 40
  • Slide 41
  • Slide 42
  • Slide 43
Page 23: uCOS-II Kernel Structure

Task Scheduler (cont)

TASK 1

NEXTPREV

Priority

TASK 2

NEXTPREV

Priority

TASK 3

NEXTPREV

Priority

TASK 4

NEXTPREV

Priority0

0OSTCBList

Task Scheduler (cont)Get the highest priority

0 0 0 0 0 1 0 00 0 0 0 0 0 0 00 0 1 1 0 1 0 00 0 0 0 0 0 0 00 1 0 0 0 0 1 01 0 0 0 0 0 1 10 0 0 0 0 0 0 01 0 0 0 0 0 0 0

1OSRdyGrp

0101101

TASK 1

NEXTPREV

Priority

TASK 2

NEXTPREV

Priority

TASK 3

NEXTPREV

Priority

TASK 4

NEXTPREV

Priority0

0OSTCBList

Task Scheduler (cont)Modify priority stateOSRdyGrp |= OSMapTbl[prio gtgt 3]OSRdyTbl[prio gtgt 3] |= OSMapTbl[prio amp 0x07]

Task Scheduler (cont)0 0 0 0 0 1 0 00 0 0 0 0 0 0 00 0 1 1 0 1 0 00 0 0 0 0 0 0 00 1 0 0 0 0 1 01 0 0 0 0 0 1 10 0 0 0 0 0 0 01 0 0 0 0 0 0 0

1 0 1 1 0 1 0 1

0 0 0 1 1 1 1 1

OSRdyGrp

Task Priority = 31

3

1

7

1

31

OSSched(void)void OSSched (void) INT8U y OS_ENTER_CRITICAL() if ((OSLockNesting | OSIntNesting) == 0) y = OSUnMapTbl[OSRdyGrp] OSPrioHighRdy = (INT8U)((y ltlt 3) + OSUnMapTbl[OSRdyTbl[y]]) if (OSPrioHighRdy = OSPrioCur) OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy] OSCtxSwCtr++ OS_TASK_SW() OS_EXIT_CRITICAL()

Task Pending Task pending occur when interrupt

raise When waiting some event message

or semaphore When one task delays itself When one task is preempted by

higher priority task

OSMBoxPend()OSQPend()OSSemPend()

OSTaskSuspend()OSTimeDly()OSTimeDlyHMSM()

Task Creation OSTaskCreate() OSTaskCreateExt() Create task before OSStart() or in Running state But not permit to create task in ISR

OSTaskCreate() Check priority

number

Check OSTCBPrioTbl OSTaskStkInit()

OSTCBInit() OSTaskCtr++ OSSched()

if (OSRunning)

OSStackCheck

OSTaskCreateExt() Check priority

number

Check OSTCBPrioTbl OSTaskStkInit()

OSTCBInit() OSTaskCtr++ OSSched()

if (OSRunning)

Task Deletion

TASK 1

NEXTPREV

Priority

TASK 2

NEXTPREV

Priority

TASK 3

NEXTPREV

Priority

TASK 4

NEXTPREV

Priority0

0OSTCBList

Interrupts Interrupt Service RoutineStep1save CPU registersStep2call OSIntEnter () or OSIntNesting add one directlyStep3execution the service codeStep4call OSIntExit() Step5restore CPU registersStep6call interrupt return instruction

Context switch

Clock ticks 10-100Hz void OSTickISR(void) OSTimeTick() OSTimeTick() execution time is in proportion to number of Task TASK 1

NEXTPREV OSTCBDly

TASK 2NEXTPREV OSTCBDly

TASK 3NEXTPREV OSTCBDly

TASK 4NEXTPREV OSTCBDly 0

0OSTCBList

OSTimeTick() if (ptcb-gtOSTCBDly = 0) if (--ptcb-gtOSTCBDly == 0) if ((ptcb-gtOSTCBStat amp OS_STAT_SUSPEND)) OSRdyGrp |= ptcb-gtOSTCBBitY OSRdyTbl[ptcb-gtOSTCBY] |= ptcb-gtOSTCBBitX else ptcb-gtOSTCBDly = 1

Time Management Using clock tick to implement time delays and timeouts OSTimeDly() OSTimeDlyHMSM() OSTimeDlyResume() OSTimeGet() OSTimeSet() Defined in OS_TimeC

OSTimeDly()void OSTimeDly (INT16U ticks) if (ticks gt 0)

OS_ENTER_CRITICAL() if ((OSRdyTbl[OSTCBCur-gtOSTCBY] amp= ~OSTCBCur-gtOSTCBBitX) == 0) OSRdyGrp amp= ~OSTCBCur-gtOSTCBBitY OSTCBCur-gtOSTCBDly = ticks

OS_EXIT_CRITICAL() OSSched()

uCOSII initialization OSIint() initialize all variables and data structure for system Defined in OS_COREC

OSPrioCur = 0OSPrioHighRdy = 0OSTCBCur = NULLOSTCBHighRdy = OLOSTime = 0OSIntNesting = 0OSLockNesting = 0 OSCtxSwCtr = 0OSTaskCtr = 2OSRunning = FALSEOSCPUUsage = 0OSIdleCtrMax = 0L OSIdleCtrRun = 0LOSIdleCtr = 0LOSStatRdy = FALSE

Free TCB List

Free Event List

Free Queue List

Free Memory List

Create a TaskPriority = 6

OSPrioCur = 6OSPrioHighRdy = 6OSTCBCur OSTCBHighRdy OSTime = 0OSIntNesting = 0OSLockNesting = 0 OSCtxSwCtr = 0OSTaskCtr = 3OSRunning = TRUEOSCPUUsage = 0OSIdleCtrMax = 0L OSIdleCtrRun = 0LOSIdleCtr = 0LOSStatRdy = FALSE

Message Mail boxes

Waiting List

  • Slide 1
  • Slide 2
  • Slide 3
  • Slide 4
  • Slide 5
  • Slide 6
  • Slide 7
  • Slide 8
  • Slide 9
  • Slide 10
  • Slide 11
  • Slide 12
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Slide 17
  • Slide 18
  • Slide 19
  • Slide 20
  • Slide 21
  • Slide 22
  • Slide 23
  • Slide 24
  • Slide 25
  • Slide 26
  • Slide 27
  • Slide 28
  • Slide 29
  • Slide 30
  • Slide 31
  • Slide 32
  • Slide 33
  • Slide 34
  • Slide 35
  • Slide 36
  • Slide 37
  • Slide 38
  • Slide 39
  • Slide 40
  • Slide 41
  • Slide 42
  • Slide 43
Page 24: uCOS-II Kernel Structure

Task Scheduler (cont)Get the highest priority

0 0 0 0 0 1 0 00 0 0 0 0 0 0 00 0 1 1 0 1 0 00 0 0 0 0 0 0 00 1 0 0 0 0 1 01 0 0 0 0 0 1 10 0 0 0 0 0 0 01 0 0 0 0 0 0 0

1OSRdyGrp

0101101

TASK 1

NEXTPREV

Priority

TASK 2

NEXTPREV

Priority

TASK 3

NEXTPREV

Priority

TASK 4

NEXTPREV

Priority0

0OSTCBList

Task Scheduler (cont)Modify priority stateOSRdyGrp |= OSMapTbl[prio gtgt 3]OSRdyTbl[prio gtgt 3] |= OSMapTbl[prio amp 0x07]

Task Scheduler (cont)0 0 0 0 0 1 0 00 0 0 0 0 0 0 00 0 1 1 0 1 0 00 0 0 0 0 0 0 00 1 0 0 0 0 1 01 0 0 0 0 0 1 10 0 0 0 0 0 0 01 0 0 0 0 0 0 0

1 0 1 1 0 1 0 1

0 0 0 1 1 1 1 1

OSRdyGrp

Task Priority = 31

3

1

7

1

31

OSSched(void)void OSSched (void) INT8U y OS_ENTER_CRITICAL() if ((OSLockNesting | OSIntNesting) == 0) y = OSUnMapTbl[OSRdyGrp] OSPrioHighRdy = (INT8U)((y ltlt 3) + OSUnMapTbl[OSRdyTbl[y]]) if (OSPrioHighRdy = OSPrioCur) OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy] OSCtxSwCtr++ OS_TASK_SW() OS_EXIT_CRITICAL()

Task Pending Task pending occur when interrupt

raise When waiting some event message

or semaphore When one task delays itself When one task is preempted by

higher priority task

OSMBoxPend()OSQPend()OSSemPend()

OSTaskSuspend()OSTimeDly()OSTimeDlyHMSM()

Task Creation OSTaskCreate() OSTaskCreateExt() Create task before OSStart() or in Running state But not permit to create task in ISR

OSTaskCreate() Check priority

number

Check OSTCBPrioTbl OSTaskStkInit()

OSTCBInit() OSTaskCtr++ OSSched()

if (OSRunning)

OSStackCheck

OSTaskCreateExt() Check priority

number

Check OSTCBPrioTbl OSTaskStkInit()

OSTCBInit() OSTaskCtr++ OSSched()

if (OSRunning)

Task Deletion

TASK 1

NEXTPREV

Priority

TASK 2

NEXTPREV

Priority

TASK 3

NEXTPREV

Priority

TASK 4

NEXTPREV

Priority0

0OSTCBList

Interrupts Interrupt Service RoutineStep1save CPU registersStep2call OSIntEnter () or OSIntNesting add one directlyStep3execution the service codeStep4call OSIntExit() Step5restore CPU registersStep6call interrupt return instruction

Context switch

Clock ticks 10-100Hz void OSTickISR(void) OSTimeTick() OSTimeTick() execution time is in proportion to number of Task TASK 1

NEXTPREV OSTCBDly

TASK 2NEXTPREV OSTCBDly

TASK 3NEXTPREV OSTCBDly

TASK 4NEXTPREV OSTCBDly 0

0OSTCBList

OSTimeTick() if (ptcb-gtOSTCBDly = 0) if (--ptcb-gtOSTCBDly == 0) if ((ptcb-gtOSTCBStat amp OS_STAT_SUSPEND)) OSRdyGrp |= ptcb-gtOSTCBBitY OSRdyTbl[ptcb-gtOSTCBY] |= ptcb-gtOSTCBBitX else ptcb-gtOSTCBDly = 1

Time Management Using clock tick to implement time delays and timeouts OSTimeDly() OSTimeDlyHMSM() OSTimeDlyResume() OSTimeGet() OSTimeSet() Defined in OS_TimeC

OSTimeDly()void OSTimeDly (INT16U ticks) if (ticks gt 0)

OS_ENTER_CRITICAL() if ((OSRdyTbl[OSTCBCur-gtOSTCBY] amp= ~OSTCBCur-gtOSTCBBitX) == 0) OSRdyGrp amp= ~OSTCBCur-gtOSTCBBitY OSTCBCur-gtOSTCBDly = ticks

OS_EXIT_CRITICAL() OSSched()

uCOSII initialization OSIint() initialize all variables and data structure for system Defined in OS_COREC

OSPrioCur = 0OSPrioHighRdy = 0OSTCBCur = NULLOSTCBHighRdy = OLOSTime = 0OSIntNesting = 0OSLockNesting = 0 OSCtxSwCtr = 0OSTaskCtr = 2OSRunning = FALSEOSCPUUsage = 0OSIdleCtrMax = 0L OSIdleCtrRun = 0LOSIdleCtr = 0LOSStatRdy = FALSE

Free TCB List

Free Event List

Free Queue List

Free Memory List

Create a TaskPriority = 6

OSPrioCur = 6OSPrioHighRdy = 6OSTCBCur OSTCBHighRdy OSTime = 0OSIntNesting = 0OSLockNesting = 0 OSCtxSwCtr = 0OSTaskCtr = 3OSRunning = TRUEOSCPUUsage = 0OSIdleCtrMax = 0L OSIdleCtrRun = 0LOSIdleCtr = 0LOSStatRdy = FALSE

Message Mail boxes

Waiting List

  • Slide 1
  • Slide 2
  • Slide 3
  • Slide 4
  • Slide 5
  • Slide 6
  • Slide 7
  • Slide 8
  • Slide 9
  • Slide 10
  • Slide 11
  • Slide 12
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Slide 17
  • Slide 18
  • Slide 19
  • Slide 20
  • Slide 21
  • Slide 22
  • Slide 23
  • Slide 24
  • Slide 25
  • Slide 26
  • Slide 27
  • Slide 28
  • Slide 29
  • Slide 30
  • Slide 31
  • Slide 32
  • Slide 33
  • Slide 34
  • Slide 35
  • Slide 36
  • Slide 37
  • Slide 38
  • Slide 39
  • Slide 40
  • Slide 41
  • Slide 42
  • Slide 43
Page 25: uCOS-II Kernel Structure

Task Scheduler (cont)Modify priority stateOSRdyGrp |= OSMapTbl[prio gtgt 3]OSRdyTbl[prio gtgt 3] |= OSMapTbl[prio amp 0x07]

Task Scheduler (cont)0 0 0 0 0 1 0 00 0 0 0 0 0 0 00 0 1 1 0 1 0 00 0 0 0 0 0 0 00 1 0 0 0 0 1 01 0 0 0 0 0 1 10 0 0 0 0 0 0 01 0 0 0 0 0 0 0

1 0 1 1 0 1 0 1

0 0 0 1 1 1 1 1

OSRdyGrp

Task Priority = 31

3

1

7

1

31

OSSched(void)void OSSched (void) INT8U y OS_ENTER_CRITICAL() if ((OSLockNesting | OSIntNesting) == 0) y = OSUnMapTbl[OSRdyGrp] OSPrioHighRdy = (INT8U)((y ltlt 3) + OSUnMapTbl[OSRdyTbl[y]]) if (OSPrioHighRdy = OSPrioCur) OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy] OSCtxSwCtr++ OS_TASK_SW() OS_EXIT_CRITICAL()

Task Pending Task pending occur when interrupt

raise When waiting some event message

or semaphore When one task delays itself When one task is preempted by

higher priority task

OSMBoxPend()OSQPend()OSSemPend()

OSTaskSuspend()OSTimeDly()OSTimeDlyHMSM()

Task Creation OSTaskCreate() OSTaskCreateExt() Create task before OSStart() or in Running state But not permit to create task in ISR

OSTaskCreate() Check priority

number

Check OSTCBPrioTbl OSTaskStkInit()

OSTCBInit() OSTaskCtr++ OSSched()

if (OSRunning)

OSStackCheck

OSTaskCreateExt() Check priority

number

Check OSTCBPrioTbl OSTaskStkInit()

OSTCBInit() OSTaskCtr++ OSSched()

if (OSRunning)

Task Deletion

TASK 1

NEXTPREV

Priority

TASK 2

NEXTPREV

Priority

TASK 3

NEXTPREV

Priority

TASK 4

NEXTPREV

Priority0

0OSTCBList

Interrupts Interrupt Service RoutineStep1save CPU registersStep2call OSIntEnter () or OSIntNesting add one directlyStep3execution the service codeStep4call OSIntExit() Step5restore CPU registersStep6call interrupt return instruction

Context switch

Clock ticks 10-100Hz void OSTickISR(void) OSTimeTick() OSTimeTick() execution time is in proportion to number of Task TASK 1

NEXTPREV OSTCBDly

TASK 2NEXTPREV OSTCBDly

TASK 3NEXTPREV OSTCBDly

TASK 4NEXTPREV OSTCBDly 0

0OSTCBList

OSTimeTick() if (ptcb-gtOSTCBDly = 0) if (--ptcb-gtOSTCBDly == 0) if ((ptcb-gtOSTCBStat amp OS_STAT_SUSPEND)) OSRdyGrp |= ptcb-gtOSTCBBitY OSRdyTbl[ptcb-gtOSTCBY] |= ptcb-gtOSTCBBitX else ptcb-gtOSTCBDly = 1

Time Management Using clock tick to implement time delays and timeouts OSTimeDly() OSTimeDlyHMSM() OSTimeDlyResume() OSTimeGet() OSTimeSet() Defined in OS_TimeC

OSTimeDly()void OSTimeDly (INT16U ticks) if (ticks gt 0)

OS_ENTER_CRITICAL() if ((OSRdyTbl[OSTCBCur-gtOSTCBY] amp= ~OSTCBCur-gtOSTCBBitX) == 0) OSRdyGrp amp= ~OSTCBCur-gtOSTCBBitY OSTCBCur-gtOSTCBDly = ticks

OS_EXIT_CRITICAL() OSSched()

uCOSII initialization OSIint() initialize all variables and data structure for system Defined in OS_COREC

OSPrioCur = 0OSPrioHighRdy = 0OSTCBCur = NULLOSTCBHighRdy = OLOSTime = 0OSIntNesting = 0OSLockNesting = 0 OSCtxSwCtr = 0OSTaskCtr = 2OSRunning = FALSEOSCPUUsage = 0OSIdleCtrMax = 0L OSIdleCtrRun = 0LOSIdleCtr = 0LOSStatRdy = FALSE

Free TCB List

Free Event List

Free Queue List

Free Memory List

Create a TaskPriority = 6

OSPrioCur = 6OSPrioHighRdy = 6OSTCBCur OSTCBHighRdy OSTime = 0OSIntNesting = 0OSLockNesting = 0 OSCtxSwCtr = 0OSTaskCtr = 3OSRunning = TRUEOSCPUUsage = 0OSIdleCtrMax = 0L OSIdleCtrRun = 0LOSIdleCtr = 0LOSStatRdy = FALSE

Message Mail boxes

Waiting List

  • Slide 1
  • Slide 2
  • Slide 3
  • Slide 4
  • Slide 5
  • Slide 6
  • Slide 7
  • Slide 8
  • Slide 9
  • Slide 10
  • Slide 11
  • Slide 12
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Slide 17
  • Slide 18
  • Slide 19
  • Slide 20
  • Slide 21
  • Slide 22
  • Slide 23
  • Slide 24
  • Slide 25
  • Slide 26
  • Slide 27
  • Slide 28
  • Slide 29
  • Slide 30
  • Slide 31
  • Slide 32
  • Slide 33
  • Slide 34
  • Slide 35
  • Slide 36
  • Slide 37
  • Slide 38
  • Slide 39
  • Slide 40
  • Slide 41
  • Slide 42
  • Slide 43
Page 26: uCOS-II Kernel Structure

Task Scheduler (cont)0 0 0 0 0 1 0 00 0 0 0 0 0 0 00 0 1 1 0 1 0 00 0 0 0 0 0 0 00 1 0 0 0 0 1 01 0 0 0 0 0 1 10 0 0 0 0 0 0 01 0 0 0 0 0 0 0

1 0 1 1 0 1 0 1

0 0 0 1 1 1 1 1

OSRdyGrp

Task Priority = 31

3

1

7

1

31

OSSched(void)void OSSched (void) INT8U y OS_ENTER_CRITICAL() if ((OSLockNesting | OSIntNesting) == 0) y = OSUnMapTbl[OSRdyGrp] OSPrioHighRdy = (INT8U)((y ltlt 3) + OSUnMapTbl[OSRdyTbl[y]]) if (OSPrioHighRdy = OSPrioCur) OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy] OSCtxSwCtr++ OS_TASK_SW() OS_EXIT_CRITICAL()

Task Pending Task pending occur when interrupt

raise When waiting some event message

or semaphore When one task delays itself When one task is preempted by

higher priority task

OSMBoxPend()OSQPend()OSSemPend()

OSTaskSuspend()OSTimeDly()OSTimeDlyHMSM()

Task Creation OSTaskCreate() OSTaskCreateExt() Create task before OSStart() or in Running state But not permit to create task in ISR

OSTaskCreate() Check priority

number

Check OSTCBPrioTbl OSTaskStkInit()

OSTCBInit() OSTaskCtr++ OSSched()

if (OSRunning)

OSStackCheck

OSTaskCreateExt() Check priority

number

Check OSTCBPrioTbl OSTaskStkInit()

OSTCBInit() OSTaskCtr++ OSSched()

if (OSRunning)

Task Deletion

TASK 1

NEXTPREV

Priority

TASK 2

NEXTPREV

Priority

TASK 3

NEXTPREV

Priority

TASK 4

NEXTPREV

Priority0

0OSTCBList

Interrupts Interrupt Service RoutineStep1save CPU registersStep2call OSIntEnter () or OSIntNesting add one directlyStep3execution the service codeStep4call OSIntExit() Step5restore CPU registersStep6call interrupt return instruction

Context switch

Clock ticks 10-100Hz void OSTickISR(void) OSTimeTick() OSTimeTick() execution time is in proportion to number of Task TASK 1

NEXTPREV OSTCBDly

TASK 2NEXTPREV OSTCBDly

TASK 3NEXTPREV OSTCBDly

TASK 4NEXTPREV OSTCBDly 0

0OSTCBList

OSTimeTick() if (ptcb-gtOSTCBDly = 0) if (--ptcb-gtOSTCBDly == 0) if ((ptcb-gtOSTCBStat amp OS_STAT_SUSPEND)) OSRdyGrp |= ptcb-gtOSTCBBitY OSRdyTbl[ptcb-gtOSTCBY] |= ptcb-gtOSTCBBitX else ptcb-gtOSTCBDly = 1

Time Management Using clock tick to implement time delays and timeouts OSTimeDly() OSTimeDlyHMSM() OSTimeDlyResume() OSTimeGet() OSTimeSet() Defined in OS_TimeC

OSTimeDly()void OSTimeDly (INT16U ticks) if (ticks gt 0)

OS_ENTER_CRITICAL() if ((OSRdyTbl[OSTCBCur-gtOSTCBY] amp= ~OSTCBCur-gtOSTCBBitX) == 0) OSRdyGrp amp= ~OSTCBCur-gtOSTCBBitY OSTCBCur-gtOSTCBDly = ticks

OS_EXIT_CRITICAL() OSSched()

uCOSII initialization OSIint() initialize all variables and data structure for system Defined in OS_COREC

OSPrioCur = 0OSPrioHighRdy = 0OSTCBCur = NULLOSTCBHighRdy = OLOSTime = 0OSIntNesting = 0OSLockNesting = 0 OSCtxSwCtr = 0OSTaskCtr = 2OSRunning = FALSEOSCPUUsage = 0OSIdleCtrMax = 0L OSIdleCtrRun = 0LOSIdleCtr = 0LOSStatRdy = FALSE

Free TCB List

Free Event List

Free Queue List

Free Memory List

Create a TaskPriority = 6

OSPrioCur = 6OSPrioHighRdy = 6OSTCBCur OSTCBHighRdy OSTime = 0OSIntNesting = 0OSLockNesting = 0 OSCtxSwCtr = 0OSTaskCtr = 3OSRunning = TRUEOSCPUUsage = 0OSIdleCtrMax = 0L OSIdleCtrRun = 0LOSIdleCtr = 0LOSStatRdy = FALSE

Message Mail boxes

Waiting List

  • Slide 1
  • Slide 2
  • Slide 3
  • Slide 4
  • Slide 5
  • Slide 6
  • Slide 7
  • Slide 8
  • Slide 9
  • Slide 10
  • Slide 11
  • Slide 12
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Slide 17
  • Slide 18
  • Slide 19
  • Slide 20
  • Slide 21
  • Slide 22
  • Slide 23
  • Slide 24
  • Slide 25
  • Slide 26
  • Slide 27
  • Slide 28
  • Slide 29
  • Slide 30
  • Slide 31
  • Slide 32
  • Slide 33
  • Slide 34
  • Slide 35
  • Slide 36
  • Slide 37
  • Slide 38
  • Slide 39
  • Slide 40
  • Slide 41
  • Slide 42
  • Slide 43
Page 27: uCOS-II Kernel Structure

OSSched(void)void OSSched (void) INT8U y OS_ENTER_CRITICAL() if ((OSLockNesting | OSIntNesting) == 0) y = OSUnMapTbl[OSRdyGrp] OSPrioHighRdy = (INT8U)((y ltlt 3) + OSUnMapTbl[OSRdyTbl[y]]) if (OSPrioHighRdy = OSPrioCur) OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy] OSCtxSwCtr++ OS_TASK_SW() OS_EXIT_CRITICAL()

Task Pending Task pending occur when interrupt

raise When waiting some event message

or semaphore When one task delays itself When one task is preempted by

higher priority task

OSMBoxPend()OSQPend()OSSemPend()

OSTaskSuspend()OSTimeDly()OSTimeDlyHMSM()

Task Creation OSTaskCreate() OSTaskCreateExt() Create task before OSStart() or in Running state But not permit to create task in ISR

OSTaskCreate() Check priority

number

Check OSTCBPrioTbl OSTaskStkInit()

OSTCBInit() OSTaskCtr++ OSSched()

if (OSRunning)

OSStackCheck

OSTaskCreateExt() Check priority

number

Check OSTCBPrioTbl OSTaskStkInit()

OSTCBInit() OSTaskCtr++ OSSched()

if (OSRunning)

Task Deletion

TASK 1

NEXTPREV

Priority

TASK 2

NEXTPREV

Priority

TASK 3

NEXTPREV

Priority

TASK 4

NEXTPREV

Priority0

0OSTCBList

Interrupts Interrupt Service RoutineStep1save CPU registersStep2call OSIntEnter () or OSIntNesting add one directlyStep3execution the service codeStep4call OSIntExit() Step5restore CPU registersStep6call interrupt return instruction

Context switch

Clock ticks 10-100Hz void OSTickISR(void) OSTimeTick() OSTimeTick() execution time is in proportion to number of Task TASK 1

NEXTPREV OSTCBDly

TASK 2NEXTPREV OSTCBDly

TASK 3NEXTPREV OSTCBDly

TASK 4NEXTPREV OSTCBDly 0

0OSTCBList

OSTimeTick() if (ptcb-gtOSTCBDly = 0) if (--ptcb-gtOSTCBDly == 0) if ((ptcb-gtOSTCBStat amp OS_STAT_SUSPEND)) OSRdyGrp |= ptcb-gtOSTCBBitY OSRdyTbl[ptcb-gtOSTCBY] |= ptcb-gtOSTCBBitX else ptcb-gtOSTCBDly = 1

Time Management Using clock tick to implement time delays and timeouts OSTimeDly() OSTimeDlyHMSM() OSTimeDlyResume() OSTimeGet() OSTimeSet() Defined in OS_TimeC

OSTimeDly()void OSTimeDly (INT16U ticks) if (ticks gt 0)

OS_ENTER_CRITICAL() if ((OSRdyTbl[OSTCBCur-gtOSTCBY] amp= ~OSTCBCur-gtOSTCBBitX) == 0) OSRdyGrp amp= ~OSTCBCur-gtOSTCBBitY OSTCBCur-gtOSTCBDly = ticks

OS_EXIT_CRITICAL() OSSched()

uCOSII initialization OSIint() initialize all variables and data structure for system Defined in OS_COREC

OSPrioCur = 0OSPrioHighRdy = 0OSTCBCur = NULLOSTCBHighRdy = OLOSTime = 0OSIntNesting = 0OSLockNesting = 0 OSCtxSwCtr = 0OSTaskCtr = 2OSRunning = FALSEOSCPUUsage = 0OSIdleCtrMax = 0L OSIdleCtrRun = 0LOSIdleCtr = 0LOSStatRdy = FALSE

Free TCB List

Free Event List

Free Queue List

Free Memory List

Create a TaskPriority = 6

OSPrioCur = 6OSPrioHighRdy = 6OSTCBCur OSTCBHighRdy OSTime = 0OSIntNesting = 0OSLockNesting = 0 OSCtxSwCtr = 0OSTaskCtr = 3OSRunning = TRUEOSCPUUsage = 0OSIdleCtrMax = 0L OSIdleCtrRun = 0LOSIdleCtr = 0LOSStatRdy = FALSE

Message Mail boxes

Waiting List

  • Slide 1
  • Slide 2
  • Slide 3
  • Slide 4
  • Slide 5
  • Slide 6
  • Slide 7
  • Slide 8
  • Slide 9
  • Slide 10
  • Slide 11
  • Slide 12
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Slide 17
  • Slide 18
  • Slide 19
  • Slide 20
  • Slide 21
  • Slide 22
  • Slide 23
  • Slide 24
  • Slide 25
  • Slide 26
  • Slide 27
  • Slide 28
  • Slide 29
  • Slide 30
  • Slide 31
  • Slide 32
  • Slide 33
  • Slide 34
  • Slide 35
  • Slide 36
  • Slide 37
  • Slide 38
  • Slide 39
  • Slide 40
  • Slide 41
  • Slide 42
  • Slide 43
Page 28: uCOS-II Kernel Structure

Task Pending Task pending occur when interrupt

raise When waiting some event message

or semaphore When one task delays itself When one task is preempted by

higher priority task

OSMBoxPend()OSQPend()OSSemPend()

OSTaskSuspend()OSTimeDly()OSTimeDlyHMSM()

Task Creation OSTaskCreate() OSTaskCreateExt() Create task before OSStart() or in Running state But not permit to create task in ISR

OSTaskCreate() Check priority

number

Check OSTCBPrioTbl OSTaskStkInit()

OSTCBInit() OSTaskCtr++ OSSched()

if (OSRunning)

OSStackCheck

OSTaskCreateExt() Check priority

number

Check OSTCBPrioTbl OSTaskStkInit()

OSTCBInit() OSTaskCtr++ OSSched()

if (OSRunning)

Task Deletion

TASK 1

NEXTPREV

Priority

TASK 2

NEXTPREV

Priority

TASK 3

NEXTPREV

Priority

TASK 4

NEXTPREV

Priority0

0OSTCBList

Interrupts Interrupt Service RoutineStep1save CPU registersStep2call OSIntEnter () or OSIntNesting add one directlyStep3execution the service codeStep4call OSIntExit() Step5restore CPU registersStep6call interrupt return instruction

Context switch

Clock ticks 10-100Hz void OSTickISR(void) OSTimeTick() OSTimeTick() execution time is in proportion to number of Task TASK 1

NEXTPREV OSTCBDly

TASK 2NEXTPREV OSTCBDly

TASK 3NEXTPREV OSTCBDly

TASK 4NEXTPREV OSTCBDly 0

0OSTCBList

OSTimeTick() if (ptcb-gtOSTCBDly = 0) if (--ptcb-gtOSTCBDly == 0) if ((ptcb-gtOSTCBStat amp OS_STAT_SUSPEND)) OSRdyGrp |= ptcb-gtOSTCBBitY OSRdyTbl[ptcb-gtOSTCBY] |= ptcb-gtOSTCBBitX else ptcb-gtOSTCBDly = 1

Time Management Using clock tick to implement time delays and timeouts OSTimeDly() OSTimeDlyHMSM() OSTimeDlyResume() OSTimeGet() OSTimeSet() Defined in OS_TimeC

OSTimeDly()void OSTimeDly (INT16U ticks) if (ticks gt 0)

OS_ENTER_CRITICAL() if ((OSRdyTbl[OSTCBCur-gtOSTCBY] amp= ~OSTCBCur-gtOSTCBBitX) == 0) OSRdyGrp amp= ~OSTCBCur-gtOSTCBBitY OSTCBCur-gtOSTCBDly = ticks

OS_EXIT_CRITICAL() OSSched()

uCOSII initialization OSIint() initialize all variables and data structure for system Defined in OS_COREC

OSPrioCur = 0OSPrioHighRdy = 0OSTCBCur = NULLOSTCBHighRdy = OLOSTime = 0OSIntNesting = 0OSLockNesting = 0 OSCtxSwCtr = 0OSTaskCtr = 2OSRunning = FALSEOSCPUUsage = 0OSIdleCtrMax = 0L OSIdleCtrRun = 0LOSIdleCtr = 0LOSStatRdy = FALSE

Free TCB List

Free Event List

Free Queue List

Free Memory List

Create a TaskPriority = 6

OSPrioCur = 6OSPrioHighRdy = 6OSTCBCur OSTCBHighRdy OSTime = 0OSIntNesting = 0OSLockNesting = 0 OSCtxSwCtr = 0OSTaskCtr = 3OSRunning = TRUEOSCPUUsage = 0OSIdleCtrMax = 0L OSIdleCtrRun = 0LOSIdleCtr = 0LOSStatRdy = FALSE

Message Mail boxes

Waiting List

  • Slide 1
  • Slide 2
  • Slide 3
  • Slide 4
  • Slide 5
  • Slide 6
  • Slide 7
  • Slide 8
  • Slide 9
  • Slide 10
  • Slide 11
  • Slide 12
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Slide 17
  • Slide 18
  • Slide 19
  • Slide 20
  • Slide 21
  • Slide 22
  • Slide 23
  • Slide 24
  • Slide 25
  • Slide 26
  • Slide 27
  • Slide 28
  • Slide 29
  • Slide 30
  • Slide 31
  • Slide 32
  • Slide 33
  • Slide 34
  • Slide 35
  • Slide 36
  • Slide 37
  • Slide 38
  • Slide 39
  • Slide 40
  • Slide 41
  • Slide 42
  • Slide 43
Page 29: uCOS-II Kernel Structure

Task Creation OSTaskCreate() OSTaskCreateExt() Create task before OSStart() or in Running state But not permit to create task in ISR

OSTaskCreate() Check priority

number

Check OSTCBPrioTbl OSTaskStkInit()

OSTCBInit() OSTaskCtr++ OSSched()

if (OSRunning)

OSStackCheck

OSTaskCreateExt() Check priority

number

Check OSTCBPrioTbl OSTaskStkInit()

OSTCBInit() OSTaskCtr++ OSSched()

if (OSRunning)

Task Deletion

TASK 1

NEXTPREV

Priority

TASK 2

NEXTPREV

Priority

TASK 3

NEXTPREV

Priority

TASK 4

NEXTPREV

Priority0

0OSTCBList

Interrupts Interrupt Service RoutineStep1save CPU registersStep2call OSIntEnter () or OSIntNesting add one directlyStep3execution the service codeStep4call OSIntExit() Step5restore CPU registersStep6call interrupt return instruction

Context switch

Clock ticks 10-100Hz void OSTickISR(void) OSTimeTick() OSTimeTick() execution time is in proportion to number of Task TASK 1

NEXTPREV OSTCBDly

TASK 2NEXTPREV OSTCBDly

TASK 3NEXTPREV OSTCBDly

TASK 4NEXTPREV OSTCBDly 0

0OSTCBList

OSTimeTick() if (ptcb-gtOSTCBDly = 0) if (--ptcb-gtOSTCBDly == 0) if ((ptcb-gtOSTCBStat amp OS_STAT_SUSPEND)) OSRdyGrp |= ptcb-gtOSTCBBitY OSRdyTbl[ptcb-gtOSTCBY] |= ptcb-gtOSTCBBitX else ptcb-gtOSTCBDly = 1

Time Management Using clock tick to implement time delays and timeouts OSTimeDly() OSTimeDlyHMSM() OSTimeDlyResume() OSTimeGet() OSTimeSet() Defined in OS_TimeC

OSTimeDly()void OSTimeDly (INT16U ticks) if (ticks gt 0)

OS_ENTER_CRITICAL() if ((OSRdyTbl[OSTCBCur-gtOSTCBY] amp= ~OSTCBCur-gtOSTCBBitX) == 0) OSRdyGrp amp= ~OSTCBCur-gtOSTCBBitY OSTCBCur-gtOSTCBDly = ticks

OS_EXIT_CRITICAL() OSSched()

uCOSII initialization OSIint() initialize all variables and data structure for system Defined in OS_COREC

OSPrioCur = 0OSPrioHighRdy = 0OSTCBCur = NULLOSTCBHighRdy = OLOSTime = 0OSIntNesting = 0OSLockNesting = 0 OSCtxSwCtr = 0OSTaskCtr = 2OSRunning = FALSEOSCPUUsage = 0OSIdleCtrMax = 0L OSIdleCtrRun = 0LOSIdleCtr = 0LOSStatRdy = FALSE

Free TCB List

Free Event List

Free Queue List

Free Memory List

Create a TaskPriority = 6

OSPrioCur = 6OSPrioHighRdy = 6OSTCBCur OSTCBHighRdy OSTime = 0OSIntNesting = 0OSLockNesting = 0 OSCtxSwCtr = 0OSTaskCtr = 3OSRunning = TRUEOSCPUUsage = 0OSIdleCtrMax = 0L OSIdleCtrRun = 0LOSIdleCtr = 0LOSStatRdy = FALSE

Message Mail boxes

Waiting List

  • Slide 1
  • Slide 2
  • Slide 3
  • Slide 4
  • Slide 5
  • Slide 6
  • Slide 7
  • Slide 8
  • Slide 9
  • Slide 10
  • Slide 11
  • Slide 12
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Slide 17
  • Slide 18
  • Slide 19
  • Slide 20
  • Slide 21
  • Slide 22
  • Slide 23
  • Slide 24
  • Slide 25
  • Slide 26
  • Slide 27
  • Slide 28
  • Slide 29
  • Slide 30
  • Slide 31
  • Slide 32
  • Slide 33
  • Slide 34
  • Slide 35
  • Slide 36
  • Slide 37
  • Slide 38
  • Slide 39
  • Slide 40
  • Slide 41
  • Slide 42
  • Slide 43
Page 30: uCOS-II Kernel Structure

OSTaskCreate() Check priority

number

Check OSTCBPrioTbl OSTaskStkInit()

OSTCBInit() OSTaskCtr++ OSSched()

if (OSRunning)

OSStackCheck

OSTaskCreateExt() Check priority

number

Check OSTCBPrioTbl OSTaskStkInit()

OSTCBInit() OSTaskCtr++ OSSched()

if (OSRunning)

Task Deletion

TASK 1

NEXTPREV

Priority

TASK 2

NEXTPREV

Priority

TASK 3

NEXTPREV

Priority

TASK 4

NEXTPREV

Priority0

0OSTCBList

Interrupts Interrupt Service RoutineStep1save CPU registersStep2call OSIntEnter () or OSIntNesting add one directlyStep3execution the service codeStep4call OSIntExit() Step5restore CPU registersStep6call interrupt return instruction

Context switch

Clock ticks 10-100Hz void OSTickISR(void) OSTimeTick() OSTimeTick() execution time is in proportion to number of Task TASK 1

NEXTPREV OSTCBDly

TASK 2NEXTPREV OSTCBDly

TASK 3NEXTPREV OSTCBDly

TASK 4NEXTPREV OSTCBDly 0

0OSTCBList

OSTimeTick() if (ptcb-gtOSTCBDly = 0) if (--ptcb-gtOSTCBDly == 0) if ((ptcb-gtOSTCBStat amp OS_STAT_SUSPEND)) OSRdyGrp |= ptcb-gtOSTCBBitY OSRdyTbl[ptcb-gtOSTCBY] |= ptcb-gtOSTCBBitX else ptcb-gtOSTCBDly = 1

Time Management Using clock tick to implement time delays and timeouts OSTimeDly() OSTimeDlyHMSM() OSTimeDlyResume() OSTimeGet() OSTimeSet() Defined in OS_TimeC

OSTimeDly()void OSTimeDly (INT16U ticks) if (ticks gt 0)

OS_ENTER_CRITICAL() if ((OSRdyTbl[OSTCBCur-gtOSTCBY] amp= ~OSTCBCur-gtOSTCBBitX) == 0) OSRdyGrp amp= ~OSTCBCur-gtOSTCBBitY OSTCBCur-gtOSTCBDly = ticks

OS_EXIT_CRITICAL() OSSched()

uCOSII initialization OSIint() initialize all variables and data structure for system Defined in OS_COREC

OSPrioCur = 0OSPrioHighRdy = 0OSTCBCur = NULLOSTCBHighRdy = OLOSTime = 0OSIntNesting = 0OSLockNesting = 0 OSCtxSwCtr = 0OSTaskCtr = 2OSRunning = FALSEOSCPUUsage = 0OSIdleCtrMax = 0L OSIdleCtrRun = 0LOSIdleCtr = 0LOSStatRdy = FALSE

Free TCB List

Free Event List

Free Queue List

Free Memory List

Create a TaskPriority = 6

OSPrioCur = 6OSPrioHighRdy = 6OSTCBCur OSTCBHighRdy OSTime = 0OSIntNesting = 0OSLockNesting = 0 OSCtxSwCtr = 0OSTaskCtr = 3OSRunning = TRUEOSCPUUsage = 0OSIdleCtrMax = 0L OSIdleCtrRun = 0LOSIdleCtr = 0LOSStatRdy = FALSE

Message Mail boxes

Waiting List

  • Slide 1
  • Slide 2
  • Slide 3
  • Slide 4
  • Slide 5
  • Slide 6
  • Slide 7
  • Slide 8
  • Slide 9
  • Slide 10
  • Slide 11
  • Slide 12
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Slide 17
  • Slide 18
  • Slide 19
  • Slide 20
  • Slide 21
  • Slide 22
  • Slide 23
  • Slide 24
  • Slide 25
  • Slide 26
  • Slide 27
  • Slide 28
  • Slide 29
  • Slide 30
  • Slide 31
  • Slide 32
  • Slide 33
  • Slide 34
  • Slide 35
  • Slide 36
  • Slide 37
  • Slide 38
  • Slide 39
  • Slide 40
  • Slide 41
  • Slide 42
  • Slide 43
Page 31: uCOS-II Kernel Structure

OSStackCheck

OSTaskCreateExt() Check priority

number

Check OSTCBPrioTbl OSTaskStkInit()

OSTCBInit() OSTaskCtr++ OSSched()

if (OSRunning)

Task Deletion

TASK 1

NEXTPREV

Priority

TASK 2

NEXTPREV

Priority

TASK 3

NEXTPREV

Priority

TASK 4

NEXTPREV

Priority0

0OSTCBList

Interrupts Interrupt Service RoutineStep1save CPU registersStep2call OSIntEnter () or OSIntNesting add one directlyStep3execution the service codeStep4call OSIntExit() Step5restore CPU registersStep6call interrupt return instruction

Context switch

Clock ticks 10-100Hz void OSTickISR(void) OSTimeTick() OSTimeTick() execution time is in proportion to number of Task TASK 1

NEXTPREV OSTCBDly

TASK 2NEXTPREV OSTCBDly

TASK 3NEXTPREV OSTCBDly

TASK 4NEXTPREV OSTCBDly 0

0OSTCBList

OSTimeTick() if (ptcb-gtOSTCBDly = 0) if (--ptcb-gtOSTCBDly == 0) if ((ptcb-gtOSTCBStat amp OS_STAT_SUSPEND)) OSRdyGrp |= ptcb-gtOSTCBBitY OSRdyTbl[ptcb-gtOSTCBY] |= ptcb-gtOSTCBBitX else ptcb-gtOSTCBDly = 1

Time Management Using clock tick to implement time delays and timeouts OSTimeDly() OSTimeDlyHMSM() OSTimeDlyResume() OSTimeGet() OSTimeSet() Defined in OS_TimeC

OSTimeDly()void OSTimeDly (INT16U ticks) if (ticks gt 0)

OS_ENTER_CRITICAL() if ((OSRdyTbl[OSTCBCur-gtOSTCBY] amp= ~OSTCBCur-gtOSTCBBitX) == 0) OSRdyGrp amp= ~OSTCBCur-gtOSTCBBitY OSTCBCur-gtOSTCBDly = ticks

OS_EXIT_CRITICAL() OSSched()

uCOSII initialization OSIint() initialize all variables and data structure for system Defined in OS_COREC

OSPrioCur = 0OSPrioHighRdy = 0OSTCBCur = NULLOSTCBHighRdy = OLOSTime = 0OSIntNesting = 0OSLockNesting = 0 OSCtxSwCtr = 0OSTaskCtr = 2OSRunning = FALSEOSCPUUsage = 0OSIdleCtrMax = 0L OSIdleCtrRun = 0LOSIdleCtr = 0LOSStatRdy = FALSE

Free TCB List

Free Event List

Free Queue List

Free Memory List

Create a TaskPriority = 6

OSPrioCur = 6OSPrioHighRdy = 6OSTCBCur OSTCBHighRdy OSTime = 0OSIntNesting = 0OSLockNesting = 0 OSCtxSwCtr = 0OSTaskCtr = 3OSRunning = TRUEOSCPUUsage = 0OSIdleCtrMax = 0L OSIdleCtrRun = 0LOSIdleCtr = 0LOSStatRdy = FALSE

Message Mail boxes

Waiting List

  • Slide 1
  • Slide 2
  • Slide 3
  • Slide 4
  • Slide 5
  • Slide 6
  • Slide 7
  • Slide 8
  • Slide 9
  • Slide 10
  • Slide 11
  • Slide 12
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Slide 17
  • Slide 18
  • Slide 19
  • Slide 20
  • Slide 21
  • Slide 22
  • Slide 23
  • Slide 24
  • Slide 25
  • Slide 26
  • Slide 27
  • Slide 28
  • Slide 29
  • Slide 30
  • Slide 31
  • Slide 32
  • Slide 33
  • Slide 34
  • Slide 35
  • Slide 36
  • Slide 37
  • Slide 38
  • Slide 39
  • Slide 40
  • Slide 41
  • Slide 42
  • Slide 43
Page 32: uCOS-II Kernel Structure

Task Deletion

TASK 1

NEXTPREV

Priority

TASK 2

NEXTPREV

Priority

TASK 3

NEXTPREV

Priority

TASK 4

NEXTPREV

Priority0

0OSTCBList

Interrupts Interrupt Service RoutineStep1save CPU registersStep2call OSIntEnter () or OSIntNesting add one directlyStep3execution the service codeStep4call OSIntExit() Step5restore CPU registersStep6call interrupt return instruction

Context switch

Clock ticks 10-100Hz void OSTickISR(void) OSTimeTick() OSTimeTick() execution time is in proportion to number of Task TASK 1

NEXTPREV OSTCBDly

TASK 2NEXTPREV OSTCBDly

TASK 3NEXTPREV OSTCBDly

TASK 4NEXTPREV OSTCBDly 0

0OSTCBList

OSTimeTick() if (ptcb-gtOSTCBDly = 0) if (--ptcb-gtOSTCBDly == 0) if ((ptcb-gtOSTCBStat amp OS_STAT_SUSPEND)) OSRdyGrp |= ptcb-gtOSTCBBitY OSRdyTbl[ptcb-gtOSTCBY] |= ptcb-gtOSTCBBitX else ptcb-gtOSTCBDly = 1

Time Management Using clock tick to implement time delays and timeouts OSTimeDly() OSTimeDlyHMSM() OSTimeDlyResume() OSTimeGet() OSTimeSet() Defined in OS_TimeC

OSTimeDly()void OSTimeDly (INT16U ticks) if (ticks gt 0)

OS_ENTER_CRITICAL() if ((OSRdyTbl[OSTCBCur-gtOSTCBY] amp= ~OSTCBCur-gtOSTCBBitX) == 0) OSRdyGrp amp= ~OSTCBCur-gtOSTCBBitY OSTCBCur-gtOSTCBDly = ticks

OS_EXIT_CRITICAL() OSSched()

uCOSII initialization OSIint() initialize all variables and data structure for system Defined in OS_COREC

OSPrioCur = 0OSPrioHighRdy = 0OSTCBCur = NULLOSTCBHighRdy = OLOSTime = 0OSIntNesting = 0OSLockNesting = 0 OSCtxSwCtr = 0OSTaskCtr = 2OSRunning = FALSEOSCPUUsage = 0OSIdleCtrMax = 0L OSIdleCtrRun = 0LOSIdleCtr = 0LOSStatRdy = FALSE

Free TCB List

Free Event List

Free Queue List

Free Memory List

Create a TaskPriority = 6

OSPrioCur = 6OSPrioHighRdy = 6OSTCBCur OSTCBHighRdy OSTime = 0OSIntNesting = 0OSLockNesting = 0 OSCtxSwCtr = 0OSTaskCtr = 3OSRunning = TRUEOSCPUUsage = 0OSIdleCtrMax = 0L OSIdleCtrRun = 0LOSIdleCtr = 0LOSStatRdy = FALSE

Message Mail boxes

Waiting List

  • Slide 1
  • Slide 2
  • Slide 3
  • Slide 4
  • Slide 5
  • Slide 6
  • Slide 7
  • Slide 8
  • Slide 9
  • Slide 10
  • Slide 11
  • Slide 12
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Slide 17
  • Slide 18
  • Slide 19
  • Slide 20
  • Slide 21
  • Slide 22
  • Slide 23
  • Slide 24
  • Slide 25
  • Slide 26
  • Slide 27
  • Slide 28
  • Slide 29
  • Slide 30
  • Slide 31
  • Slide 32
  • Slide 33
  • Slide 34
  • Slide 35
  • Slide 36
  • Slide 37
  • Slide 38
  • Slide 39
  • Slide 40
  • Slide 41
  • Slide 42
  • Slide 43
Page 33: uCOS-II Kernel Structure

Interrupts Interrupt Service RoutineStep1save CPU registersStep2call OSIntEnter () or OSIntNesting add one directlyStep3execution the service codeStep4call OSIntExit() Step5restore CPU registersStep6call interrupt return instruction

Context switch

Clock ticks 10-100Hz void OSTickISR(void) OSTimeTick() OSTimeTick() execution time is in proportion to number of Task TASK 1

NEXTPREV OSTCBDly

TASK 2NEXTPREV OSTCBDly

TASK 3NEXTPREV OSTCBDly

TASK 4NEXTPREV OSTCBDly 0

0OSTCBList

OSTimeTick() if (ptcb-gtOSTCBDly = 0) if (--ptcb-gtOSTCBDly == 0) if ((ptcb-gtOSTCBStat amp OS_STAT_SUSPEND)) OSRdyGrp |= ptcb-gtOSTCBBitY OSRdyTbl[ptcb-gtOSTCBY] |= ptcb-gtOSTCBBitX else ptcb-gtOSTCBDly = 1

Time Management Using clock tick to implement time delays and timeouts OSTimeDly() OSTimeDlyHMSM() OSTimeDlyResume() OSTimeGet() OSTimeSet() Defined in OS_TimeC

OSTimeDly()void OSTimeDly (INT16U ticks) if (ticks gt 0)

OS_ENTER_CRITICAL() if ((OSRdyTbl[OSTCBCur-gtOSTCBY] amp= ~OSTCBCur-gtOSTCBBitX) == 0) OSRdyGrp amp= ~OSTCBCur-gtOSTCBBitY OSTCBCur-gtOSTCBDly = ticks

OS_EXIT_CRITICAL() OSSched()

uCOSII initialization OSIint() initialize all variables and data structure for system Defined in OS_COREC

OSPrioCur = 0OSPrioHighRdy = 0OSTCBCur = NULLOSTCBHighRdy = OLOSTime = 0OSIntNesting = 0OSLockNesting = 0 OSCtxSwCtr = 0OSTaskCtr = 2OSRunning = FALSEOSCPUUsage = 0OSIdleCtrMax = 0L OSIdleCtrRun = 0LOSIdleCtr = 0LOSStatRdy = FALSE

Free TCB List

Free Event List

Free Queue List

Free Memory List

Create a TaskPriority = 6

OSPrioCur = 6OSPrioHighRdy = 6OSTCBCur OSTCBHighRdy OSTime = 0OSIntNesting = 0OSLockNesting = 0 OSCtxSwCtr = 0OSTaskCtr = 3OSRunning = TRUEOSCPUUsage = 0OSIdleCtrMax = 0L OSIdleCtrRun = 0LOSIdleCtr = 0LOSStatRdy = FALSE

Message Mail boxes

Waiting List

  • Slide 1
  • Slide 2
  • Slide 3
  • Slide 4
  • Slide 5
  • Slide 6
  • Slide 7
  • Slide 8
  • Slide 9
  • Slide 10
  • Slide 11
  • Slide 12
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Slide 17
  • Slide 18
  • Slide 19
  • Slide 20
  • Slide 21
  • Slide 22
  • Slide 23
  • Slide 24
  • Slide 25
  • Slide 26
  • Slide 27
  • Slide 28
  • Slide 29
  • Slide 30
  • Slide 31
  • Slide 32
  • Slide 33
  • Slide 34
  • Slide 35
  • Slide 36
  • Slide 37
  • Slide 38
  • Slide 39
  • Slide 40
  • Slide 41
  • Slide 42
  • Slide 43
Page 34: uCOS-II Kernel Structure

Context switch

Clock ticks 10-100Hz void OSTickISR(void) OSTimeTick() OSTimeTick() execution time is in proportion to number of Task TASK 1

NEXTPREV OSTCBDly

TASK 2NEXTPREV OSTCBDly

TASK 3NEXTPREV OSTCBDly

TASK 4NEXTPREV OSTCBDly 0

0OSTCBList

OSTimeTick() if (ptcb-gtOSTCBDly = 0) if (--ptcb-gtOSTCBDly == 0) if ((ptcb-gtOSTCBStat amp OS_STAT_SUSPEND)) OSRdyGrp |= ptcb-gtOSTCBBitY OSRdyTbl[ptcb-gtOSTCBY] |= ptcb-gtOSTCBBitX else ptcb-gtOSTCBDly = 1

Time Management Using clock tick to implement time delays and timeouts OSTimeDly() OSTimeDlyHMSM() OSTimeDlyResume() OSTimeGet() OSTimeSet() Defined in OS_TimeC

OSTimeDly()void OSTimeDly (INT16U ticks) if (ticks gt 0)

OS_ENTER_CRITICAL() if ((OSRdyTbl[OSTCBCur-gtOSTCBY] amp= ~OSTCBCur-gtOSTCBBitX) == 0) OSRdyGrp amp= ~OSTCBCur-gtOSTCBBitY OSTCBCur-gtOSTCBDly = ticks

OS_EXIT_CRITICAL() OSSched()

uCOSII initialization OSIint() initialize all variables and data structure for system Defined in OS_COREC

OSPrioCur = 0OSPrioHighRdy = 0OSTCBCur = NULLOSTCBHighRdy = OLOSTime = 0OSIntNesting = 0OSLockNesting = 0 OSCtxSwCtr = 0OSTaskCtr = 2OSRunning = FALSEOSCPUUsage = 0OSIdleCtrMax = 0L OSIdleCtrRun = 0LOSIdleCtr = 0LOSStatRdy = FALSE

Free TCB List

Free Event List

Free Queue List

Free Memory List

Create a TaskPriority = 6

OSPrioCur = 6OSPrioHighRdy = 6OSTCBCur OSTCBHighRdy OSTime = 0OSIntNesting = 0OSLockNesting = 0 OSCtxSwCtr = 0OSTaskCtr = 3OSRunning = TRUEOSCPUUsage = 0OSIdleCtrMax = 0L OSIdleCtrRun = 0LOSIdleCtr = 0LOSStatRdy = FALSE

Message Mail boxes

Waiting List

  • Slide 1
  • Slide 2
  • Slide 3
  • Slide 4
  • Slide 5
  • Slide 6
  • Slide 7
  • Slide 8
  • Slide 9
  • Slide 10
  • Slide 11
  • Slide 12
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Slide 17
  • Slide 18
  • Slide 19
  • Slide 20
  • Slide 21
  • Slide 22
  • Slide 23
  • Slide 24
  • Slide 25
  • Slide 26
  • Slide 27
  • Slide 28
  • Slide 29
  • Slide 30
  • Slide 31
  • Slide 32
  • Slide 33
  • Slide 34
  • Slide 35
  • Slide 36
  • Slide 37
  • Slide 38
  • Slide 39
  • Slide 40
  • Slide 41
  • Slide 42
  • Slide 43
Page 35: uCOS-II Kernel Structure

Clock ticks 10-100Hz void OSTickISR(void) OSTimeTick() OSTimeTick() execution time is in proportion to number of Task TASK 1

NEXTPREV OSTCBDly

TASK 2NEXTPREV OSTCBDly

TASK 3NEXTPREV OSTCBDly

TASK 4NEXTPREV OSTCBDly 0

0OSTCBList

OSTimeTick() if (ptcb-gtOSTCBDly = 0) if (--ptcb-gtOSTCBDly == 0) if ((ptcb-gtOSTCBStat amp OS_STAT_SUSPEND)) OSRdyGrp |= ptcb-gtOSTCBBitY OSRdyTbl[ptcb-gtOSTCBY] |= ptcb-gtOSTCBBitX else ptcb-gtOSTCBDly = 1

Time Management Using clock tick to implement time delays and timeouts OSTimeDly() OSTimeDlyHMSM() OSTimeDlyResume() OSTimeGet() OSTimeSet() Defined in OS_TimeC

OSTimeDly()void OSTimeDly (INT16U ticks) if (ticks gt 0)

OS_ENTER_CRITICAL() if ((OSRdyTbl[OSTCBCur-gtOSTCBY] amp= ~OSTCBCur-gtOSTCBBitX) == 0) OSRdyGrp amp= ~OSTCBCur-gtOSTCBBitY OSTCBCur-gtOSTCBDly = ticks

OS_EXIT_CRITICAL() OSSched()

uCOSII initialization OSIint() initialize all variables and data structure for system Defined in OS_COREC

OSPrioCur = 0OSPrioHighRdy = 0OSTCBCur = NULLOSTCBHighRdy = OLOSTime = 0OSIntNesting = 0OSLockNesting = 0 OSCtxSwCtr = 0OSTaskCtr = 2OSRunning = FALSEOSCPUUsage = 0OSIdleCtrMax = 0L OSIdleCtrRun = 0LOSIdleCtr = 0LOSStatRdy = FALSE

Free TCB List

Free Event List

Free Queue List

Free Memory List

Create a TaskPriority = 6

OSPrioCur = 6OSPrioHighRdy = 6OSTCBCur OSTCBHighRdy OSTime = 0OSIntNesting = 0OSLockNesting = 0 OSCtxSwCtr = 0OSTaskCtr = 3OSRunning = TRUEOSCPUUsage = 0OSIdleCtrMax = 0L OSIdleCtrRun = 0LOSIdleCtr = 0LOSStatRdy = FALSE

Message Mail boxes

Waiting List

  • Slide 1
  • Slide 2
  • Slide 3
  • Slide 4
  • Slide 5
  • Slide 6
  • Slide 7
  • Slide 8
  • Slide 9
  • Slide 10
  • Slide 11
  • Slide 12
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Slide 17
  • Slide 18
  • Slide 19
  • Slide 20
  • Slide 21
  • Slide 22
  • Slide 23
  • Slide 24
  • Slide 25
  • Slide 26
  • Slide 27
  • Slide 28
  • Slide 29
  • Slide 30
  • Slide 31
  • Slide 32
  • Slide 33
  • Slide 34
  • Slide 35
  • Slide 36
  • Slide 37
  • Slide 38
  • Slide 39
  • Slide 40
  • Slide 41
  • Slide 42
  • Slide 43
Page 36: uCOS-II Kernel Structure

OSTimeTick() if (ptcb-gtOSTCBDly = 0) if (--ptcb-gtOSTCBDly == 0) if ((ptcb-gtOSTCBStat amp OS_STAT_SUSPEND)) OSRdyGrp |= ptcb-gtOSTCBBitY OSRdyTbl[ptcb-gtOSTCBY] |= ptcb-gtOSTCBBitX else ptcb-gtOSTCBDly = 1

Time Management Using clock tick to implement time delays and timeouts OSTimeDly() OSTimeDlyHMSM() OSTimeDlyResume() OSTimeGet() OSTimeSet() Defined in OS_TimeC

OSTimeDly()void OSTimeDly (INT16U ticks) if (ticks gt 0)

OS_ENTER_CRITICAL() if ((OSRdyTbl[OSTCBCur-gtOSTCBY] amp= ~OSTCBCur-gtOSTCBBitX) == 0) OSRdyGrp amp= ~OSTCBCur-gtOSTCBBitY OSTCBCur-gtOSTCBDly = ticks

OS_EXIT_CRITICAL() OSSched()

uCOSII initialization OSIint() initialize all variables and data structure for system Defined in OS_COREC

OSPrioCur = 0OSPrioHighRdy = 0OSTCBCur = NULLOSTCBHighRdy = OLOSTime = 0OSIntNesting = 0OSLockNesting = 0 OSCtxSwCtr = 0OSTaskCtr = 2OSRunning = FALSEOSCPUUsage = 0OSIdleCtrMax = 0L OSIdleCtrRun = 0LOSIdleCtr = 0LOSStatRdy = FALSE

Free TCB List

Free Event List

Free Queue List

Free Memory List

Create a TaskPriority = 6

OSPrioCur = 6OSPrioHighRdy = 6OSTCBCur OSTCBHighRdy OSTime = 0OSIntNesting = 0OSLockNesting = 0 OSCtxSwCtr = 0OSTaskCtr = 3OSRunning = TRUEOSCPUUsage = 0OSIdleCtrMax = 0L OSIdleCtrRun = 0LOSIdleCtr = 0LOSStatRdy = FALSE

Message Mail boxes

Waiting List

  • Slide 1
  • Slide 2
  • Slide 3
  • Slide 4
  • Slide 5
  • Slide 6
  • Slide 7
  • Slide 8
  • Slide 9
  • Slide 10
  • Slide 11
  • Slide 12
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Slide 17
  • Slide 18
  • Slide 19
  • Slide 20
  • Slide 21
  • Slide 22
  • Slide 23
  • Slide 24
  • Slide 25
  • Slide 26
  • Slide 27
  • Slide 28
  • Slide 29
  • Slide 30
  • Slide 31
  • Slide 32
  • Slide 33
  • Slide 34
  • Slide 35
  • Slide 36
  • Slide 37
  • Slide 38
  • Slide 39
  • Slide 40
  • Slide 41
  • Slide 42
  • Slide 43
Page 37: uCOS-II Kernel Structure

Time Management Using clock tick to implement time delays and timeouts OSTimeDly() OSTimeDlyHMSM() OSTimeDlyResume() OSTimeGet() OSTimeSet() Defined in OS_TimeC

OSTimeDly()void OSTimeDly (INT16U ticks) if (ticks gt 0)

OS_ENTER_CRITICAL() if ((OSRdyTbl[OSTCBCur-gtOSTCBY] amp= ~OSTCBCur-gtOSTCBBitX) == 0) OSRdyGrp amp= ~OSTCBCur-gtOSTCBBitY OSTCBCur-gtOSTCBDly = ticks

OS_EXIT_CRITICAL() OSSched()

uCOSII initialization OSIint() initialize all variables and data structure for system Defined in OS_COREC

OSPrioCur = 0OSPrioHighRdy = 0OSTCBCur = NULLOSTCBHighRdy = OLOSTime = 0OSIntNesting = 0OSLockNesting = 0 OSCtxSwCtr = 0OSTaskCtr = 2OSRunning = FALSEOSCPUUsage = 0OSIdleCtrMax = 0L OSIdleCtrRun = 0LOSIdleCtr = 0LOSStatRdy = FALSE

Free TCB List

Free Event List

Free Queue List

Free Memory List

Create a TaskPriority = 6

OSPrioCur = 6OSPrioHighRdy = 6OSTCBCur OSTCBHighRdy OSTime = 0OSIntNesting = 0OSLockNesting = 0 OSCtxSwCtr = 0OSTaskCtr = 3OSRunning = TRUEOSCPUUsage = 0OSIdleCtrMax = 0L OSIdleCtrRun = 0LOSIdleCtr = 0LOSStatRdy = FALSE

Message Mail boxes

Waiting List

  • Slide 1
  • Slide 2
  • Slide 3
  • Slide 4
  • Slide 5
  • Slide 6
  • Slide 7
  • Slide 8
  • Slide 9
  • Slide 10
  • Slide 11
  • Slide 12
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Slide 17
  • Slide 18
  • Slide 19
  • Slide 20
  • Slide 21
  • Slide 22
  • Slide 23
  • Slide 24
  • Slide 25
  • Slide 26
  • Slide 27
  • Slide 28
  • Slide 29
  • Slide 30
  • Slide 31
  • Slide 32
  • Slide 33
  • Slide 34
  • Slide 35
  • Slide 36
  • Slide 37
  • Slide 38
  • Slide 39
  • Slide 40
  • Slide 41
  • Slide 42
  • Slide 43
Page 38: uCOS-II Kernel Structure

OSTimeDly()void OSTimeDly (INT16U ticks) if (ticks gt 0)

OS_ENTER_CRITICAL() if ((OSRdyTbl[OSTCBCur-gtOSTCBY] amp= ~OSTCBCur-gtOSTCBBitX) == 0) OSRdyGrp amp= ~OSTCBCur-gtOSTCBBitY OSTCBCur-gtOSTCBDly = ticks

OS_EXIT_CRITICAL() OSSched()

uCOSII initialization OSIint() initialize all variables and data structure for system Defined in OS_COREC

OSPrioCur = 0OSPrioHighRdy = 0OSTCBCur = NULLOSTCBHighRdy = OLOSTime = 0OSIntNesting = 0OSLockNesting = 0 OSCtxSwCtr = 0OSTaskCtr = 2OSRunning = FALSEOSCPUUsage = 0OSIdleCtrMax = 0L OSIdleCtrRun = 0LOSIdleCtr = 0LOSStatRdy = FALSE

Free TCB List

Free Event List

Free Queue List

Free Memory List

Create a TaskPriority = 6

OSPrioCur = 6OSPrioHighRdy = 6OSTCBCur OSTCBHighRdy OSTime = 0OSIntNesting = 0OSLockNesting = 0 OSCtxSwCtr = 0OSTaskCtr = 3OSRunning = TRUEOSCPUUsage = 0OSIdleCtrMax = 0L OSIdleCtrRun = 0LOSIdleCtr = 0LOSStatRdy = FALSE

Message Mail boxes

Waiting List

  • Slide 1
  • Slide 2
  • Slide 3
  • Slide 4
  • Slide 5
  • Slide 6
  • Slide 7
  • Slide 8
  • Slide 9
  • Slide 10
  • Slide 11
  • Slide 12
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Slide 17
  • Slide 18
  • Slide 19
  • Slide 20
  • Slide 21
  • Slide 22
  • Slide 23
  • Slide 24
  • Slide 25
  • Slide 26
  • Slide 27
  • Slide 28
  • Slide 29
  • Slide 30
  • Slide 31
  • Slide 32
  • Slide 33
  • Slide 34
  • Slide 35
  • Slide 36
  • Slide 37
  • Slide 38
  • Slide 39
  • Slide 40
  • Slide 41
  • Slide 42
  • Slide 43
Page 39: uCOS-II Kernel Structure

uCOSII initialization OSIint() initialize all variables and data structure for system Defined in OS_COREC

OSPrioCur = 0OSPrioHighRdy = 0OSTCBCur = NULLOSTCBHighRdy = OLOSTime = 0OSIntNesting = 0OSLockNesting = 0 OSCtxSwCtr = 0OSTaskCtr = 2OSRunning = FALSEOSCPUUsage = 0OSIdleCtrMax = 0L OSIdleCtrRun = 0LOSIdleCtr = 0LOSStatRdy = FALSE

Free TCB List

Free Event List

Free Queue List

Free Memory List

Create a TaskPriority = 6

OSPrioCur = 6OSPrioHighRdy = 6OSTCBCur OSTCBHighRdy OSTime = 0OSIntNesting = 0OSLockNesting = 0 OSCtxSwCtr = 0OSTaskCtr = 3OSRunning = TRUEOSCPUUsage = 0OSIdleCtrMax = 0L OSIdleCtrRun = 0LOSIdleCtr = 0LOSStatRdy = FALSE

Message Mail boxes

Waiting List

  • Slide 1
  • Slide 2
  • Slide 3
  • Slide 4
  • Slide 5
  • Slide 6
  • Slide 7
  • Slide 8
  • Slide 9
  • Slide 10
  • Slide 11
  • Slide 12
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Slide 17
  • Slide 18
  • Slide 19
  • Slide 20
  • Slide 21
  • Slide 22
  • Slide 23
  • Slide 24
  • Slide 25
  • Slide 26
  • Slide 27
  • Slide 28
  • Slide 29
  • Slide 30
  • Slide 31
  • Slide 32
  • Slide 33
  • Slide 34
  • Slide 35
  • Slide 36
  • Slide 37
  • Slide 38
  • Slide 39
  • Slide 40
  • Slide 41
  • Slide 42
  • Slide 43
Page 40: uCOS-II Kernel Structure

OSPrioCur = 0OSPrioHighRdy = 0OSTCBCur = NULLOSTCBHighRdy = OLOSTime = 0OSIntNesting = 0OSLockNesting = 0 OSCtxSwCtr = 0OSTaskCtr = 2OSRunning = FALSEOSCPUUsage = 0OSIdleCtrMax = 0L OSIdleCtrRun = 0LOSIdleCtr = 0LOSStatRdy = FALSE

Free TCB List

Free Event List

Free Queue List

Free Memory List

Create a TaskPriority = 6

OSPrioCur = 6OSPrioHighRdy = 6OSTCBCur OSTCBHighRdy OSTime = 0OSIntNesting = 0OSLockNesting = 0 OSCtxSwCtr = 0OSTaskCtr = 3OSRunning = TRUEOSCPUUsage = 0OSIdleCtrMax = 0L OSIdleCtrRun = 0LOSIdleCtr = 0LOSStatRdy = FALSE

Message Mail boxes

Waiting List

  • Slide 1
  • Slide 2
  • Slide 3
  • Slide 4
  • Slide 5
  • Slide 6
  • Slide 7
  • Slide 8
  • Slide 9
  • Slide 10
  • Slide 11
  • Slide 12
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Slide 17
  • Slide 18
  • Slide 19
  • Slide 20
  • Slide 21
  • Slide 22
  • Slide 23
  • Slide 24
  • Slide 25
  • Slide 26
  • Slide 27
  • Slide 28
  • Slide 29
  • Slide 30
  • Slide 31
  • Slide 32
  • Slide 33
  • Slide 34
  • Slide 35
  • Slide 36
  • Slide 37
  • Slide 38
  • Slide 39
  • Slide 40
  • Slide 41
  • Slide 42
  • Slide 43
Page 41: uCOS-II Kernel Structure

Free TCB List

Free Event List

Free Queue List

Free Memory List

Create a TaskPriority = 6

OSPrioCur = 6OSPrioHighRdy = 6OSTCBCur OSTCBHighRdy OSTime = 0OSIntNesting = 0OSLockNesting = 0 OSCtxSwCtr = 0OSTaskCtr = 3OSRunning = TRUEOSCPUUsage = 0OSIdleCtrMax = 0L OSIdleCtrRun = 0LOSIdleCtr = 0LOSStatRdy = FALSE

Message Mail boxes

Waiting List

  • Slide 1
  • Slide 2
  • Slide 3
  • Slide 4
  • Slide 5
  • Slide 6
  • Slide 7
  • Slide 8
  • Slide 9
  • Slide 10
  • Slide 11
  • Slide 12
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Slide 17
  • Slide 18
  • Slide 19
  • Slide 20
  • Slide 21
  • Slide 22
  • Slide 23
  • Slide 24
  • Slide 25
  • Slide 26
  • Slide 27
  • Slide 28
  • Slide 29
  • Slide 30
  • Slide 31
  • Slide 32
  • Slide 33
  • Slide 34
  • Slide 35
  • Slide 36
  • Slide 37
  • Slide 38
  • Slide 39
  • Slide 40
  • Slide 41
  • Slide 42
  • Slide 43
Page 42: uCOS-II Kernel Structure

Create a TaskPriority = 6

OSPrioCur = 6OSPrioHighRdy = 6OSTCBCur OSTCBHighRdy OSTime = 0OSIntNesting = 0OSLockNesting = 0 OSCtxSwCtr = 0OSTaskCtr = 3OSRunning = TRUEOSCPUUsage = 0OSIdleCtrMax = 0L OSIdleCtrRun = 0LOSIdleCtr = 0LOSStatRdy = FALSE

Message Mail boxes

Waiting List

  • Slide 1
  • Slide 2
  • Slide 3
  • Slide 4
  • Slide 5
  • Slide 6
  • Slide 7
  • Slide 8
  • Slide 9
  • Slide 10
  • Slide 11
  • Slide 12
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Slide 17
  • Slide 18
  • Slide 19
  • Slide 20
  • Slide 21
  • Slide 22
  • Slide 23
  • Slide 24
  • Slide 25
  • Slide 26
  • Slide 27
  • Slide 28
  • Slide 29
  • Slide 30
  • Slide 31
  • Slide 32
  • Slide 33
  • Slide 34
  • Slide 35
  • Slide 36
  • Slide 37
  • Slide 38
  • Slide 39
  • Slide 40
  • Slide 41
  • Slide 42
  • Slide 43
Page 43: uCOS-II Kernel Structure

Message Mail boxes

Waiting List

  • Slide 1
  • Slide 2
  • Slide 3
  • Slide 4
  • Slide 5
  • Slide 6
  • Slide 7
  • Slide 8
  • Slide 9
  • Slide 10
  • Slide 11
  • Slide 12
  • Slide 13
  • Slide 14
  • Slide 15
  • Slide 16
  • Slide 17
  • Slide 18
  • Slide 19
  • Slide 20
  • Slide 21
  • Slide 22
  • Slide 23
  • Slide 24
  • Slide 25
  • Slide 26
  • Slide 27
  • Slide 28
  • Slide 29
  • Slide 30
  • Slide 31
  • Slide 32
  • Slide 33
  • Slide 34
  • Slide 35
  • Slide 36
  • Slide 37
  • Slide 38
  • Slide 39
  • Slide 40
  • Slide 41
  • Slide 42
  • Slide 43