rtt——线程间的通信(邮箱)
邮箱
邮箱是实时操作系统中的一种典型的线程间的通信方式
邮箱的通信方式除了可以一对一,也可以一对多通信,或者多对多通信
邮箱的工作机制
在RT-thread操作系统中,邮箱是开销较低、效率较高的一种线程间通信方式。
邮箱中的每一封邮件的容量固定为4字节(刚好容下一个32位系统的指针)
线程或中断服务程序把一封长度为4字节的邮件发送到指定邮箱中,而其他一个或多个线程可以从指定的邮箱中接收邮件后进行相关处理
当一个线程向邮箱发邮件的时候,如果邮箱没有满,则邮件内容会被复制到邮箱中。如果邮箱已经满了,那么发送线程可以设置等待时间并挂起线程,等待邮箱空出;也可以选择不等待,此时直接返回“RT_EFULL”;当邮箱中的邮件被取出,邮箱出现空余的时候,会唤醒等待的线程让线程继续发送邮件。
当一个线程从邮箱中获取邮件时候,如果邮箱中存在邮件,那么等待线程将复制邮箱中的4字节邮件内容到接收缓存中;如果邮箱为空,可选择是否等待,并挂起线程直到有新的邮件达到而唤醒;也可以设置等待时间,当到达等待时间,但邮箱还是为空,那么等待的线程将被唤醒并返回“-RT_ETIMEOUT”
邮箱的相关接口
RT-thread提供了邮箱相关的接口函数
创建邮箱
rt_mailbox_t rt_mb_create(const char *name, rt_size_t size, rt_uint8_t flag);
动态创建一个邮箱对象
创建邮箱的时候,先从对象管理器中分配一个邮箱对象,然后给邮箱动态分配一块内寸空间用来存放邮件,这块内容的大小为邮件大小(4字节)*邮箱容量;接着初始化接收数目和发送邮件在邮箱中的偏移量。
FLAG中有两个选项,RT_ICP_FLAG_FIFO为非实时调度方式,除非应用程序非常看重先来后到的顺序,否则推荐使用RT_ICP_FLAG_PRIO,即确保实时准确性
删除邮箱
使用rt_mb_create函数动态创建邮箱后,如果不再使用,可以使用rt_mb_delete删除;
rt_err_t rt_mb_delete(rt_mailbox_t mb);
删除邮件时候,如果有线程正在挂起在邮箱对象上,则内核先唤醒挂起在该邮箱上的所有线程,线程返回RT_ERROR,然后再释放邮箱使用的内存,最后删除邮箱的对象
初始化邮箱
初始化邮箱与创建邮箱相似,只是初始化邮箱用于静态邮箱对象的初始化,静态邮箱对象的内存是在系统编译时由编译器分配的
rt_err_t rt_mb_init(rt_mailbox_t mb,
const char *name,
void *msgpool,
rt_size_t size,
rt_uint8_t flag);
这里的邮箱容量应该为缓存区大小/4
脱离线程
脱离函数将吧静态初始化的邮箱对象从内核对象管理器中脱离
rt_err_t rt_mb_detach(rt_mailbox_t mb);
发送邮件
线程或者中断服务程序可以通过邮箱给其他线程发送邮件
rt_err_t rt_mb_send(rt_mailbox_t mb, rt_ubase_t value);
邮件可以是32位的任意格式的数据,一个整型值或者一个指向缓存区的指针
当邮箱中邮件已经满时,返回值为"RT_EFULL"
阻塞式发送邮箱
如果希望以等待方式发送邮件,那么也可以通过如下的接口函数向指定的邮箱发送邮件
rt_err_t rt_mb_send_wait(rt_mailbox_t mb,
rt_ubase_t value,
rt_int32_t timeout);
接收邮件
只有当邮箱中有邮件时,接收者才能立即取到邮件并返回RT_EOK的返回值,否则接收线程会根据超时时间设置,或挂起在邮箱的等待线程队列上,或直接返回
rt_err_t rt_mb_recv(rt_mailbox_t mb, rt_ubase_t *value, rt_int32_t timeout);
接收邮箱时,接收者需要指定并指定存放位置和等待的超时时间
相关文章
rtt——线程间通信(互斥量)
互斥量的概念 在 RT-Thread 中,互斥量(Mutex,互斥锁)用于确保共享资源在任意时刻只被一个线程访问 - **确保共享资源的互斥访问**:互斥量用于保护对共享资源的访问,确保在任意时刻只有一个线程可以访问该资源;避免多个线程同时修改共享资源而导致的数据不一致或竞态条件 - 实现临界区保护:互斥量通常用于实现临界区保护,将对共享资源的访问限制在临界区内。**只有获取了互斥量的线程...
rtt——线程间通信(消息队列)
**消息队列是一种线程间的通信方式,是邮箱的扩展** 消息队列的工作机制 消息队列能够接收来自线程或中断服务例程中**不固定长度的消息**,**并把消息缓存在自己的内存空间中**。其他线程也能够从消息队列中读取相应的消息,而当消息队列为空时,可挂起读取线程。当有新的消息到达时,挂起的线程将被唤醒为接收并处理消息 **消息队列是一种异步的通信方式** 通常将先进入消息队列的消息先传给线程...
rtt——时钟管理
嘀嗒时钟 时钟tick的频率一般由RT\_TICK\_PER\_SECOND宏定义决定,系统默认设置RT\_TICK\_PER\_SECOND为1000,注意RT\_TICK\_PER\_SECOND不能大于1000,防止嘀嗒硬件溢出,无返回值 定时器 我们首先要区分操作系统定时器和芯片上的硬件定时器: - 硬件定时器:是芯片本身提供的定时功能,一般由外部晶振提供芯片输入时钟,当到达...