前面说到px4是基于Nuttx实时操作系统上的,那么px4也是由一些程序所构成,这些程序实现了飞行器的自主控制,只不过这些程序并不是我们通常所见到的单片机或者windows编程那样的程序,但基本编程思想是一致的。我认为如果要看懂px4的源码,那你一定要了解px4的那些程序是怎么编写出来,怎么运行的。所以本章我就大概介绍一下基于Nuttx的编程,我以一个所有编程入门都会介绍的一个程序作为例子。这个程序就是大名鼎鼎的hello world

在讲解编程之前,我得交代两个重要的东西,因为这两个东西存在于px4的源码系统当中,非常重要,它们就是make和Cmake。

首先谈谈何为make,熟悉linux系统的朋友对make肯定不陌生,它就是用来读取Makefile文件然后执行,把源码编译链接为可执行程序的一个软件。我们只要把待编译的源码文件和这些源码所需要用到的库写到Makefile文件里面执行make命令就能得到可执行或者可烧录的二进制文件。

那何为Cmake呢?

我们可以这样理解,早期人们直接使用gcc命令编译程序,当源码文件多起了之后,直接用gcc命令过长,链接的库过多,这样就太麻烦了。这时候Make就应运而生,解决了人们对于代码文件过多的困扰。但随着项目越来越大,文件越来越多,人们发现make也捉襟见肘,因为编写Makefile文件又会变得异常复杂。这个时候聪明的程序猿就想能不能有个程序可以帮我写Makefile文件呢?这样就引出了Cmake,当然Cmake不是智能的,它不可能自己去辨别那些是代码,那些是文件,需要什么库。这样就引入了另外一套规则,也引入了一个文件CMakeLists.txt,这个文件就是Cmake程序识别的文件,有这个文件,Cmake就能帮助程序猿自动生成Makefile文件。

总的来说流程应该是这样的:

cmake                            make

CMakeLists.txt-------------->Makefile---------------------->可执行文件

src,lib

看过px4源码文件的朋友肯定会发现里面有很多CMakeLists.txt文件,事实上整个px4源码的文件都是基于CMakeLists.txt的(Nuttx系统不是,Nuttx是基于Makefile的,px4源码基本都在Firmware/src下,Nuttx操作系统源码在Firmware/NuttX下)

有了上面这个两个概念之后,我们就开始着手编写我们的hello world程序。

首先进入/Firmware/src/examples文件夹,然后在这个文件夹下面建立一个文件夹hello_world,再进入hello_world文件夹,在该文件夹下建立两个文件:CMakeLists.txt,hello_world.c。

首先编辑hello_world.c文件。

[cpp] view plain copy
  1. #include <px4_config.h>
  2. #include <px4_tasks.h>
  3. #include <px4_posix.h>
  4. #include <unistd.h>
  5. #include <stdio.h>
  6. #include <poll.h>
  7. #include <string.h>
  8. __EXPORT int hello_world_main(int argc, char *argv[]);
  9. int hello_world_main(int argc, char *argv[]){
  10. PX4_INFO("hello world!");
  11. return 0;
  12. }

然后编辑CMakeLists.txt文件

[cpp] view plain copy
  1. px4_add_module(
  2. MODULE examples__hello_world
  3. MAIN hello_world
  4. STACK_MAIN 2000
  5. SRCS
  6. hello_world.c
  7. DEPENDS
  8. platforms__common
  9. )

最后最重要的是我们要将这个程序注册到Nuttx的系统当中

找到文件/Firmware/cmake/configs/nuttx_px4fmu-v2_default.cmake

针对不同的硬件所注册的文件是不同的,下面是不同硬件的注册方式:

  • Posix SITL: Firmware/cmake/configs/posix_sitl_default.cmake
  • Pixhawk v1/2: Firmware/cmake/configs/nuttx_px4fmu-v2_default.cmake
  • Pixracer: Firmware/cmake/configs/nuttx_px4fmu-v4_default.cmake

在cmake文件中添加“examples/hello_world”

像下面这样:

