Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
设备驱动组件
10
设备tx_complete和rx_indicate回调传参问题
发布于 2024-03-21 13:00:08 浏览:932
订阅该版
tx_complete和rx_indicate这两个回调函数中,传入的参数是由设备驱动框架本身控制的,无法传入额外参数。而这两个回调的目的基本上都是用于IPC的,但是当我们希望通过这两个回调来进行IPC时,可能会遇到一些问题。 举个例子,串口阻塞接收,主线程阻塞等待一个信号量,串口rx_indicate回调释放该信号量,这个逻辑很简单。 现在我们增加几个串口,那么这种情况要怎么处理呢?最简单的方法是每个串口开一个线程,每个线程阻塞等待各自的信号量。那么代价是什么呢?并发性能低下,同时浪费资源。 那么有没有更好的方法呢?有。我们可以只用一个线程来处理,怎么做呢?很简单,复用rx_indicate就行了。 在rx_indicate中,我们释放一个信号,主线程等待这个信号,主线程获得信号时,遍历所有串口,把有数据的串口读取出来进行处理。但是这样做不符合我们朴素的逻辑,我们朴素的逻辑是谁有数据处理谁,不要干多余的事,遍历所有串口显然就是多余的事。那么还有没有更好的方法呢?有。 我们可以在rx_indicate中,将串口设备对象放入到一个ready list中,主线程获得信号量后依次从ready list中获取串口设备对象,并读取数据进行处理。这样我们就实现了高性能的同时,占用更少的资源。但问题来了,想要在rx_indicate中实现将串口设备对象放入ready list中,我们需要传入额外的参数才可以做到。 有人说很简单,设备对象都有user_data,可以拿来用,但问题时,这个user_data真的是user可以用的data吗?也许串口设备的user_data可以直接用,那换另一个设备对象呢?框架以及驱动对这个成员的使用完全没有任何规范,有些内部直接用了,有些还预留着,这个user_data能不能拿来传递参数,完全依赖设备框架以及设备驱动的内部实现,假如我要实现一个特定的功能,或者我的应用明确绑定特定的设备对象,那是可以去查看内部实现来决定的,但问题是,假如我要实现一个通用框架,那就不能如此假定了,这个时候,rx_indicate以及tx_complete已经不能满足要求了。 这就是我现在遇到的问题,我在实现一个支持多实例的特定通讯协议的通用框架,后端对接的设备是不做要求的,这种情况我要怎么做呢? 我不明白设计之初为什么要这样做,不允许额外传参有什么好处吗?为了安全吗?问题是作为一个系统组件,职责是提供接口,至于如何选择,那是用户的事情。 ----- 可能不上伪码大家不太方便理解,我现在写个简单的伪码 ``` struct demo { rt_device_t device; void *member_a; void *member_b; ... }; static rt_err_t rx_ind(rt_device_t dev, rt_size_t size) { // 这里我们希望的逻辑操作某个demo对象中的member_a成员 // 传入的dev是这个demo对象中的device成员 } rt_err_t demo_init(struct demo *demo, const char *dev_name) { demo->device = rt_device_find(dev_name); /* 初始化其他成员以及其他的一些操作 */ ... ... rt_device_open(demo->device, oflag); rt_device_set_rx_indicate(demo->device, rx_ind); return RT_EOK; } int main(void) { struct demo demo1, demo2, demo3, demo4; demo_init(&demo1, "uart1"); demo_init(&demo2, "uart2"); demo_init(&demo3, "uart3"); demo_init(&demo4, "uart4"); while (1); } ``` 在上面这个场景中,请问rx_ind应该怎么做?假如现在这个场景是明确某个应用场景的可以在rx_ind里面依次判断,那我每加一个demo就改一次rx_ind吗?假如demo是一个框架呢?框架实现者是没有那么多上下文的,谁知道用户会在main里面初始化多少个demo呢?
查看更多
5
个回答
默认排序
按发布时间排序
yangpengya
2024-03-22
这家伙很懒,什么也没写!
```c /* device call back */ rt_err_t (*rx_indicate)(rt_device_t dev, rt_size_t size); rt_err_t (*tx_complete)(rt_device_t dev, void *buffer); ``` rt_device_t dev 就是你要的设备对象啊,不需要什么额外参数。 另外,开源软件,不满意就fork。
三世执戟
2024-03-22
这家伙很懒,什么也没写!
支持加参数👍 不过不用吐槽那么多,楼主可以直接自己加,加好也可以考虑提个PR上来。 ```c /* device call back */ rt_err_t (*rx_indicate)(rt_device_t dev, rt_size_t size, void *arg); rt_err_t (*tx_complete)(rt_device_t dev, void *buffer, void *arg); ``` 相应的,`rt_device`里面也要添加相应的字段来保存这2个`arg`。
winfeng
认证专家
2024-03-21
这家伙很懒,什么也没写!
你想复杂了。
oxlm
2024-03-21
这家伙很懒,什么也没写!
我的理解,tx_complete只是用作驱动告诉应用说应用需要发送的东西已经发送完毕了,本身上不需要太复杂的参数,最多传一个应用写下去数据的地址信息之类的就完了。而rx_indicate本质上也只是驱动通知应用说收到新消息了,至于消息是啥,应用完全可以通过control或者read去详细解析,没必要用rx_indicate来细分说明(虽然rx_indicate传参也能在一定程度上干这个事情,但我个人不太喜欢这么干,相当于是本身应用要干的活,交给了驱动去实现,而且很多驱动调用这个接口还是在中断里面调的,不适合干太复杂的活)
a1012112796
2024-03-22
这家伙很懒,什么也没写!
> 我不明白设计之初为什么要这样做,不允许额外传参有什么好处吗?为了安全吗? 结构复杂了,假设需要 tx_complete / rx_indicate 需要传用户自定义参数,那在 device 结构体中是不是也得增加成员存储这两个自定义参数? 这样 ram 占用就增加了。并且并不是所有用户都需要。。。
撰写答案
登录
注册新账号
关注者
0
被浏览
932
关于作者
Milo
这家伙很懒,什么也没写!
提问
1
回答
16
被采纳
3
关注TA
发私信
相关问题
1
设备驱动组件只能通过env?
2
RTT 中利用FSMC驱动SRAM代码
3
Rt-thread什么时候可以支持dcmi接口的驱动
4
drv_hwtimer 和hwtimer关系是啥?
5
硬件有32768的晶振,实现准确的日历,如何配置rtc实现
6
STM32硬件i2c
7
串口设备发送的dev->ref_count为0
8
请问在studio中如何查看和设置编码器设备的连接引脚?
9
设备驱动开发指南是不是rtthread已经都实现了
10
小白初探RT-Thread驱动注册机制套路......
推荐文章
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
RT-Thread项目助手v0.2.0 - 支持Env Windows
2
RttreadV5.10上,GD32F450Z RTC时间显示问题
3
rt-smart启动流程分析
4
EtherKit快速上手PROFINET
5
RTThread USB转串口无法接收数据
热门标签
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
UART
WIZnet_W5500
ota在线升级
PWM
cubemx
flash
freemodbus
BSP
packages_软件包
潘多拉开发板_Pandora
定时器
ADC
flashDB
GD32
socket
编译报错
中断
Debug
rt_mq_消息队列_msg_queue
SFUD
msh
keil_MDK
ulog
MicroPython
C++_cpp
本月问答贡献
出出啊
1517
个答案
342
次被采纳
小小李sunny
1444
个答案
290
次被采纳
张世争
813
个答案
177
次被采纳
crystal266
547
个答案
161
次被采纳
whj467467222
1222
个答案
149
次被采纳
本月文章贡献
出出啊
1
篇文章
2
次点赞
小小李sunny
1
篇文章
1
次点赞
张世争
1
篇文章
3
次点赞
crystal266
2
篇文章
2
次点赞
whj467467222
2
篇文章
2
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部