330 likes | 693 Views
Cyclic Scheduling. Advantages Simple implementation (no real-time operating system is required). Low run-time overhead. It allows jitter control. Disadvantages It is not robust during overloads. It is difficult to expand the schedule. It is not easy to handle non periodic activities.
E N D
Cyclic Scheduling • Advantages • Simple implementation (no real-time operating system is required). • Low run-time overhead. • It allows jitter control. • Disadvantages • It is not robust during overloads. • It is difficult to expand the schedule. • It is not easy to handle non periodic activities.
Other Schedule Algorithms • Priority Scheduling • Each task is assigned a priority based on its timing constraints • We verify the feasibility of the schedule using analytical techniques • Tasks are executed on a priority-based kernel • Example: Rate Monotonic (RM) • Each task is assigned a fixed priority proportional to its rate
Real Time and Linux • Linux is a standard time-sharing operating system • Good average performance and highly sophisticated services • Hardware management layer dealing with event polling or processor/peripheral interrupts • Scheduler classes dealing with process activation, priorities, time slice • Communications between applications.
Real Time and Linux • Linux suffers from a lack of real time support • Changes in the kernel sources, i.e. in the interrupt handling and scheduling policies • Real time platform, with low latency and high predictability requirements • Full non real time Linux environment (access to TCP/IP, graphical display and windowing systems, file and data base systems, etc.).
Timers PC’s • Specific chip to solve the problem of generating accurate time delays under software control. • 8254 • Programmable interval timer/counter • 4 I/O ports in the system software • Three are independent 16-bit, one is a control register • We configures the 8254 to match requirements (select the mode) and program one of the counters for the desired delay. • After the delay, the 8254 will interrupt the CPU.
Real Time in Linux, RTAI • Use low cost general purpose computers and open-free source operating systems • RTAI means Real Time Application Interface. • Not a real time operating system • Based on the Linux kernel. • RTAI expands Linux to hard real time
Real Time in Linux, RTAI • A patch to the Linux kernel which introduces a hardware abstraction layer • A broad variety of services which make real-time programmers' life easier • RTAI offers the same services of the Linux kernel core, adding the features of an industrial real time operating system.
Real Time in Linux, RTAI • Is an interrupt dispatcher • RTAI traps the peripherals interrupts and if necessary re-routes them to Linux • It uses the concept of HAL (hardware abstraction layer) to get information from Linux and to trap some fundamental functions. • HAL provides few dependencies to Linux Kernel. • RTAI considers Linux as a background task running when no real time activity occurs.
RT Computer Systems RTAI • Basic task management • time management and conversions • dynamic priority assignment • scheduler policy assignment • scheduling locking/unlocking • counting suspend/resume to avoid trivial deadlocks • Memory Management • shared memory for inter tasks • inter-intra user/kernel space data • sharing, dynamic memory allocations
RT Computer Systems RTAI • Semaphores • Wait • Send • broadcast on • counting, binary and resources with full priority • inheritance to avoid priority inversion.
RT Computer Systems RTAI • Conditional variables • wait, signal, broadcast, equivalent to the related POSIX APIs, but with an RTAI specific implementation. • Bits synchronization • Multi events/flags/signals synchronization, i.e. semaphore like operations with different logical masking/unmasking on a set of bits at call and return time.
RT Computer Systems RTAI • Mailboxes • send, receive of messages with multi readers/writers capability • messages queued in either FIFO or priority order. It is possible to use overwriting and urgent sends, broadcast a single message to all task waiting to receive on a mailbox queue, preview any message before reading it.
RT Computer Systems RTAI • Direct Inter-task Messages • Asynchronous: send, receive • Synchronous remote procedures calls (RPC) • rpc, receive, return.
RTAI Modules • To use RTAI, you have to load the modules that implement whatever RTAI capabilities you need. • Modules: • Rtai, Main module. • rtai_sched. scheduler module, which is in charge of distributing the CPU to different tasks • Task functions • Timing functions • Semaphore functions • Mailbox functions • Inter-task communication functions • rtai_fifos.
RTAI Modules • Modules • rtai_shm • Lxrt • rtai_pqueue • rtai_pthread • rtai_utils
RTAI Examples The program simply generates a sine signal and displays the instant values on the screen. -------------- RT_PROCESS.C ------------------- \#include <linux/module.h> \#include <asm/io.h> \#include <math.h> \#include <rtai.h> \#include <rtai_sched.h> \#include <rtai_fifos.h> \#define TICK_PERIOD 1000000 \#define TASK_PRIORITY 1 \#define STACK_SIZE 10000 \#define FIFO 0
RTAI Examples static RT_TASK rt_task; static void fun(int t) { int counter = 0; float sin_value; while (1) { sin_value = sin(2*M_PI*1*rt_get_cpu_time_ns()/1E9); rtf_put(FIFO, &counter, sizeof(counter)); rtf_put(FIFO, &sin_value, sizeof(sin_value)); counter++; rt_task_wait_period(); } }
RTAI Examples int init_module(void) { RTIME tick_period; rt_set_periodic_mode(); rt_task_init(&rt_task, fun, 1, STACK_SIZE, TASK_PRIORITY, 1, 0); rtf_create(FIFO, 8000); tick_period = start_rt_timer(nano2count(TICK_PERIOD)); rt_task_make_periodic(&rt_task, rt_get_time() + tick_period, tick_period); return 0; }
RTAI Examples void cleanup_module(void) { stop_rt_timer(); rtf_destroy(FIFO); rt_task_delete(&rt_task); return; }
RTAI Examples Scope: int main (void) { int fifo, counter; float sin_value; if ((fifo = open("/dev/rtf0", O_RDONLY)) < 0) { fprintf(stderr, "Error opening /dev/rtf0\n"); exit(1); } signal(SIGINT, endme); while (!end) { read(fifo, &counter, sizeof(counter)); read(fifo, &sin_value, sizeof(sin_value)); printf(" Counter : %d Seno : %f \n", counter, sin_value); } return 0; }