Presentation is loading. Please wait.

Presentation is loading. Please wait.

Chapter 1: Getting Started with μC/OS-II 1. kernel Introduction 2 LinuxμC/OS-II Task (process) kernel Device driver User mode (0-3G) (Kernel mode) 3G-4G.

Similar presentations


Presentation on theme: "Chapter 1: Getting Started with μC/OS-II 1. kernel Introduction 2 LinuxμC/OS-II Task (process) kernel Device driver User mode (0-3G) (Kernel mode) 3G-4G."— Presentation transcript:

1 Chapter 1: Getting Started with μC/OS-II 1

2 kernel Introduction 2 LinuxμC/OS-II Task (process) kernel Device driver User mode (0-3G) (Kernel mode) 3G-4G Task (thread) Device driver

3 Introduction μ C/OS-II – Micro-Controller Operating Systems, Version 2 – A very small real-time kernel. Memory footprint is about 20KB for a fully functional kernel. Source code is about 5,500 lines, mostly in ANSI C. It’s source is open but not free for commercial usages. 3

4 Introduction μ C/OS-II – Preemptible priority-driven real-time scheduling. 64 priority levels (max 64 tasks) 8 (/1/2) reserved for μ C/OS-II Each task is an infinite loop. – Deterministic execution times for most μ C/OS-II functions and services. – Nested interrupts could go up to 256 levels. 4

5 Introduction μ C/OS-II – Supports of various 8-bit to 64-bit platforms: x86, 68x, MIPS, 8051, etc – Easy for development: Borland C++ compiler and DOS (optional). However, μ C/OS-II still lacks of the following features: – Resource synchronization protocols. – Sporadic task support. – Soft real-time support. 5

6 Introduction Getting started with μ C/OS-II ! – See how a μ C/OS-II program looks like. – Learn how to write a skeleton program for μ C/OS-II. How to initialize μ C/OS-II ? How to create tasks? How to use inter-task communication mechanisms? How to catch system events? 6

7 Getting started with μC/OS-II Example 1: Multitasking Example 2: Stack Checking Example 3: Extension of μ C/OS-II Example 4: Portability 7

8 Example 1: Multitasking 8

9 9 Task10 main TaskStart install tick ISR Create other tasks Exit? OSTimeDlyHMSM Exit? OSTimeDlyHMSM Task1 OSSemPend random OSSemPost OSTimeDly OSSemPend random OSSemPost OSTimeDly OSInit Install context switch handler OSStart OSTaskCreate OSSemCreate OSSemPend random OSSemPost OSTimeDly OSSemPend random OSSemPost OSTimeDly... longmp μC/OS-II (Multiprogramming) DOS (bootloader)

10 Example 1: Multitasking 13 tasks run concurrently. – 2 internal tasks: The idle task and the statistic task. – 11 user tasks: Randomly print numbers onto the screen. Focus: System initialization and task creation. 10

11 Example 1: Multitasking Files – The main program (test.c) – The big include file (includes.h) – The configuration of μ C/OS-II (os_cfg.h) for each application Tools needed: – Borland C++ compiler (V3.1+) 11

12 The μC/OS-II File Structure 12 Application Code (test.c) Processor independent implementations Scheduling policy Event flags Semaphores Mailboxes Event queues Task management Time management Memory management Processor independent implementations Scheduling policy Event flags Semaphores Mailboxes Event queues Task management Time management Memory management Application Specific Configurations OS_CFG.H Max # of tasks Max Queue length … Application Specific Configurations OS_CFG.H Max # of tasks Max Queue length … μC/OS-II port for processor specific codes CPU Timer Hardware Software

13 includes.h 13

14 OS_CFG.H 14........

15 test.c 15 A semaphore (explain later) Stacks (explain later) Stacks (explain later)

16 test.c: main() 16

17 17 Task10 main TaskStart install tick ISR Create other tasks Exit? OSTimeDlyHMSM Exit? OSTimeDlyHMSM Task1 OSSemPend random OSSemPost OSTimeDly OSSemPend random OSSemPost OSTimeDly OSInit Install context switch handler OSStart OSTaskCreate OSSemCreate OSSemPend random OSSemPost OSTimeDly OSSemPend random OSSemPost OSTimeDly... longmp Multiprogramming DOS

18 OSInit() Internal structures of μ C/OS-II. – Task ready list. – Priority table. – Task control blocks (TCB). – Free pools. Create housekeeping tasks. – The idle task. – The statistic task. 18

19 OSinit() 19

20 OSinit() 20

21 The PC IVT Interrupt vector table (IVT) 21 Before (DOS only)After (μC/OS-II installed)

22 PC_DOSSaveReturn() Save the current status of DOS for the future restoration. – Interrupt vectors and the RTC tick rate. Set a global returning point by calling setjmp(). – μ C/OS-II can come back here when it terminates. – PC_DOSReturn() 22

23 PC_DOSSaveReturn() 23

