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

飞控开发

在探索自己的代码的第一个步骤是使用示例梗概的库。作为一个开始,你应该阅读,构建和运行以下库:
• 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

1、include文件

pde文件转变为C++文件后,提供必要的库引用支持。

2、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

3、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函数,整个程序的入口。它真正的定义在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

1 个评论

学习了

要回复文章请先登录注册