33
Lecture 2. Real-time Systems Concept Prof. Taeweon Suh Computer Science Education Korea University COM609 Topics in Embedded Systems

Lecture 2. Real-time Systems Concept Prof. Taeweon Suh Computer Science Education Korea University COM609 Topics in Embedded Systems

Embed Size (px)

Citation preview

Page 1: Lecture 2. Real-time Systems Concept Prof. Taeweon Suh Computer Science Education Korea University COM609 Topics in Embedded Systems

Lecture 2. Real-time Systems Concept

Prof. Taeweon SuhComputer Science Education

Korea University

COM609 Topics in Embedded Systems

Page 2: Lecture 2. Real-time Systems Concept Prof. Taeweon Suh Computer Science Education Korea University COM609 Topics in Embedded Systems

Korea Univ

Real-time Systems

• Real-time systems are characterized by the severe consequences that result if logical as well as timing correctness properties of the system are not met

• 2 types of real-time systems exist: Soft real-time systems: tasks are performed as fast as

possible, but the tasks don’t have to finish by specific times

Hard real-time systems: tasks have to be performed not only correctly but on time

2

Page 3: Lecture 2. Real-time Systems Concept Prof. Taeweon Suh Computer Science Education Korea University COM609 Topics in Embedded Systems

Korea Univ

Foreground/Background Systems

3

• Small systems of low complexity are generally designed as foreground/background systems An application consists of an

infinite loop that calls modules (i.e., functions) to perform the desired operations (background); Background is called task level

Interrupt service routines (ISRs) handle asynchronous events (foreground); Foreground is called interrupt level

Page 4: Lecture 2. Real-time Systems Concept Prof. Taeweon Suh Computer Science Education Korea University COM609 Topics in Embedded Systems

Korea Univ

Foreground/Background Systems

• Critical operations must be performed by the ISRs to ensure that they are dealt with in a timely fashion

• Information for a background module that an ISR makes available is not processed until the background routine gets its turn to execute, which is called the task-level response The worst case task-level response time depends on how

long the background loop takes to execute

• Most high-volume microcontroller-based applications (e.g. microwave ovens, telephones, toys, and so on) are designed as foreground/background systems In microcontroller-based applications, it might be better

from a power consumption point of view to halt a processor and perform all of the processing in ISRs

4

Page 5: Lecture 2. Real-time Systems Concept Prof. Taeweon Suh Computer Science Education Korea University COM609 Topics in Embedded Systems

Korea Univ

Critical Sections

• In concurrent programming, a critical section is a piece of code that accesses a shared resource (data structure or device) that must not be concurrently accessed by more than one thread of execution

• The simplest method is to prevent any change of processor control inside the critical section. On uni-processor systems, this can be done by disabling

interrupts on entry into the critical section, avoiding system calls that can cause a context switch while inside the section and restoring interrupts to their previous state on exit

• µC/OS-II has done this! This brute-force approach can be improved upon by using

semaphores. To enter a critical section, a thread must obtain a semaphore, which it releases on leaving the section

5Source: Wikipedia

Page 6: Lecture 2. Real-time Systems Concept Prof. Taeweon Suh Computer Science Education Korea University COM609 Topics in Embedded Systems

Korea Univ

Tasks

• A task (thread, process) is a simple program that thinks it has the CPU all to itself

• The design process for a real-time application involves splitting the work to be done into tasks responsible for a portion of the problem Each task is assigned a

priority, and has its own stack area

6

Page 7: Lecture 2. Real-time Systems Concept Prof. Taeweon Suh Computer Science Education Korea University COM609 Topics in Embedded Systems

Korea Univ

Tasks

7

• Each task typically is an infinite loop that can be in any one of five states: dormant, ready, running, waiting (for an event), or ISR (interrupted) Dormant: a task resides in memory, but has not been

made available to the multitasking kernel Ready: a task is ready when it can execute, but its

priority is less than the currently running task Running: a task is running when it has control of the

CPU Waiting: a task is waiting when it requires the

