消息队列的使用
消息队列可以应用于发送不定长消息的场合,包括线程与线程间的消息交换,以及中断服务例程中给线程发送消息(中断服务例程不能接收消息)。
static char msg_pool[1024];
/* 消息队列控制块 */
static struct rt_messagequeue rx_mq;
static struct rt_thread gui_thread;
static rt_uint8_t gui_stack[2048];
/* 接收消息结构 */
typedef struct
{
uint8_t msg_id;
int value1;
char value2[20];
} msg_update_ui;
void yt_gui_main(void *parameter)
{
while (1)
{
rt_thread_delay(10);
msg_update_ui msg;
/* 从消息队列中读取消息 */
rt_err_t result = rt_mq_recv(&rx_mq, &msg, sizeof(msg), RT_WAITING_NO);
if (result == RT_EOK)
{
/* 打印数据 */
rt_kprintf("msg.msg_id=%d msg.value1=%d,msg.value2=%s\n", msg.msg_id, msg.value1, msg.value2);
}
}
}
//这个函数用于其他线程发送数据时调用
void send_mq()
{
msg_update_ui ui_msg;//定义局部变量
ui_msg.msg_id = 11;
ui_msg.value1 = 22;
strcpy(ui_msg.value2, "33");//赋值
rt_err_t result = rt_mq_send(&rx_mq, &ui_msg, sizeof(ui_msg));//拷贝到消息队列中
if (result == -RT_EFULL)
{
/* 消息队列满 */
rt_kprintf("message queue full !\n");
}
}
int main(){
/* 初始化消息队列 */
rt_mq_init(&rx_mq, "rx_mq",
msg_pool, /* 存放消息的缓冲区 */
sizeof(msg_update_ui), /* 一条消息的最大长度 */
sizeof(msg_pool), /* 存放消息的缓冲区大小 */
RT_IPC_FLAG_FIFO); /* 如果有多个线程等待,按照先来先得到的方法分配消息 */
rt_err_t res = rt_thread_init(&gui_thread, "gui_thread", yt_gui_main, RT_NULL, (rt_uint8_t *)&gui_stack[0], sizeof(gui_stack), 25, 5);
if (res == RT_EOK)
{
rt_thread_startup(&gui_thread);
}
}