Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
2012 / uCOS / uCOSII_ebook.pdf
Скачиваний:
70
Добавлен:
10.02.2015
Размер:
1.08 Mб
Скачать

OSQFlush()

INT8U *OSQFlush(OS_EVENT *pevent);

File

Called from

Code enabled by

OS_Q.C

Task or ISR

OS_Q_EN

OSQFlush() is used to empty the contents of the message queue and basically eliminate all the messages sent to the queue. This function takes the same amount of time to execute whether tasks are waiting on the queue (and thus no messages are present) or the queue contains one or more messages.

Arguments

pevent is a pointer to the message queue. This pointer is returned to your application when the message queue is created (see OSQCreate()).

Returned Value

One of the following codes:

1)OS_NO_ERR, the message queue was flushed.

2)OS_ERR_EVENT_TYPE, if you attempted to flush an object other than a message queue.

Notes/Warnings

Queues must be created before they are used.

Example

OS_EVENT *CommQ;

 

 

void main(void)

 

 

{

 

 

INT8U err;

 

 

OSInit();

/* Initialize µC/OS-II

*/

.

 

 

.

 

 

err = OSQFlush(CommQ);

 

 

.

 

 

.

 

 

OSStart();

/* Start Multitasking

*/

}

 

 

OSQPend()

void *OSQPend(OS_EVENT *pevent, INT16U timeout, INT8U *err);

File

Called from

Code enabled by

OS_Q.C

Task only

OS_Q_EN

OSQPend() is used when a task desires to receive messages from a queue. The messages are sent to the task either

by an ISR or by another task. The messages received are pointer size variables and their use is application specific. If a at least one message is present at the queue when OSQPend() is called, the message is retrieved and returned to the caller. If no message is present at the queue, OSQPend() will suspend the current task until either a message

is received or a user specified timeout expires. If a message is sent to the queue and multiple tasks are waiting for such

a message then, µC/OS-II will resume the highest priority task that is waiting. A pended task that has been suspended with OSTaskSuspend() can receive a message. The task will, however, remain suspended until the task is

resumed by calling OSTaskResume().

Arguments

pevent is a pointer to the queue where the messages are to be received from. This pointer is returned to your application when the queue is created (see OSQCreate()).

timeout is used to allow the task to resume execution if a message is not received from the mailbox within the specified number of clock ticks. A timeout value of 0 indicates that the task desires to wait forever for the message. The maximum timeout is 65535 clock ticks. The timeout value is not synchronized with the clock tick. The timeout count starts being decremented on the next clock tick which could potentially occur immediately.

err is a pointer to a variable which will be used to hold an error code. OSQPend() sets *err to either:

1)OS_NO_ERR, a message was received

2)OS_TIMEOUT, a message was not received within the specified timeout

3)OS_ERR_PEND_ISR, you called this function from an ISR and µC/OS-II would have to suspend the ISR. In general, you should not call OSQPend(). µC/OS-II checks for this situation in case you do anyway.

Returned Value

OSQPend() returns a message sent by either a task or an ISR and *err is set to OS_NO_ERR. If a timeout occurred,

OSQPend() returns a NULL pointer and sets *err to OS_TIMEOUT.

Notes/Warnings

Queues must be created before they are used.

Example

OS_EVENT *CommQ;

void CommTask(void *data)

{

INT8U err; void *msg;

pdata = pdata;

for (;;) {

.

 

 

.

 

 

msg = OSQPend(CommQ, 100, &err);

 

if (err == OS_NO_ERR) {

 

.

 

 

.

/* Message received within 100 ticks!

*/

.

 

 

} else {

 

 

.

 

 

.

/* Message not received, must have timed out

*/

.

 

 

}

 

 

.

 

 

.

 

 

}

 

 

}

 

 

OSQPost()

INT8U OSQPost(OS_EVENT *pevent, void *msg);

File

Called from

Code enabled by

OS_Q.C

Task or ISR

OS_Q_EN

OSQPost() is used to send a message to a task through a queue. A message is a pointer size variable and its use is application specific. If the message queue is full an error code is returned to the caller. OSQPost() will then

immediately return to its caller and the message will not be placed in the queue. If any task is waiting for a message at the queue then, the highest priority task will receive the message. If the task waiting for the message has a higher priority than the task sending the message then, the higher priority task will be resumed and the task sending the message will be suspended. In other words, a context switch will occur. Message queues are first-in-first-out (FIFO) which means that the first message sent will be the first message received.

Arguments

peventis a pointer to the queue where the message is to be deposited into. This pointer is returned to your application when the queue is created (see OSQCreate()).

msg is the actual message sent to the task. msg is a pointer size variable and is application specific. You MUST never post a NULL pointer.

Returned Value

OSQPost() returns one of these two error codes

1)OS_NO_ERR, if the message was deposited in the queue

2)OS_Q_FULL, if the queue is already full

Notes/Warnings

Queues must be created before they are used.

Example

OS_EVENT *CommQ;

 

INT8U

CommRxBuf[100];

 

void CommTaskRx(void *pdata)

 

{

 

 

INT8U

err;

 

pdata = pdata;

 

for (;;) {

 

.

 

 

.

 

 

err = OSQPost(CommQ, (void *)&CommRxBuf[0]);

 

if (err == OS_NO_ERR) {

 

.

/* Message was deposited into queue

*/

.

 

 

} else {

 

.

/* Queue is full

*/

.

 

 

}

.

.

}

}

OSQPostFront()

INT8U OSQPostFront(OS_EVENT *pevent, void *msg);

File

Called from

Code enabled by

OS_Q.C

Task or ISR

OS_Q_EN

OSQPostFront() is used to send a message to a task through a queue. OSQPostFront() behaves very much like OSQPost() except that the message is inserted at the front of the queue. This means that OSQPostFront() makes the message queue behave like a last-in-first-out (LIFO) queue instead of a

first-in-first-out (FIFO) queue. A message is a pointer size variable and its use is application specific. If the message queue is full an error code is returned to the caller. OSQPostFront() will then immediately return to its caller

and the message will not be placed in the queue. If any task is waiting for a message at the queue then, the highest priority task will receive the message. If the task waiting for the message has a higher priority than the task sending the message then, the higher priority task will be resumed and the task sending the message will be suspended. In other words, a context switch will occur.

Arguments

Соседние файлы в папке uCOS