zoukankan      html  css  js  c++  java
  • 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就是一个结构体,结构的元素在上面的图片中有介绍。

    作者:cumtchw
    出处:http://www.cnblogs.com/cumtchw/
    我的博客就是我的学习笔记,学习过程中看到好的博客也会转载过来,若有侵权,与我联系,我会及时删除。

  • 相关阅读:
    Linux基础知识
    redis info
    记录: 解决 pycurl: libcurl link-time ssl backend (openssl) is different from compile-time ssl backend (none/other)
    IOS IAP 自动续订 之 利用rabbitmq延时队列自动轮询检查是否续订成功
    Python3.6 的字典为什么会快
    IAP 订阅后端踩坑总结之 Google 篇
    docker 命令合集
    Python Schema使用说明
    Apache Bench测试
    channels2.X 学习笔记
  • 原文地址:https://www.cnblogs.com/cumtchw/p/7225892.html
Copyright © 2011-2022 走看看