[cpp] view plain copy
  1. include(nuttx/px4_impl_nuttx)
  2. set(CMAKE_TOOLCHAIN_FILE ${PX4_SOURCE_DIR}/cmake/toolchains/Toolchain-arm-none-eabi.cmake)
  3. set(config_uavcan_num_ifaces 2)
  4. set(config_module_list
  5. #
  6. # Board support modules
  7. #
  8. drivers/device
  9. drivers/stm32
  10. drivers/stm32/adc
  11. drivers/stm32/tone_alarm
  12. drivers/led
  13. drivers/px4fmu
  14. drivers/px4io
  15. drivers/boards/px4fmu-v2
  16. drivers/rgbled
  17. drivers/mpu6000
  18. #drivers/mpu9250
  19. drivers/lsm303d
  20. drivers/l3gd20
  21. drivers/hmc5883
  22. drivers/ms5611
  23. #drivers/mb12xx
  24. #drivers/srf02
  25. drivers/sf0x
  26. #drivers/ll40ls
  27. drivers/trone
  28. drivers/gps
  29. drivers/pwm_out_sim
  30. #drivers/hott
  31. #drivers/hott/hott_telemetry
  32. #drivers/hott/hott_sensors
  33. #drivers/blinkm
  34. drivers/airspeed
  35. drivers/ets_airspeed
  36. drivers/meas_airspeed
  37. #drivers/frsky_telemetry
  38. modules/sensors
  39. #drivers/mkblctrl
  40. drivers/px4flow
  41. #drivers/oreoled
  42. #drivers/vmount
  43. drivers/pwm_input
  44. drivers/camera_trigger
  45. drivers/bst
  46. #drivers/snapdragon_rc_pwm
  47. drivers/lis3mdl
  48. #example
  49. examples/px4_simple_app
  50. <span style="color:#FF0000;">examples/hello_world</span>
  51. #
  52. # System commands
  53. #
  54. systemcmds/bl_update
  55. systemcmds/config
  56. systemcmds/dumpfile
  57. #systemcmds/esc_calib
  58. systemcmds/mixer
  59. #systemcmds/motor_ramp
  60. systemcmds/mtd
  61. systemcmds/nshterm
  62. systemcmds/param
  63. systemcmds/perf
  64. systemcmds/pwm
  65. systemcmds/reboot
  66. #systemcmds/sd_bench
  67. systemcmds/top
  68. #systemcmds/topic_listener
  69. systemcmds/ver
  70. #
  71. # Testing
  72. #
  73. #drivers/sf0x/sf0x_tests
  74. #drivers/test_ppm
  75. #lib/rc/rc_tests
  76. #modules/commander/commander_tests
  77. #modules/controllib_test
  78. #modules/mavlink/mavlink_tests
  79. #modules/unit_test
  80. #modules/uORB/uORB_tests
  81. #systemcmds/tests
  82. #
  83. # General system control
  84. #
  85. modules/commander
  86. modules/load_mon
  87. modules/navigator
  88. modules/mavlink
  89. modules/gpio_led
  90. modules/uavcan
  91. modules/land_detector
  92. #
  93. # Estimation modules
  94. #
  95. modules/attitude_estimator_q
  96. #modules/position_estimator_inav
  97. modules/local_position_estimator
  98. modules/ekf2
  99. #
  100. # Vehicle Control
  101. #
  102. modules/fw_pos_control_l1
  103. modules/fw_att_control
  104. modules/mc_att_control
  105. modules/mc_pos_control
  106. modules/vtol_att_control
  107. #
  108. # Logging
  109. #
  110. #modules/logger
  111. modules/sdlog2
  112. #
  113. # Library modules
  114. #
  115. modules/param
  116. modules/systemlib
  117. modules/systemlib/mixer
  118. modules/uORB
  119. modules/dataman
  120. #
  121. # Libraries
  122. #
  123. lib/controllib
  124. lib/mathlib
  125. lib/mathlib/math/filter
  126. lib/ecl
  127. lib/external_lgpl
  128. lib/geo
  129. lib/geo_lookup
  130. lib/conversion
  131. lib/launchdetection
  132. lib/terrain_estimation
  133. lib/runway_takeoff
  134. lib/tailsitter_recovery
  135. lib/DriverFramework/framework
  136. platforms/nuttx
  137. # had to add for cmake, not sure why wasn't in original config
  138. platforms/common
  139. platforms/nuttx/px4_layer
  140. #
  141. # OBC challenge
  142. #
  143. #modules/bottle_drop
  144. #
  145. # Rover apps
  146. #
  147. #examples/rover_steering_control
  148. #
  149. # Demo apps
  150. #
  151. #examples/math_demo
  152. # Tutorial code from
  153. # https://px4.io/dev/px4_simple_app
  154. #examples/px4_simple_app
  155. # Tutorial code from
  156. # https://px4.io/dev/daemon
  157. #examples/px4_daemon_app
  158. # Tutorial code from
  159. # https://px4.io/dev/debug_values
  160. #examples/px4_mavlink_debug
  161. # Tutorial code from
  162. # https://px4.io/dev/example_fixedwing_control
  163. #examples/fixedwing_control
  164. # Hardware test
  165. #examples/hwtest
  166. )
  167. set(config_extra_builtin_cmds
  168. serdis
  169. sercon
  170. )
  171. set(config_io_board
  172. px4io-v2
  173. )
  174. set(config_extra_libs
  175. uavcan
  176. uavcan_stm32_driver
  177. )
  178. set(config_io_extra_libs
  179. )
  180. add_custom_target(sercon)
  181. set_target_properties(sercon PROPERTIES
  182. PRIORITY "SCHED_PRIORITY_DEFAULT"
  183. MAIN "sercon" STACK_MAIN "2048"
  184. COMPILE_FLAGS "-Os")
  185. add_custom_target(serdis)
  186. set_target_properties(serdis PROPERTIES
  187. PRIORITY "SCHED_PRIORITY_DEFAULT"
  188. MAIN "serdis" STACK_MAIN "2048"
  189. COMPILE_FLAGS "-Os")