occurrence of an event ISR: a task is in the ISR state when an interrupt has

occurred and the CPU is in the process of servicing the interrupt

Page 8: Lecture 2. Real-time Systems Concept Prof. Taeweon Suh Computer Science Education Korea University COM609 Topics in Embedded Systems

Korea Univ

Task States

8

Page 9: Lecture 2. Real-time Systems Concept Prof. Taeweon Suh Computer Science Education Korea University COM609 Topics in Embedded Systems

Korea Univ

Multitasking

• Multitasking is the process of scheduling and switching the CPU between several tasks

• Multitasking is like foreground/background with multiple backgrounds

• Multitasking maximizes the use of the CPU and also provides for modular construction of applications

• Context switch When a multitasking kernel decides to run a different task,

it saves the current task’s context (CPU registers) in the current task’s stack

After this operation is performed, the new task’s context is restored from its stack and then resumes execution of the new task’s code

This process is called a context switch 9

Page 10: Lecture 2. Real-time Systems Concept Prof. Taeweon Suh Computer Science Education Korea University COM609 Topics in Embedded Systems

Korea Univ

Kernels

• The kernel is the part of a multitasking system responsible for management of tasks and communication between tasks

• The kernel allows you to make better use of CPU by providing indispensible services such as semaphores, mailboxes, queues and time delays

• The use of a real-time kernel generally simplifies the design of systems by allowing the application to be divided into multiple tasks that the kernel manages

10

Page 11: Lecture 2. Real-time Systems Concept Prof. Taeweon Suh Computer Science Education Korea University COM609 Topics in Embedded Systems

Korea Univ

Schedulers

• The scheduler (also called dispatcher) is the part of the kernel responsible for determining which task runs next

• Most real-time kernels are priority-based Each task is assigned a priority based on its importance

• In a priority-based kernel, control of the CPU is always given to the highest priority task ready to run When the highest priority task gets the CPU, however, is

determined by the type of kernel used 2 types of priority-based kernels exist: non-preemptive

and preemptive

11

Page 12: Lecture 2. Real-time Systems Concept Prof. Taeweon Suh Computer Science Education Korea University COM609 Topics in Embedded Systems

Korea Univ

Non-Preemptive Kernels

12

• Non-preemptive kernel requires that each task does something to explicitly give up control of the CPU A non-preemptive kernel

allows each task to run until it voluntarily gives up control of the CPU

An interrupt preempts a task

Upon completion of the ISR, the ISR returns to the interrupted task

• Non-preemptive scheduling is also called cooperative multitasking

Page 13: Lecture 2. Real-time Systems Concept Prof. Taeweon Suh Computer Science Education Korea University COM609 Topics in Embedded Systems

Korea Univ

Non-Preemptive Kernels (cont.)

13

• Task-level response can be much lower than with foreground/background systems because the task-level response is now given by the time of the longest task

• The most important drawback of a non-preemptive kernel is responsiveness A higher priority task that has been made ready to run

might have to wait a long time to run because the current task must give up the CPU

• Very few commercial kernels are non-preemptive

Page 14: Lecture 2. Real-time Systems Concept Prof. Taeweon Suh Computer Science Education Korea University COM609 Topics in Embedded Systems

Korea Univ

Preemptive Kernels

14

• A preemptive kernel is used when system responsiveness is important; Thus, µC/OS-II and most commercial real-time kernels are preemptive When a task makes a higher

priority task ready to run, the current task is preempted (suspended), and the higher priority task is immediately given control of the CPU

If an ISR makes a higher priority task ready, when the ISR completes, the interrupted task is suspended, and the new higher priority task is resumed

Page 15: Lecture 2. Real-time Systems Concept Prof. Taeweon Suh Computer Science Education Korea University COM609 Topics in Embedded Systems

Korea Univ

Preemptive Kernels (cont.)

15

• With a preemptive kernel, execution of the highest priority task is deterministic Thus, the task-level response is minimized by

using a preemptive kernel