24 setjmp 24 setjmp +longjmp ≒ goto

25 longjmp 25

26 PC_VectSet() PC_VectSet(uCOS, OSCtxSw) – Install the context switch handler (OSCtxSw). – Interrupt 0x08 (uCOS) under 80x86 family. Invoked by INT instruction. 26 Disable interrupt Enable interrupt

27 OSSemCreate() Create a semaphore for resource synchronization. – To protect non-reentrant codes. The created semaphore becomes a mutual exclusive mechanism if “1” is given as the initial value. In this example, a semaphore is created to protect the standard C library “random()”. 27

28 OSTaskCreate() Functionality – Create tasks with the given arguments. – Tasks become “ready” after they are created. Task – An active entity which could do some computations. – Priority, CPU registers, stack, text, housekeeping status. The μ C/OS-II picks up the highest-priority task to run on context-switching. – Tightly coupled with ISR. 28

29 OSTaskCreate() OSTaskCreate( TaskStart, (void *)0, &TaskStartStk[TASK_STK_SIZE - 1], 0 ); 29 Priority (0=hightest) Top of Stack Entry point of the task (a pointer to function) User-specified data

30 OSStart() – Start multitasking of μ C/OS-II. – It never returns to main(). – μ C/OS-II is terminated if PC_DOSReturn() is called. 30

31 31 Task10 main TaskStart install tick ISR Create other tasks Exit? OSTimeDlyHMSM Exit? OSTimeDlyHMSM Task1 OSSemPend random OSSemPost OSTimeDly OSSemPend random OSSemPost OSTimeDly OSInit Install context switch handler OSStart OSTaskCreate OSSemCreate OSSemPend random OSSemPost OSTimeDly OSSemPend random OSSemPost OSTimeDly... longmp Multiprogramming DOS

32 TaskStart() 32 for (i=0 to 9) { OSTaskCeate } Wait one second void TaskStart (void *pdata) OSTaskCreate( TaskStart, (void *)0, &TaskStartStk[TASK_STK_SIZE - 1], 0);

33 TaskStart() OS_ENTER_CRITICAL()/OS_EXIT_CRITICAL() – Enable/disable most interrupts. – An alternative way to accomplish mutual exclusion. No rescheduling is possible during the disabling of interrupts. (different from semaphores) – Processor specific. CLI/STI (x86 real mode) Interrupt descriptors (x86 protected mode) 33

34 TaskStartCreateTasks() 34 Priority Stack Argument: character to print Entry point of the created task

35 Task() 35 Semaphore operations.

36 36 Task10 main TaskStart install tick ISR Create other tasks Exit? OSTimeDlyHMSM Exit? OSTimeDlyHMSM Task1 OSSemPend random OSSemPost OSTimeDly OSSemPend random OSSemPost OSTimeDly OSInit Install context switch handler OSStart OSTaskCreate OSSemCreate OSSemPend random OSSemPost OSTimeDly OSSemPend random OSSemPost OSTimeDly... longmp Multiprogramming DOS

37 Semaphores A semaphore consists of a wait list and an integer counter. – OSSemPend(): Counter-- If the value of the semaphore < 0, then the task is blocked and moved to the wait list immediately. A time-out value can be specified. – OSSemPost(): Counter++ If the value of the semaphore ≧ 0, then a task in the wait list is removed from the wait list. Reschedule if needed. 37

38 Example 1: Multitasking Summary: μ C/OS-II is initialized and started by calling OSInit() and OSStart(), respectively. Before μ C/OS-II is started, – The DOS status is saved by calling PC_DOSSaveReturn(). – A context switch handler is installed by calling PC_VectSet(). – One user task must be created first! Shared resources can be protected by semaphores. – OSSemPend(), OSSemPost(). 38

39 Example 2 39

40 40 Multiprogramming DOS main TaskStart install tick ISR Create other tasks Update the display Task1 OSTaskStkChk Task4 OSMboxPost &OSMobxPend OSMboxPost &OSMobxPend Task5 OSMboxPost OSInit Install context switch handler OSStart OSTaskStkInit_FPE_X86 & OSTaskCreateExt OSTaskStkInit_FPE_X86 & OSTaskCreateExt

41 Example 2: Stack Checking Five tasks do jobs on message sending/receiving. – More task creation options Better judgment on stack sizes – Stack usage of each task Different stack sizes for tasks – Emulation of floating point operations 80386 or lower-end CPU’s – Communication through mailbox Only the pointer is passed. 41

42 42 2 Mailboxes

43 Main() 43 OSTaskStkInit_FPE_x86(&ptos, &pbos, &size)

44 OSTaskStkInit_FPE_x86() OSTaskStkInit_FPE_x86(&ptos, &pbos, &size) – Passing the original top address, bottom address, and size of the stack. – On the return, arguments are modified, and some stack space are reserved for the floating point library. For context switches. 44 ptos pbos size