这样cmake的编译系统就会将这个程序加入到编译链中去了。

在Firmware文件夹下面执行make px4fmu-v2_default,如果不出问题的话,编译成功会显示下面的画面:

然后将硬件连接至虚拟机,执行烧录命令:make px4fmu-v2_default upload

按照上一篇文章所讲的那样同Nuttx shell通信

./mavlink_shell.py /dev/ttyACM0

在nsh中输入help命令之后,你就会在Builtin Apps下面找到hello_world程序

执行hello_world程序:

可以看到输出了hello world!

那么这一切是怎么做到的呢?首先看看代码文件即hello_world.c文件

首先是include

[cpp] view plain copy
  1. #include <px4_config.h>
  2. #include <px4_tasks.h>
  3. #include <px4_posix.h>
  4. #include <unistd.h>
  5. #include <stdio.h>
  6. #include <poll.h>
  7. #include <string.h>

这些库文件你可以认为是编写基于Nuttx操作系统修改的px4程序程序必不可少的库文件包含(其实px4团队修改了不少Nuttx操作系统的东西,使其使用更加方便,所以这些程序并不是真正意义上的Nuttx程序)

然后是main函数(这里要提醒一下广大同学,可能px4基于stm32的编译器语法规则过于严格,所以在编写一个函数之前,必须要去申明这个函数,即使这个函数是main函数也要申明,不然编译报错,无法通过)

[cpp] view plain copy
  1. int hello_world_main(int argc, char *argv[]){
  2. PX4_INFO("hello world!");
  3. return 0;
  4. }

可以看到基于Nuttx操作系统的main函数和其它系统的命名有很大不同,但也有自己的规律,那就是函数名+_+main,即 name_main(),程序主函数里的参数(int argc, char *argv[])和其它系统main函数所带的参数没什么不同(如果不懂main函数带形参的同学最好自己百度一下,因为px4的那些程序基本都带参数的)。

PX4_INFO();是一个类似于printf的函数(事实上他就是是基于printf实现的),用来输出PX4的一些信息的。

再来看看CMakeLists.txt文件

[cpp] view plain copy
  1. px4_add_module(
  2. MODULE examples__hello_world
  3. MAIN hello_world
  4. STACK_MAIN 2000
  5. SRCS
  6. hello_world.c
  7. DEPENDS
  8. platforms__common
  9. )

从字面上可以了解到每个程序在CMake里面都是一个模块,最后总的Cmake文件会去自动将这些模块添加到最后的生成的Makefile文件里面。所以我们要做的就是把我们写的模块的一些属性描写清楚,然后将其注册到nuttx_px4fmu-v2_default.cmake文件当中。

首先是模块名MODULE:这个名字的命名规则是当前文件夹+__+主函数名。

然后是MIAN :这个就是用来确定代码中那个函数为主函数的,填写主函数名即可。

STACK_MAIN:目前暂不清楚用途

SRCS:所用到的源文件。

DEPENDS :依赖。

以上就是关于编写一个基于Nuttx操作系统hello world程序的全过程。

因为我本人对Cmake的一些语法还不是很清楚,所以以上有些东西可能描述的不是很清楚,如有大神,还望指点。

下面一篇文章我将简介一下大家都很关心和迫切想知道的问题,就是px4的飞控程序是怎么开始执行的,程序入口在哪。

