【APM】第一个应用程序

第一个应用程序

此部分对应教程原文
http://ardupilot.org/dev/docs/learning-ardupilot-the-example-sketches.html

HelloWorld

代码编写及编译

学习任何一种平台都从Hello World开始。由于官方教程中的方法有一些问题,因此在这里详细写一下如何在Pixhawk中运行helloworld程序。

在eclipse左侧的 project explorer中,打开ardupilot | libraries | AP_GPS | examples | GPS_AUTO_test文件夹,双击里面的GPS_AUTO_test.cpp文件。
这个文件的主要功能是打印出GPS信息到控制台上。
当然,作为初学者,我们更关心怎么打印hello world到屏幕上(毕竟GPS模块不是谁都有的)。所以我们先对代码做如下改动:

#include <AP_HAL/AP_HAL.h>

const AP_HAL::HAL& hal = AP_HAL::get_HAL();

void setup() {
  hal.console->println("GPS AUTO library test");

}

void loop()
{
   hal.console->println("hello world!");
    hal.scheduler->delay(1000);

}

AP_HAL_MAIN();

如果你熟悉arduino开发的话,你一定对上面的代码很眼熟。
没错,apm组织代码的形式和arduino是一样的。一个setup()函数,一个loop()函数,当pixhawk通电后,系统会先执行一次setup(),再循环执行loop()直到断电。
然而经过我的测试上面的代码是不能直接运行的(Linux和Windows下编译后烧录到板子上均无反应)。需要将上面的代码改为下面的代码才能正常打印

#include <AP_HAL/AP_HAL.h>
const AP_HAL::HAL& hal = AP_HAL::get_HAL();

class GPS_AUTO_test: public AP_HAL::HAL::Callbacks{
public:
    void setup()
    {
        hal.console->println("GPS AUTO library test");

    }

    void loop()
    {
        hal.console->println("hello world!");
        hal.scheduler->delay(1000);
    }
};
GPS_AUTO_test gat;

// Register above functions in HAL board level
AP_HAL_MAIN_CALLBACKS(&gat);

区别在于在第二段代码中我们把setup()函数和loop()函数封装在了一个类里。这个类必须继承AP_HAL::HAL::Callbacks并重载setup和loop函数。烧录后可正常运行。
编者注:此处编者阅读了AP_HAL_MAIN和AP_HAL_MAIN_CALLBACKS两个宏,发现两个宏都是没有错误的,尚不清楚为何第一种宏编译后无法运行。
改完后就是编译了。在Eclipse右侧的Make Target选项卡上找到我们的当前目录ardupilot | libraries | AP_GPS | examples | GPS_AUTO_test,单击上面的绿色加号,输入px4-v2-upload,之后双击生成的绿色图标,编译开始。

注:apm采用增量编译的形式,初次编译时间很长,而第二次编译时仅重新编译修改过的部分。因此请耐心等待。

这里写图片描述

编译完成时,会提示

If the board does not respond within 1-2 seconds, unplug and re-plug the USB connector.

此时请将pixhawk板通过USB线连接到电脑上。系统会自动擦除原先的代码,并烧录进新的代码。
这里写图片描述

运行代码

打开px4-toolchain中的teraTerm软件。依次选择Setup | serial port。在打开的选项板中设置Baud rate为115200,其与保持默认,单击OK即可连接上。
编者注:TeraTerm为一个串口监视器,你可以选用任何你喜欢的串口监视器来执行程序。
此时可以看到屏幕上打出一堆hello world!
这里写图片描述

其他细节

到了这里,我们已经完成了环境的搭建,以及简单地编译和运行程序。使用eclipse强大的代码阅读能力可以帮助我们迅速的定位每一个函数的定义位置,将鼠标光标定位到函数处,即可出现该函数定义。在此处按下F3即可打开相应的定义文件。
这里我们简单介绍一下宏AP_HAL_MAIN_CALLBACKS
该宏展开后代码如下:

#define AP_HAL_MAIN_CALLBACKS(CALLBACKS) extern "C" { \
    int AP_MAIN(int argc, char* const argv[]); \
    int AP_MAIN(int argc, char* const argv[]) { \
        hal.run(argc, argv, CALLBACKS); \
        return 0; \
    } \
    }

