ImageVerifierCode 换一换
格式:DOCX , 页数:45 ,大小:43.45KB ,
资源ID:9686215      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/9686215.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(源代码解析.docx)为本站会员(b****8)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

源代码解析.docx

1、源代码解析Pixhawk源码笔记一:APM代码基本结构Pixhawk源码笔记一:APM代码基本结构基础知识 详细参考:第一部分:介绍 详细参考: ArduPilot 代码分为5个主要部分,基本结构分类如下: vehicle directories AP_HAL libraries tools directories external support code1、vehicle directories模型类型 当前共有4种模型:ArduPlane, ArduCopter, APMrover2 and AntennaTracker。都是.pde文件,就是为了兼容arduino平台,以后可能会放弃。

2、2、AP_HAL硬件抽象层 硬件抽象层,使得在不同硬件平台上的移植变得简单。 其中AP_HAL目录定义了一个通用的接口。其他的目录AP_HAL_XXX针对不同硬件平台进行详细的定义。例如AP_HAL_AVR目录对于AVR平台,AP_HAL_PX4对应PX4平台,AP_HAL_Linux对应Linux平台。3、tools directories工具目录 主要提供支持。For examples, tools/autotest provides the autotest infrastructure behind the site and tools/Replay provides our log

3、replay utility.4、external support code外部支持代码 对于其他平台,需要外部支持代码。例如Pixhawk、PX4的支持代码如下: PX4NuttX 板载实时系统。the core NuttX RTOS used on PX4 boards PX4Firmware PX4固件。the base PX4 middleware and drivers used on PX4 boards uavcan 飞行器CAN通信协议。the uavcan CANBUS implementation used in ArduPilot mavlink Mavlink通信协议。

4、the mavlink protocol and code generator5、系统编译 针对不同的硬件板,编译可以采用“make TARGET”的形式。 make apm1 the APM1 board make apm2 the APM2 board make px4-v1 the PX4v1 make px4-v2 the Pixhawk 如果要移植到新的硬件,可以在mk/targets.mk文件中添加。 比如: make apm2-octa -j8 或者: make px4-v2 -j8 采用8通道并行编译方式,针对APM、Pixhawk硬件板(AVR、STM32),编译八旋翼代码。

5、第二部分: 学习sketch例程代码 sketch,是指使用 .pde 文件编写的主程序。 开始之前,你可以试着阅读、编译并运行下面的sketches libraries/AP_GPS/examples/GPS_AUTO_test libraries/AP_InertialSensor/examples/INS_generic libraries/AP_Compass/examples/AP_Compass_test libraries/AP_Baro/examples/BARO_generic libraries/AP_AHRS/examples/AHRS_Test 例如,下面的编译方法,将

6、在Pixhawk上安装AP_GPS例程sketch。 cd libraries/AP_GPS/examples/GPS_AUTO_test make px4-clean make px4-v2 make px4-v2-upload 正确理解sketch例程代码,我们以GPS_AUTO_test.pde代码为例(目录ardupilotlibrariesAP_GPSexamplesGPS_AUTO_test),主要几个特点: 1、 pde文件包含很多 includes; 2、 定义了 hal 引用声明; 3、 代码非常粗糙; 4、 setup() 和 loop()函数1、include文件 pde

7、文件转变为C+文件后,提供必要的库引用支持。2、hal引用声明 定义如下: const AP_HAL:HAL& hal = AP_HAL_BOARD_DRIVER;/ pixhawk等价于AP_HAL_PX4 该定义,方便访问硬件接口,比如console终端、定时器、I2C、SPI接口等。 实际的定义是在HAL_PX4_Class.cpp中定义,如下: const HAL_PX4 AP_HAL_PX4; hal是针对 AP_HAL_PX4 的引用。 经常使用的方法如下: 终端字符输出。hal.console-printf() and hal.console-printf_P() to prin

8、t strings (use the _P to use less memory on AVR) 获取当前运行时间。hal.scheduler-millis() and hal.scheduler-micros() to get the time since boot 延时。hal.scheduler-delay() and hal.scheduler-delay_microseconds() to sleep for a short time IO输入输出。hal.gpio-pinMode(), hal.gpio-read() and hal.gpio-write() for accessi

9、ng GPIO pins I2C操作,hal.i2c SPI操作,hal.spi3、setup()和loop() 每个sketch都有一个setup()和loop()函数。板子启动时,setup()被调用。这些调用都来自HAL代码中的main()函数调用(HAL_PX4_Class.cpp文件main_loop())。setup()函数只调用一次,用于初始化所有libraries。 Loop()循环被调用,执行主任务。4、AP_HAL_MAIN()宏指令 每一个sketch(.pde文件)最底部,都有一个“AP_HAL_MAIN();”指令,它是一个HAL宏,用于定义一个C+ main函数,整

