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

文章目录

  • 前言
  • 一、邮箱的特性
  • 二、邮箱操作函数
  • 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的功能,提升嵌入式系统的开发效率和性能。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

阶跃信号与冲击信号

奇异信号&#xff1a;信号与系统分析中&#xff0c;经常遇到函数本身有不连续点&#xff08;跳变电&#xff09;或其导函数与积分有不连续点的情况&#xff0c;这类函数称为奇异函数或奇异信号&#xff0c;也称之为突变信号。以下为一些常见奇异函数。 奇异信号 单位斜变信号 …

java-ssm-jsp-宠物护理预定系统

java-ssm-jsp-宠物护理预定系统 获取源码——》公主号&#xff1a;计算机专业毕设大全

xxl-job--01--简介

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 1.xxl-job1. 1 发展历史1.2 XXL-JOB的系统架构1.3 xxl-job与其他框架对比 2. XXL-JOB的使用2.1 准备工作- 配置调度中心XXL-JOB的数据表 2.2 配置执行器1 引入依赖包…

一个脚本两步计算材料Raman谱(附数据处理和绘图脚本)

在以往推送中已经介绍了相当多的计算材料Raman的方法&#xff0c;使用的软件主要为Phonopy-Spectroscopy&#xff0c;相关软件还有vasp&#xff0c;phonopy&#xff0c;phono3py等。 Phonopy-Spectroscopy计算材料红外和Raman光谱 Phonopy-Spectroscopy 计算红外和拉曼光谱 也…

Github配置SSH免密认证

以Ubuntu Server为例 生成SSH ssh-keygen -t ed25519 -C "your_emailexample.com" 如果系统不支持Ed25519算法&#xff0c;使用旧的命令&#xff1a; ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" 根据提示生成公私钥文件&#xff0c;记下位置…

深度学习_17_丢弃法调整过拟合

除了权重衰退法调整过拟合&#xff0c;还有丢弃法调整模型得过拟合现象 过拟合&#xff1a; 丢弃法如果直接丢弃会导致新期望的不确定性&#xff0c;为了防止这个不确定被模型学到&#xff0c;所以要保证丢弃后的期望和丢弃前的期望一样&#xff08;个人观点&#xff09; 顾…

微服务笔记

什么是微服务? 微服务是一种经过良好架构设计的分布式架构方案&#xff0c;微服务架构特征: 1.单一职责:微服务拆分粒度更小&#xff0c;每一个服务都对应唯一的业务能力&#xff0c;做到单一职责&#xff0c;避免重复业发。 2.面向服务:微服务对外暴露业务接口 3.自治:团…

基于Springboot的人事管理系统 (有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的人事管理系统 &#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&am…

数据结构与算法学习【算法思想之二分法基础】

文章目录 数据结构与算法学习【算法思想之二分查找基础】本文学习目标或巩固的知识点 最基础的二分查找&#x1f7e2;通过题目可知题解结果验证 数据结构与算法学习【算法思想之二分查找基础】 本文学习目标或巩固的知识点 学习二分法类题目 巩固基础的二分法 提前说明&#…

Matlab 机器人工具箱 Link类

文章目录 1 Link类1.1 机械臂Link类1.2 构造函数1.3 信息/显示方法1.4 转换方法1.5 操作方法1.6 测试方法1.7 重载操作1.8 属性(读/写)1.9 例子2 Link.Link2.1 创建机器人连杆对象2.2 OPTIONS2.3 注意2.4 旧语法2.5 例子3 Link的其他函数3.1 Link.A3.2 Link.char3.3 Link.displ…

ABAP - SALV教程10 添加可编辑checkbox列

几乎所有的功能报表都会有那么一个选择列&#xff0c;问了业务顾问&#xff0c;业务顾问说是用户不习惯使用报表原生的选择模式。效果图SALV的选择列是通过将列设置成checkbox_hotspot样式&#xff0c;注册单击事件完成勾选功能的。完成步骤 将SEL列设置成checkbox_hotspot样式…

递推算法(c++)

递推可以说是递归反过来的一种算法&#xff0c;递归是从后往前倒着算&#xff0c;递推是从前往后正着算。 统计每个月兔子的总数 题目描述 有一对兔子&#xff0c;从出生后第3个月起每个月都生一对兔子&#xff0c;一对小兔子长到第三个月后每个月又生一对兔子&#xff0c; …

网络编程(IP、端口、协议、UDP、TCP)【详解】

目录 1.什么是网络编程&#xff1f; 2.基本的通信架构 3.网络通信三要素 4.UDP通信-快速入门 5.UDP通信-多发多收 6.TCP通信-快速入门 7.TCP通信-多发多收 8.TCP通信-同时接收多个客户端 9.TCP通信-综合案例 1.什么是网络编程&#xff1f; 网络编程是可以让设…

Cloud整合Zookeeper代替Eureka

微服务间通信重构与服务治理笔记-CSDN博客 Zookeeper是一个分布式协调工具,可以实现注册中心功能 安装Zookeeper 随便 就用最新版本吧 进入Zookeeper 包目录 cd /usr/local/develop/ 解压 tar -zxvf apache-zookeeper-3.9.1-bin.tar.gz -C /usr/local/develop 进入配置文件…

electron nsis 安装包 window下任务栏无法正常固定与取消固定 Pin to taskbar

问题 win10系统下&#xff0c;程序任务栏在固定后取消固定&#xff0c;展示的程序内容异常。 排查 1.通过论坛查询&#xff0c;应该是与app的api setAppUserModelId 相关 https://github.com/electron/electron/issues/3303 2.electron-builder脚本 electron-builder…

VUE CLI3项目搭建 ESLint配置

VUE项目框架配置 一、工具准备 Node.js安装 安装方法&#xff1a;点击查看WebStorm安装 下载地址&#xff1a;点击查看 二、环境准备 镜像准备 1.查看代理&#xff1a;npm get registry 2.设置淘宝镜像 2.1临时使用. npm --registry https://registry.npm.taobao.org ins…

vue 使用vue-scroller 列表滑动到底部加载更多数据

安装插件 npm install vue-scroller -dmain.js import VueScroller from vue-scroller Vue.use(VueScroller)<template><div class"wrap"><div class"footer"><div class"btn" click"open true">新增</d…

LeetCode --- 三数之和

题目描述 三数之和 代码解析 暴力 在做这一道题的时候&#xff0c;脑海里先想出来的是暴力方法&#xff0c;一次排序&#xff0c;将这个数组变为有序的&#xff0c;再通过三次for循环来寻找满足条件的数字&#xff0c;然后将符合条件的数组与之前符合条件的数组进行一一对比…

Matlab 机器人工具箱 运动学

文章目录 R.fkine()R.ikine()R.ikine6s()R.jacob0、R.jacobn、R.jacob_dotjtrajctraj参考链接官网:Robotics Toolbox - Peter Corke R.fkine() 正运动学,根据关节坐标求末端执行器位姿 mdl_puma560; % 加载puma560模型 qz % 零角度 qr

Spring学习笔记(六)利用Spring的jdbc实现学生管理系统的用户登录功能

一、案例分析 本案例要求学生在控制台输入用户名密码&#xff0c;如果用户账号密码正确则显示用户所属班级&#xff0c;如果登录失败则显示登录失败。 &#xff08;1&#xff09;为了存储学生信息&#xff0c;需要创建一个数据库。 &#xff08;2&#xff09;为了程序连接数…