Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
Ctrl
IPC
调用rt_sem_take前是否要先发送RT_IPC_CMD_RESE...
发布于 2020-01-09 11:57:47 浏览:2146
订阅该版
我看rtt内部的代码`rt_sem_take(&rx_sem, RT_WAITING_FOREVER);`调用之前经常会先调用`rt_sem_control(&rx_sem, RT_IPC_CMD_RESET, RT_NULL);` 来对该信号量进行复位,但是我在使用的时候有个案例是获取信号量不是永久阻塞,比如调用`rt_sem_take(&rx_sem, 5);`等待5个时间片, 然后我发现这样调用前如果再调用一遍`rt_sem_control(&rx_sem, RT_IPC_CMD_RESET, RT_NULL);`就有可能导致永远接收不到信号量而卡死。 我去掉`rt_sem_control(&rx_sem, RT_IPC_CMD_RESET, RT_NULL);`的调用,又正常了,希望RTT的人能做个解答
查看更多
7
个回答
默认排序
按发布时间排序
CGENG
2023-09-11
这家伙很懒,什么也没写!
我个人理解这个相当于一个release,但是这个release不会让信号量增加。可以让等待该信号量的线程都运行一次。 我现在碰到需要用这个场景: 拿来当一个一对多的二值信号量使用,生产者release信号量,然后消费者take这个信号量之后,获取资源,再调用reset,reset会让其他的消费者任务进入就绪状态,且这个信号量会保持为0,这样每个消费者任务只会运行一次 不定长串口这个地方我理解是为了让每个等待串口数据的线程都能获得一次运行,但是因为第一个等待串口数据的线程会把数据读走,后面的消费者只是空跑一次。 总结一下就是可以用在一个生产者对多个消费者的场景,生产者负责release信号量(让信号量从0变成1) 消费者负责take信号量,但是因为有多个消费者,如果第一个消费者take之后release会让这个信号量变得混乱(因为消费者release信号量会导致信号量变成1,但是后面就无法区分这个信号量是生产者release的还是消费者release的,这样就会重复造成死循环);而用CMD_RESET可以让等待该信号量的所有消费者都获得运行,且运行后该信号量还是保持为0。这样就保证了**只有生产者可以让信号量变1**,确保每次消费者运行都是由于生产者释放信号
MIOW_9186
2020-01-15
这家伙很懒,什么也没写!
咋还没人回,顶下
bernard
2020-01-15
这家伙很懒,什么也没写!
RT_IPC_CMD_RESET,没这个说法吧。如果都是这么用,那没法用了。除非这个是有什么特殊目的 需要的话,也可以贴相关的代码出来,哪里是这么用的
MIOW_9186
2020-01-15
这家伙很懒,什么也没写!
>RT_IPC_CMD_RESET,没这个说法吧。如果都是这么用,那没法用了。除非这个是有什么特殊目的 > >需要的话,也可 ... ```c while (rt_device_read(serial, 0, &ch, 1) == 0) { rt_sem_control(&rx_sem, RT_IPC_CMD_RESET, RT_NULL); rt_sem_take(&rx_sem, RT_WAITING_FOREVER); } ``` 来自你们的编程手册,12.3节,串口接收不定长数据的demo代码里
Jokeoo
2020-11-12
这家伙很懒,什么也没写!
另外在ulog.c中也有类似的用法 ``` void ulog_async_waiting_log(rt_int32_t time) { rt_sem_control(&ulog.async_notice, RT_IPC_CMD_RESET, RT_NULL); rt_sem_take(&ulog.async_notice, time); } ```
chenls
2021-11-04
这家伙很懒,什么也没写!
我也有同样的问题啊,不知道楼主有没有搞明白。顶一波!
水中天
2021-12-16
这家伙很懒,什么也没写!
帮顶,我也是看到手册关于串口不定长接收数据的地方有这个用法,没有特别搞懂,看到楼主的问题更加疑惑了。希望有了解的人能够解答
撰写答案
登录
注册新账号
关注者
1
被浏览
2.1k
关于作者
MIOW_9186
这家伙很懒,什么也没写!
提问
19
回答
7
被采纳
0
关注TA
发私信
相关问题
1
请问线程休眠时清除 errno 的设计意图是什么?
2
ipc对象插入时既有优先级模式,又有ffio模式会不会出bug?
3
我自己添加一个释放多个信号量的函数,会不会对系统有影响
4
rtthread IPC机制理解
5
如何实现多个线程对1个线程消息的订阅
6
请问Nano怎么使用IPC组件,是不是必须标准版才可以使用
7
RTT 多线程间通信机制有哪几种及推荐?
8
对于动态申请的IPC(邮箱,信号量),如何确保在释放的时候临界安全问题
9
驱动程序中的线程挂起与IPC的线程挂起流程为什么不一样?
10
关于5.0版本,内核新的IPC接口用处
推荐文章
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组件
最新文章
1
使用百度AI助手辅助编写一个rt-thread下的ONVIF设备发现功能的功能代码
2
RT-Thread 发布 EtherKit开源以太网硬件!
3
rt-thread使用cherryusb实现虚拟串口
4
《C++20 图形界面程序:速度与渲染效率的双重优化秘籍》
5
《原子操作:程序世界里的“最小魔法单位”解析》
热门标签
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
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部