Nuttx romfs与启动脚本rcS

2023-05-16

ARM系统上电后,系统将flash地址映射到零地址处,处理器从零地址处开始运行第一条指令。而在零地址处,一般是系统复位中断向量,此处存放的是一条跳转指指令,通过该条换指令,处理器运行复位服务函数。Cortext-M系列的实现稍有不同,它的零地址处放置的栈指针,接着才是复服务函数地址。

复位服务函数开始处是由汇编语言编写,借助汇编函数调用C函数,将系统带到C函数中。Nuttx的C入口函数便是os_start(),在os_start()执行操作系统地初始化。

Nuttx操作系统初始化完成后,首先创建第一个进程,idle线程便是这第一个进程的线程。有了第一个进程,系统接着创建用户进程,即在os_bringup()函数中,调用os_do_appstart()创建init进程。init进程的第一个默认线程是nsh_main。nsh_main调用nsh_consolemain()函数,先运行romfs文件系统上的启动脚本,然后nsh_main线程进入nsh交互界面。至此,操作系统完全启动。其他进程,或者线程可以通过启动脚本启动运行,或者通过nsh启动。。

在默认情形下,nsh_main线程将运行romfs中“/etc/init.d/rcS”这个启动脚本上的命令。romfs启动脚本有它自己的语法,Nuttx中的sh可以解析这些语法,并执行相关的命令。这些命令可以设置进程环境变量,读取环境变量,或者启动其他线程。

这一节将说明Nuttx制作romfs的方法,接着说明如何定制romfs,即让Nuttx在启动的过程中能够运行我们制作的启动脚本。最后我们对启动脚本的语法进行简要说明。

1. romfs简介

romfs,顾名思义是在rom中实现的一种文件系统,linux 2.1.21版本中最早支持该文件系统。这种文件系统是基于块存储介质的只读文件系统,具有体积小、读取速度快、可靠性高的优点。它的缺点是,这种文件系统是只读的,而且对文件的描述信息很少,没有访问权限限制。

romfs通常用在嵌入式系统中,用来存储系统模块,只读的文件等,将其部署在EEPROM或者其他块存储设备中。

更多关于romfs文件系统的模块结构和协议,以及驱动程序,可以在网上搜索。

2. 制作romfs

在linux系统下使用“genromfs”工具来生成romfs映像文件,该映像文件可以被挂载到系统中作为只读文件系统。

2.1 生成romfs

这里在linux系统下演示一下生成并挂载romfs文件系统。首先主机上创建我们所要生成romfs的目录和文件,比如目录romfs_dir。通过”tree”命令查看该目录结构

$ tree romfs_dir
romfs
|——dir_a
|    |——a.txt   
|——dir_b
     |——b.txt

2 directories, 2 file

写入字符串”this is a.txt”到a.txt文件,写入字符串”this is b.txt”到b.txt文件。

使用”genromfs”命令将romfs_dir文件夹制作成一个romfs映像,并挂载到系统”/mnt”。”genromfs”命令使用方法可以通过”genromfs -h”查看。在romfs_dir所在目录下执行命令:

$ genromfs –f romfs.img –d romfs_dir –v –V “romfstest”

上面genromfs命令工具以文件夹romfs_dir为输入,生成romfs.img二进制映像文件,映像卷名为”romfstest”。”-v”参数使得”genromfs”输出详细信息。

我们通过”mount”命令将生成的romfs挂载到系统”/mnt”下,并查看其内容是否符合预期。

$ sudo mount romfs.img  /mnt –o loop
mount: warning: /mnt seems to be mounted read-only
$ tree /mnt
/mnt
|——dir_a
|    |——a.txt   
|——dir_b
     |——b.txt

2 directories, 2 file

2.2 制作romfs头文件

Nuttx系统中注册romfs文件系统,需要romfs文件系统头指针,以便将文件系统编译链接进可执行文件。所以,需要将romfs映像文件生成一个头文件。

