Control, send, receive, or wait for messages.
More...
Message Queue Management functions allow to control, send, receive, or wait for messages. A message can be an integer or pointer value that is send to a thread or interrupt service routine.
CMSIS-RTOS Message Queue
#define osFeature_MessageQ 1 |
A CMSIS-RTOS implementation may support message queues.
#define osMessageQ |
( |
|
name | ) |
&os_messageQ_def_##name |
Access to the message queue definition for the function osMessageCreate.
- Parameters
-
- Note
- CAN BE CHANGED: The parameter to osMessageQ shall be consistent but the macro body is implementation specific in every CMSIS-RTOS.
#define osMessageQDef |
( |
|
name, |
|
|
|
queue_sz, |
|
|
|
type |
|
) |
| |
Define the attributes of a message queue created by the function osMessageCreate using osMessageQ.
- Note
- The parameter thread registers the receiving thread for a message and is needed for the general osWait function to deliver the message.
- Parameters
-
name | name of the queue. |
queue_sz | maximum number of messages in the queue. |
type | data type of a single message element (for debugger). |
- Note
- CAN BE CHANGED: The parameter to osMessageQDef shall be consistent but the macro body is implementation specific in every CMSIS-RTOS.
- Parameters
-
- Returns
- message queue ID for reference by other functions or NULL in case of error.
- Note
- MUST REMAIN UNCHANGED: osMessageCreate shall be consistent in every CMSIS-RTOS.
Create and initialize a message queue.
Example
typedef struct {
float voltage;
float current;
int counter;
} T_MEAS;
void send_thread (void const *argument);
void recv_thread (void const *argument);
void send_thread (void const *argument) {
T_MEAS *mptr;
mptr->voltage = 223.72;
mptr->current = 17.54;
mptr->counter = 120786;
mptr->voltage = 227.23;
mptr->current = 12.41;
mptr->counter = 170823;
}
void recv_thread (void const *argument) {
T_MEAS *rptr;
for (;;) {
printf ("\nVoltage: %.2f V\n", rptr->voltage);
printf ("Current: %.2f A\n", rptr->current);
printf ("Number of cycles: %d\n", rptr->counter);
}
}
}
void StartApplication (void) {
:
}
- Parameters
-
[in] | queue_id | message queue ID obtained with osMessageCreate. |
[in] | millisec | timeout value or 0 in case of no time-out. |
- Returns
- event information that includes status code.
- Note
- MUST REMAIN UNCHANGED: osMessageGet shall be consistent in every CMSIS-RTOS.
Suspend the execution of the current RUNNING thread until a message arrives. When a message is already in the queue, the function returns instantly with the message information.
The argument millisec specifies how long the system waits for a message to become available. While the system waits the thread that is calling this function is put into the state WAITING. The millisec timeout value can have the following values:
- when millisec is 0, the function returns instantly.
- when millisec is set to osWaitForever the function will wait for an infinite time until a message arrives.
- all other values specify a time in millisecond for a timeout.
- Note
- The parameter millisec must be 0 for using this function in an ISR.
Status and Error Codes
- osOK: no message is available in the queue and no timeout was specified.
- osEventTimeout: no message has arrived during the given timeout period.
- osEventMessage: message received, value.p contains the pointer to message.
- osErrorParameter: a parameter is invalid or outside of a permitted range.
- Parameters
-
[in] | queue_id | message queue ID obtained with osMessageCreate. |
[in] | info | message information. |
[in] | millisec | timeout value or 0 in case of no time-out. |
- Returns
- status code that indicates the execution status of the function.
- Note
- MUST REMAIN UNCHANGED: osMessagePut shall be consistent in every CMSIS-RTOS.
Put the message info in a message queue specified by queue_id.
When the message queue is full, the system retries for a specified time with millisec. While the system retries the thread that is calling this function is put into the state WAITING. The millisec timeout can have the following values:
- when millisec is 0, the function returns instantly.
- when millisec is set to osWaitForever the function will wait for an infinite time until a message queue slot becomes available.
- all other values specify a time in millisecond for a timeout.
- Note
- The parameter millisec must be 0 for using this function in an ISR.
Status and Error Codes
- osOK: the message is put into the queue.
- osErrorResource: no memory in the queue was available.
- osErrorTimeoutResource: no memory in the queue was available during the given time limit.
- osErrorParameter: a parameter is invalid or outside of a permitted range.