Message Passing Akos Ledeczi EECE 6354 Fall 2015

  • Slides: 8
Download presentation
Message Passing Akos Ledeczi EECE 6354, Fall 2015 Vanderbilt University

Message Passing Akos Ledeczi EECE 6354, Fall 2015 Vanderbilt University

Message Queues • • • Inter-task communication Usually better practice than using global variables

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

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

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

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

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 My. Q; My. Msg. Data My. Msg; OSQCreate(&My. Q, “My Queue”, 10,

Usage OS_Q My. Q; My. Msg. Data My. Msg; OSQCreate(&My. Q, “My Queue”, 10, &err); … OSQPost(&My. Q, (void *)&My. Msg, /* max queue size */ /* actual data to send */ /* DANGER: using a global */ sizeof(My. Msg), OS_OPT_POST_FIFO, &err); … OSQPend(&My. Q, 1000, /* timeout */ OS_OPT_PEND_BLOCKING, &size, &ts, &err); if (err == OS_ERR_TIMEOUT) { … API: OSQCreate() OSQPend() OSQPost() OSQFlush() OSQPend. Abort() OSQDel()

Internals

Internals