AP_HAL_Linux is a subclass of
AP_HAL that implements a set of classes to be able to run
ardupilot in Linux-based systems. The code from the
AP_HAL_Linux can be found at /libraries/AP_HAL_Linux/,
According to the code, the this HAL is described as:
Umbrella header for
AP_HAL_Linuxmodule. The module header exports singleton instances which must conform the
AP_HAL::HALinterface. It may only expose implementation details (class names, headers) via the Linux namespace. The class implementing
AP_HAL::HALshould be called
HAL_Linuxand exist in the global namespace. There should be a single const instance of the
AP_HAL_Linux, instantiated in the HAL_Linux_Class.cpp and exported as
extern const HAL_Linux AP_HAL_Linux;in
All declaration and compilation should be guarded by
CONFIG_HAL_BOARDmacros. In this case, we're using
CONFIG_HAL_BOARD == HAL_BOARD_LINUX. When creating a new HAL, declare a new
The module should also export an appropriate AP_HAL_MAIN() macro if the appropriate
CONFIG_HAL_BOARDvalue is set. The
AP_HAL_MAINmacro expands to a main function (either an
int main (void)or
int main (int argc, const char * argv), depending on platform) of an ArduPilot application, whose entry points are the c++ functionsvoid setup()
andvoid loop()`, ala Arduino.
The following abstractions are implemented:
tree ardupilot/libraries/AP_HAL_Linux . ├── AP_HAL_Linux.h ├── AP_HAL_Linux_Main.h ├── AP_HAL_Linux_Namespace.h ├── AP_HAL_Linux_Private.h ├── AnalogIn.cpp ├── AnalogIn.h ├── GPIO.cpp ├── GPIO.h ├── HAL_Linux_Class.cpp ├── HAL_Linux_Class.h ├── I2CDriver.cpp ├── I2CDriver.h ├── RCInput.cpp ├── RCInput.h ├── RCOutput.cpp ├── RCOutput.h ├── SPIDriver.cpp ├── SPIDriver.h ├── Scheduler.cpp ├── Scheduler.h ├── Semaphores.cpp ├── Semaphores.h ├── Storage.cpp ├── Storage.h ├── UARTDriver.cpp ├── UARTDriver.h ├── Util.cpp └── Util.h 0 directories, 28 files
When running ardupilot (either ArduCopter, ArduPlane or APMRover2) in a Linux machine, these classes will be used for tasks such as SPI or I2C handling, Radio Control (RC) input processing and output generation and so on.
As mentioned before, a HAL is usually quite close to the hardware,thus it might be difficult sometimes to code a generic HAL for a big range of systems. In the case of Linux, the development platform has been the BeagleBone Black however an effort has been done to use standart system calls and generic Linux mechanisms. Still, some parts remain platform dependent. This is the case of
RCOuput or the
GPIO modules that use the PRUs (Programmable RealTime Units) to offload the main processor.
Note: The HAL has been developed with Debian, for major compatibility, this File System (FS) is recommended.
Other FS could be used (e.g.: Ubuntu, ArchLinux, etc.) but some modifications in the code might be needed.
Below, we describe some abstractions implemented in this layer briefly:
This header put all the abstractions under the same namespace.
AP_HAL_Linux_Private.h defines a private umbrella for the
HAL_Linux_Class.h defines the class
- include NOTE. When using include, the difference between using
" "is the following:
<>Search in all directories specified to the compiler.
" "Search , first, in the current directory and after that in the others.
HAL_Linux_Class.cpp is probably one of the most relevant files of the HAL. Defines and instantiates all the abstractions used in the Linux HAL.
You can find some code comments here.
AP_HAL_Main.h is used for compatibility with previous HAL code (AVRs, etc.). Launches the system.
The following subsections will describe the most relevant componentes of this HAL.