px4原生源码学习四--Nuttx 实时操作系统编程相关推荐

  1. px4原生源码学习三--Nuttx实时操作系统的使用

    /*************************************************************************************************** ...

  2. px4原生源码学习一

    接触px4代码有几天了,想把自己所学所想记录下来. px4就不过多介绍了,算得上目前使用的最广泛的开源飞控了.为什么说"px4原生代码学习呢",这还得追溯到被大疆干死的3DR,3D ...

  3. px4原生源码学习-(1)

    接触px4代码有几天了,想把自己所学所想记录下来. px4就不过多介绍了,算得上目前使用的最广泛的开源飞控了.为什么说"px4原生代码学习呢",这还得追溯到被大疆干死的3DR,3D ...

  4. px4原生源码学习二--实时操作系统篇

    /*************************************************************************************************** ...

  5. 漂流瓶语聊视频文字聊天模式app软件原生源码定制开发

    漂流瓶语聊视频文字聊天模式app软件原生源码定制开发 功能首页: 1. 顶部是一个滚动信息条 2. 下面是大海和漂流瓶界面 3. 再往下是心动匹配和扔一个 4. 点击心动匹配之后,进入匹配页面,配对成 ...

  6. 2021最新4合1即时通讯IM源码-服务端+PC+WEB+安卓+IOS完整原生源码

    介绍: 20214合1即时通讯IM源码 服务端+PC+WEB+安卓+IOS完整原生源码 附完整开发文档+视频搭建教程. 注意:此源码亲测可用,他处有小问题,我们已经修复.任何源码,难免有瑕疵,但不影响 ...

  7. NuttX实时操作系统

    NuttX 是一个实时操作系统(RTOS),其重点遵从特定的标准并且尽量小型化.可伸缩良好且可适应从8位到32位单片机环境.Nuttx主要遵循的标准是 Posix和ANSI标准.其他的一些来自于Uni ...

  8. javashop源码百度云,java多用户商城原生源码,javamall电商系统

    java商城系统-小程序商城-javab2b2c系统-新零售分销商城-零售商城-o2o商城系统-拼团商城 商城源码,b2b2c,多商户商城系统,网上商城系统,电子商务系统,javashop,网店系统

  9. 手机直播开发杂谈之:直播原生源码+APP+直播系统推流SDK(Android)

    情不知所起而一往情深 心不知所动而生死相许 先朗诵两句诗词抒发一下美好的心情,正如两句诗词一样,我的心慢慢的也被这个自媒体时代的直播网络所偷走,时代的变化注定这个时代的文化,下面是我对直播开发一些浅显 ...

最新文章

  1. OpenCV边缘检测专题
  2. 数据结构与算法 / 红黑树
  3. Spring管理的Hibernate事件监听器
  4. PagerSwitch tab样式加上下拉刷新(一)
  5. 网站内容收录不稳定/不收录的原因分析
  6. 机器学习系列文章-决策树
  7. transforms.Compose,transforms.ToTensor(),transforms.Normalize()的含义与原理
  8. php天气预报小偷,帮朋友写的PHP天气预报小偷程序
  9. 网络技能大赛-2018年国赛真题[2018年全国职业技能大赛高职组计算机网络应用赛项真题-I卷]路由交换部分答案详解
  10. 奥的斯电梯服务器自动呼梯,奥的斯外呼电梯控制系统说明
  11. #CF div2 1670D Very Suspicious题解(思维+贪心)
  12. 解决None of the constructors found with ‘Autofac.Core.Activators.Reflection.DefaultConstructorFinder’
  13. 最新版YOLOv6训练自己的数据集(超详细完整版!)
  14. 未来瞭望 | 智能超表面:致敬(RISpect)6G
  15. android activity 后的形式 藏
  16. 【QT】实现本地音乐播放器
  17. 计算机械转速,机械制造装备设计举例-计算转速.ppt
  18. U盘启动PE 华硕X205TA安装 win10/win8
  19. 紫光展锐驱动之sensorhub调试
  20. 中易项目管理系统,辅助项目经理规范管理项目的小助手

热门文章

  1. col-lg-8 col-lg-offset-2
  2. excel 插入图片 NPOI
  3. ASP.NET MVC网站学习问题积累(一)
  4. tcpdump使用实例——基于ip统计流量
  5. windows残留软件卸载
  6. 2修改字段名_DevExpress ASP.NET v18.2新功能详解(二)
  7. [Android] 给图像添加相框、圆形圆角显示图片、图像合成知识
  8. LeetCode Algorithm 389. 找不同
  9. 对于一颗具有n个结点,度为4的树来说,( )
  10. 百练4148:生理周期