PX4FMU如何从PX4IO芯片读取数据

2023-05-16

上一篇文章分析了PX4IO芯片中的数据接收和发送实现方式。得出结论是:PX4IO不会主动向PX4FMU发送任何数据,所有的发送都出于接收到数据之后的回复。那么PX4FMU究竟如何从PX4IO芯片读取数据,实现过程是怎样的,下面就结合代码进行分析。

一、文件的位置。

    上篇已经讲过,位于Firmware/src/drivers/px4io文件夹,主文件是px4io.cpp,任务入口函数是PX4IO::task_main()。在进入任务函数之前的初始化函数start()函数(是独立的函数,不是PX4IO类的成员)中,获取了对应与IO芯片通讯串口的interface指针,并且在new PX4IO(interface) 的过程中将这个指针传递给了PX4IO类的成员_interface,它就是调用串口相关处理函数的关键。串口初始化、收发数据的实现都在px4io_serial.cpp文件中。

二、读取数据的实现。

    举例说明,在task_main()的循环中调用了io_get_status()读取并发布IO芯片的状态信息。从芯片读取数据时会调用io_get_status()函数,其中又调用了io_reg_get()函数,这个函数中关键的就在划线的地方。通过一个_interface指针,调用了PX4IO_serial类中的read()成员函数。


    PX4IO_serial::read()函数先将参数传递给DMA相关的配置,然后调用了PX4IO_serial::_wait_complete()来实现串口数据接收。首先用DMA发送一个请求对应page数据的指令给IO芯片,然后在for( ; ; )循环中等待一个信号量数据接收完成的互斥信号ret = sem_timedwait(&_completion_semaphore, &abstime)。而这个_completion_semaphore信号量的发布者,正是DMA数据接收中断服务函数。可以在PX4IO_serial::_do_rx_dma_callback()中看到释放信号量的函数,也就是px4_sem_post(&_completion_semaphore)。

    总结一下,读取数据时先通过DMA发送一个请求对应page数据的指令,然后在一个循环中等待信号量;中断服务函数接收到来自IO芯片的回报数据之后释放信号量,从而实现了数据的接收。另外,从代码可以看到PX4IO_serial::write()函数也是调用了_wait_complete()函数,也就是说发送和接收的过程是类似的。这也进一步印证了上一篇的结论:PX4IO不会主动向PX4FMU发送任何数据,所有的发送都出于接收到数据之后的回复。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PX4FMU如何从PX4IO芯片读取数据 的相关文章

随机推荐