Introduction to Real Time Systems

Download Report

Transcript Introduction to Real Time Systems

Message Passing
Akos Ledeczi
EECE 354, Fall 2012
Vanderbilt University
Message Queues
•
•
•
Inter-task communication
Usually better practice than using global variables
Message queues are used to manage messages
–
–
•
•
•
Standalone queues
Each task has a built-in queue
Messages are passed by reference, that is, no copy is ever made!!! Must remain in scope!!!
Default is FIFO, but optionally LIFO can be used for important messaged to bypass waiting messages
in the queue
Multiple tasks can Pend() on a queue. Post() can optionally broadcast to all waiting tasks
Bilateral Rendezvous
• Using tasks queues in
this case
• Just like semaphores,
but can pass data as
well
Flow Control
•
•
•
Message producer may
produce faster than
consumer can consume
To prevent overflowing the
message queue, a
semaphore helps manage
the resource
Using a task semaphore and
a task queue in this case
Clients and servers
• Different tasks/ISRs (clients) report different error
conditions
• Single error handler (“server”) processes the reports
Example
•
•
•
•
Measure RPM using a hole in the disk
A free running counter is used to measure the time between
two hole detections
ISR shouldn’t be used to compute average, maximum, etc.
Task may be low priority in the system, so a message queue is
used to store measurements until they can be processed
Usage
OS_Q MyQ;
MyMsgData MyMsg;
OSQCreate(&MyQ,
“My Queue”,
10,
&err);
…
OSQPost(&MyQ,
(void *)&MyMsg,
/* max queue size */
/* actual data to send */
/* DANGER: using a global */
sizeof(MyMsg),
OS_OPT_POST_FIFO,
&err);
…
OSQPend(&MyQ,
1000,
/* timeout */
OS_OPT_PEND_BLOCKING,
&size,
&ts,
&err);
if (err == OS_ERR_TIMEOUT) {
…
API:
OSQCreate()
OSQPend()
OSQPost()
OSQFlush()
OSQPendAbort()
OSQDel()
Internals