Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
2024-RSOC
【2024-RSOC】day03基于RTT的线程同步(互斥量,信息量)+实例演示
发布于 2024-07-24 21:47:39 浏览:620
订阅该版
[tocm] # IPC机制 ## 内核入门典型概念 ### 线程阻塞 一个线程如果先占用了临界区的资源,此时如果另一个线程想使用临界区资源,会产生线程阻塞 例子:杯子接水如果需要等待通知才能停止那么就是阻塞线程,如果有异步报警的话就是非阻塞线程 ### 挂起 就绪状态——>挂起状态(rt_thread_suspend) 运行状态 ——>挂起状态(rt_thread_delay...) 挂起状态就是将其暂时搁置,而后再来处理 ### 死锁 线程彼此需要资源又都无法释放,导致线程无法获取下一步执行所需的资源,就会导致死锁的产生 出现的时候意味着代码不合理,需要仔细排查代码的设计架构问题 ## 线程同步 ### 信号量 用于实现任务与任务之间,任务与中断处理程序之间的同步与互斥 一般分为3种: 1.互斥信号量:用于解决互斥问题,可能会引发优先级反转 2.二值信号量:用于解决同步问题 3.计数信号量:用于解决资源计数问题 例如信号灯会对不同的人传递不同的信息,使所有人同时做出不同的反应,这就是信号量的具体应用 在裸机中一般设置一些全局变量flag,代码依据flag的设置做出相应的动作,可以提高代码的空间性 二值信号量主要用于线程与线程之间,线程与中断服务(ISR)之间的同步 ——用于同步的二值信号量初始值为0 ——线程获取信号量 ——另一个任务达到同步点时值设置为1并且释放,表示同步事件已经发生 计数信号量用于控制系统中共享资源的个数,一般设置为n,允许多个线程使用同一种资源 #### 创建信号量 ```c rt_sem_t rt_sem_create(const char *name,rt_unit32_t value,rt_unit8_t flag); ``` 调用这个函数时。系统会先从对象管理器分配一个semaphore对象,然后初始化IPC和semaphore对象, 标志参数决定了当信号量不可用时,多个线程等待的排队方式,有先进先出和优先级等待两种方式 `rt_sem_init`多一个`rt_sem_t sem`这是在编译过程中多考虑一些变量 #### 获取信号量 ```c rt_err_t rt_sem_take(rt_sem_t sem,rt_int32_t time); ``` `sem`表示信号量值,大于0会获得信号量,根据time来选择直接返回或者挂起一段时间或者永久等待 #### 释放信号量 释放信号量可以唤起被挂在该信号量上的线程 释放时由线程获得信号量或者直接加1 ### 互斥量 互斥量又叫做相互排斥的信号量,是一种特殊的二值信号量,具有解锁或者加锁两种状态的变量,它支持: 1.互斥量所有权 2.递归访问 3.防止优先级翻转的特性 优先级反转 当低优先级先一步占用资源时,此时高优先级只能挂起等待低优先级执行完后才能开始执行,如之间还有次低优先级的且不占用该资源的线程的话,也会打断高优先级线程的执行,这种现象叫做优先级反转 互斥量是怎么解决优先级反转的? 互斥量的解决方案就是将低优先级的优先级先设置成与最高优先级的一致,预防次低级也使得高优先级阻塞,在执行完低级时再设置回原来的优先级 #### 互斥量创建 ```c rt_mutex_t rt_mutex_create(const char* name,rt_unit8_t flag); ``` 与信息量创建不同的是这里的flag标志位已经作废,其他流程均一致 #### 互斥量删除 ```c rt_err_t rt_mutex_delete(rt_mutex_t mutex); ``` 删除时等待此互斥量的线程都会被唤醒 #### 获取互斥量 ```c rt_err_t rt_mutex_trytake(rt_mutex_t mutex); ``` 如果已占领则计数加一,无人占领时高优先级的先占领,已被占领则只能等 #### 释放互斥量 完成后尽快释放,计数为0时则为可用 ### 事件集 ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20240724/801f06ef0de13308344c54d75fe8aacc.png.webp) #### 创建事件集 同理 父类为IPC #### 删除事件集 同理 会唤醒挂在这上面的所有线程 #### 初始化事件集 类似 #### 脱离事件集 类似 create一定对应delete保证动态api相对应 初始化init一定要拿detach来删除 #### 发送事件集 ```c rt_err_t rt_event_send(rt_event_t event,rt_unit32_t set); ``` set对应事件集中事件的标志位,可以同时发送一个或者多个事件 #### 接受事件集 ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20240724/9c11a226ff34ceadc0ce8ff71c0b86a5.png.webp) ### 线程邮箱 #### 消息邮箱介绍 ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20240724/cb82331e445d2687519a30e85d13761b.png.webp) #### 创建邮箱 ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20240724/bd3ada12790efff5f2edb3fb9d0cc96a.png.webp) #### 删除邮箱 ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20240724/e76a199a0374d82dfa8dd2cf41506ede.png.webp) #### 发送邮件 ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20240724/d7d76aea2471394741e8feed7cc119c9.png.webp) #### 接受邮件 ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20240724/5b5d0aaa90fc4b0b8ba99dadddd06a41.png.webp) ### 消息队列 是一种常用的线程件通信方式,使用串口接受不定长数据等,线程可将一个或多个信息放进消息队列中 同时消息队列提供异步处理机制可以起到缓冲消息的作用 ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20240724/8a2ad64d40f6ab1385f445ace6a74703.png.webp) ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20240724/70b844362b564ed95e29d4f8ee6d9541.png.webp) #### 创建消息队列 ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20240724/e3fc06c097c3a7db196f59032d2a03d8.png.webp) #### 发送消息 ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20240724/4a77985cea0d6bb9e0b3b1ec380a9875.png.webp) ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20240724/45f5ac4e173cbff15e21c9dd1cc051cf.png.webp) ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20240724/ea5c395057745bd6547803d02f8e0958.png.webp) #### 接受消息 ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20240724/1ce9d76feb6e64c1d6efde8929cb098c.png.webp) ## 成果展示 ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20240724/3dbc83ee9890ebfdca6939765a618e90.png.webp)
0
条评论
默认排序
按发布时间排序
登录
注册新账号
关于作者
鲁迪乌斯
这家伙很懒,什么也没写!
文章
5
回答
0
被采纳
0
关注TA
发私信
相关文章
推荐文章
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
UART
ota在线升级
PWM
cubemx
freemodbus
flash
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
Debug
编译报错
msh
SFUD
keil_MDK
rt_mq_消息队列_msg_queue
ulog
C++_cpp
at_device
本月问答贡献
踩姑娘的小蘑菇
7
个答案
3
次被采纳
a1012112796
13
个答案
2
次被采纳
张世争
9
个答案
2
次被采纳
rv666
5
个答案
2
次被采纳
用户名由3_15位
11
个答案
1
次被采纳
本月文章贡献
程序员阿伟
9
篇文章
2
次点赞
hhart
3
篇文章
4
次点赞
大龄码农
1
篇文章
5
次点赞
RTT_逍遥
1
篇文章
2
次点赞
ThinkCode
1
篇文章
1
次点赞
回到
顶部
发布
问题
投诉
建议
回到
底部