转载:Pixhawk源码笔记一:APM代码基本结构
?
?
?
?轉(zhuǎn)自 新浪微博@WalkAnt?
基礎(chǔ)知識(shí)
????????詳細(xì)參考:http://dev.ardupilot.com/wiki/learning-the-ardupilot-codebase/
第一部分:介紹
????????詳細(xì)參考:http://dev.ardupilot.com/wiki/learning-ardupilot-introduction/
????????ArduPilot 代碼分為5個(gè)主要部分,基本結(jié)構(gòu)分類如下:
- ?vehicle directories
- ?AP_HAL
- ?libraries
- ?tools directories
- ?external support code
1、vehicle directories模型類型
????????當(dāng)前共有4種模型:ArduPlane, ArduCopter, APMrover2 and AntennaTracker。都是.pde文件,就是為了兼容arduino平臺(tái),以后可能會(huì)放棄。
2、AP_HAL硬件抽象層
????????硬件抽象層,使得在不同硬件平臺(tái)上的移植變得簡(jiǎn)單。
????????其中AP_HAL目錄定義了一個(gè)通用的接口。其他的目錄AP_HAL_XXX針對(duì)不同硬件平臺(tái)進(jìn)行詳細(xì)的定義。例如AP_HAL_AVR目錄對(duì)于AVR平臺(tái),AP_HAL_PX4對(duì)應(yīng)PX4平臺(tái),AP_HAL_Linux對(duì)應(yīng)Linux平臺(tái)。
3、tools directories工具目錄
????????主要提供支持。For examples, tools/autotest provides the autotest infrastructure behind theautotest.diydrones.com?site and tools/Replay provides our log replay utility.
4、external support code外部支持代碼
????????對(duì)于其他平臺(tái),需要外部支持代碼。例如Pixhawk、PX4的支持代碼如下:
- ?PX4NuttX?–?板載實(shí)時(shí)系統(tǒng)。the core NuttX RTOS used on PX4 boards
- ?PX4Firmware?–?PX4固件。the base PX4 middleware and drivers used on PX4 boards
- ?uavcan?–?飛行器CAN通信協(xié)議。the uavcan CANBUS implementation used in ArduPilot
- ?mavlink?–?Mavlink通信協(xié)議。the mavlink protocol and code generator
5、系統(tǒng)編譯
????????針對(duì)不同的硬件板,編譯可以采用“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通道并行編譯方式,針對(duì)APM、Pixhawk硬件板(AVR、STM32),編譯八旋翼代碼。
第二部分:?學(xué)習(xí)sketch例程代碼
????????http://dev.ardupilot.com/wiki/learning-ardupilot-the-example-sketches/
????????sketch,是指使用 .pde 文件編寫(xiě)的主程序。
????????開(kāi)始之前,你可以試著閱讀、編譯并運(yùn)行下面的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
????????例如,下面的編譯方法,將在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代碼為例(目錄ardupilot\libraries\AP_GPS\examples\GPS_AUTO_test),主要幾個(gè)特點(diǎn):
????????1、 pde文件包含很多 includes;
????????2、 定義了 hal 引用聲明;
????????3、 代碼非常粗糙;
????????4、 setup() 和 loop()函數(shù)
1、include文件
????????pde文件轉(zhuǎn)變?yōu)镃++文件后,提供必要的庫(kù)引用支持。
2、hal引用聲明
????????定義如下:
????????const AP_HAL::HAL& hal = AP_HAL_BOARD_DRIVER;// pixhawk等價(jià)于AP_HAL_PX4
????????該定義,方便訪問(wèn)硬件接口,比如console終端、定時(shí)器、I2C、SPI接口等。
????????實(shí)際的定義是在HAL_PX4_Class.cpp中定義,如下:
????????????????const HAL_PX4 AP_HAL_PX4;
????????hal是針對(duì) AP_HAL_PX4 的引用。
????????經(jīng)常使用的方法如下:
- ?終端字符輸出。hal.console->printf() and hal.console->printf_P() to print strings (use the _P to use less memory on AVR)
- ?獲取當(dāng)前運(yùn)行時(shí)間。hal.scheduler->millis() and hal.scheduler->micros() to get the time since boot
- ?延時(shí)。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 accessing GPIO pins
- ?I2C操作,hal.i2c
- ?SPI操作,hal.spi
3、setup()和loop()
????????每個(gè)sketch都有一個(gè)setup()和loop()函數(shù)。板子啟動(dòng)時(shí),setup()被調(diào)用。這些調(diào)用都來(lái)自HAL代碼中的main()函數(shù)調(diào)用(HAL_PX4_Class.cpp文件main_loop())。setup()函數(shù)只調(diào)用一次,用于初始化所有l(wèi)ibraries。
????????Loop()循環(huán)被調(diào)用,執(zhí)行主任務(wù)。
4、AP_HAL_MAIN()宏指令
????????每一個(gè)sketch(.pde文件)最底部,都有一個(gè)“AP_HAL_MAIN();”指令,它是一個(gè)HAL宏,用于定義一個(gè)C++ main函數(shù),整個(gè)程序的入口。它真正的定義在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; \
????????????????}
????????作為程序的起點(diǎn),在AP_HAL_MAIN()里,就正式調(diào)用了hal.init()初始化代碼。
????????程序的執(zhí)行過(guò)程就是:程序起點(diǎn)AP_HAL_MAIN()?à?hal.init()??à?hal.main_loop()?à?sketch中的setup()和loop()。
轉(zhuǎn)載于:https://www.cnblogs.com/pinlyu/p/4632454.html
總結(jié)
以上是生活随笔為你收集整理的转载:Pixhawk源码笔记一:APM代码基本结构的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: ( function(){…} )()
- 下一篇: 读《一个程序猿的生命周期》有感