45 OSCreateTaskExt() OSTaskCreatExt( TaskStart, (void *)0, ptos, TASK_START_PRIO, TASK_START_ID, pbos, size, (void *)0, OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR ); 45 User supplied data which can be used to extend TCB options

46 TaskStart() 46 Create 2 mailboxes The dummy loop wait for ‘ ESC ’

47 Task1() 47

48 Task2 and Task3 48 for (i=0; i<499; i++) { dymmy[i] = ‘?’; }

49 Task4 and Task5 49 ??? OSTimeDlyHMSM(0, 0, 1, 0);

50 MailBox A mailbox is for data exchanging between tasks. – A mailbox consists of a data pointer and a wait-list. OSMboxPend(): – The message in the mailbox is retrieved. – If the mailbox is empty, the task is immediately blocked and moved to the wait-list. – A time-out value can be specified. OSMboxPost(): – A message is posted in the mailbox. – If there is already a message in the mailbox, then an error is returned (not overwritten). – If tasks are waiting for a message from the mailbox, then the task with the highest priority is removed from the wait-list and scheduled to run. 50

51 OSTaskStkCheck() Check for stack overflow. – bos < (tos – stack length) – Local variables, arguments for procedure calls, temporary storage for ISR’s. – μ C/OS-II can check for stack overflow on the creation of tasks and when OSTaskStkCheck() is called. – μ C/OS-II does not automatically check stacks. 51

52 (Linux 2.6) 52 User mode Kernel mode (kernel service routines) Kernel mode (interrupt service routines) stack

53 (Linux 2.4) 53 User mode Kernel mode (kernel service routines) Kernel mode (interrupt service routines) stack

54 μC/OS-II 54 Kernel mode (kernel service routines) Kernel mode (interrupt service routines) stack

55 Example2: Stack Checking Summary: – Local variable, function calls, and ISR’s will utilize the stack space of user tasks. – ISR will use the stack of the interrupted task. – If floating-point operations are needed, then some stack space should be reserved. – Mailboxes can be used to synchronize the work of tasks. 55

56 Example 3: Extension of μC/OS-II A Pointer to from the TCB of each task to a user-provided data structure – Passing user-specified data structures on task creations or have application-specific usage. Message queues – More than one pointers Demonstration on how to use OS hooks to receive/process desired event from the μ C/OS-II 56

57 Example 3 57

58 58 User-defined data structure to pass to tasks Message queue and an array of event

59 59

60 60......

61 61

62 62 Task 2, 3, 4 are functionally identical.

63 Message Queues A message queue consists of an array of elements and a wait- list. Different from a mailbox, a message queue can hold many data elements (in a FIFO basis). As same as mailboxes, there can be multiple tasks pend/post to a message queue. OSQPost(): a message is appended to the queue. The highest- priority task (in the wait-list) receives the message and is scheduled to run, if any. OSQPend(): a message is removed from the array of elements. If no message can be retrieved, the task is moved to the wait- list and becomes blocked. 63

64 Hooks A hook function will be called by μ C/OS-II when the corresponding event occurs. – Event handlers could be in user programs. – For example, OSTaskSwHook () is called every time when context switch occurs. The hooks are specified in the compiling time in μ C/OS- II : – μ C/OS-II is an embedded OS. OS_CFG.H (OS_CPU_HOOKS_EN = 0) – Many OS’s can register and un-register hooks. 64

65 User Customizable Hooks for μC/OS-II void OSInitHookBegin (void) void OSInitHookEnd (void) void OSTaskCreateHook (OS_TCB *ptcb) void OSTaskDelHook (OS_TCB *ptcb) void OSTaskIdleHook (void) void OSTaskStatHook (void) void OSTaskSwHook (void) void OSTCBInitHook (OS_TCB *ptcb) void OSTimeTickHook (void) 65

66 OSTaskStatHook() 66

67 OSTaskSwHook() 67 OSTCBCur  TCB of the current task OSTCBHighRdy  TCB of the new task OSTCBCur  TCB of the current task OSTCBHighRdy  TCB of the new task Elapsed time for the current task

68 Example 3: Extension of μC/OS-II Summary: – Message queues can be used to synchronize among tasks. Multiple messages can be held in a queue. Multiple tasks can “pend”/“post” to message queues simultaneously. – Hooks can be used to do some user-specific computations on certain OS events occurs. They are specified in the compiling time. A Pointer to from the TCB of each task to a user-provided data structure 68

69 Getting Started with μC/OS-II? Getting Started with μ C/OS-II : – How the control flows among procedures? – How tasks are created? – How tasks are synchronized by semaphore, mailbox, and message queues? – How the space of a stack is utilized? – How to capture system events? – How to write a dummy μ C/OS-II program? 69


Download ppt "Chapter 1: Getting Started with μC/OS-II 1. kernel Introduction 2 LinuxμC/OS-II Task (process) kernel Device driver User mode (0-3G) (Kernel mode) 3G-4G."

Similar presentations


Ads by Google