1. 程式人生 > 其它 >為什麼px4原始碼裡找不到main函式

為什麼px4原始碼裡找不到main函式

技術標籤:px4c++嵌入式自動駕駛神經網路機器學習

如果你剛自學了c++,準備開始看px4的原始碼,但翻來覆去找了半天沒有找到一個標準的main(){}
究其原因,在nuttx系統裡,程式入口不是main(){},所以找不到任何main(){}
如果想讓編譯器知道我寫了一段函式就是主函式,就是程式的入口,該怎麼做?
當然是按照px4的標準來寫,這樣編譯器才會知道這就是主函式。

1.__EXPORT int name_main(int argc, char *argv[]);  必須使用__EXPORT對其進行匯出
2.int name_main(int argc, char *argv[
]); 主函式名必須是<功能名>_main 必須帶引數int argc, char *argv[]

以“px4_simple_app”為例:
一個功能要以資料夾的形式存在,資料夾名稱就是功能名稱,資料夾中包含程式部分和CMakeLists部分。在這裡插入圖片描述
1.px4_simple_app.c :
程式部分就是功能的具體實現,程式檔案的名稱不作要求,但主函式名必須為<功能名>_main,如功能為px4_simple_app,主函式相應命名為px4_simple_app_main

,主函式必須帶引數px4_simple_app_main(int argc, char *argv[]),必須用__EXPORT對主函式進行匯出__EXPORT int px4_simple_app_main(int argc, char *argv[]);。之後,才能對主函式進行定義。
包含主程式的檔名稱可以是任意的,如:

extern "C" __EXPORT int hello_main(int argc, char *argv[]);
int hello_main(int argc, char *argv[])

包含這段程式的檔名其實叫hello_start.cpp

,但功能名也就是資料夾名稱必須為hello

PX4_INFOprintf的px4版本。

#include <px4_platform_common/log.h>
__EXPORT int px4_simple_app_main(int argc, char *argv[]);
int px4_simple_app_main(int argc, char *argv[])
{
	PX4_INFO("Hello Sky!");
	return OK;
}

2.CMakeLists.txt
在這裡插入圖片描述
功能px4_simple_app在資料夾examples內

格式:
MODULE 功能父資料夾名稱__功能名稱:MODULE examples__px4_simple_app
MAIN 功能名稱:MAIN px4_simple_app
SRCS是原始檔列表,包含實現功能所需的程式檔案,這裡只包含一個px4_simple_app.c
DEPENDS是依賴庫列表

px4_add_module(
	MODULE examples__px4_simple_app
	MAIN px4_simple_app
	SRCS
		px4_simple_app.c
	DEPENDS
	)

所有的格式說明已經搬過來了放在文章末尾。

在nuttx系統中怎麼啟動這個程式,就得先了解一個概念,nuttx真的是一個作業系統,他甚至有自己的shell,叫nsh
把程式匯入到px4的過程不叫燒寫,叫上傳。上傳的檔案不叫韌體,叫應用,你所做的事就是給nuttx系統安裝了一個應用。
按照官網的步驟把上邊的的程式上傳到px4裡邊後就自動連線到nsh了(對於sitl使用者,可以直接在原始碼目錄下make px4_sitl gazebo,連線到的shell叫pxh),鍵入help

nsh> help
  help usage:  help [-v] [<cmd>]
  [           df          kill        mkfifo      ps          sleep       
  ?           echo        losetup     mkrd        pwd         test        
  cat         exec        ls          mh          rm          umount      
  cd          exit        mb          mount       rmdir       unset       
  cp          free        mkdir       mv          set         usleep      
  dd          help        mkfatfs     mw          sh          xd          
Builtin Apps:
  reboot
  perf
  top
  ..
  px4_simple_app
  ..
  sercon
  serdis

help usage列表裡是現在可以使用的命令,包含一些常見的linux命令:cd、cp、mv、rm、ls...但這不是重點,重點是下面的Builtin Apps列表。
可以在Builtin Apps列表裡找到我們剛編譯好的專案px4_simple_app
nsh中輸入

 px4_simple_app

得到輸出顯示

Hello Sky!
#=============================================================================
#
#	px4_add_module
#
#	This function builds a static library from a module description.
#
#	Usage:
#		px4_add_module(MODULE <string>
#			MAIN <string>
#			[ STACK_MAIN <string> ]
#			[ STACK_MAX <string> ]
#			[ COMPILE_FLAGS <list> ]
#			[ INCLUDES <list> ]
#			[ DEPENDS <string> ]
#			[ SRCS <list> ]
#			[ MODULE_CONFIG <list> ]
#			[ EXTERNAL ]
#			[ DYNAMIC ]
#			)
#
#	Input:
#		MODULE			: unique name of module
#		MAIN			: entry point
#		STACK			: deprecated use stack main instead
#		STACK_MAIN		: size of stack for main function
#		STACK_MAX		: maximum stack size of any frame
#		COMPILE_FLAGS		: compile flags
#		LINK_FLAGS		: link flags
#		SRCS			: source files
#		MODULE_CONFIG		: yaml config file(s)
#		INCLUDES		: include directories
#		DEPENDS			: targets which this module depends on
#		EXTERNAL		: flag to indicate that this module is out-of-tree
#		DYNAMIC			: don't compile into the px4 binary, but build a separate dynamically loadable module (posix)
#		UNITY_BUILD		: merge all source files and build this module as a single compilation unit
#
#	Output:
#		Static library with name matching MODULE.
#		(Or a shared library when DYNAMIC is specified.)
#
#	Example:
#		px4_add_module(MODULE test
#			SRCS
#				file.cpp
#			STACK_MAIN 1024
#			DEPENDS
#				git_nuttx
#			)
#