• Application code using a preemptive kernel should not use non-reentrant functions unless exclusive access to these functions is ensured through the use of mutual exclusion semaphores

Page 16: Lecture 2. Real-time Systems Concept Prof. Taeweon Suh Computer Science Education Korea University COM609 Topics in Embedded Systems

Korea Univ

Reentrant & Non-reentrant Functions

16

void strcpy(char *dest, char *src)

{

while (*dest++ == *src++) {

;

}

*dest = NULL;

}

int Temp; // global variable

Void swap(int *x, int *y)

{

Temp = *x;

*x = *y;

*y = Temp;

}

• Reentrant function • Non-reentrant function

• A reentrant function can be used by more than one task w/o fear of data corruption

• Making a Non-entrant function reentrant• Declare Temp local to swap()• Disable interrupt before the operation and enable them

afterwards• Use a semaphore

Page 17: Lecture 2. Real-time Systems Concept Prof. Taeweon Suh Computer Science Education Korea University COM609 Topics in Embedded Systems

Korea Univ

Mutual Exclusion

• The easiest way for tasks to communicate with each other is through shared data structures It is especially easy when all tasks exist in a single address

space and can reference elements such as global variables, pointers, buffers, and linked lists etc

• Although sharing data simplifies the exchange of information, you must ensure that each task has exclusive access to the data to avoid contention and data corruption

• The most common methods of obtaining exclusive access to shared resources: Disabling interrupts Performing test-and-set operations Disabling scheduling Using semaphores

17

Page 18: Lecture 2. Real-time Systems Concept Prof. Taeweon Suh Computer Science Education Korea University COM609 Topics in Embedded Systems

Korea Univ

Disabling and Enabling Interrupts

• The easiest and fastest way to gain exclusive access to a shared resource is by disabling and enabling interrupts Check out os_cpu.h and os_cpu_a.s in µC/OS source

• You must be careful not to disable interrupts for too long Doing so affects the response of your system to interrupts,

which is known as interrupt latency Consider this method when you are changing or copying a few

variables Keep interrupts disabled for as little time as possible

18

OS_ENTER_CRITICAL() // Disable interrupts;

Access the resource;

OS_EXIT_CRITICAL () // Reenable interrupt;

Page 19: Lecture 2. Real-time Systems Concept Prof. Taeweon Suh Computer Science Education Korea University COM609 Topics in Embedded Systems

Korea Univ

Disabling and Enabling Interrupts in Microblaze

19

#define OS_ENTER_CRITICAL() cpu_sr = OS_CPU_SR_Save();

#define OS_EXIT_CRITICAL() OS_CPU_SR_Restore(cpu_sr);

OS_CPU_SR_Save: ADDIK r1, r1, -4 /* Save R4 since it's used as a scratchpad register */ SW r4, r1, r0

MFS r3, RMSR /* Read the MSR. r3 is used as the return value */ ANDNI r4, r3, CPU_IE_BIT /* Mask off the IE bit */ MTS RMSR, r4 /* Store the MSR */

LW r4, r1, r0 /* Restore R4 */ ADDIK r1, r1, 4

AND r0, r0, r0 /* NO-OP - pipeline flush */ AND r0, r0, r0 /* NO-OP - pipeline flush */ AND r0, r0, r0 /* NO-OP - pipeline flush */

RTSD r15, 8 /* Return to caller with R3 containing original RMSR */ AND r0, r0, r0 /* NO-OP */

OS_CPU_SR_Restore:

RTSD r15, 8

MTS rMSR, r5 /* Move the saved status from r5 into rMSR */

Page 20: Lecture 2. Real-time Systems Concept Prof. Taeweon Suh Computer Science Education Korea University COM609 Topics in Embedded Systems

Korea Univ

Test-and-Set

• If you are not using a kernel, 2 functions could agree that to access a resource, they must check a global variable and if the variable is 0, the function has access to the resource To prevent the other function from accessing the resource, the first

function that gets the resource sets the variable to 1, which is called a test-and-set (TAS) operation

