px4原生源码学习四--Nuttx 实时操作系统编程
?前面說到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? 然后編輯CMakeLists.txt文件
?
[cpp]?view plain?copy最后最重要的是我們要將這個程序注冊到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這樣cmake的編譯系統就會將這個程序加入到編譯鏈中去了。
?在Firmware文件夾下面執行make px4fmu-v2_default,如果不出問題的話,編譯成功會顯示下面的畫面:
?然后將硬件連接至虛擬機,執行燒錄命令:make px4fmu-v2_default?upload
??按照上一篇文章所講的那樣同Nuttx shell通信?
在nsh中輸入help命令之后,你就會在Builtin Apps下面找到hello_world程序
執行hello_world程序:
可以看到輸出了hello world!
那么這一切是怎么做到的呢?首先看看代碼文件即hello_world.c文件
首先是include
[cpp]?view plain?copy
這些庫文件你可以認為是編寫基于Nuttx操作系統修改的px4程序程序必不可少的庫文件包含(其實px4團隊修改了不少Nuttx操作系統的東西,使其使用更加方便,所以這些程序并不是真正意義上的Nuttx程序)
然后是main函數(這里要提醒一下廣大同學,可能px4基于stm32的編譯器語法規則過于嚴格,所以在編寫一個函數之前,必須要去申明這個函數,即使這個函數是main函數也要申明,不然編譯報錯,無法通過)
[cpp]?view plain?copy
可以看到基于Nuttx操作系統的main函數和其它系統的命名有很大不同,但也有自己的規律,那就是函數名+_+main,即?name_main(),程序主函數里的參數(int argc, char *argv[])和其它系統main函數所帶的參數沒什么不同(如果不懂main函數帶形參的同學最好自己百度一下,因為px4的那些程序基本都帶參數的)。
?PX4_INFO();是一個類似于printf的函數(事實上他就是是基于printf實現的),用來輸出PX4的一些信息的。
?再來看看CMakeLists.txt文件
[cpp]?view plain?copy
從字面上可以了解到每個程序在CMake里面都是一個模塊,最后總的Cmake文件會去自動將這些模塊添加到最后的生成的Makefile文件里面。所以我們要做的就是把我們寫的模塊的一些屬性描寫清楚,然后將其注冊到nuttx_px4fmu-v2_default.cmake文件當中。
? 首先是模塊名MODULE:這個名字的命名規則是當前文件夾+__+主函數名。
??然后是MIAN :這個就是用來確定代碼中那個函數為主函數的,填寫主函數名即可。
? STACK_MAIN:目前暫不清楚用途
? SRCS:所用到的源文件。
? DEPENDS :依賴。
?以上就是關于編寫一個基于Nuttx操作系統hello world程序的全過程。
因為我本人對Cmake的一些語法還不是很清楚,所以以上有些東西可能描述的不是很清楚,如有大神,還望指點。
下面一篇文章我將簡介一下大家都很關心和迫切想知道的問題,就是px4的飛控程序是怎么開始執行的,程序入口在哪。
總結
以上是生活随笔為你收集整理的px4原生源码学习四--Nuttx 实时操作系统编程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: px4原生源码学习三--Nuttx实时操
- 下一篇: NuttX 启动流程