Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
2024-RSOC
RT-Thread IPC机制
发布于 2024-07-26 17:35:21 浏览:206
订阅该版
[tocm] # RT-Thread IPC机制 ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20240726/2d294bac90d5b3f656c743c565130b48.png.webp) ## 信号量 用于实现任务与任务之间、任务与中断处理程序之间的同步与互斥。 ## 分类 互斥信号量 用于解决互斥问题。可能会引起优先级反转问题 二值信号量 用于解决同步问题 计数信号量 用于解决资源计数问题 ## 二值信号量 要用于线程与线程之间、线程与中断服务程序(ISR)之间的同步。 初始值为0,表示同步事件尚未产生; ## 计数信号量 允许多个线程同时访问同一种资源。 初始化为n(非负整数),n为该种共享资源的数目。 ## 创建信号量 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(优先级等待)方式时,优先级高的等待线程将先获得等待的信号量。 删除信号量 rt_err_t rt_sem_delete(rt_sem_t sem); 如果删除该信号量时,有线程正在等待该信号量,那么删除操作会先唤醒等待在该信号量上的线程(返回值是 - RT_ERROR),再释放信号量的内存资源。 初始化信号量 rt_err_t rt_sem_init(rt_sem_t sem, const char *name, rt_uint32_t value, rt_uint8_8 flag) 脱离信号量 rt_err_t rt_sem_detach(rt_sem_t sem); 适用于静态初始化的信号量 先唤醒挂在该信号量等待的线程,然后将该脱离信号量。原来挂起在信号量上的等待线程将获得 _RT_ERROR 的返回值。 获取信号量 rt_err_t rt_sem_take(rt_sem_t sem,rt_int32_t time); 当信号量值>零,线程将获得信号量,相应的信号量值-1。 如果信号量=零,说明当前信号量资源实例不可用。 (申请该信号量的线程将根据 time 参数的情况选择直接返回、或挂起等待一段时间、或永久等待,直到其他线程或中断释放该信号量。如果在参数 time 指定的时间内依然得不到信号量,线程将超时返回,返回值是 - RT_ETIMEOUT。) 无等待获取信号量 rt_err_t rt_sem_trytake(rt_sem_t sem); /*rt_sem_take(sem,RT_WAITING_NO)*/ 释放信号量 rt_err_t rt_sem_release(rt_sem_t sem); 当信号量的值=零时,释放信号量,唤醒等待信号量中的第一个线程;否则将把信号量+1。 ## 互斥量 创建互斥量 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 处理。 删除互斥量 rt_err_t rt_mutex_delete(rt_mutex_t mutex); 删除并释放互斥量占用的内存空间,返回值是 - RT_ERROR 初始化互斥量 rt_err_t rt_mutex_init(rt_mutex_t mutex,const char* name,rt_uint8_t flag); 一般放于读写数据段或未初始化数据段中 脱离互斥量 rt_err_t rt_mutex_detach(rt_mutex_t mutex); 获取互斥量 rt_err_t rt_mutex_take(rt_mutex_t mutex,rt_int32_t time); 如互斥量已被当前线程线程控制,该互斥量的持有计数加+1,当前线程也不会挂起等待。 如互斥量已被其他线程占有,当前线程在该互斥量上挂起等待,到其他线程释放它或者等待时间超过指定的时间。 无等待获取互斥量 rt_err_t rt_mutex_trytake(rt_mutex_t mutex); 释放取互斥量 rt_err_t rt_mutex_release(rt_mutex_t mutex); 每次释放该互斥量,它的持有计数-1 当该互斥量的持有计数=零,即持有线程已经释放所有的持有操作,变为可用 ## 事件集 事件集是一个32 bit 的数,每个事件用一个bit位代表; 触发方式有与触发、或触发 创建事件 rt_event_t rt_event_create(const char* name,rt_uint8_t flag); 删除事件 rt_event_t rt_event_delete(rt_event_t,event); 初始化事件 rt_event_t rt_event_init(rt_event_t event,const char* name,rt_uint8_t flag); 脱离事件 rt_event_t rt_event_detach(rt_event_t,event); 发送事件 rt_event_t rt_event_send(rt_event_t event,rt_uint8_t set); 接收事件 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); ## 消息邮箱 创建邮箱 rt_mailbox_t rt_mb_create(const char* name,rt_size_t rt_uint8_t flag); 初始化 rt_err_t rt_mb_init(rt_mailbox_t mb, const char *name, void* msgpool, rt_size_t size, rt_uint8_8 flag) 发送邮件 rt_err_t rt_mb_send(rt_mailbox_t mb,rt_uint8_8 value ); 接收邮件 rt_err_t rt_mb_recv(rt_mailbox_t mb,rt_uint8_t* value,rt_uint8_t* timeout ); ## 消息队列 是一种常用的线程间通信方式,可以应用在多种场合,线程间的消息交换,使用串口接收不定长数据 消息队列提供异步处理机制可以起到缓冲消息的作用 消息队列工作原理 先进先出原则(FIFO) ## 消息队列创建 内存的大小 = [消息大小 + 消息头(用于链表连接)的大小] * 消息队列最大个数 rt_mq_t rt_mq_create(const char*name, rt_size_t msg_size, rt_size_t max_msgs, rt_uint8_t flag); 发送消息 rt_mq_t rt_mq_send(rt_mq_t mq,void *buffer,rt_size_t msg_size); 接收消息 rt_mq_t rt_mq_recv(rt_mq_t mq, void *buffer,rt_size_t msg_size, rt_int32_t timeout);
0
条评论
默认排序
按发布时间排序
登录
注册新账号
关于作者
Gokotta
这家伙很懒,什么也没写!
文章
4
回答
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
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
次点赞
回到
顶部
发布
问题
投诉
建议
回到
底部