最近在工作上需要用到这个nuttx实时操作系统,并且对这个系统进行学习记录以及记录下自己所遇到过的问题。
目录
那么对于这个操作系统有帮助的文档:
Quickstart — NuttX Companion 0.1.6 documentation
NuttX Documentation — NuttX latest documentation
Wiki - NUTTX - Apache Software Foundation
一、环境配置
(1)基础环境
环境:ubuntu 20.04,首先进行基础的环境配置。
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
sudo apt install kconfig-frontends
sudo apt install gcc-arm-none-eabi binutils-arm-none-eabi
(2)下载nuttx
mkdir nuttxspace
cd nuttxspace
git clone https://github.com/apache/incubator-nuttx.git nuttx
git clone https://github.com/apache/incubator-nuttx-apps apps
git clone https://bitbucket.org/nuttx/tools.git
cd tools/kconfig-frontends
./configure
make
sudo make install
sudo ldconfig
(3)构建模拟器
进入到nuttx文件中,输入:./tools/configure.sh sim/nsh
修改配置文件:make menuconfig
设置:
Build Setup----------Build Host Platform(Linux)
用户免密登陆设置:
这里按下enter把原来有的*取消掉就行了。然后save一下,之后回来进行make
。之后即可得到可执行文件,并且是在模拟器上运行,若中间出现什么错误,只需要在ubuntu上安装对应的库就行了:
也可以从另外一个终端窗口中,杀死模拟器:pkill nuttx
。
(4)初始化配置
这个操作系统是可以适配很多种嵌入式设备,可以通过以下命令进行选择:
cd nuttx
./tools/configure.sh -L | less
使用上面的命令可以查看所有的配置,如果找到了自己适配的型号,则可以:
cd nuttx
./tools/configure.sh -l stm32f4discovery:nsh
选定后即可以基于菜单的配置系统自定义此配置:
cd nuttx
make menuconfig
如果需要清理所构建的,则需要使用make clean
。
(5)调试信息
sudo apt install openocd
openocd -f interface/stlink-v2.cfg -f target/stm32f1x.cfg
cd nuttx/
gdb-multiarch nuttx/nuttx
gdb调试在这就不过多说明了,网上有很多教程。
二、Nuttx目录结构
-
NSH,各种app(nuttx shell):实际的应用曾,应用程序可以shizuo为是我们在终端中运行的东西,或者可以看作是一个终端。
-
Virtual File System(虚拟文件系统):虚拟文件系统,符合Linux系统的思想,这一层的主要作用是将设备的操作转化为对虚拟文件的操作。
-
Upper Half Drivers(上层驱动):这些驱动可以看作为是对各种设备的操作接口的定义,比如PWM、Network等等。这一层也可以视作为系统的API。在这里你可以不需要管底层的实现,直接调用就可以了。
-
Lower Half Drivers(下层驱动):这一层是上层驱动的具体化,在这里是每种芯片都有不一样的寄存器操作,这一层的驱动提供的API直接操作各种芯片,各种芯片的驱动在这里都是不相同的。
-
Microcontroller + Peripherals(外设):这一层是各种硬件以及外设。位于
Nuttx/arch/*
。
具体文件架构:Directory Structure — NuttX latest documentation
三、NSH应用程序
(一)NSH自定义启动脚本
配置:File Systems -> ROMFS file system
到达:Application Configuration → NSH Library → Scripting Support ->Support ROMFS start-up script
可以看到这个系统的默认启动脚本为init.d/rc.sysinit
,我们可以通过这个地方进行修改,但是最好还是不要改了,避免有bug,我们可以进入系统的文件中修改:
那么我们回到nuttx,进入这个地址:
/home/zhengxiting/nuttxspace/nuttx/boards/sim/sim/sim/src/etc/init.d
,打开rcS文件,进行修改:
首先先make clean
一下,再进行make
,再运行即可看到:
那么在这我们就可以编写很多启动脚本了,方法类似上面写的。
(二)自定义NuttShell
NuttxShell是一个简单的Shell应用程序,可以与Nuttx一起使用,支持各种命令,也可以自定义命令,可以添加新命令、更改初始化序列等。
那么他的shell语句是在哪里实现的,可以具体看到:/nuttxspace/apps/nshlib
,这个地方是他的库:
输入help
即可看到所有的NSH命令以及内置应用程序,这个内置应用程序不要理解错为是内部的命令,其实是Builtin Apps中的东西,其实是外部应用程序,也就是我们可以进行添加的:
那么如何编写自己的应用程序,可以看看apps中的例程,路径为/nuttxspace/apps/examples/hello
,以这个hello为例,我们做一些小修改,让其成为一个小的应用程序:
打开hello_main.c可以看到:
那么我们就在这个基础上进行改进吧:
我们在apps的文件夹中创建名为projects的文件夹,然后把hello文件夹拷贝到这个地方:
mkdir projects
cp -a examples/hello projects/test
cd projects/test
mv hello_main.c test_hello.c
修改自己的程序配置文件,修改TEST文件夹中的Makefile\make.defs\kconfig这三个文件,首先看看Makefile
,我们将其修改为test_main.c,修改一下对应的宏以及我们对应的源文件:
其中的PROGNAME设置为在Kconfig中配置的名字,优先级设置为Kconfig中的配置,栈大小设置为Kconfig中给他配置的大小,模块也是K config中配置的名称
接下来是啥打开Make.defs
文件,修改为我们自己文件的路径:
之后是打开我们的Kconfig文件,主要是要修改我们的宏,要与上方的匹配:
改名字是用来在deconfig中配置使用,在添加该配之后,该应用会被打开。下面的hello nuttx则可以看作为是名字。如果打开了选项,那么就打开下面的配置显示,首先是出现了app名,之后再设置栈的优先级,设置栈的大小。
最后就是修改对应的源文件了,简单改个样子就行:
将apps/examples中的Makefile、Make.defs、Kconfig三个文件拷贝过来:
cp ../../examples/Makefile ../
cp ../../examples/Make.defs ../
cp ../../examples/Kconfig ../
目录结构是这样的:
首先修改Kconfig文件,修改为如下,这个地方是到时候在menu中会展现出来的文件名:
打开Make.defs文件,修改为:
之后进入到nuttx文件夹中:
make apps_distclean
make menuconfig
可以发现执行完后apps的文件中出现了一个Kconfig:
之后就可以发现在Application Configuratuon-->Projects
中:
之后我们选中他,保存退出,之后我们make
一下。生成可执行文件后,执行可执行文件./nuttx
,再输入help,执行hello_nuttx,即可以及看到我们的hello nuttx
。