Topics in Embedded Systems - PowerPoint PPT Presentation

About This Presentation
Title:

Topics in Embedded Systems

Description:

Title: Topics in Embedded Systems Author: Taeweon Suh Last modified by: Taeweon Suh Created Date: 8/14/2004 10:46:03 PM Document presentation format – PowerPoint PPT presentation

Number of Views:180
Avg rating:3.0/5.0
Slides: 34
Provided by: Taewe2
Category:

less

Transcript and Presenter's Notes

Title: Topics in Embedded Systems


1
COM609 Topics in Embedded Systems
Lecture 2. Real-time Systems Concept
Prof. Taeweon Suh Computer Science
Education Korea University
2
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 dont have to
    finish by specific times
  • Hard real-time systems tasks have to be
    performed not only correctly but on time

3
Foreground/Background Systems
  • 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

4
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

5
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

Source Wikipedia
6
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

7
Tasks
  • 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

8
Task States
9
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 tasks
    context (CPU registers) in the current tasks
    stack
  • After this operation is performed, the new tasks
    context is restored from its stack and then
    resumes execution of the new tasks code
  • This process is called a context switch

10
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

11
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

12
Non-Preemptive Kernels
  • 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

13
Non-Preemptive Kernels (cont.)
  • 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

14
Preemptive Kernels
  • 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

15
Preemptive Kernels (cont.)
  • 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

16
Reentrant Non-reentrant Functions
  • A reentrant function can be used by more than one
    task w/o fear of data corruption
  • Reentrant function
  • Non-reentrant function

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
  • Making a Non-entrant function reentrant
  • Declare Temp local to swap()
  • Disable interrupt before the operation and enable
    them afterwards
  • Use a semaphore

17
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

18
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

OS_ENTER_CRITICAL() // Disable
interrupts Access the resource OS_EXIT_CRITICAL
() // Reenable interrupt
19
Disabling and Enabling Interrupts in Microblaze
define OS_ENTER_CRITICAL() cpu_sr
OS_CPU_SR_Save() define OS_EXIT_CRITICAL() OS_C
PU_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 /
20
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
    Developers Manual
  • ARM swp (swap) instruction
  • used to implement semaphores source ARM
    Architecture Reference Manual
  • Microblaze?

21
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

void Function (void) OSSchedLock()
... // You can access shared data in here
(interrupts are recognized)
OSSchedUnlock()
22
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

OS_EVENT SharedDataSem void Function
(void) INT8U err OSSemPend(ShardDataS
em, 0, err) ... // You can access shared
data in here (interrupts are recognized)
OSSemPost(SharedDataSem)
23
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

24
Misc
  • Task synchronization with semaphores
  • Task synchronization with events
  • Intertask communication via global data or
    sending messages (Mailbox, Queue)

25
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

26
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 CPUs
    context for a foreground/background system and
    for a non-preemptive kernel
  • Interrupt latency Time to save the CPUs
    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 CPUs 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 CPUs context of the
    highest priority task Time to execute the
    return from interrupt instruction for a
    preemptive kernel

27
Interrupt for foreground/background systems and
non-preemptive kernels
28
Interrupt for preemptive kernels
29
Clock Tick
  • A clock tick is a special timer interrupt that
    occurs periodically
  • It can be viewed as the systems heartbeat
  • The time between interrupts is application-specifi
    c 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

30
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

31
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

32
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 isnt

33
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!
Write a Comment
User Comments (0)
About PowerShow.com