Nuttx 开发环境搭建及启动流程分析
NuttX 是一个实时操作系统(RTOS),并且是对接口有着一定要求的系统。原生支持 POSIX 和 ANSI 标准接口,对于这些标准下不可用的接口功能,或不适合嵌入式环境的功能,则采用 Unix 和其他常见 RTOS(如 VxWorks)的标准 API。
Nuttx 支持从8位到32位芯片。采用的开源协议是 Apache2.0 ,也就是完全开源免费的协议。可以使用 menuconfig 进行图形化配置裁剪
nuttx 开发环境搭建(Ubuntu 20.04)
输入如下命令安装编译 nuttx 所需要的依赖组件:
sudo apt install bison flex gettext texinfo libncurses5-dev libncursesw5-dev gperf automake libtool pkg-config build-essential gperf genromfs libgmp-dev libmpc-dev libmpfr-dev libisl-dev binutils-dev libelf-dev libexpat-dev gcc-multilib g++-multilib picocom u-boot-tools util-linux
nuttx 使用 Kconfig 配置裁剪系统。所以需要安装 kconfig-frontends
软件。
apt install kconfig-frontends
工具链安装
apt install gcc-arm-none-eabi binutils-arm-none-eabi
下载 nuttx 应用与内核 代码
1 | mkdir nuttx_project |
查看已经支持的开发板
1 | cd nuttx |
将 nuttx 代码工程仓库配置成目标开发板,以 sim:nsh 为例:
1 | cd nuttx |
编译工程
1 | cd nuttx/ |
编译完成后会在 nuttx 目录下出现 nuttx.bin 文件。
nuttx 模拟开发板配置
将 nuttx 代码工程仓库配置成目标开发板,以 sim:nsh 为例:
1 | cd nuttx |
配置裁剪系统
1 | make menuconfig |
已关闭 nuttx shell 账户密码登录为例:
配置完成后可退出保存。
编译工程
1 | cd nuttx/ |
运行
1 | ./nuttx |
输入完这个命令后就可以在 PC 端模拟 nuttx 了,如下图是 nut shell 终端组件的窗口。
nuttx 启动流程分析
nuttx 的启动流程一共有五个阶段,并且使用变量 g_nx_initstate
来标识。 g_nx_initstate
的值会在 void nx_start(void)
函数里分阶段改变。
1 | /* Initialization state. OS bring-up occurs in several phases: */ |
- MCU 执行到
nx_start
系统起来之后即为完成OSINIT_BOOT
阶段。 - 在
OSINIT_TASKLISTS
阶段会去初始化任务列表。 - 在
OSINIT_MEMORY
阶段需要率先初始化信号量(因为接下来很多系统组件需要使用信号量),然后初始化内存管理。 - 在
OSINIT_HARDWARE
阶段需要先初始化文件系统(因为后面的设备驱动需要使用到文件系统,这涉及到了 nuttx 的驱动管理方式,后面我会再讲。),然后配置 中断向量表、看门狗、时钟、系统 tick 、系统信号、系统消息队列、网络、线程栈内容初始化、注册标准的设备(如:/dev/null
,/dev/zero
,/dev/loop
./dev/random
)。 - 在
OSINIT_OSREADY
阶段需要完成多系统相关的初始化(如启动 IDLE 线程)。
除了上面的分析,网上还有其他博主对启动流程分析图,这个更为详细。如下所示:
1 | /**************************************************************/ |