【RT-Thread基础教程】邮箱的使用

news2024/9/24 11:28:53

文章目录

  • 前言
  • 一、邮箱的特性
  • 二、邮箱操作函数
  • 2.1 创建邮箱
      • 创建动态邮箱
      • 创建静态邮箱
    • 2.2 删除邮箱
    • 2.3 发邮件
      • 2.4 取邮件
  • 三、示例代码
  • 总结


前言

RT-Thread是一个开源的实时嵌入式操作系统,广泛应用于各种嵌入式系统和物联网设备。在RT-Thread中,邮箱是一种常用的线程间通信机制,用于实现不同线程之间的消息传递。本教程将介绍如何在RT-Thread中使用邮箱,以便开发者更好地利用这一功能。


一、邮箱的特性

邮箱的本质是环形缓冲区:

邮箱中的每一封邮件,只能容纳 4 字节内容(对于 32 位系统,指针大小刚好为 4 字节);

  • 邮件的发送通常是非阻塞的,线程、中断都可以发送邮件;也可使用阻塞方式发送;
    • 邮件的接收通常是阻塞的,取决于邮箱中是否有邮件;
    • 当一个线程向邮箱发送邮件时:
      • 如果邮箱没满,就把数值写入邮箱中
    • 如果邮箱满了:
      • 发送线程可以直接返回RT_EFULL
      • 也可以挂起一段时间,在挂起的期间,别的线程或中断服务程序读了邮箱,会唤醒挂起的线程。
  • 当一个线程从邮箱接收邮件时:
    • 如果邮箱不为空,就读取邮箱中的数值
    • 如果邮箱为空:
      • 接收线可以直接返回RT_ETIMOUT
      • 也可以挂起一段时间,在挂起的期间,别的线程或中断服务程序写了邮箱,会唤醒挂起的线程。

二、邮箱操作函数

邮箱由邮箱控制块管理,由结构体 rt_mailbox 表示。
使用邮箱的流程:创建/初始化邮箱、发送邮件、接收邮件、删除/脱离邮箱
在这里插入图片描述

2.1 创建邮箱

创建动态邮箱

我们可以使用下面这个函数创建动态邮箱:

rt_mailbox_t rt_mb_create (const char* name, rt_size_t size, rt_uint8_t flag);

参数说明:
name 邮箱名称
size 邮箱容量
flag 邮箱采用的等待方式: RT_IPC_FLAG_FIFO 或 RT_IPC_FLAG_PRIO
返回值 邮箱对象的句柄:成功,返回句柄,以后使用句柄来操作邮箱,RT_NULL:失败

创建静态邮箱

我们可以使用下面这个函数创建静态邮箱:

 rt_err_t rt_mb_init(rt_mailbox_t mb,
 const char* name,
 void* msgpool,
 rt_size_t size,
 rt_uint8_t flag);

参数说明:
mb 邮箱对象的句柄
name 邮箱的名字
msgpool 缓冲区指针
size 邮箱容量
flag 邮箱采用的等待方式: RT_IPC_FLAG_FIFO 或 RT_IPC_FLAG_PRIO
返回值 RT_EOK:成功

2.2 删除邮箱

我们可以使用下面这个函数删除rt_mb_create 函数创建的邮箱:

rt_err_t rt_mb_delete (rt_mailbox_t mb);

参数为邮箱的handle

我们可以使用下面这个函数删除rt_mb_init创建的邮箱:

rt_err_t rt_mb_detach(rt_mailbox_t mb);

参数为邮箱的handle

他们的返回值为RT_ERROR时,表示出错了

2.3 发邮件

  1. 我们可以使用下面这个函数来发送邮件:
rt_err_t rt_mb_send(rt_mailbox_t mb, rt_ubase_t value);

参数1为邮箱的handle
参数2为要发送的值

  1. 我们可以使用下面这个函数来发送邮件,并等待一定的tick:
rt_err_t rt_mb_send_wait(rt_mailbox_t mb,
                         rt_ubase_t   value,
                         rt_int32_t   timeout);

参数1为邮箱的handle
参数2为要发送的值
参数3为等待的tick

  1. 我们可以使用下面这个函数来发送紧急邮件:
rt_err_t rt_mb_urgent (rt_mailbox_t mb, rt_ubase_t value);

参数1为邮箱的handle
参数2为要发送的值

2.4 取邮件

我们可以使用下面这个函数来收邮件:

rt_err_t rt_mb_recv (rt_mailbox_t mb, rt_uint32_t* value, rt_int32_t timeout);

参数1为邮箱的handle
参数2为存储的地址
参数3为等待时间

三、示例代码

#include <rtthread.h>

// 定义一个邮箱句柄
static rt_mailbox_t mailbox;

// 定义一个线程1
static void thread1_entry(void *parameter)
{
    rt_uint32_t message = 123;

    // 发送消息到邮箱
    rt_mb_send(mailbox, &message, sizeof(message));

    // 等待一段时间,模拟其他操作
    rt_thread_delay(50);
}

