Professional Documents
Culture Documents
CPU+FPU+MPU
(8, 16, 32 or 64-bit)
silabs.com | @silabs
An RTOS Provides Services To Your Application
RTOS
Tasks Time Semaphores Event Flags Mutexes Queues Timers Memory Blocks
OSTaskCreate(..) OSTimeDly(..) OSSemCreate(..) OSFlagCreate(..) OSMutexCreate(..) OSQCreate(..) OSTmrCreate(..) OSMemCreate(..)
OSTaskDel(..) OSTimeDlyHMSM(..) OSSemDel(..) OSFlagDel(..) OSMutexDel(..) OSQDel(..) OSTmrDel(..) OSMemDel(..)
OSTaskSuspend(..) OSTimeDlyResume(..) OSSemPend(..) OSFlagPend(..) OSMutexPend(..) OSQPend(..) OSTmrStart(..) OSMemGet(..)
OSTaskResume(..) OSTimeGet(..) OSSemPost(..) OSFlagPost(..) OSMutexPost(..) OSQPost(..) OSTmrStop(..) OSMemPut(..)
OSTaskChangePrio() OSTimeSet(..) : : : : : :
: : : : : : : :
: :
silabs.com | @silabs
Benefits of Using an RTOS
silabs.com | @silabs
Benefits of Using an RTOS
silabs.com | @silabs
Drawbacks of Using an RTOS
silabs.com | @silabs
Tasks
Stack
void MyTask (void *p_arg) // Task Code
(RAM)
{ Variables
Local Variables; Arrays
Structures
Task initialization; (RAM)
while (1) { // Infinite Loop (Typ.)
Wait for Event;
Perform task operation; // Do something useful
}
}
silabs.com | @silabs
Creating a Task
You must tell the RTOS about the existence of a task:
The RTOS provides a special API: OSTaskCreate() (or equivalent)
silabs.com | @silabs
RTOSs Are Event Driven
High Priority
Low Priority
silabs.com | @silabs
Tasks Waiting for Events Are Placed in a Wait List
DMA Completion
Semaphore
Task waiting for
DMA to complete
Printer Access
Mutex
Task waiting to Task waiting to Task waiting to
access printer access printer access printer
Tick List
(Delta List) Task waiting for Task waiting for Task waiting for
time to expire time to expire time to expire
silabs.com | @silabs
RTOSs Are Preemptive
void Low_Prio_Task (void)
{
Task initialization;
while (1) {
Setup to wait for event; RTOS Overhead
Signal
Wait for event to occur;
Perform task operation;
Task
} ISR
}
RTOS
void ISR (void) Resumes
{ Task Wait For
Entering ISR; Event
Perform Work;
Event High Priority Task
Signal or Send Message to Task;
Occurs
Perform Work; // Optional
Leaving ISR; RTOS
} Resumes
Task
void High_Prio_Task (void)
{
Task initialization; Low Priority Task Low Priority Task
while (1) {
Setup to wait for event;
Wait for event to occur; Time
Perform task operation;
}
}
silabs.com | @silabs
Interrupts Must Notify the RTOS
Task
ISRs can be written directly in C on Cortex-M CPUs
silabs.com | @silabs
A Context Switch Occurs When the RTOS Decides to Run Another
Task
Restore Save
Task 2 1 Task
Control Control
Block Block
(TCB) (TCB)
CPU
FPU
Context
Switch
Example using Cortex-M4
silabs.com | @silabs
Most RTOSs Have a Periodic Time Source
silabs.com | @silabs
RTOS Services – Time Delays (i.e. Sleep)
Updating a display
Scanning a keyboard
Letting other tasks a chance to run
Etc.
Task
N Ticks
silabs.com | @silabs
RTOS Services – Sharing a Resource Using a Mutex
What is a resource? void EachTask (void)
{
Shared memory, variables, arrays, structures Task initialization;
while (1) {
:
I/O devices :
Acquire Mutex;
RTOSs typically provide resource sharing APIs Access the resource;
Relinquish the Mutex;
:
Mutex have built-in priority inheritance }
}
Eliminates unbounded priority inversions Task
There could be multiple mutexes in a system
Each protecting access to a different resource
Access
Shared
2
Task Resource
OSMutexPend() (Memory or I/O)
Acquire
1
3 Mutex
Relinquish
OSMutexPost()
Task
Timeout
silabs.com | @silabs
RTOS Services – Signaling a Task Using a Semaphore
Semaphore
Signal Wait
ISR OSSemPost() OSSemPend()
Task
Timeout
silabs.com | @silabs
RTOS Services – Signaling Task(s) Using Event Flags
Group
silabs.com | @silabs
RTOS Services – Sending Messages to Task(s)
Send
Consumer(s)
Send Receive
ISR OSQPost() OSQPend()
Task
silabs.com | @silabs
Debugging RTOS-Based Systems – µC/Probe, Graphical Live
Watch®
Seeing inside an embedded system
Your Non-intrusive
Code
IDE Display or change ANY values numerically
Compiler .ELF
or graphically
RTOS
Assembler Debugger
(Optional)
Linker A universal tool that interfaces to any
target:
Libraries
8-, 16-, 32-, 64-bit and DSPs
Cortex-M
.ELF Target No CPU intervention with Cortex-M
Requires target resident code if not using the
On-the-Fly debug port:
Memory & I/O
RS232C
Access
CDF (I/Os) TCP/IP
CSF (Custom Symbols) USB
silabs.com | @silabs
Debugging RTOS-Based Systems – µC/Probe, Graphical Live
Watch®
RTOS awareness
Micrium’s µC/ProbeTM
Task state stack usage
CPU usage
Run counters
Interrupt disable time
Kernel objects
Etc.
silabs.com | @silabs
Debugging RTOS-Based Systems – Segger’s SystemView
silabs.com | @silabs
Do You Need an RTOS?
silabs.com | @silabs
Development Tools and Books
silabs.com | @silabs
Thank you!
SILABS.COM