Open winfenggao opened 2 years ago
没错 我们也发现这个问题了,这个非常误导用户,将在v5.0版本当中修改。
好的
按照字面意思,void *user_data; 应该留给用户使用,目前在组件和软件包中都有占用;
个人认为不应该, device 的结构体中的所有成员变量都是供驱动逻辑使用的,其他组件/模块调用设备时应该只使用 rt_device_open / read/ write 等 api 完成对设备的操作,不应该直接使用设备结构体的任何成员变量。
不是的 这个是设计的问题,user_data这个词给用户造成了极大地误解,或者说早期阶段,rt-thread在没有过多上层建筑是 user_data确实是给user用的,但是上层建筑开始逐渐丰富起来之后,rt-thread的这些上层建筑也开始偷偷摸摸自己去用这个字段了。所以这里要重新规范一下。
不是的 这个是设计的问题,user_data这个词给用户造成了极大地误解,或者说早期阶段,rt-thread在没有过多上层建筑是 user_data确实是给user用的,但是上层建筑开始逐渐丰富起来之后,rt-thread的这些上层建筑也开始偷偷摸摸自己去用这个字段了。所以这里要重新规范一下。
文档注释还是比较明确的。。。
个人感觉可能考虑添加如下接口:
void rt_device_set_param(rt_device_t dev, void *param);
void *rt_device_get_param(rt_device_t dev);
更希望可以给hook 加参数,但这样对旧的代码破坏就太大了。。。
diff --git a/rt-thread/include/rtthread.h b/rt-thread/include/rtthread.h
index c55720b..85d9016 100644
--- a/rt-thread/include/rtthread.h
+++ b/rt-thread/include/rtthread.h
@@ -502,10 +502,10 @@ void rt_device_destroy(rt_device_t device);
rt_err_t
rt_device_set_rx_indicate(rt_device_t dev,
rt_err_t (*rx_ind)(rt_device_t dev, rt_size_t size));
rt_err_t (rx_ind)(rt_device_t dev, rt_size_t size, void param), void *param); rt_err_t rt_device_set_tx_complete(rt_device_t dev,
rt_err_t (tx_done)(rt_device_t dev, void buffer));
rt_err_t (tx_done)(rt_device_t dev, void buffer, void param), void param);
rt_err_t rt_device_init (rt_device_t dev); rt_err_t rt_device_open (rt_device_t dev, rt_uint16_t oflag);
文档注释还是比较明确的。。。
外国人看不懂中文文档呢?
这块肯定是有问题的,中文文档把user_data写成了私有数据,私有数据应该叫private_data。这是两个高冲突的信息,文档里说这个是私有数据,源码命名上说这个不是系统私有的,是留给用户的。主要是因为,早期rt-thread仅仅是一个kernel的时候,tcb里的user_data真的是给user留着用的。但是随着rt-thread上层建筑不断增多。很多其他结构体写模仿者tcb的写法写成了user_data。但是user_data却总被系统内部自己偷偷使用掉,根本不是留给user的。
按照字面意思,void *user_data; 应该留给用户使用,目前在组件和软件包中都有占用;
有几次在写代码时,用到了这个指针,直到程序异常排查采发现组件占用了这个指针,被我修改了导致异常; 是不是应该对这个指针的使用明确一下。 或者组件和软件包避免使用这个指针; 或者使用者特别声明一下; 或者专门在device里给组件门专门留一个指针; ` /**
Device structure */ struct rt_device { struct rt_object parent; /*< inherit from rt_object /
enum rt_device_class_type type; /< device type */ rt_uint16_t flag; /*< device flag / rt_uint16_t open_flag; /< device open flag */
rt_uint8_t ref_count; /*< reference count / rt_uint8_t device_id; /*< 0 - 255 /
/ 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);
ifdef RT_USING_DEVICE_OPS
else
endif / RT_USING_DEVICE_OPS /
ifdef RT_USING_POSIX_DEVIO
endif / RT_USING_POSIX_DEVIO /
}; `