为什么px4源码里找不到main函数?——从hello sky理解px4的编程规范

2023-05-16

如果你刚自学了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[]);。导出的目的是将函数对nuttx系统进行注册(函数名输出到链接器Linker),之后,才能对主函数进行定义。
但有的程序在声明函数的时候还在开头包含一个extern "C",这是告诉编译器按c语言规则编译这段函数而不是c++。
包含主程序的文件名称可以是任意的,如:

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
#			)
#
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么px4源码里找不到main函数?——从hello sky理解px4的编程规范 的相关文章

  • 【cmake学习】cmake 引入第三方库(头文件目录、库目录、库文件)

    程序的编写需要用到头文件 xff0c 程序的编译需要lib文件 xff0c 程序的运行需要dll文件 xff0c 因此cmake引入第三方库其实就是将include目录 lib目录 bin目录引入工程 目录 1 find package x
  • T265学习之路(1)---环境搭配及Realsense_viewer安装

    T265学习入门参考了很多资料 xff0c 其中主要以这位博主的文章进行学习 xff0c 步骤和解答很详细 xff0c 再次感谢提供这么好的学习资料 xff0c 链接如下 xff1a 原创链接 个人学习路径如下 xff1a 一 安装步骤 1
  • T265学习之路(4)---realsense_ros安装及案例实现

    一 Realsense ros功能包的安装 1 1下载realsense ros源码 在Ros工作空间的src文件夹下输入命令 xff1a span class token function git span clone https git
  • 想进大厂必看的计算机类书单

    从大一开始 xff0c 我就很喜欢看各种各样的书 xff0c 不仅是技术的 xff0c 也有散文 越读感触越深 xff0c 发现书不在多 xff0c 而在于经典 xff0c 例如计算机传统黑皮书 xff0c CSAPP等等 你在不同时间读同
  • 数组

    数组 常用创建数组方式 xff1a span class token number 1 span 创建数组的同时 xff0c 制定数组中的内容 数据类型 span class token punctuation span span clas
  • Zookeeper的安装

    Zookeeper的安装 注意 xff1a 安装 zookeeper 前一定要先安装 jdk 在Linux上安装 装备一个本地虚拟机 xff0c 我使用的是 VMware Workstation 新建 CentOS7 的虚拟机 xff08
  • docker的安装

    安装docker 第 1 步 xff1a 将 yum 包更新到最新 xff0c 更新过程中出现输入的界面都输入 y 命令 xff1a yum update 出现 Complete span class token operator span
  • DOCKER 部署应用

    DOCKER 部署应用 DOCKER 部署应用 DOCKER 部署应用安装 Docker部署 MySQL部署 Tomcat部署 Redis 下面操作没有特别说明 xff0c 都是在虚拟机CentOS7上完成 安装 Docker 第 1 步
  • Docker部署ElasticSearch

    Docker部署ElasticSearch 默认docker已安装且启动 通过 dockerhup 官网查询docker内提供的 ElasticSearch 镜像 官网 xff1a https registry hub docker com
  • 酒旅项目总结

    项目里程碑 项目里程碑下图是项目原计划的时间线 项目技术架构 下面介绍各个技术 xff1a DNS xff08 Domain Name Server xff0c 域名服务器 xff09 是进行域名 domain name 和与之相对应的IP
  • MySQL环境搭建

    MySQL环境搭建 1 MySQL的下载 MySQL的4大版本 MySQL Community Server 社区版本 xff0c 开源免费 xff0c 自由下载 xff0c 但不提供官方技术支持 xff0c 适用于 大多数普通用户 MyS
  • 通过 SMOTE 及其变体过采样处理不平衡数据

    在这篇文章中 xff0c 我将解释使用 SMOTE SVM SMOTE BorderlineSMOTE K Means SMOTE 和 SMOTE NC 进行过采样 上采样 我将通过一个实际示例进行解释 xff0c 在该示例中我们应用这些方
  • SNMP错误记录:No more variables left in this MIB view (It is past the end of the MIB tree)

    MIB和OID对应关系查看命令 xff1a snmptranslate Tz m all SNMP测试 本地测试 xff1a snmpwalk v 2c c public 64 123 localhost 1 3 6 1 2 1 25 3
  • 一个Docker面试题目

    编写Dockerfile脚本编译镜像 xff0c 运行容器后实现对现有 mysql 数据库做备份 环境信息 xff1a mysql数据库地址192 168 0 10 端口 6600 用户 testuser 密码 123456 需要备份的数据
  • Windows程序设置自启动

    Windows程序设置自启动 在Windows系统中 有几种方法可以设置一个程序在系统启动时自动启动 将程序添加到开机启动文件夹 Win 43 R打开运行框 输入shell startup打开开机启动文件夹 然后将你想自动启动的程序快捷方式
  • Windows Server 程序设置自启动(用户不登录)

    Windows Server 程序设置自启动 xff08 用户不登录 xff09 在Windows Server中 想要在系统启动时自动启动一个程序 但不依赖用户登录 可以使用以下几种方法 将程序添加为服务 这是Windows Server
  • linux时间同步脚本

    linux时间同步脚本 span class token function bash span span class token comment bin bash span span class token comment 时间同步服务器
  • 华三网络设备查看命令

    华三网络设备查看命令 华三网络设备的配置和管理可以通过设备的管理地址进行 常用的页面有 状态监控 用于查看设备运行状态 CPU利用率 内存利用率 温度等信息接口配置 用于配置接口属性 如速率模式 DUPLEX模式 description等I
  • rsync 远程删除文件

    rsync 远程删除文件 rsync是一个强大的远程数据同步工具 它不仅可以实现远程文件复制 也可以实现远程文件删除 要使用rsync实现远程删除文件 可以使用如下命令 span class token function bash span
  • 华为openEuler 22.03 LTS系统的欢迎讯息

    华为欧拉系统的欢迎讯息 华为EulerOS系统中的欢迎讯息是通过 etc profile文件来定义和设置的 该文件会在用户登录后读取并执行 EulerOS的 etc profile文件中定义了prompt函数来设置PS1提示符 并通过PRO