Linux系统下的”xxd”工具命令能够将标准输入或者给定的二进制文件输出到文件或者标准输出。关于”xxd”工具命令的详细使用方法可以通过”xxd -h”或者”man xxd”命令查看。如果使用”-i”参数,”xxd”可以输出C语言头文件形式的文件。

我们以上节中生成的romfs映像文件制作一个C语言头文件,头文件名为nsh_romfsimg.h, 而头文件nsh_romfsimg.h中的数组名为romfs_img。命令如下:

$ xxd –i romfs.img nsh_romfsimg.h

生成的头文件中数组名称由输入的romfs映像文件名决定,如果文件名中含有”.”分隔符,那么”.”将会被替换为”_”。

3. Nuttx系统romfs实验

Nuttx系统在nsh_main线程中,通过调用nsh_initialize()函数,进而调用nsh_romfsetc()向系统注册romfs,并挂载到默认的位置”/etc”目录。注意,nsh_romfsetc()需要配置CONFIG_NSH_ROMFSETC,该选项可以在”make menuconfig”界面中配置,或者直接在.config文件中手动配置。另外,也需要系统支持ROMFS,即CONFIG_FS_ROMFS文件系统选项需要启用。

我们需要做的是生成romfs头文件,将其放置到系统的某个位置(默认位置为apps/nshlib目录,如果配置了CONFIG_NSH_ARCHROMFS,则放置到config/< board >/inlclude目录),重新编译系统。将生成的romfs头文件nsh_romfsimg.h放置到apps/nshlib目录,确保头文件nsh_romfsimg.h中数组名为”romfs_img”,重新编译下载系统,并运行。通过nsh终端验证如下:

NuttxShell (NSH)
nsh> ls
/:
 dev/
 etc/
nsh> cd /etc
nsh> ls
/etc:
 .
 dir_a/
 dir_b/
nsh> cd dir_a
/etc/dir_a:
 .
 a.txt
nsh> cat a.txt
this is a.txt
nsh> 

4. 制作启动脚本rcS

通过前面两节,我们已经可以定制romfs文件系统的内容了,那么制作Nuttx系统下的启动脚本init.d/rcS就易如反掌。

我们重起炉灶,另外创建一个文件夹top_dir,在该文件夹下创建init.d文件夹,再在init.d文件夹下创建文件rcS,目录结构如下:

$ tree top_dir
top_dir
|——init.d
     |——rcS

1 directory, 1 file

作为练习,我们现在rcS文件中写入简单地命令,只是挂载proc文件系统而已。注意:rcS文件中以”#”字符开头的行将被sh解析为注释行。我们的rcS文件的内容如下:

$ cat top_dir/init.d/rcS
# this is rcS file

mount –t procfs /proc

要挂载proc文件系统,Nuttx系统需要启用CONFIG_FS_PROCFS文件系统选项。

按照上述两节中的步骤,将top_dir目录制作为一个romfs.img映像文件,然后再生成nsh_romfsimg.h的头文件,将这个头文件放置到apps/nshlib路径下,编译下载并运行,nsh终端输出如下:

NuttxShell (NSH)
nsh> ls
/:
 Dev/
 etc/
 proc/
nsh> cat /etc/init.d/rcS
# this is rcS file

mount –t procfs /proc

nsh> 

从nsh终端的输出可以看出,Nuttx运行了/etc/init.d/rcS启动脚本,将proc文件系统成功地挂载到系统。最后也打印出了/etc/init.d/rcS的内容,全都符合我们的期望。

5. APM中生成romfs

启动APM飞控,从nsh终端查看它的”/etc”目录,可以看到下面有四个目录,分别为bootloader, px4io, tones 和init.d。bootloader用于更新飞控的bootloader。px4io是飞控上面io控制器的固件,该固件在飞控启动后从主控(stm32f427)下载到io控制器(stm32f103)。tones是控制蜂鸣器发出报警声的源文件。最后一个init.d文件夹下面便是APM的启动脚本rcS。

