Professional Documents
Culture Documents
1
Functions
• OSQCreate()
• OSQDel()
• OSQFlush()
– Flushing a queue
• OSQPend()
• OSQAccept()
• OSQPost()
– Sending a message to a queue (FIFO)
• OSQPostFront()
– Sending a message to a queue (LIFO)
• OSQPostOpt()
– Sending a message to a queue (LIFO or FIFO)
• OSQQuery()
2
Tasks, ISR, and
a Message Queue
3
Data Structures for
a Message Queue
4
Queue Control Block (QCB)
5
Fields in the QCB
.OSQPtr: links free QCB
.OSQStart: point to the start of the queue
.OSQEnd: point to the location past the end of the
queue
.OSQIn: point to location where the next message will
be inserted.
.OSQOut: point to the next message to be extracted
from the queue
.OSQSize: Contains the size of the message storage
area.
.OSQEntries: contains the number of entries in the
queue 6
List of Free Queue Control Blocks (QCB)
7
A circular buffer
8
OSQCreate()
9
OSQCreate()
10
OSQDel()
• Case 1: OS_DEL_NO_PEND
– Return queue control block
– Return event control block
• Case 2: OS_DEL_ALWAYS
– Ready all waiting tasks
– Return queue control block
– Return event control block
– Schedule
11
OSQDel()
12
OSQDel()
13
OSQDel()
14
OSQPend()
15
OSQPend()
16
OSQPost()
• Case 1: at least one task pending on the queue
– Ready the highest priority task
• Case 2: otherwise
– The queue is full return (non-blocking)
– The queue is not full insert the message
17
OSQPost()
18
OSQPostFront()
• Case 1: at least one task pending on the queue
– Ready the highest priority task
• Case 2: otherwise
– The queue is full return (non-blocking)
– The queue is not full insert the message
19
OSQPostFront()
20
OSQPostOpt()
• pevent: is a pointer to the event control block associated
with the desired queue
• msg: is a pointer to the message to send
• opt
– OS_POST_OPT_NONE: identical to OSQPost()
– OS_POST_OPT_FRONT: identical to OSQPostFront()
– OS_POST_OPT_BROADCAST: identical to OSQPost() but will
broadcast 'msg' to ALL waiting tasks
– OS_POST_OPT_FRONT + OS_POST_OPT_BROADCAST: is
identical to OSQPostFront() except that will broadcast 'msg' to
ALL waiting tasks
21
OSQPostOpt()
22
OSQPostOpt()
23
OSQFlush()
• Reset the variables – .OSQIn, .OSQOut
and .OSQEntries
24
OSQFlush()
25