Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
RT-Thread一般讨论
【2024-RSOC】Day 3 RT_Thread IPC机制 学习笔记
发布于 2024-07-25 21:07:03 浏览:144
订阅该版
[tocm] # Day 3 今天主要学习的的是RT-Thread IPC机制 ![image-20240724204537935.png](https://oss-club.rt-thread.org/uploads/20240725/8cfcca25cb251e31f002c0736f5e0ee1.png.webp) ## 信号量 用于实现任务与任务之间、任务与中断处理程序之间的同步与互斥。 ### 分类 1. 互斥信号量 用于解决互斥问题。可能会引起优先级反转问题 2. 二值信号量 用于解决同步问题 3. 计数信号量 用于解决资源计数问题 #### 二值信号量 要用于线程与线程之间、线程与中断服务程序(ISR)之间的同步。 初始值为0,表示同步事件尚未产生; #### 计数信号量 允许多个线程同时访问同一种资源。 初始化为n(非负整数),n为该种共享资源的数目。 ### 创建信号量 ```c rt_sem_t rt_sem_create(const char *nAME, rt_uint32_t value; rt_uint8_t flag); ``` 当选择 RT_IPC_FLAG_FIFO(先进先出)方式时,先进入的线程将先获得等待的信号量; 当选择 RT_IPC_FLAG_PRIO(优先级等待)方式时,优先级高的等待线程将先获得等待的信号量。 ### 删除信号量 ```c rt_err_t rt_sem_delete(rt_sem_t sem); ``` 如果删除该信号量时,有线程正在等待该信号量,那么删除操作会先唤醒等待在该信号量上的线程(返回值是 - RT_ERROR),再释放信号量的内存资源。 ### 初始化信号量 ```c rt_err_t rt_sem_init(rt_sem_t sem, const char *name, rt_uint32_t value, rt_uint8_8 flag) ``` ### 脱离信号量 ```c rt_err_t rt_sem_detach(rt_sem_t sem); ``` 适用于静态初始化的信号量 先唤醒挂在该信号量等待的线程,然后将该脱离信号量。原来挂起在信号量上的等待线程将获得 _RT_ERROR 的返回值。 ### 获取信号量 ```c rt_err_t rt_sem_take(rt_sem_t sem,rt_int32_t time); ``` 当信号量值>零,线程将获得信号量,相应的信号量值-1。 如果信号量=零,说明当前信号量资源实例不可用。 (申请该信号量的线程将根据 time 参数的情况选择直接返回、或挂起等待一段时间、或永久等待,直到其他线程或中断释放该信号量。如果在参数 time 指定的时间内依然得不到信号量,线程将超时返回,返回值是 - RT_ETIMEOUT。) ### 无等待获取信号量 ```c rt_err_t rt_sem_trytake(rt_sem_t sem); /*rt_sem_take(sem,RT_WAITING_NO)*/ ``` ### 释放信号量 ```C rt_err_t rt_sem_release(rt_sem_t sem); ``` 当信号量的值=零时,释放信号量,唤醒等待信号量中的第一个线程;否则将把信号量+1。 --- ## 互斥量 ### 创建互斥量 ```C rt_mutex_t rt_mutex_create(const char*name,rt_uint8_t flag) ``` 无论用户选择 RT_IPC_FLAG_PRIO 还是RT_IPC_FLAG_FIFO,内核均按照 RT_IPC_FLAG_PRIO 处理。 ### 删除互斥量 ```c rt_err_t rt_mutex_delete(rt_mutex_t mutex); ``` 删除并释放互斥量占用的内存空间,返回值是 - RT_ERROR ### 初始化互斥量 ```c rt_err_t rt_mutex_init(rt_mutex_t mutex,const char* name,rt_uint8_t flag); ``` 一般放于读写数据段或未初始化数据段中 ### 脱离互斥量 ```c rt_err_t rt_mutex_detach(rt_mutex_t mutex); ``` ### 获取互斥量 ```c rt_err_t rt_mutex_take(rt_mutex_t mutex,rt_int32_t time); ``` 如互斥量已被当前线程线程控制,该互斥量的持有计数加+1,当前线程也不会挂起等待。 如互斥量已被其他线程占有,当前线程在该互斥量上挂起等待,到其他线程释放它或者等待时间超过指定的时间。 ### 无等待获取互斥量 ```c rt_err_t rt_mutex_trytake(rt_mutex_t mutex); ``` ### 释放取互斥量 ```c rt_err_t rt_mutex_release(rt_mutex_t mutex); ``` 每次释放该互斥量,它的持有计数-1 当该互斥量的持有计数=零,即持有线程已经释放所有的持有操作,变为可用 --- ## 事件集 事件集是一个32 bit 的数,每个事件用一个bit位代表; 触发方式有与触发、或触发 ### 创建事件 ```c rt_event_t rt_event_create(const char* name,rt_uint8_t flag); ``` ### 删除事件 ```c rt_event_t rt_event_delete(rt_event_t,event); ``` ### 初始化事件 ```c rt_event_t rt_event_init(rt_event_t event,const char* name,rt_uint8_t flag); ``` ### 脱离事件 ```c rt_event_t rt_event_detach(rt_event_t,event); ``` ### 发送事件 ```c rt_event_t rt_event_send(rt_event_t event,rt_uint8_t set); ``` ### 接收事件 ```c rt_event_t rt_event_recv(rt_event_t event, rt_uint8_t set, rt_uint8_t option, rt_uint8_t timeout, rt_uint8_t* recoved); ``` --- ## 消息邮箱 ### 创建邮箱 ```c rt_mailbox_t rt_mb_create(const char* name,rt_size_t rt_uint8_t flag); ``` ### 初始化 ```c rt_err_t rt_mb_init(rt_mailbox_t mb, const char *name, void* msgpool, rt_size_t size, rt_uint8_8 flag) ``` ### 发送邮件 ```c rt_err_t rt_mb_send(rt_mailbox_t mb,rt_uint8_8 value ); ``` ### 接收邮件 ```c rt_err_t rt_mb_recv(rt_mailbox_t mb,rt_uint8_t* value,rt_uint8_t* timeout ); ``` ## 消息队列 是一种常用的线程间通信方式,可以应用在多种场合,线程间的消息交换,使用串口接收不定长数据 消息队列提供异步处理机制可以起到缓冲消息的作用 ### 消息队列工作原理 先进先出原则(FIFO) ### 消息队列创建 内存的大小 = [消息大小 + 消息头(用于链表连接)的大小] * 消息队列最大个数 ```c rt_mq_t rt_mq_create(const char*name, rt_size_t msg_size, rt_size_t max_msgs, rt_uint8_t flag); ``` ### 发送消息 ```c rt_mq_t rt_mq_send(rt_mq_t mq, void *buffer, rt_size_t msg_size); ``` ### 接收消息 ```c rt_mq_t rt_mq_recv(rt_mq_t mq, void *buffer, rt_size_t msg_size, rt_int32_t timeout); ``` --- ## 应用 ### 信号量运行结果 ![image-20240725121923954.png](https://oss-club.rt-thread.org/uploads/20240725/c7b381fecf133390af081e070196ed40.png.webp) ### 互斥量运行结果 ![image-20240725121813929.png](https://oss-club.rt-thread.org/uploads/20240725/8e21d6a501fe349446968df16d18dc7e.png.webp) ### 事件集运行结果 ![image-20240725122103613.png](https://oss-club.rt-thread.org/uploads/20240725/70bbe92d5ce1315109b5c9d78fd2fadf.png.webp) ### 邮箱运行结果 ![image-20240725122141617.png](https://oss-club.rt-thread.org/uploads/20240725/635a3be3bbf1fe97351e4d3d99da3253.png.webp)
0
条评论
默认排序
按发布时间排序
登录
注册新账号
关于作者
POJT_4529
这家伙很懒,什么也没写!
文章
4
回答
0
被采纳
0
关注TA
发私信
相关文章
1
有关动态模块加载的一篇论文
2
最近的调程序总结
3
晕掉了,这么久都不见layer2的踪影啊
4
继续K9ii的历程
5
[GUI相关] FreeType 2
6
[GUI相关]嵌入式系统中文输入法的设计
7
20081101 RT-Thread开发者聚会总结
8
嵌入式系统基础
9
linux2.4.19在at91rm9200 上的寄存器设置
10
[转]基于嵌入式Linux的通用触摸屏校准程序
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
WIZnet_W5500
ota在线升级
UART
PWM
cubemx
freemodbus
flash
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
Debug
编译报错
msh
SFUD
keil_MDK
rt_mq_消息队列_msg_queue
at_device
ulog
C++_cpp
本月问答贡献
踩姑娘的小蘑菇
7
个答案
3
次被采纳
张世争
8
个答案
2
次被采纳
rv666
5
个答案
2
次被采纳
用户名由3_15位
11
个答案
1
次被采纳
KunYi
6
个答案
1
次被采纳
本月文章贡献
程序员阿伟
6
篇文章
2
次点赞
hhart
3
篇文章
4
次点赞
大龄码农
1
篇文章
2
次点赞
ThinkCode
1
篇文章
1
次点赞
Betrayer
1
篇文章
1
次点赞
回到
顶部
发布
问题
投诉
建议
回到
底部