没有经过编译的APM的固件代码,用于生成romfs的文件夹只包含tones和init.d两个子文件夹,并没有bootloader和px4io,这两个文件夹是在编译时候生成的。这点可以从makefile文件中找到,以px4-io-v2为例。

px4-io-v2: $(PX4_ROOT)/Archives/px4io-v2.export
    $(v)+ $(MAKE) -C $(PX4_ROOT) -f $(PX4_ROOT)/Makefile.make px4io-v2_default EXTRADEFINES="-DARDUPILOT_BUILD"
    $(v) cp $(PX4_ROOT)/Images/px4io-v2_default.bin px4io-v2.bin
    $(v) cp $(PX4_ROOT)/Build/px4io-v2_default.build/firmware.elf px4io-v2.elf
    $(v) mkdir -p $(MK_DIR)/PX4/ROMFS/px4io/
    $(v) cp px4io-v2.bin $(MK_DIR)/PX4/ROMFS/px4io/px4io.bin
    $(v) mkdir -p $(MK_DIR)/PX4/ROMFS/bootloader/
       $(v) cp $(SKETCHBOOK)/mk/PX4/bootloader/px4fmuv2_bl.bin $(MK_DIR)/PX4/ROMFS/bootloader/fmu_bl.bin
    $(v) echo "PX4IOv2 Firmware is in px4io-v2.bin"

这段Makefile将生成的px4io-v2.bin文件复制到PX4/ROMFS/px4io/px4io.bin,将PX4/bootloader/px4fmuv2_bl.bin复制到PX4/ROMFS/bootloader/fmu_bl.bin。

制作APM romfs的文件准备好之后,将PX4/ROMFS文件夹制作成romfs.img二进制映像文件。

# Generate the ROMFS image from the root
$(ROMFS_IMG): $(ROMFS_SCRATCH) $(ROMFS_DEPS) $(GLOBAL_DEPS)
    @$(ECHO) "ROMFS:   $@"
    $(Q) $(GENROMFS) -f $@ -d $(ROMFS_SCRATCH) -V "NSHInitVol"

然后将romfs.img转换成romfs.o文件

# Turn the ROMFS image into an object file
$(ROMFS_OBJ): $(ROMFS_IMG) $(GLOBAL_DEPS)
    $(call BIN_TO_OBJ,$<,$@,romfs_img)

最后romfs.o会被链接进可执行文件,生成固件firmware.px4。

6. 启动脚本rcS语法介绍

rcS启动脚本实质上是Nuttx下实现的类似于linux中shell脚本的一种脚本文件,Nuttx中sh可以解释这种脚本的语法和执行命令。本小节简要说明Nuttx中支持的命令和基本语法。

6.1 基本命令

在Nuttx的脚本中可以运行命令,命令还可以带参数。脚本支持的命令是sh所支持的命令,可以在nsh终端输入help命令查看sh支持的命令。

