rt_thread消息队列应用示例

消息队列的使用

消息队列可以应用于发送不定长消息的场合,包括线程与线程间的消息交换,以及中断服务例程中给线程发送消息(中断服务例程不能接收消息)。

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);
    }
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值