本文内容是针对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语法,暂未深究。