nsh> help
help usage: help [-v] [<cmd>]
[               dirname     help            mh      set     unset
?               dd          hexdump     mount   sh      usleep
basename    df          kill            mv      sleep   xd
break       echo            ls          mw      test
cat         exec            mb          ps      time
cd          exit            mkdir       pwd     true
cp          false           mkfatfs     rm      uname
cmp         free            mkrd        rmdir   umount

命令”help -v”可以查看所有命令详细使用格式, 查看单个命令的详细使用格式,使用命令”help –v [< cmd >]”,比如查看命令”ls”的详细使用格式为”help –v ls”。

6.2 语法

6.2.1 if…else…

if… else… 条件语句的格式如下:

if  <cmd>
then
        [sequence of <cmd>]
else
        [sequence of <cmd>]
fi

如果< cmd >结果为true,则执行then分支,否则,执行else分支。

6.2.2 while循环

while循环格式如下:

while  <cmd>
do
        [sequence of <cmd>]
done

如果条件< cmd >返回为true,将循环执行do…done之间语句。

6.2.3 until循环

until循环格式如下:

until  <cmd>
do
        [sequence of <cmd>]
done

如果条件< cmd >不为真,将循环执行do…done之间的语句。这点与while循环正好相反。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Nuttx romfs与启动脚本rcS 的相关文章

  • PX4也是C++写的,而且是基于Nuttx操作系统

    PX4也是C 43 43 写的 xff0c 而且是基于Nuttx操作系统 要做PX4的二次开发估计也是用C 43 43 http shequ dimianzhan com users 84
  • nuttx和linux区别,Nuttx文件系统

    1 介绍 文件系统 xff0c 是对一个存储设备上的数据和元数据进行组织的机制 xff0c 它是操作系统管理持久性数据的子系统 xff0c 提供数据存储和访问功能 将一个文件系统与一个存储设备关联起来的过程叫做挂载 mount xff0c
  • nuttx-概述

    早期基于MSP430系列 STM32系列 EFM32系列 AT91SAM9X imx6ul系列做各种物联网产品 xff0c 近几年国芯片慢慢崛起 xff0c 加上ST芯片价格暴涨 xff0c 更是让国产芯片赢得了难得的发展机会 xff0c
  • 为何选择nuttx

    裸机程序 xff0c 不能处理太复杂的逻辑 xff0c 系统越复杂 xff0c 越需要上os freertos 不支持posix api rtems是gpl版权 nuttx bsd版权 xff0c px4和apm开源飞控都使用nuttx 经
  • ROMFS文件系统分析

    ROMFS文件系统分析 ROMFS是一种简单的只读文件系统 xff0c 主要是用来当做初始文件系统来使用的 xff0c 在嵌入式linux或是uclinux中通常使用这中文件系统来作为引导系统的文件系统 xff0c 甚至uclinux有时就
  • NuttX 介绍

    xff08 嵌入式 实时操作系统 rtos nuttx 7 1 xff09 NuttX 介绍 转载请注明出处 xff1a http blog csdn net zhumaill article details 24197637 1 Nutt
  • Using NuttX OS as a library on Atmel Studio 7

    This document explains how to add NuttX OS to your application on Atmel Studio 7 using NuttX OS as a library With Atmel
  • nuttx杂记

    1 设置自启动应用 修改deconfig文件下的 CONFIG INIT ENTRYPOINT 参数即可 2 消息队列使用 以下是Nuttx系统中使用queue create函数创建队列的示例代码 xff1a include lt stdi
  • nuttx学习-0:模拟安装

    一 Nuttx 模拟运行环境的安装 xff1a 1 文件要求 xff0c 主要需要三个文件 xff1a nuttx 7 24 tar apps 7 24 tar nuttx tools tar 2 环境要求 xff1a sudo apt g
  • 关于/etc/init.d/rcS not found的解决方法

    进入rescue模式 xff0c 选择root 输入命令 lt pre name 61 34 code 34 class 61 34 cpp 34 gt mount o remount rw touch etc init d rc vim
  • Nuttx下移植uorb笔记

    Nuttx下移植uorb笔记 之前接触过ros下的消息机制 xff08 生产者 消费者 xff09 模型 xff0c 第一感觉是灵活好用 xff0c 但是在资源有限的嵌入式环境里面 xff0c 邮箱 消息 显得就有点不那么灵活 xff0c
  • NuttX RTOS

    目录 综述 NuttX是什么 看看这些文件和功能 它怎么会是一个小小的操作系统呢 xff1f NuttX讨论组 你想谈谈NuttX的特性吗 xff1f 你需要帮助吗 xff1f 问题吗 错误吗 下载 我在哪里可以买到NuttX xff1f
  • nuttx操作系统的移植以及下载

    1 在ubuntu根目录下 xff1a root 64 ubuntu apt get update 更新包 2 root 64 ubuntu apt get install gcc arm none eabi 编译器 3 kconfig f
  • NuttX 文件系统架构介绍(7.14)

  • /etc/init.d/rcS文件详解

    我使用的简单rcS文件内容如下 最后的IP地址设定非常重要 xff0c 一定要跟服务器的地址再同一个网段 xff0c 不然会出现无法连接错误 nfs server 192 168 0 102 not responding still try
  • can't run '/etc/init.d/rcS': No such file or directory 最终解决方法

    drivers rtc hctosys c unable to open rtc device rtc0 end request I O error dev mtdblock2 sector 256 isofs fill super bre
  • 5.0 NuttX File System

    转载请注明出处 xff1a 5 0 NuttX File System Alvin Peng的博客 CSDN博客 文章均出自个人理解 前言 前一段时间折腾了几个驱动 xff08 PWM Serial I2C xff09 xff0c 这次来折
  • ROMFS的建立

    参考 xff1a VxWorks 7 File Systems Programmer s Guide
  • esp32c3 nuttx 移植 micropython 尝试

    源码来自 https github com apache incubator nuttx apps pull 840 和 https github com apache incubator nuttx apps tree 787ac9060
  • 小米在建IoT护城河Vela NuttX

    MIDC 2020小米开发者大会刚刚过去 整场大会下来 几个印象比较深刻的点是 雷军宣布扩招5000名工程师 最新伸缩式大光圈镜头技术 小爱同学5 0发布 当然了 还有一个更加值得被提及的重点是 首次亮相的Xiaomi Vela物联网软件平

随机推荐

  • 全开源即时通讯(IM)系统 高仿微信

    android chat 项目地址 xff1a wildfirechat android chat 简介 xff1a 全开源即时通讯 IM 系统 高仿微信 更多 xff1a 作者 提 Bug 官网 标签 xff1a 野火 IM 是一套跨平台
  • OpenCV与机器视觉

    最近在网易云课堂把南科大于仕琪团队的OpenCV教程完整看了一遍 xff0c 对图像处理或者机器视觉又有了一个系统性的理解 OpenCV中文网站就是他创建的 xff0c 他的研究团队及其相应成果可以在个人网站中查阅 回想过去在图像处理方面的
  • Virtual Box+Ubuntu20.04+ROS2 Foxy配置

    ROS从最早的正式版本Box Turtle到现在也十几年了 而ROS2出来也挺久了 xff0c 一直没机会看看 好久也没弄ROS xff0c 这几天捣鼓了捣鼓 目录 1 Virtual Box安装Ubuntu20 04 2 ROS2 Fox
  • TI CC265x的IIC通讯读取IMU BMI08x数据

    SmartLink CC265x是TI公司出的无线MCU平台器件 最近玩了个小项目用TI的CC265x平板IIC接口通讯 xff0c 获取博世BMI08x陀螺仪 加速度计传感器的数据 本篇博客亦是对博客 树莓派IIC通讯获取BMI08x I
  • 三种方法在ROS中加载Qt库进行GUI设计

    编写ros程序 xff0c 因为有时会涉及到界面设计 xff0c 所以本人主要用的QtCreator IDE 首先当然是安装QtCreator xff0c 这个网上有很多安装教程和下载资源 xff0c 非常简单 由于Qt的工程大多采用qma
  • 在ROS中处理yaml文件

    ROS中的参数服务器 xff08 Parameter Server xff09 的相关操作可参见roscpp tutorials Tutorials Parameters 如果想要载入参数 xff0c 可以通过编写yaml文件 xff0c
  • ROS动态调参(dynamic reconfigure)客户端服务端之C++ Python实现

    在ROS系统中 xff0c 我们需要实时修改参数 xff0c 并能马上看到运行效果 这一功能是通过ros dynamic reconfigure包实现的 官网教程如下 xff1a dynamic reconfigure Tutorials
  • ROS中slam_gmapping、map_server源码解读及其librviz的使用

    SLAM全称simultaneous localization and mapping xff0c 即实时定位与地图构建 也就是说导航离不开地图 xff0c 目前常用的地图构建方法有三种 xff1a 1 gmapping xff0c 一种基
  • 记 - PC视频播放最强画质教程(Potplayer + madVR)

    PC视频播放最强画质教程 前言 xff1a 本次使用到的软件 工具 Potplayer播放器 Potplayer是目前我用到的最好用的宝藏视频播放软件 xff1a 内存占用低 无广告 支持视频格式多 功能强大 扩展性高 界面唯美 xff08
  • 【三维深度学习】多视角立体视觉 MVSNet代码解读

    MVSNet通过将相机几何参数编码到网络中 xff0c 实现了端到端的多视角三维重建 xff0c 并在性能和视觉效果上超越了先前算法 xff0c 并在eccv2018 oral中发表 模型主要包含四个主要步骤 xff1a 图像特征抽取 多视
  • 【pandas】删除满足条件元素所在的行

    在数据清洗时 xff0c 需要按照一定条件删除某些数据样本 xff0c 利用布尔表达式 索引和drop方法可以实现 1 pandas drop df 61 df drop df lt some boolean condition gt in
  • 【AI视野·今日Robot 机器人论文速览 第八期】Wed, 16 Jun 2021

    AI视野 今日CS Robotics 机器人学论文速览 Wed 16 Jun 2021 Totally 13 papers x1f449 上期速览 更多精彩请移步主页 Daily Robotics Papers Constrained Mo
  • 【CVPR2022】论文列表与下载——PartTwo

    CVPR2022将于6月22日召开 x1f389 x1f389 x1f389 xff0c 本次会议共收录了2067篇论文 由于数量较多 xff0c 本文将分四个子文章呈现 xff0c 可直接点击论文标题获取文档 x1f4c3 第一部分 x1
  • 【CVPR2022】论文列表与下载——PartThree

    CVPR2022将于6月22日召开 x1f389 x1f389 x1f389 xff0c 本次会议共收录了2067篇论文 由于数量较多 xff0c 本文将分四个子文章呈现 xff0c 可直接点击论文标题获取文档 x1f4c3 第一部分 x1
  • 【CVPR2022】论文列表与下载——PartFour

    CVPR2022将于6月22日召开 x1f389 x1f389 x1f389 xff0c 本次会议共收录了2067篇论文 由于数量较多 xff0c 本文将分四个子文章呈现 xff0c 可直接点击论文标题获取文档 x1f4c3 第一部分 x1
  • Python三维绘图--Matplotlib

    Python三维绘图 在遇到三维数据时 xff0c 三维图像能给我们对数据带来更加深入地理解 python的matplotlib库就包含了丰富的三维绘图工具 1 创建三维坐标轴对象Axes3D 创建Axes3D主要有两种方式 xff0c 一
  • 【深度学习】三维点云数据集总结

    点云数据集总结 三维点云数据 xff0c 三维深度学习 1 ShapeNet ShapeNet是一个丰富标注的大规模点云数据集 xff0c 其中包含了55中常见的物品类别和513000个三维模型 2 ShapeNetSem 这是一个小的数据
  • git push代码到远程新分支

    Git push 获取远程代码修改后 想要push到远端与原来不同的新分支 xff0c 可以使用下面的命令实现 xff1a git push origin 本地分支 远端希望创建的分支 例如git下来的分支为master span clas
  • 【numpy求和】numpy.sum()求和

    numpy sum a axis 61 None dtype 61 None out 61 None keepdims 61 initial 61 source 用于计算array元素的和 python中常用的numpy进行数学计算 xff
  • Nuttx romfs与启动脚本rcS

    ARM系统上电后 xff0c 系统将flash地址映射到零地址处 xff0c 处理器从零地址处开始运行第一条指令 而在零地址处 xff0c 一般是系统复位中断向量 xff0c 此处存放的是一条跳转指指令 xff0c 通过该条换指令 xff0