nuttx-10.2.0笔记

本文内容是针对nuttx-10.2.0的笔记。
nuttx-10.2.0下内核工程目录已经和apps工程目录分开了。
下面内容中的nuttx/指的是解压后内核源文件的根目录,实际上从官网下载后解压的目录是incubator-nuttx-nuttx-10.2.0。

构建时怎么做?
在linux下,按照README.md安装工具链。
在nuttx根目录下,运行tools/configure.sh, 参数自行查阅。
在nuttx根目录下,运行make mconfig
在nuttx根目录下,运行make。

执行make的配置时源码目录下都发生了啥变化?
目标板子的默认配置文件defconfig被拷贝到了nuttx目录下,同时创建了.config文件,.config文件的内容来自defconfig,但又发生了一些变化。目标板子的Make.defs被拷贝到了nuttx目录下。

defconfig来自哪?
来自每个板子的配置目录下。如nuttx\boards\arm\tms570\tms570ls31x-usb-kit\configs\nsh目录下就保存了一个defconfig文件。nsh目录是其中一种配置,可以有多个配置文件,每个需在configs目录下有对应的子目录,子目录名自定,nsh只是默认的一种而已。

nuttx/Make.defs来自哪?
来自配置时指定的板子目录下的具体的配置目录,这个目录在如nuttx\boards\arm\tms570\tms570ls31x-usb-kit\scripts下的位置。nuttx设计的是为每个不同的板子(board)定义对应的Make.defs文件。

nuttx/Make.defs主要内容是什么?
其包含了以下文件,以tms570ls31x-usb-kit板子为例。
include $(TOPDIR)/.config
include $(TOPDIR)/tools/Config.mk
include $(TOPDIR)/arch/arm/src/armv7-r/Toolchain.defs
可知,其包含了默认的配置文件,芯片对应的工具链定义文件(Toolchain.defs)。同时定义了一些编译、链接选项。

谁拷贝的defconfig和Make.defs?
在nuttx根目录下运行tools/configure.sh时,这个脚本拷贝的。根据传入的参数去找到defconfig和Make.defs文件各自对应的目录,并拷贝到nuttx根目录下。同时会在nuttx根目录下新建一个.config文件,内容来自defconfig,但是又多了一些定义,包括但不限于CONFIG_APPS_DIR。

工具链定义文件在哪保存着?
每个cpu架构下有对应的这个文件。保存路径类似nuttx\arch\arm\src\armv7-r这样的目录。

在linux下为了能够进行UI方式的配置,需要装什么包?
kconfig-frontends ,具体安装要求见nuttx/README.md文件。

nuttx/Makefile都干了些什么?
nuttx/Makefile里其实没干啥事,几十行的内容。1、包含.config文件;2、定义TOPDIR ;3、包含核心的Makefile,判断编译环境是linux还是Windows,根据情况include tools/Makefile.unix或tools/Makefile.win。
主要内容如下:

# Check if the system has been configured

ifeq ($(wildcard .config),)
.DEFAULT default:
	@echo "NuttX has not been configured!"
	@echo "To configure the project:"
	@echo "  tools/configure.sh <config>"
	@echo "For a list of available configurations:"
	@echo "  tools/configure.sh -L"
else
include .config

# Build any necessary tools needed early in the build.
# incdir - Is needed immediately by all Make.defs file.

TOPDIR := ${shell echo $(CURDIR) | sed -e 's/ /\\ /g'}
DUMMY  := ${shell $(MAKE) -C tools -f Makefile.host incdir \
          INCDIR="$(TOPDIR)/tools/incdir.sh"}

# Include the correct Makefile for the selected architecture.

ifeq ($(CONFIG_WINDOWS_NATIVE),y)
include tools/Makefile.win
else
include tools/Makefile.unix
endif
endif

tools/Makefile.unix都干了些什么?
主要内容如下:

include $(TOPDIR)/Make.defs 
#$(TOPDIR)/Make.defs的来源在前面已说,例如来自nuttx\boards\arm\tms570\tms570ls31x-usb-kit\scripts\Make.defs

include tools/Directories.mk
include tools/ProtectedLibs.mk
include tools/KernelLibs.mk
include tools/FlatLibs.mk
#另外Makefile.unix文件里还定义了各种make目标:
config: apps_preconfig
	$(Q) APPSDIR=${CONFIG_APPS_DIR} EXTERNALDIR=$(EXTERNALDIR) kconfig-conf Kconfig

oldconfig: apps_preconfig
	$(Q) APPSDIR=${CONFIG_APPS_DIR} EXTERNALDIR=$(EXTERNALDIR) kconfig-conf --oldconfig Kconfig

olddefconfig: apps_preconfig
	$(Q) APPSDIR=${CONFIG_APPS_DIR} EXTERNALDIR=$(EXTERNALDIR) kconfig-conf --olddefconfig Kconfig

menuconfig: apps_preconfig
	$(Q) APPSDIR=${CONFIG_APPS_DIR} EXTERNALDIR=$(EXTERNALDIR) kconfig-mconf Kconfig

nconfig: apps_preconfig
	$(Q) APPSDIR=${CONFIG_APPS_DIR} EXTERNALDIR=$(EXTERNALDIR) kconfig-nconf Kconfig

注:kconfig-conf、kconfig-mconf、kconfig-nconf来自安装的kconfig-frontends包。

构建实验结果,对tms570ls31x-usb-kit的编译不顺利,原因有:1、工具链是大端的,需要使用buildroot中的armeb-nuttx-eabi工具链;2、源码直接编译不成功,部分头文件需要创建符号链接;3、部分c代码编译也有问题。
构建实验结果,对imx6/sabre-6quad的编译很顺利。

注:对armv8系列的支持已经有了,目前是armv8-m架构(ARM的低功耗架构)。具体的芯片是ST公司的stm32l5(Cortex-M33)系列,具体芯片是nucleo-l552ze和stm32l562e-dk。

注:按照README,在Windows原生状态和Windows下cygwin环境下构建,均失败了,原因是进行menuconfig时,kconfig工具解析部分Kconfig文件时提示出错。猜测是README里提及的Windows下的kconfig工具不能解析Kconfig语法,暂未深究。

上一篇:Linux——Linux驱动之使用Menuconfig进行Linux内核的裁剪总结(Menuconfig操作、Kconfig和.config文件的关系)


下一篇:make menuconfig错误——make[2]: *** [scripts/kconfig/lexer.lex.c] 错误 127