// 定义一个线程2
static void thread2_entry(void *parameter)
{
    rt_uint32_t message;

    // 从邮箱接收消息
    rt_mb_recv(mailbox, &message, RT_WAITING_FOREVER);

    // 处理接收到的消息
    rt_kprintf("Received message: %d\n", message);
}

int mailbox_example(void)
{
    // 创建邮箱,设置邮箱大小为5,每个消息大小为4字节
    mailbox = rt_mb_create("mbox", 5, RT_IPC_FLAG_FIFO);
    if (mailbox == RT_NULL)
    {
        rt_kprintf("Failed to create mailbox!\n");
        return -1;
    }

    // 创建线程1
    rt_thread_t thread1 = rt_thread_create("t1", thread1_entry, RT_NULL, 512, 10, 10);
    if (thread1 != RT_NULL)
    {
        rt_thread_startup(thread1);
    }

    // 创建线程2
    rt_thread_t thread2 = rt_thread_create("t2", thread2_entry, RT_NULL, 512, 11, 10);
    if (thread2 != RT_NULL)
    {
        rt_thread_startup(thread2);
    }

    // 等待线程执行完成
    rt_thread_mdelay(100);

    // 删除邮箱
    rt_mb_delete(mailbox);

    return 0;
}

// 在RT-Thread的初始化中调用示例函数
INIT_APP_EXPORT(mailbox_example);

在这里插入图片描述


总结

通过本教程,我们深入了解了在RT-Thread中如何有效地使用邮箱进行线程间通信。邮箱作为一种轻量级的消息传递机制,为开发者提供了一种灵活而高效的方式来实现不同线程之间的数据传递。通过合理地利用邮箱,我们能够在嵌入式系统和物联网设备中构建更为可靠和响应的应用程序。希望本教程能够帮助开发者更好地利用RT-Thread的功能,提升嵌入式系统的开发效率和性能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1483565.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【leetcode】 剑指 Offer学习计划(java版本含注释)(下)

目录 前言第十六天&#xff08;排序&#xff09;剑指 Offer 45. 把数组排成最小的数&#xff08;中等&#xff09;剑指 Offer 61. 扑克牌中的顺子&#xff08;简单&#xff09; 第十七天&#xff08;排序&#xff09;剑指 Offer 40. 最小的k个数&#xff08;简单&#xff09; 第…

【yolov8部署实战】VS2019环境下使用Onnxruntime环境部署yolo项目|含源码

一、前言 部署yolo项目&#xff0c;是我这几个月以来做的事情&#xff0c;最近打算把这几个月试过的方法&#xff0c;踩过的坑&#xff0c;以博客的形式&#xff0c;分享一下。关于下面动态中讲到的如何用opencv部署&#xff0c;我在上一篇博客中已经详细讲到了&#xff1a;【…

Unity(第二十三部)导航

你可以使用 unity官方提供的 unity导航组件或第三方 unity导航组件&#xff0c;以实现游戏中角色或其他物体的导航。 unity导航组件通常具有多种导航模式&#xff0c;如飞行模式、步行模式、车辆模式等&#xff0c;可以根据不同的需求选择合适的模式。同时&#xff0c;unity导…

【JSON2WEB】06 JSON2WEB前端框架搭建

【JSON2WEB】01 WEB管理信息系统架构设计 【JSON2WEB】02 JSON2WEB初步UI设计 【JSON2WEB】03 go的模板包html/template的使用 【JSON2WEB】04 amis低代码前端框架介绍 【JSON2WEB】05 前端开发三件套 HTML CSS JavaScript 速成 前端技术路线太多了&#xff0c;知识点更多&…

【InternLM 实战营笔记】OpenCompass大模型评测

随着人工智能技术的快速发展&#xff0c; 大规模预训练自然语言模型成为了研究热点和关注焦点。OpenAI于2018年提出了第一代GPT模型&#xff0c;开辟了自然语言模型生成式预训练的路线。沿着这条路线&#xff0c;随后又陆续发布了GPT-2和GPT-3模型。与此同时&#xff0c;谷歌也…

leetcode 3.1

leetcode hot 100 双指针1.三数之和2.接雨水 多维动态规划1.最长公共子序列 双指针 1.三数之和 三数之和 排序 双指针的方法&#xff0c;固定一个数nums[i], 用两数和找target - nums[i] 的数需要注意两点: 1.需要去掉重复数字 while (l < r && nums[l] nums[…

2024年领取腾讯云优惠券的方法有哪些?程序员爆肝整理

腾讯云代金券领取渠道有哪些&#xff1f;腾讯云官网可以领取、官方媒体账号可以领取代金券、完成任务可以领取代金券&#xff0c;大家也可以在腾讯云百科蹲守代金券&#xff0c;因为腾讯云代金券领取渠道比较分散&#xff0c;腾讯云百科txybk.com专注汇总优惠代金券领取页面&am…

如何自动化获取谷歌学术上学者的全部论文信息

如何自动化获取谷歌学术上学者的全部论文信息 在学术研究领域&#xff0c;追踪和分析学者的研究工作是非常重要的。本文介绍了如何使用Python自动化地收集指定学者的谷歌学术主页上的所有论文信息。 示例&#xff1a;施一公院士的谷歌学术主页 以施一公院士的谷歌学术主页为…

