IPC Message Queues
Last updated
Last updated
Assoc. Prof. Wiroon Sriborrirux, Founder of Advance Innovation Center (AIC) and Bangsaen Design House (BDH), Electrical Engineering Department, Faculty of Engineering, Burapha University
Message queue is another commonly used inter-thread communication method. It can receive messages of variable length from threads or interrupt service routines and cache the messages in its own memory space. Other threads can also read corresponding messages from the message queue, and when the message queue is empty, the reading thread can be suspended. When a new message arrives, the suspended thread will be awakened to receive and process the message.
The main operations of message queues include: creating or opening through the mq_open() function, calling mq_send() to send a message to the message queue, calling mq_receive() to get a message from the message queue, and calling mq_unlink() to delete the message queue when it is not in use.
The POSIX message queue is mainly used for inter-process communication. The POSIX message queue of the RT-Thread operating system is mainly a package based on the RT-Thread kernel message queue, and is mainly used for communication between threads in the system. The usage is similar to the RT-Thread kernel message queue.
Each message queue corresponds to a message queue control block. Before creating a message queue, you need to define a message queue control block. The message queue control block is defined in the mqueue.h header file.
This function creates a new message queue or opens an existing message queue according to the name of the message queue. The optional values of Oflag are 0, O_CREAT or O_CREAT|O_EXCL. If Oflag is set to O_CREAT, a new message queue will be created. If Oflag is set to O_CREAT|O_EXCL, NULL will be returned if the message queue already exists, and a new message queue will be created if it does not exist. If Oflag is set to 0, NULL will be returned if the message queue does not exist.
This function searches for a message queue based on the message queue name name. If found, the message queue is set to a detached state. If the hold count is 0, the message queue is deleted and the resources occupied by the message queue are released.
When a thread terminates, the shutdown operation is performed on the message queue it occupies. This shutdown operation is performed regardless of whether the thread terminates voluntarily or involuntarily, which is equivalent to reducing the hold count of the message queue by 1. If the hold count is 0 after reduction by 1 and the message queue is in a detached state, the mqdes message queue will be deleted and the resources it occupies will be released.
This function is used to send a message to the mqdes message queue and is the encapsulation of the rt_mq_send() function. This function adds the message pointed to by msg_ptr to the mqdes message queue. The length of the message sent, msg_len, must be less than or equal to the maximum message length set when the message queue is created.
If the message queue is full, that is, the number of messages in the message queue is equal to the maximum number of messages, the thread or interrupt program that sends the message will receive an error code (-RT_EFULL).
Currently RT-Thread does not support sending messages with a specified blocking time, but the function interface has been implemented, which is equivalent to calling mq_send().
This function removes the oldest message in the mqdes message queue from the message queue and puts the message into the memory pointed to by msg_ptr. If the message queue is empty, the thread calling the mq_receive() function will be blocked until a message is available in the message queue.
The difference between this function and the mq_receive() function is that if the message queue is empty, the thread will be blocked for the abs_timeout duration. After the timeout, the function directly returns - 1, and the thread will be awakened from the blocked state to the ready state.
This program will create three threads, thread 1 receives messages from the message queue, and thread 2 and thread 3 send messages to the message queue.