10、个程序的入口。它真正的定义在AP_HAL_PX4_Main.h中。 #define AP_HAL_MAIN() extern C _EXPORT int SKETCH_MAIN(int argc, char * const argv); int SKETCH_MAIN(int argc, char * const argv) hal.init(argc, argv); return OK; 作为程序的起点,在AP_HAL_MAIN()里,就正式调用了hal.init()初始化代码。 程序的执行过程就是:程序起点AP_HAL_MAIN() hal.init() hal.main_loop() s

11、ketch中的setup()和loop()。Pixhawk源码笔记二:APM线程Pixhawk源码笔记一:APM代码基本结构,参见:这里,我们对 APM 线程进行讲解。如有问题,可以交流30175224。新浪WalkAnt,转载本博客文章,请注明出处,以便更大范围的交流,谢谢。第三部分APM线程详细参考:对于APM1、APM2硬件板,不支持多线程,所以只能通过简单的定时器加回调函数来实现。类似PX4和Linux硬件板支持Posix标准的多线程。线程一般是指基于多任务操作系统的并行任务,我们首先要明白的几个概念如下:1、 定时回调2、 HAL专属线程3、 驱动专属线程4、 APM驱动与板级驱动5

12、、 板级专属线程、任务6、 AP_Scheduler任务调度系统7、 信号灯(任务队列互锁用)8、 lockless data structures如果你对操作系统运行机制比较了解,那就很好理解了。1、定时回调The timer callbacks每个飞控平台都提供一个1kHz的定时器(见AP_HAL),通过“注册”一个定时器函数来获取1kHz定时功能。所有注册的定时器将被顺序调用。调用形式如下:hal.scheduler-register_timer_process(AP_HAL_MEMBERPROC(&AP_Baro_MS5611:_update);定时器优先级为181,高于主进程的180

13、。上面代码是以MS5611气压计驱动为例,其中 AP_HAL_MEMBERPROC() 宏,主要作用是将一个C+成员函数包装起来,作为一个回调参数。其定义在AP_HAL_Namespace.h文件中,如下:/ macro to hide the details of AP_HAL:MemberProc#defineAP_HAL_MEMBERPROC(func) fastdelegate:MakeDelegate(this, func)使用hal.scheduler-millis() and hal.scheduler-micros() 可以记录时间。好了,你可以试着自己边一个简单的sketch

14、,在setup()和loop()函数中练习一下1秒钟向USB终端输出一个时间或字符。2、HAL专属线程以PX4为例,HAL专属线程有:1、 UART线程,用于读、写串行接口数据(包括USB);2、 定时器线程,支持1kHz定时功能;3、 IO线程,支持写microSD、EEPROM、FRAM等。对于Pixhawk,请准备一条调试电缆,连接到nsh console(serial 5 端口),波特率57600。如果已经连接,试下”ps”命令,你会得到如下信息:PID PRI SCHD TYPE NP STATE NAME0 0 FIFO TASK READY Idle Task()1 192 FI

15、FO KTHREAD WAITSIG hpwork()2 50 FIFO KTHREAD WAITSIG lpwork()3 100 FIFO TASK RUNNING init()37 180 FIFO TASK WAITSEM AHRS_Test() AHRS线程38 181 FIFO PTHREAD WAITSEM (20005400)定时器线程39 60 FIFO PTHREAD READY (20005400)UART线程40 59 FIFO PTHREAD WAITSEM (20005400) IO线程10 240 FIFO TASK WAITSEM px4io()13 100 F

16、IFO TASK WAITSEM fmuservo()30 240 FIFO TASK WAITSEM uavcan()上面的线程为定时器线程(优先级181),UART线程(60), IO线程(59),以及其他线程诸如:px4io, fmuservo, uavcan, lpwork, hpwork and idle tasks线程的主要目的是在不干扰主进程的情况下,在后台处理一些低优先级任务。例如 AP_Terrain library,需要向microSD卡写地形文件,它的实现方式如下:hal.scheduler-register_io_process(AP_HAL_MEMBERPROC(&A

17、P_Terrain:io_timer);注意:IO线程优先级59,相比定时器181优先级慢了很多。3、Driver专属线程没什么好说的,请参考英文原版,需要提的一点是,我们可以利用register_io_process() 和register_timer_process()来处理驱动的访问。4、APM驱动与板级(原生)驱动我们可以看到MPU6000驱动有两个版本:一个是APM版本,在libraries/AP_InertalSensor/AP_InertialSensor_MPU6000.cpp,另一个为原生代码版本,在PX4Firmware/src/drivers/mpu6000。注意,对于P

18、ixhawk,APM代码使用的是Pixhawk原生驱动,因为原生驱动已经做得很好了。libraries/AP_InertialSensor/AP_InertialSensor_PX4.cpp中可以查看详情。在非PX4平台上,我们使用AP_InertialSensor_MPU6000.cpp驱动,在PX4平台上,我们就用PX4原生驱动AP_InertialSensor_PX4.cpp5、板级专属线程、任务在上面第2节“HAL专属线程”讲到”ps”命令显示的线程。很多都不是 AP_HAL_PX4 Schedule启动的线程,这些线程列举如下:idle task called when there

19、is nothing else to runinit used to start up the systempx4io handle the communication with the PX4IO co-processorhpwork PX4稍低优先级驱动线程。handle thread based PX4 drivers (mainly I2C drivers)lpwork PX4非常低优先级驱动线程。handle thread based low priority work (eg. IO)fmuservo AUX输出。handle talking to the auxillary PW

20、M outputs on the FMUuavcan handle the uavcan CANBUS protocol这些任务的启动,由rc.APM脚本文件(ardupilotmkPX4ROMFSinit.drc.APM)指定。PX4启动时,会读取该文件。rc.APM属于nsh 类型脚本。作为练习,你可以修改rc.APM脚本文件,增加一些sleep和echo命令,那么当PX4启动时,通过debug console(也就是serial 5)可以显示出来。更多内容,可以参考英文原版。原生线程的启动代码如下:hrt_call_every(&_call, 1000, _call_interval,

21、(hrt_callout)&MPU6000:measure_trampoline, this);等同于AP_HAL中的hal.scheduler-register_timer_process()。上述代码的意思是,HRT (high resolution timer)高精度定时器,以1000微妙的周期调用MPU6000:measure_trampoline函数。这些操作是禁止中断的,最多占用数十微妙的时间。上面的优先级非常高。下面的方法,是稍低优先级。work_queue(HPWORK, &_work, (worker_t)&HMC5883:cycle_trampoline, this, 1)

22、;用于处理I2C设备。大概花几百微妙的操作时间。是可以被中断的任务。如果是最低优先级,那么参数改为LPWORK,这样的任务一般需要花费更长的时间。6、AP_Scheduler任务调度系统用于飞行器主线程,提供了简单的机制控制每个操作花费了多少时间。例如:1、等待一个新IMU采样;2、在每一个IMU采样周期之间调用一系列其他任务。每一个飞行器都有一个AP_Scheduler:Task table任务列表,参考代码(ardupilotlibrariesAP_SchedulerScheduler_test.pde)类似如下:static const AP_Scheduler:Task schedul

23、er_tasks PROGMEM = ins_update, 1, 1000 , one_hz_print, 50, 1000 , five_second_call, 250, 1800 ,;结构体第1列,循环调用的任务函数。第2列,调用频率(也叫tick,一个tick,就是一个最小时间单元,pixhawk为2.5ms)。第3列为最大可能占用的操作时间,scheduler.run()会传递当前可用的时间(微秒),如果时间不够,那么这个任务就pass掉了,不执行。注意,AP_Scheduler:Task table列表必须具备以下条件:1、 他们不能被阻塞。2、 在飞行时,他们不能调用sleep

24、 function3、 他们必须有可预估的最坏的运行时间。你可以修改Scheduler_test.pde,加入自己的代码来读取气压计、罗盘、GPS、更新AHRS输出roll/pitch。7、信号灯有3种方法可以避免多线程访问冲突:1、信号灯;2、lockless data;3、PX4 ORB。例如:I2C驱动可以通过信号灯,确保同一时间,只有一个I2C设备被使用。可以查看ardupilotlibrariesAP_CompassAP_Compass_HMC5843.cpp了解:获得信号灯:_i2c_sem-take(1);释放信号灯:_i2c_sem-give();8、Lockless Data

25、 StructuresLockless Data Structures比信号灯要方便,例子见:the _shared_data structure in libraries/AP_InertialSensor/AP_InertialSensor_MPU9250.cppthe ring buffers used in numerous places. A good example is libraries/DataFlash/DataFlash_File.cppGo and have a look at these two examples, and prove to yourself that

26、 they are safe for concurrent access. For DataFlash_File look at the use of the _writebuf_head and _writebuf_tail variables.9、PX4 ORBORB(Object Request Broker)是PX4的互斥机制。另外两种PX4驱动通信机制,列举如下:ioctlcalls (see the examples in AP_HAL_PX4/RCOutput.cpp)/dev/xxxread/writecalls (see _timer_tick in AP_HAL_PX4/R

27、COutput.cpp)想要学习Pixhawk源码的朋友有福了,后边我会陆续的将Pixhawk的源码学习笔记整理出来分享给大家。敬请关注:新浪微博WalkAnt,3017224。欢迎交流。Pixhawk源码笔记三:串行接口UART和Console这里,我们对 APM UART Console 接口进行讲解。如有问题,可以交流30175224。新浪WalkAnt,转载本博客文章,请注明出处,以便更大范围的交流,谢谢。第四部分串行接口UART和Console详细参考:UART很重要,用于调试输出,数传、GPS模块等。1、5个UART目前共定义了5个UART,他们的用途分别是:uartA 串行终端,通常是Micro USB接口,运行MAVLink协议。uartB GPS1模块。uartC 主数传接口,也就是Pixhawk telem1接口。uartD 次数传接口,也就是telem2接口。uartE GPS2模块。有些UART具备双重角色,比如通过修改SERIAL2_PROTOCOL参数

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1