redis7.2.2|Dict

文章目录 StructredisDBdictdictTypedictEntry 宏定义散列函数散列冲突dictEntry pointer bit tricks[指针位技巧]API implementation_dictReset_dictInitdictCreatedictGetHashdictSetKeydictSetValdictSetNextdictGetNextdictGetValdictGetKey_dictCleardictEmptydictRelease…

Linux进程——信号详解(上)

文章目录 信号入门生活角度的信号技术应用角度的信号用kill -l命令可以察看系统定义的信号列表信号处理常见方式概述 产生信号通过键盘进行信号的产生&#xff0c;ctrlc向前台发送2号信号通过系统调用异常软件条件 信号入门 生活角度的信号 你在网上买了很多件商品&#xff0…

洗地机推荐购买要点全攻略:洗地机哪些品牌好用?热门洗地机详细体验点评

清洁家务可谓是家务清洁中最累人的存在&#xff0c;既浪费时间也浪费精力&#xff0c;还费腰。如果是家有萌宠的铲屎官们就更加辛苦了&#xff0c;不仅清洁时会被萌宠们打扰&#xff0c;还要处理漫天飞舞和沾在地面上的毛发。那么有没有一款智能家电可以帮助我们快速高效的完成…

百度SEO快排原理是什么?如何快速排名方法?

前言&#xff1a;我之前说过我不打算写这个快速排序。 首先&#xff0c;我从来没有在自己的网站上操作过所谓的快速排序。 其次&#xff0c;我不能像网上很多人写的那样透露百度快速排序的秘密&#xff08;说实话&#xff0c;你可以透露秘密&#xff09;。 方法是有了&#xff…

MWC 2024丨美格智能CEO杜国彬出席中国联通创新成果发布会并发表主题演讲

2月26日&#xff0c;中国联通在MWC2024 巴塞罗那期间举办了以“算网为基&#xff0c;智领未来”为主题的创新成果发布会&#xff0c;集中展示最新的创新成果与最佳实践。 中国通信标准化协会理事长闻库、GSMA首席财务官Louise Easterbrook、中国联通副总经理梁宝俊、华为ICT销…

xsslabs第五关

看一下源码 <!DOCTYPE html><!--STATUS OK--><html> <head> <meta http-equiv"content-type" content"text/html;charsetutf-8"> <script> window.alert function() { confirm("完成的不错&#xff01…

代码随想录第45天|● 70. 爬楼梯 (进阶) ● 322. 零钱兑换 ● 279.完全平方数

文章目录 ● 70. 爬楼梯 &#xff08;进阶&#xff09;思路&#xff1a;- 排列 先value后weight代码&#xff1a; ● 322. 零钱兑换思路&#xff1a;代码 ● 279.完全平方数思路&#xff1a;代码 ● 70. 爬楼梯 &#xff08;进阶&#xff09; 思路&#xff1a;- 排列 先value后…

Godot自定义控件样式语法解析

前言 本篇原始文章写于2023年8月7日&#xff0c;存储在我的语雀文档中。但是语雀分享有诸多不便&#xff0c;为了让更多Godoter更轻松的搜到和看到&#xff0c;就转过来了。 这个项目我上传了Github&#xff0c;后续会贴上链接。 概述 Godot控件体系存在的问题之一就是样式无…

C++ 快速排序快速选择

目录 1、75. 颜色分类 2、912. 排序数组 3、 215. 数组中的第K个最大元素 4、LCR 159. 库存管理 III 1、75. 颜色分类 思路&#xff1a;利用快速排序思路&#xff0c;使用三指针分块进行优化。 [0,left]——小于key[left1,right-1]——等于key[right,nums.size()]——大于k…

解决Mybatis报Type interface *.*Mapper is not known to the MapperRegis

解决Mybatis报Type interface *.*Mapper is not known to the MapperRegis 问题发现问题解决方法一&#xff1a;检查Mapper文件的namespace路径是否正确方法二&#xff1a;使用其他方法是否正确 问题发现 在学习MyBatis框架的时候&#xff0c;不使用 XML 构建 SqlSessionFacto…

2023年NOC大赛软件创意编程(学而思)赛道图形化小高组初赛试题,包含答案

2023NOC初赛试题-小高-A卷(平行讲义) 一、判断 1、如果想要编程演奏乐曲需要添加下面的拓展模块 2、运行下面的程序,我们看不到角色位置在舞台上发生变化 3、运行下面的程序,我们会在舞台上看到一个正方形。 4、运行下面的程序,结果一定为true。 5、运行下面的程序,…

顶易海关数据怎么做获客?功能详解看这里!

顶易海关数据怎么做获客呢&#xff1f;详解看这里&#xff01; 海关数据系统登录&#xff1a;hg.smtso.com/?iEF6DCB 如果对开发国外优质客户感兴趣的话&#xff0c;关注Felicia外贸说&#xff0c;一键开发客户不是问题。 海关数据主要功能&#xff1a; 报关单详情查询&#…