PX4 激光测距传感器

先看下面这面博客,了解清楚msg消息结构体,发布和订阅的步骤过程。

PX4二次开发——uorb订阅_px4_uorb_subs-CSDN博客

在上面这个博客里面,主要是使用μORB进行数据订阅和发布,其实就是在应用层上实现了一个应用程序。在命令行中可以调用。但是我现在需要的是新的传感器,这意味着我需要完成驱动层的程序,然后在使用μORB来完成应用层的程序。 

这里补充一个知识点: 

C++中extern "C"和export用法_extern c 导出类-CSDN博客

一、驱动层

要写出驱动程序,先学习驱动程序。飞控的传感器驱动都放在src/drivers下面。驱动程序从级别上可以分为两种;

1.系统级驱动程序。在操作系统中注册设备结点/dev/xxx,并为应用级驱动程序提供标准的调用方法,比如open,close,read,write,seek,ioctl等。

2.应用级驱动程序。通过操作现有的驱动程序设备节点,配置,读取,写入相关数据与设备节点交互,并通过μorb机制与上层应用进行交互。我们要写的传感器驱动和应用程序就属于这一种。

设备节点:无论是GPIO,串口,SPI,IIC还是USB都是文件,存放在/dev/目录下面,这些都是设备节点。这些设备节点都是驱动程序在操作系统中注册的设备节点,上层应用可以像使用文件一样来使用这些设备节点。

操作系统为驱动程序提供了一个struct file_operations的结构,这是操作系统定义的一个通用的文件操作结构体(就是前面提到的系统级驱动程序)。驱动程序根据需要自己实现这些函数,同时需要使用register_driver()函数向操作系统注册一个设备节点(注册设备的路径/dev/;文件操作函数指针;设备节点的操作权限rwx,包括类型,所有者,所在组,其他组;驱动程序根据需要存放自定义的数据内容)。如果使用C++编程,可以定义一个驱动程序,继承CDev类来注册设备节点,并重写open,close,read,write等方法。实际上,在PX4中,串口,IIC,SPI都已经写好了。我们不需要担心。

了解了这么多,先看看一个led灯的驱动程序是如何实现的。

1.看例子一

1.在src/drivers目录下新建一个led文件夹,在里面建cmakelists.txt和led.c。cmakelists.txt文件里包括模块名称、入口函数、源代码文件、还有依赖模块。在led.c文件中定义led_open, led_close, led_read等接口函数和驱动文件操作符struct file_operations。当上层函数调用open函数时,实际上调用的是led_open。led_open()里面就是对stm32进行GPIO的配置。

2.入口函数led_main()。通过判断主函数中agrv[1]中的参数来分别执行不同的功能。start,stop(注册或者取消设备节点),on,off(打开设备节点,led亮或者灭,然后关闭设备节点)。

3.在总编译脚本里面加上drivers/led

4.测试驱动程序。编译程序之后,通过调试口进入nsh终端,执行led start回车,就可以看到/dev/led的驱动节点,输入led on就可以看到灯亮。

无人机中级篇:第四讲:系统级驱动程序开发 - 知乎 (zhihu.com)

2.看例子二

PX4  drivers /distance_sensor /gy_us42

1.cmakelists.txt:模块,入口函数,资源,依赖。

2.GY_US42_main.cpp:主函数:传感器协议选择,传输速率,从机地址,start,stop,status.

3.GY_US42.cpp:实现传感器

  • 11
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值