本帖最后由 老鸟 于 2023-3-25 18:50 编辑
NuttX 是一个实时操作系统(RTOS),强调标准兼容和小型封装,具有从8位到32位微控制器环境的高度可扩展性。
NuttX 主要遵循 Posix 和 ANSI 标准,可以说是所有RTOS中对posix兼容性最高的。
直白点的说就是很多的linux应用程序可以通过简单的修改或不修改直接运行在nuttx中。
小米的Vela系统就是基于nuttx打造的。
nuttx一般是在linux下开发(也可以在windows下,但没尝试过),其开发方式与不使用设备树的linux开发非常相似,
具体的环境搭建过程就不简述了,官网就有教程,这里主要是基于我自己画的一块apm32f407板子的移植
一、芯片级移植:
1.apm32f407属于cortex-m内核,故在nuttx/arch/arm的src和include下新建apm32文件夹 2.参考stm32,将arch/arm/src/stm32下的Make.defs和Kconfig复制到apm32下 3.查看Make.defs,发现有很有源文件直接被添加到了编译选项中,根据mcu的一般配置流程可知最简的系统中仅仅rcc、flash、irq、heap、io、serial等是必须的,而apm32f407是直接兼容stm32f407的,故可以将以下源文件从stm32中复制过来并将stm32替换成apm32。根据启动流程可知,汇编完后会进入__start()函数,故apm_32_start.c也需要复制。其他不必须的文件可从Make.defs中移除,后续有需要再添加
apm32_allocateheap.c、apm32_start.c、apm32_rcc.c、apm32_lse.c、apm32_lsi.c、apm32_gpio.c、apm32_exti_gpio.c、apm32_flash.c、apm32_irq.c、apm32_lowputc.c、apm32_waste.c、apm32_ccm.c、apm32_serial.c、apm32_timerisr 4.复制其他文件: 总的原则就是查看上述必须文件内容,其包含引用其他文件(源文件或头文件等)就从stm32中复制到apm32对应位置,并根据芯片的实际情况做一些修改。这一步的工作量会比较大
5.修改Kconfig文件: 根据apm32f407手册修改芯片外设配置情况(因apm32f407兼容stm32f407,故可以直接删除文件中非407的部分或者不修改)
6.到此处,基本的文件已添加并修改,后续只需要根据编译情况来添加或修改对应的文件,但此时编译器还无法链接到apm32,需将apm32添加到配置文件。修改arch/arm/Kconfig 在Prompt “ARM MCU selection”该choice段内,参考stm32添加apm32:
config ARCH_CHIP_APM32
bool "Geehy APM32 F1/F4"
select ARCH_HAVE_MPU
select ARCH_HAVE_FETCHADD
select ARCH_HAVE_I2CRESET
select ARCH_HAVE_HEAPCHECK
select ARCH_HAVE_PROGMEM
select ARCH_HAVE_SPI_BITORDER
select ARCH_HAVE_TICKLESS
select ARCH_HAVE_TIMEKEEPING
select ARM_HAVE_MPU_UNIFIED
select ARMV7M_HAVE_STACKCHECK
---help---
Geehy APM32 architectures (ARMCortex-M3/4).
在config ARCH_CHIP下添加: default "apm32" ifARCH_CHIP_APM32
在最后指定源文件: if ARCH_CHIP_APM32
source"arch/arm/src/apm32/Kconfig"
endif
二、板级移植:
1.在boards/arm/下创建apm32文件夹,将同级目录下stm32/stm32f4discovery复制到apm32下,并重命名为apm32f407-mini 2.修改configs/nsh/defconfig CONFIG_ARCH_BOARD="apm32f407-mini"
CONFIG_ARCH_BOARD_APM32F407_MINI=y
CONFIG_ARCH_CHIP="apm32"
CONFIG_ARCH_CHIP_APM32=y
CONFIG_ARCH_CHIP_APM32F407VG=y
CONFIG_APM32_USART1=y
CONFIG_USART1_RXBUFSIZE=128
CONFIG_USART1_SERIAL_CONSOLE=y
CONFIG_USART1_TXBUFSIZE=128
3.根据板子实际情况修改include/board.h,主要是一些时钟配置、外设引脚配置等
4.根据nuttx启动流程可知,只有apm32_boot.c、apm32_bringup.c、apm32_appinit.c是必须的,故可以将src下的其他xxx.c文件删除
5.在src下编写Makefile文件,添加对上述源文件的编译支持(修改Make.defs无效,暂未找到原因) include$(TOPDIR)/Make.defs
CSRCS =apm32_boot.c apm32_bringup.c
ifeq($(CONFIG_BOARDCTL),y)
CSRCS +=apm32_appinit.c
ifeq($(CONFIG_BOARDCTL_RESET),y)
CSRCS +=apm32_reset.c
endif
endif
include$(TOPDIR)/boards/Board.mk
6.修改apm32f407-mini下的Kconfig,因该配置文件仅针对板级的配置,我们最简系统可以不使用其他东西,故Kconfig下的内容可以移除 7.到此处,板级文件已基本配置,但编译器还无法链接到该板级文件。 修改boards/Kconfig:
在"Select target board"的choice段下添加apm32f407-mini板
config ARCH_BOARD_APM32F407_MINI
bool "Geehy APM32F407-Mini board"
depends on ARCH_CHIP_APM32F407VG
---help---
Geehy APM32F407-Mini board based on theGeehy apm32F407VGT6 MCU.
在config ARCH_BOARD段最后添加:
default "apm32f407-mini" if ARCH_BOARD_APM32F407_MINI
在comment"Board-Specific Options"段最后添加:
ifARCH_BOARD_APM32F407_MINI
source"boards/arm/apm32/apm32f407-mini/Kconfig"
endif
8.到此处移植的基本工作已经完成,后续主要是根据编译情况进行查漏补缺了
三、编译:
在nuttx源码目录下执行:./tools/configure.sh apm32f407-mini/nsh导入配置
执行make menuconfig,按需修改配置后保存
执行make -j16编译系统,根据编译的报错情况处理未修改到位的地方
四、烧录运行
附件放一个本次移植芯片级的和板级的文件夹,只需修改下arch/arm/Kconfig和boards/Kconfig即可使用,consol使用的PA9/10串口1。由于手上只有自己做的这块板子,目前芯片级和板级都只做了这个的支持,如果后续有其他芯片或板子的话再放些其他的移植
|