第二章第二節——示例梗概

第二章第二節——示例梗概

飛控開發less

在探索本身的代碼的第一個步驟是使用示例梗概的庫。做爲一個開始,你應該閱讀,構建和運行如下庫:
• 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
瞭解示例梗概代碼,當你正在閱讀的示例梗概代碼(如GPS_AUTO_test代碼),你會發現幾件事情,彷佛有些彆扭。
• the pde file has a lot of includes
• it declares a ‘hal’ variable as a reference
• the code is quite rough and not well commented
• the setup() and loop() functions

一、include文件

pde文件轉變爲C++文件後,提供必要的庫引用支持。

二、hal引用聲明

定義以下:
const AP_HAL::HAL& hal = AP_HAL_BOARD_DRIVER;
& 是 C++ 標準的定義類型:引用。
引用有些像C/C++裏的指針,可是比指針可讀性要好,並且必須初始化時賦值,賦值後不能再引用其餘變量。定義hal爲const引用類型的好處是做爲參數傳遞時不用建立臨時變量,節省了一個AP_HAL::HAL對象的構造和析構時間。AP_HAL不必定是命名空間,也多是類、結構等。
該定義,方便訪問硬件接口,好比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 print 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 accessing GPIO pins 
I2C操做,hal.i2c 
SPI操做,hal.spi 

三、setup()和loop()

每一個sketch都有一個setup()和loop()函數。板子啓動時,setup()被調用。這些調用都來自HAL代碼中的main()函數調用(HAL_PX4_Class.cpp文件main_loop())。setup()函數只調用一次,用於初始化全部libraries。
Loop()循環被調用,執行主任務。

四、AP_HAL_MAIN()宏指令

每個sketch(.pde文件)最底部,都有一個「AP_HAL_MAIN();」指令,它是一個HAL宏,用於定義一個C++ main函數,整個程序的入口。它真正的定義在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()  sketch中的setup()和loop()。函數

copter_home_001-900x400.jpg

相關文章
相關標籤/搜索