Either the TAS operation must be performed indivisibly (by the processor), or you must disable interrupts when doing the TAS on the variable

However, it is still problematic in multiprocessor environment. Why is that?

• Typically, many processors designed for multiprocessor systems in mind provide special instructions for the atomic operation x86: xchg instruction, integer instructions with lock prefix

(exchange register/memory with register)• xchg is useful for implementing semaphores or similar data structures for

process synchronization – source: Intel Software Developer’s Manual ARM: swp (swap) instruction

• used to implement semaphores – source: ARM Architecture Reference Manual Microblaze?

20

Page 21: Lecture 2. Real-time Systems Concept Prof. Taeweon Suh Computer Science Education Korea University COM609 Topics in Embedded Systems

Korea Univ

Disabling and Enabling Scheduler

• If your task is not sharing variables or data structures with an ISR, you can disable and enable scheduling While the scheduler is locked and interrupts are enabled, if an

interrupt occurs while in the critical section, the ISR is executed immediately; At the end of the ISR, the kernel always returns to the interrupted task, even if the ISR has made a higher priority task ready to run

Because the ISR returns to the interrupted task, the behavior is very similar to that of a non-preemptive kernel

The scheduler is invoked when OSSchedUnlock() is called

21

void Function (void)

{

OSSchedLock();

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

OSSchedUnlock();

}

Page 22: Lecture 2. Real-time Systems Concept Prof. Taeweon Suh Computer Science Education Korea University COM609 Topics in Embedded Systems

Korea Univ

Semaphores

• The semaphore was invented by Edgser Dijkstra in the mid-1960s

• It is a protocol mechanism offered by most multitasking kernels

• Semaphores are used to Control access to a shared resource (mutual exclusion) Signal the occurrence of an event Allow tasks to synchronize their activities

• 2 types of semaphores Binary semaphore Counting semaphore

22

OS_EVENT *SharedDataSem;

void Function (void){ INT8U err;

OSSemPend(ShardDataSem, 0, &err);

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

OSSemPost(SharedDataSem); }

Page 23: Lecture 2. Real-time Systems Concept Prof. Taeweon Suh Computer Science Education Korea University COM609 Topics in Embedded Systems

Korea Univ

Deadlock

• A deadlock is a situation where 2 tasks are unknowingly waiting for resources held by the other Task 1 (T1) has exclusive access to Resource 1 (R1) Task 2 (T2) has exclusive access to Resource 2 (R2) If T1 needs exclusive access to R2 and T2 needs exclusive

access to R1, neither task can continue (deadlocked)

• The simplest way to avoid a deadlock is for tasks to Acquire all resources before proceeding Acquire the resources in the same order, and Release the resources in the reverse order

• Most kernels allow you to specify a timeout when acquiring a semaphore; This feature allows a deadlock to be broken If the semaphore is not available within a certain amount of

time, the task requesting the resource resumes execution

23

Page 24: Lecture 2. Real-time Systems Concept Prof. Taeweon Suh Computer Science Education Korea University COM609 Topics in Embedded Systems

Korea Univ

Misc

• Task synchronization with semaphores

• Task synchronization with events

• Intertask communication via global data or sending messages (Mailbox, Queue)

24

Page 25: Lecture 2. Real-time Systems Concept Prof. Taeweon Suh Computer Science Education Korea University COM609 Topics in Embedded Systems

Korea Univ

Interrupt

• An interrupt is a hardware mechanism used to inform the CPU that an asynchronous event has occurred

• When an interrupt is recognized, the CPU saves part (or all) of its context (i.e., registers) and jumps to a special subroutine (called an interrupt service routine (ISR))

• Upon completion of the ISR, the program returns to The background for a foreground/background system The interrupted task for a non-preemptive kernel The highest priority task ready to run for a preemptive kernel

25

Page 26: Lecture 2. Real-time Systems Concept Prof. Taeweon Suh Computer Science Education Korea University COM609 Topics in Embedded Systems

Korea Univ

Interrupt Terminologies• Interrupt latency