这段宏相当于定义了我们熟悉的main函数。进入main函数后,迅速将控制权转移给hal.run这个函数,并将我们实现的类的实例传给hal.run。这也是所有基于APM开发的程序的共同入口。
如果你想继续阅读关于hal.run的函数,可以继续往里跳转,直到解决了你所有疑惑为止。但是作为初学,我们还是更关心一些顶层的实现(如姿态、位置、EKF等)。硬件底层的实现细节可以在对代码有整体把握后再往下深挖。
在读到这里以后我们就可以读官方文档了。(注意把每一个教程里的setup和loop函数封装到类里)。在这里我们引用一个别人已经翻译好的文档,此部分内容不再赘述。

http://blog.csdn.net/linuxarmsummary/article/details/45402891
依次阅读该文档中的pixhawk源码笔记一二三四五六七八九十。该文档较老,如遇到和本博不一样的地方以本博客为准。

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: APM32F030是一款32位微控制器芯片,程序跳转是指在程序执行过程中无条件或有条件地改变执行地址,使程序跳转到其他指定的地址处继续执行。 在APM32F030中,程序跳转可以通过修改程序计数器(Program Counter,简称PC)来实现。PC是一个特殊的寄存器,用于指向下一条将要执行的指令地址。通过改变PC的值,就可以改变程序的执行流程。 在APM32F030中,程序跳转使用跳转指令来实现。通过跳转指令,可以无条件地将程序跳转到指定的地址,或根据特定条件来判断是否跳转。 比如,可以使用无条件跳转指令“JMP”来实现无条件跳转。通过设置跳转指令的操作数为目标地址,执行该指令时就会将PC的值设置为目标地址,使程序跳转到目标地址处继续执行。 另外,还可以使用有条件跳转指令,如“JE”(等于跳转)、“JNE”(不等于跳转)、“JZ”(零跳转)等,根据特定条件来判断是否跳转。例如,可以通过判断某个标志位的状态,来确定是否执行跳转指令。 总之,在APM32F030中,程序跳转是通过修改PC的值来实现的。通过使用跳转指令,可以无条件或有条件地改变PC的值,从而实现程序的跳转,改变程序的执行流程。这样,可以根据实际需要,实现复杂的程序逻辑和功能。 ### 回答2: APM32F030是一款微控制器芯片,程序跳转是指在程序执行过程中,从当前位置跳转到其他位置继续执行程序的操作。在APM32F030中,程序跳转可以通过使用函数指针或者汇编语言来实现。 首先,函数指针是一种指向函数的指针变量,通过函数指针,我们可以将某个函数的地址赋值给函数指针,然后可以通过调用函数指针来执行这个函数。如果想要在程序中实现跳转到其他位置执行的功能,可以定义一个函数指针变量,并将需要跳转的位置的函数地址赋值给函数指针,然后通过调用函数指针来执行跳转到该位置的程序代码。 其次,汇编语言是一种低级的编程语言,可以直接访问计算机的硬件资源。在汇编语言中,通过使用跳转指令可以实现程序的跳转。APM32F030支持汇编语言编程,通过使用汇编语言编写一段程序代码,可以实现程序的跳转操作。 总结起来,APM32F030的程序跳转可以通过使用函数指针或者汇编语言来实现。函数指针适用于高级语言编程,而汇编语言适用于底层编程,根据具体的应用场景和开发需求,选择合适的方式来实现程序跳转。 ### 回答3: APM32F030是一款基于ARM Cortex-M0内核的微控制器,其具有支持程序跳转的功能。程序跳转是指在程序的执行过程中,通过特定的指令或条件,将控制权从当前位置转移到另一个指定的位置。 在APM32F030中,程序跳转可以通过使用汇编语言或C语言中的跳转指令来实现。例如,使用汇编语言的跳转指令可以是B(无条件跳转)、BL(带链接的跳转)、BEQ(等于零时跳转)等。这些指令可以在程序中的特定位置使用,以实现在需要的时候改变程序的控制流。 具体来说,要进行程序跳转的操作,可以按照以下步骤进行: 1. 首先,确定需要跳转的目标位置。这可以是代码的另一个函数、循环体、条件语句等。 2. 在需要执行跳转的位置,通过使用适当的跳转指令将控制权转移到目标位置。这可以是使用汇编语言编写的指令,也可以是通过C语言中的特殊语法来实现。 3. 跳转到目标位置后,程序会从该位置继续执行。这样可以实现在运行时改变程序流程,实现不同的功能。 需要注意的是,在进行程序跳转时,需要确保目标位置的代码是可执行的,并且满足程序的逻辑要求。否则,可能会导致程序运行错误或异常。 总的来说,APM32F030支持灵活的程序跳转功能,通过适当的跳转指令,可以实现在程序的不同位置之间切换控制权,以满足不同的需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值