随机推荐

  • bash的进程与欢迎讯息自定义

    在bash shell中 可以通过多种方式自定义欢迎讯息和提示符 主要有 修改 etc profile文件 该文件在用户登录后执行 定义了PROMPT COMMAND和PS1提示符 可以修改其内容实现自定义欢迎讯息和提示符 例如 修改为 s
  • 使用crontab命令同步时间

    crontab命令可以用于在Linux系统中定期同步时间 常用的时间同步方法有 1 使用ntpdate同步时间 可以添加如下crontab任务 5 usr sbin ntpdate time nist gov http xn 5time r
  • GitHub+ Docker Hub 拉取国外镜像

    一 背景 我们在拉取国外镜像 xff0c 例如在搭建 Kubernetes 的时候需要使用到来自于 Google xff1a gcr io google containers kube apiserver amd64 这样的镜像 xff0c
  • 如何熟悉weblogic

    要熟悉WebLogic 可以从以下几个方面入手 理解WebLogic的基本架构 WebLogic是Oracle的中间件产品 用于开发和部署企业级Java EE应用程序 它的基本架构由管理服务器 托管服务器和节点管理器组成 理解每个组件的作用
  • docker overlay2 是存放什么的?

    docker overlay2是Docker中的存储驱动之一 用于管理镜像和容器层的数据 它使用最小存储空间来存储像层这样的临时数据 overlay2本质上是多层存储驱动 它将镜像和容器层都视为独立的匿名临时文件系统 然后通过联合挂载将这些
  • Google浏览器下载地址

    官网下载 https www google cn chrome 旧版本下载地址 https www chromedownloads net chrome64win https www slimjet com chrome google ch
  • docker网卡的IP地址修改

    Docker容器启动后 默认会在主机上分配一个网卡 该网卡对应一个网络命名空间 并在这个网络命名空间下随机分配一个IP地址 如果想修改Docker容器的IP地址 有以下几种方法 修改Docker宿主机的Docker网络 可以在Docker主
  • SNMP连接失败

    SNMP连接失败常见的原因有以下几个 版本不匹配 SNMP有SNMPv1 SNMPv2c SNMPv3等版本 客户端和服务器版本必须匹配 否则会连接失败 需要确认客户端和服务器所支持的SNMP版本 选择一个双方都兼容的版本进行连接 社区名不
  • windows安装GO语言环境

    GO语言版本 Windows 平台和 Mac 平台推荐下载可执行文件版 xff0c Linux 平台下载压缩文件版 版本 xff1a 1 16 8 出现上面这个界面就说明已经安装好了 查看GO版本 可以打开终端窗口 xff0c 输入go v
  • 3par命令集

    3PAR是惠普公司的存储产品 它提供了基于CLI的管理终端来管理存储系统 主要的3PAR CLI命令有 show 显示系统信息 showsys 显示系统概况信息shownode 显示节点信息showport 显示端口信息showdisks
  • 华为欧拉系统RPM强制卸载libffi-devel

    查看欧拉系统有没有安装这个包 yum list span class token operator span span class token function grep span libffi devel 准备离线下载时 xff0c 发现
  • 最全Arrays.sort函数举例

    Arrays sort 的作用是对括号中的数组进行排序 xff0c 时间复杂度O xff08 n logn xff09 xff0c 方法返回值为void 是在原来数组的空间基础上进行升序排序 xff0c 因此不需要定义一个数组接收它 xff
  • 【无标题】驱动设计思想P9- linux驱动(韦东山)

    linux驱动 xff08 韦东山 xff09 驱动设计思想P9 linux 驱动 61 驱动框架 43 硬件操作 61 驱动框架 43 单片机 面向对象 字符设备驱动程序抽象出file operation结构体对硬件部分抽象为led op
  • Ubuntu16.04 安装ROS 过程中遇到的问题

    操作系统 xff1a Ubuntu16 04 ROS版本 xff1a Kinetic 纯入门 xff0c 安装过程错误百出 xff0c 几乎是一步一个报错 xff0c 每执行一个命令就要各种查找解决方法 xff0c 终于用一个下午加晚上的时
  • Github学习心得(3):项目的修改

    书接上回Github创建版本库 xff0c 我们已经成功地创建了一个版本库 xff0c 并且上传了readme txt文件 在实际项目中 xff0c 我们总是要对代码进行修改 xff0c 那么就需要及时地更新Github版本库中的文件 以本
  • 解决Keil全局搜索时无法跳转的问题

    检查一下自己的工程文件路径中是否有英文括号 xff0c 如果有则删掉
  • 阿木实验室的普罗米修斯仿真平台搭建的难点和坑点

    普罗米修斯仿真实验平台搭建的难点解决 0 我为什么要辛苦搭环境 xff1f 前一段时间阿木实验室提供了一个搭好环境的镜像 xff0c 凭阿木币购买 xff0c 是真的好用 xff0c 阿木币嘛 xff0c 签一签道就会有 关于这个镜像其实还
  • Visual Studio Code无法监视此大工作空间中的文件更改的解决办法

    Visual Studio Code无法监视此大工作空间中的文件更改 xff08 错误ENOSPC xff09 当您看到此通知时 xff0c 表明VS Code文件监视程序用尽了句柄 xff0c 因为工作空间很大并且包含许多文件 在调整平台
  • Ubuntu增加交换分区即swap方法

    用交换文件的方式添加交换分区 xff0c 如下 sudo su 进入管理员模式 xff0c 会提示输入密码 cd usr mkdir swap cd swap dd if 61 dev zero of 61 swapfile bs 61 1
  • 为什么px4源码里找不到main函数?——从hello sky理解px4的编程规范

    如果你刚自学了c 43 43 xff0c 准备开始看px4的源码 xff0c 但翻来覆去找了半天没有找到一个标准的main 究其原因 xff0c 在nuttx系统里 xff0c 程序入口不是main xff0c 所以找不到任何main 如果