PX4中ESC的驱动框架

Cdev继承的是Device,然后I2C又是继承的CDev,然后ESC又是继承的I2C,Device---->cdev---->I2C---->ESC。

ESCinit函数里面:首先会调用I2C的init函数。然后配置RST管脚,然后配置电调的I2C地址,包括两个方面,一个是设置飞控程序里面的总线地址,另一个是motor端的I2C地址。

I2Cinit函数里面:_dev----px4_i2c_dev_t----i2c_dev_s----i2c_ops_s,在I2C的init函数里面,首先是一个up_i2cinitialize函数,还要调用I2C_SETFREQUENCY函数设置频率,然后就是调用cdev的init函数。

cdevinit函数里面:首先调用device的init函数,然后主要就是一个register_driver函数,这个register_driver函数把/dev/esc传进去,还有fops结构体,还有this指针,这里的this应该是g_esc,也就是esc对象的首地址。

 

Qesc.cpp624行里面的Open函数是怎样一级一级的到达底层的?

A:这个open是在fs_open.c里面的88行的open,open的时候要把路径path传进去,在open里面inode = inode_find(path, &relpath);根据路径返回一个设备节点,再往下,open里面还有fd = files_allocate(inode, oflags, 0, 0);根据设备节点再返回一个文件数组的下标,这个下标就是相当于文件描述符。

然后在fs_open.c里面的187行还有一个inode->u.i_ops->open函数,这个open函数就是inode的fops结构体里面的open函数,然后在cdev.cpp里面80行可以看到,fops结构体里面的open函数实际上就是cdev_open,在cdev.cpp的410行有cdev_open,在cdev_open 里面又指向了另一个open,你用sourceinsight查找的时候它指向了cdev.cpp的180行,实际上是不对的,在cdev.cpp里面进行了一个强制类型转换,然后sourceinsight没有那么智能,这里的open函数实际上是filp->f_inode->i_private里面的open函数,这里的i_private就是this,具体实现就是在cdev的init函数里面有一个register_driver函数,在这个register函数里面把this赋值给了i_provate,这里的this就是ESC,所以最后调用的是esc里面的open函数,只不过esc里面用不到自己的open函数了,所以esc里面就没有弄自己的open函数,只需要调用一个顶层的open函数返回一个文件数组的下标就可以了。

fs_files.c的323行就是找空下标的,那个for循环就是去找一个空的下标,然后把它放在里面。

Nuttx实际上用了一个伪文件系统,用的是全局的文件数组,然后每个文件

里面包含有f_inode。

然后在inode里面又包括u和i_private,

然后在u里面又包含file_operation结构体。

 

Q:在i2c_nuttx.cpp的146行有一个I2C_SETFREQUENCY函数,这个就是在i2c.h里面的108行,最后就是在i2c.h的250行的ops结构体里面的setfrequency函数指针,最后就是stm32_i2c.c里面的1566行的stm32_i2c_setfrequency函数,那么这个ops里面的setfrequency是怎么和stm32_i2c_setfrequency联系到一起的呢?

Q:比如说这个esc.cpp这个程序是怎么跑起来的,真正下载到飞机里面之后不应该是在命令行里面输入esc_start命令让他

里面有一个rcS的脚本,这个应该就是启动脚本,网上可以搜到,

几个名词  Q:esc.cpp的86,SCHEDULE_INTERVAL是什么意思,

这个是发送速度信号的时间间隔

Q:esc.cpp的113,IOX_MODE

这个模式没有用到,

Q:esc.cpp的120,actuator_armed_s,

遥控器有一个动作之后,飞机解锁,结构体里面的armed=1,就表示解锁了,然后电机就可以转动。

Q:在I2C_nuttx.h的47行,__EXPROT右键ctrl之后是哪个,然后是什么意思。

让别的文件可以使用。

 

 

复习完之后的总结:实际上在PX4里面是有一个全局的文件数组,当你用open去打开一个设备的时候,它实际上会去找一个空的数组元素,然后把相关的信息保存在这个数组元素中,然后返回的是这个数组的下标,这个数组元素的下标就相当于文件描述符,

那么问题来了,在这个数组元素中保存的是什么东西呢,

数组元素中保存的是一个file,一个file就是一个结构体,结构的元素在上面的图片中有介绍。

 

posted @ 2017-07-23 20:10  cumtchw  阅读(283)  评论(0编辑  收藏  举报