PX4飞控--Nuttx构建模式及menuconfig配置

本文讲述了作者在研究px4项目时,遇到uORB消息机制的学习过程,涉及Run函数中的参数更新逻辑,以及Nuttx系统的menuconfig配置,特别关注了CONFIG_BUILD_FLAT变量对内存组织的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

写在之前

        终于想好第二篇该写什么东西了,这个过程对我来说极其不好受。一个人瞎琢磨的坏处就是没有方向,无数次重复遇到问题--迷茫--摸索+查资料--有一点方向--再次遇到问题的过程。直到同类型的问题多次出现,才会有那么一点体会。不过,人嘛,就是要跟自己较劲不是。

第一节 问题的出现       

        原本是想接着多旋翼姿态控制往下写,但是为什么第二篇写这种和第一篇离题万里的玩意呢?其中的心路历程就是第一节的内容了。
        在知道了模块如何运行后,我第一步是准备看对应的Run函数。在Run函数里,就涉及到px4另一个具有代表性的功能--uORB消息机制。于是乎,我就回头开始准备全面学习一下uORB消息(原本这就是第二篇的内容,可惜天不遂人愿),先来看它是如何实现的。在Run函数中,第一步是老样子,判断模块是否已经在运行了(这里是通过对回调函数的注册与否来进行判断,不是这篇的重点就先跳过),判断过后就进行了一个消息的检查更新。

	if (_parameter_update_sub.updated()) {
		// clear update
		parameter_update_s param_update;
		_parameter_update_sub.copy(&param_update);

		updateParams();
		parameters_updated();
	}

        对_parameter_update_sub.updated()这个函数进行深入分析,它进行判断的依据是消息是否已经发布,同时距离上一次更新的时间差是否足够。

	bool updated()
	{
		if (advertised() && (hrt_elapsed_time(&_last_update) >= _interval_us)) {
			return _subscription.updated();
		}

		return false;
	}

        在advertised()函数中,首先对valid函数的返回值进行判定(valid函数则是通过_node成员变量判断节点是否有效),如果节点有效则进行消息检查,是否已经发布;若节点无效,则先进行订阅,再进行消息检查。

bool valid() const { return _node != nullptr; }

bool advertised()
	{
		if (valid()) {
			return Manager::is_advertised(_node);
		}

		// try to initialize
		if (subscribe()) {
			// check again if valid
			if (valid()) {
				return Manager::is_advertised(_node);
			}
		}

		return false;
	}

        而当我想继续分析Manager::is_advertised函数的时候就出了岔子。is_advertised是uORB::Manager类的一个成员函数,而在声明成员函数时,根据配置变量(是否配置CONFIG_BUILD_FLAT)不同时,进行了不同的声明。而这两个不同声明的函数,实现方式完全不同。

#if defined(CONFIG_BUILD_FLAT)

	static bool is_advertised(const void *node_handle) { return static_cast<const DeviceNode *>(node_handle)->is_advertised(); }

#else

	static bool is_advertised(const void *node_handle);

        而这种根据配置变量进行不同声明的方式,已经不是第一次看到。因此,在这里,跳转进行对系统配置变量进行一下学习。

第二节 Nuttx系统menuconfig

        查阅资料得知,CONFIG_BUILD_FLAT变量对应的Flat模式是Nuttx系统三种构建模式之一,这里就引用大佬的文章了(https://zhuanlan.zhihu.com/p/589368549?utm_id=0)。

        知道这一点后,随后我就想查阅一下相关的源代码。翻了个底朝天,在以下文件找到“C:\Users\cstest04\Desktop\PX4\platforms\nuttx\NuttX\nuttx\Kconfig”如下代码。

choice
	prompt "Memory organization"
	default BUILD_FLAT

config BUILD_FLAT
	bool "Flat address space"
	---help---
		Build NuttX as one large, executable "blob".  All of the code
		within the blob can interrupt with all of the other code within
		the blob.  There are no special privileges, protections, or
		restraints.

config BUILD_PROTECTED
	bool "NuttX protected build"
	depends on ARCH_USE_MPU
	select LIB_SYSCALL
	select BUILD_2PASS
	---help---
		Builds NuttX and selected applications as two "blobs":  A protected,
		privileged kernel blob and a separate unprivileged, user blob.  This
		requires use of the two pass build with each blob being build on
		each pass.

		NOTE:  This build configuration requires that the platform support
		a memory protection unit (MPU).  Support, however, may not be
		implemented on all platforms.

config BUILD_KERNEL
	bool "NuttX kernel build"
	depends on ARCH_USE_MMU && ARCH_ADDRENV
	select BUILD_LOADABLE
	select LIB_SYSCALL
	---help---
		Builds NuttX as a separately compiled kernel.  No applications are
		built.  All user applications must reside in a file system where
		they can be loaded into memory for execution.

		NOTE:  This build configuration requires that the platform support
		a memory management unit (MMU) and address environments.  Support,
		however, may not be implemented on all platforms.

endchoice # Build configuration

        而关于这段代码的使用,就是menuconfig功能。它是Linux内核的一个配置工具,用于对内核的编译选项进行配置。在menuconfig的交互界面中,用户可以根据需要进行内核选项的开启、关闭、配置等操作。menuconfig基于Kconfig实现,NuttX 的主 Kconfig 文件是 nuttx/Kconfig(就是前一节提到的Kconfig文件)。主 Kconfig 文件调用各级子目录的 Kconfig 文件和应用程序目录的 Kconfig 文件,形成树状关系。(关于这个功能就没有自己从头了解,参考大佬的文章https://www.cnblogs.com/fah936861121/p/7229522.html

        随后,我在虚拟机上尝试使用menuconfig功能,发现Linux系统下的make menuconfig命令无法工作,在查阅px4帮助文档后了解到需要指定需要构筑的板级配置,如make px4_fmu_v2 menuconfig(想来也是,这么多硬件,不指明谁知道该按什么配置构筑,这里参考https://docs.px4.io/main/en/hardware/porting_guide_config.html


写在最后

        这一篇写的非常困难,自己懈怠,也受到很多身边的事情影响,分散了精力。同时个人学习的弊端也暴露无疑,当问题出现时,我意识到应该是在构筑的阶段,但由于没有对px4的全面认识,走了很多弯路(我甚至最开始是从主Makefile文件开始的分析)。这也导致这篇文章虎头蛇尾,调子起高了,最后发现是单独的功能,并不是px4框架内的内容,自己也非常痛苦,算是草草收尾(毕竟如果丢在这里,自己心里膈应)。接下来就是好好分析uORB消息,就应该会清晰些了。

        不管怎么样,第二篇到此结束,至少写完了不是。关山难越,谁悲失路之人,自己走吧。接下来,让我们去码头整点薯条,respect。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值