Maximum amount of time interrupts are disabled + Time to start executing the first instruction in the ISR

• Interrupt response is the time between the reception of the interrupt and the start of the user code that handles the interrupt Interrupt latency + Time to save the CPU’s context for a

foreground/background system and for a non-preemptive kernel Interrupt latency + Time to save the CPU’s context + Execution time

of the kernel ISR entry function (OSIntEnter() in µC/OS-II) for a preemptive kernel • OSIntEnter() allows the kernel to keep tract of interrupt nesting

• Interrupt recovery is the time required for the processor to return to the interrupted code or to a higher priority task in the case of a preemptive kernel Time to restore the CPU’s context + Time to execute the return

instruction from interrupt for a foreground/background system and for a non-preemptive kernel

Time to determine if a higher priority task is ready + Time to restore the CPU’s context of the highest priority task + Time to execute the return from interrupt instruction for a preemptive kernel

26

Page 27: Lecture 2. Real-time Systems Concept Prof. Taeweon Suh Computer Science Education Korea University COM609 Topics in Embedded Systems

Korea Univ

Interrupt for foreground/background systems

and non-preemptive kernels

27

Page 28: Lecture 2. Real-time Systems Concept Prof. Taeweon Suh Computer Science Education Korea University COM609 Topics in Embedded Systems

Korea Univ

Interrupt for preemptive kernels

28

Page 29: Lecture 2. Real-time Systems Concept Prof. Taeweon Suh Computer Science Education Korea University COM609 Topics in Embedded Systems

Korea Univ

Clock Tick

• A clock tick is a special timer interrupt that occurs periodically It can be viewed as the system’s heartbeat The time between interrupts is application-specific and is

generally between 10ms and 200ms

• The clock tick interrupt allows a kernel to delay tasks for an integral number of clock ticks and to provide timeouts when tasks are waiting for events to occur All kernels allow tasks to be delayed for a certain number of

clock ticks The resolution of delayed tasks is one clock tick; however, it

does not mean that its accuracy is one clock tick (see next slides)

• The faster the tick rate, the higher the overhead imposed on the system

29

Page 30: Lecture 2. Real-time Systems Concept Prof. Taeweon Suh Computer Science Education Korea University COM609 Topics in Embedded Systems

Korea Univ

Delay Resolutions with Clock Tick

• Case 1 Higher priority tasks and ISRs execute prior to

the task, which need to delay for one tick• The task attempts to delay for 20ms, but because of

its priority, actually executes at varying intervals

30

Page 31: Lecture 2. Real-time Systems Concept Prof. Taeweon Suh Computer Science Education Korea University COM609 Topics in Embedded Systems

Korea Univ

Delay Resolutions with Clock Tick

• Case 2 The execution times of all higher priority tasks and ISRs

are slightly less than one tick; If the task delays itself just before a clock tick, the task executes again almost immediately

If you need to delay a task at least one clock tick, you must specify one extra tick

31

Page 32: Lecture 2. Real-time Systems Concept Prof. Taeweon Suh Computer Science Education Korea University COM609 Topics in Embedded Systems

Korea Univ

Delay Resolutions with Clock Tick

• Case 3 The execution times of all higher priority tasks and ISRs

extend beyond one clock tick; In this case, the task that tries to delay for one tick actually executes 2 ticks later and misses its deadline

• Missing the deadline might be acceptable in some applications, but in most cases it isn’t

32

Page 33: Lecture 2. Real-time Systems Concept Prof. Taeweon Suh Computer Science Education Korea University COM609 Topics in Embedded Systems

Korea Univ

Solutions?

• These situations exist with all real-time kernels

• They are related to CPU processing load and possibly incorrect system design

• Here are some solutions to these problems Increase the clock frequency of your microprocessor Increase the time between tick interrupts Rearrange task priorities Avoid not using floating-point math (maybe not

applicable these days. The book is written in 2002) Get a better compiler? Write time-critical code in assembly If possible, upgrade to a faster processor!

33