在当前的RTT的驱动框架中,应用层的函数是如何一层一层调用到底层驱动接口的?

发布于 2021-04-30 14:17:41

RTT的驱动框架从上至下分为三层:I/O设备管理层-->设备驱动框架层-->设备驱动层

以hwtimer外设为例,分别对应的c文件为device.c-->hwtimer.c-->drv_xxx_timer.c

跟踪代码,从device.c的函数rt_device_init()开始,调用device_init(),dev->ops->init,然后就跟丢了。
但是一路在这些函数中加入打印信息,确实是从rt_device_init()-->rt_hwtimer_init()-->xxx_timer_init()的调用流程。
请问:这个调用流程需要如何分析?谢谢

查看更多

关注者
0
被浏览
112
cxhxy12345
cxhxy12345 2021-04-30

dev->ops->init是dev对象的一个方法,它用的是函数指针,是初始化dev设备对象时赋值给对象的。
举个例子:如果我们有一个serial,将它进行初始化,首先要注册这个serial设备,就有
rt_hw_serial_register()函数,当然你这里可能是其它设备。
在这个函数里,如果你根据RT_USING_DEVICE_OPS设置函数入口,如下:

ifdef RT_USING_DEVICE_OPS

....
device->init        = rt_serial_init;
device->open        = rt_serial_open;
....

endif

这里就将device->init 指向了rt_serial_init函数,
你这里用的是hwtimer,因该初始化函数是rt_hwtimer_init
但你需要先注册这个hwtimer设备,将device->init指向rt_hwtimer_init。
不知道这样说可以理解吗?

5 个回答
Remember
Remember 2021-04-30

通常在drv_hw_timer.c里的初始化函数里会注册定时器设备rt_hwtimer_t,这个设备有ops成员,表示其操作,这些操作在drv_hw_timer.c里定义。
注册定时器设备使用rt_device_hwtimer_register,看一下这个函数的定义就明白了

yangjie
yangjie 2021-04-30

dev->ops->init 就是 drv_xxx_timer.c 里面注册的 ops 里面的 init 了,
同理其他 ops 也一样。

flashman2002
flashman2002 2021-04-30

可以单步跟踪一下调用过程就清楚了。

mii
mii 2021-04-30

使用MDK调试时不要设置优化代码,不然内嵌层数太多在调试模式下会丢失调试功能。

撰写答案

请登录后再发布答案,点击登录

发布
问题

分享
好友

手机
浏览

扫码手机浏览