历史上的今天

今天是:2024年09月23日(星期一)

正在发生

2020年09月23日 | 嵌入式开发环境介绍,嵌入式文件系统要求分析

发布者:雅致书香 来源: elecfans关键字:嵌入式  开发环境  文件系统 手机看文章 扫描二维码
随时随地手机看文章

  嵌入式开发环境介绍

  mClinux特点简介

  1. 取消了内存管理单元MMU,具有完整的网络功能。

  2. 完备的文件系统支持,采用了romfs文件系统作为根文件系统,相对于一般的ext2文件系统要求更少的空间。

  3. 使用了flat可执行文件格式:elf格式有很大的文件头,flat文件对文件头和一些段信息做了简化。

  4. 体积小,可移植性强。

  嵌入式开发环境介绍

  图1 开发环境示意图


  常见的基于mClinux的嵌入

  式系统开发环境的构建方法

  在嵌入式系统的开发过程中,通常都要建立交叉编译环境,图1为常见的嵌入 式系统开发环境示意图,基于以太网下的调试一般应将宿主机和用户板接入到局域网中,本文以mClinux +S3C4510B的开发环境为例进行说明。通常的做法是在宿主机上安装RedHat Linux操作系统,并同时安装针对ARM开发的工具链arm-elf-tools。这样,在宿主机上编辑和编译好的用户程序,就可以通过以太网,将编译 后的可执行文件下载到用户板来运行。下载方式主要有以下几种。

在嵌入式系统的开发过程中,通常都要建立交叉编译环境,图1为常见的嵌入 式系统开发环境示意图,基于以太网下的调试一般应将宿主机和用户板接入到局域网中,本文以mClinux +S3C4510B的开发环境为例进行说明。通常的做法是在宿主机上安装RedHat Linux操作系统,并同时安装针对ARM开发的工具链arm-elf-tools。这样,在宿主机上编辑和编译好的用户程序,就可以通过以太网,将编译 后的可执行文件下载到用户板来运行。下载方式主要有以下几种。

  FTP方式

  首先需要打开一个超级终端,设置好相应的通讯参数,再给系统上电,就可以在超级终端里看到mClinux的启动信息。这里指明宿主机的IP地址是:10.5.22.247,用户板的IP地址是:10.5.22.8,执行如下命令来配置用户板的IP:

  # ifconfig eth0 10.5.22.8

  eth0 指网络设备。需要注意的是,用户板的IP地址需和宿主机的IP地址在同一网段,否则难以正常的访问宿主机。


  这时如果可以ping通宿主机,就可以通过FTP方式访问宿主机的网络资源了。

  接下来选择用户程序的存放目录。应注意,如果用户板用的是romfs文件系统,那么只有少数几个目录可以访问(如tmp ,var等)。选好存放目录之后,就可以通过FTP方式访问宿主机了,键入如下命令:

  # cd /tmp

  # ftp 10.5.22.247

  然后输入用户名和密码以确定是否具有访问权限,成功登陆之后,需要确定文件传送格式。FTP可以用binary和ascii两种方式来传送文件,这里选择的是binary方式。输入以下指令来获取文件:

  # binary

  # get filename

  # bye

  执行# bye后就可以退出FTP。这时可以键入ls命令来查看文件是否已经传到选定的目录下。接下来要做的是改变文件的权限,如果没有可执行权限,在用户板中就无法运行程序。


  # chmod 755 filename

  这里的参数“7”表示拥有读、写和执行的权限;“5”仅代表拥有读和执行的权限。完成以上配置后,就可以用如下命令执行用户程序了:

  # 。/filename

  NFS方式

  使 用NFS (NetWork File System)方式可以使嵌入式应用程序的开发和调试变得更为方便,并在不同的机器、不同的操作系统间共享文件,因此,NFS在嵌入式开发中得到了广泛的 应用。目前,在mClinux-2.4-x版本下配置NFS相对比较困难,下面就配置问题进行详细说明。


  服务器(Sever)端的设置

在嵌入式系统的开发过程中,通常都要建立交叉编译环境,图1为常见的嵌入 式系统开发环境示意图,基于以太网下的调试一般应将宿主机和用户板接入到局域网中,本文以mClinux +S3C4510B的开发环境为例进行说明。通常的做法是在宿主机上安装RedHat Linux操作系统,并同时安装针对ARM开发的工具链arm-elf-tools。这样,在宿主机上编辑和编译好的用户程序,就可以通过以太网,将编译 后的可执行文件下载到用户板来运行。下载方式主要有以下几种。

  首先需要设置 Linux下的/etc/exports文档,它是NFS的主要设定文档。在Linux下的shell终端,进行如下操作:

  # vim /etc/exports

  将这个默认的空文件修改为只有如下一行内容:

  /home/tmp *(rw,no_root_ squash)

  这就表示在任何情况下,客户端都可以访问服务器端的/home/tmp目录。

  接下来要在服务器端开启如下的两个进程:

  1.开启NFS服务

  # /etc/rc.d/init.d/nfs start

  启动NFS服务: [ OK ]

  StarTIng NFS quotas: [ OK ]

  启动NFS 守护进程: [ OK ]

  启动NFS mounted : [ OK ]


  2.开启portmap服务

  # /etc/rc.d/init.d/portmap start

  配置完成后,可用如下办法简单测试一下NFS是否配置成功(注意在Linux下要将防火墙关闭):在宿主机上自己mount自己,看是否成功。例如,在宿主机/目录下执行:

在嵌入式系统的开发过程中,通常都要建立交叉编译环境,图1为常见的嵌入 式系统开发环境示意图,基于以太网下的调试一般应将宿主机和用户板接入到局域网中,本文以mClinux +S3C4510B的开发环境为例进行说明。通常的做法是在宿主机上安装RedHat Linux操作系统,并同时安装针对ARM开发的工具链arm-elf-tools。这样,在宿主机上编辑和编译好的用户程序,就可以通过以太网,将编译 后的可执行文件下载到用户板来运行。下载方式主要有以下几种。

  mount 10.5.22.247:/root/ /home/zhang/mount

  然后到/home/zhang/mount/目录下看是否可以列出/root/目录下的所有文件和目录。若可以,则说明NFS在服务器端的配置成功。


  客户端(Client)的设置

  相 对于Sever端的设置,Client端使用的是 mClinux, 设置起来相对复杂一些,需要对mClinux的内核重新编译,并进行相关配置。需要设置Customize Kernel SetTIngs 和 Customize Vender/User SeTIngs(NEW)两项。

  1. 对Customize Kernel SetTIngs进行配置

  [ * ] Customize Kernel Settings

  进入File systems的设置,可以看到Network file systems---,将NFS File system support选中。


  2.设置Customize Vender/User Setings(NEW)

  [ * ] Customize Vender/User Setings(NEW)

  在Customize Vender/User Setings 项目中,选择Network Applications之后,需要其中的portmap服务,[*] portmap即可。然后选择mount和umount服务使mClinux支持mount和umount指令。mClinux-2.4-x的内核对 NFS mount的支持不够,这使得在mClinux上添加NFS服务存在一些困难,而在较新的mClinux版本mClinux-2.6-x中重写了对 NTFS文件系统的支持。在BusyBox中选择mount和umount及mount NFS support三项即可,这样客户端的配置完成。最后重新编译内核,指令如下:

在嵌入式系统的开发过程中,通常都要建立交叉编译环境,图1为常见的嵌入 式系统开发环境示意图,基于以太网下的调试一般应将宿主机和用户板接入到局域网中,本文以mClinux +S3C4510B的开发环境为例进行说明。通常的做法是在宿主机上安装RedHat Linux操作系统,并同时安装针对ARM开发的工具链arm-elf-tools。这样,在宿主机上编辑和编译好的用户程序,就可以通过以太网,将编译 后的可执行文件下载到用户板来运行。下载方式主要有以下几种。

  # make menuconfig ------------- 内核配

  # make dep -------------寻找依存关系

  # make clean------------清除以前构造内核时生成的文件

  # make lib_only-----------该命令编译库文件

  # make user_only----------编译用户应用程序文件

  # make romfs ----------生成romfs文件系统

  # make image----------生成romfs.o文件

  # make


  重 新编译后,会在。。。/image/目录下生成image.rom文件,它是压缩了的内核在rom的映像文件,将其烧写到用户板的Flash即可。用户板 重新启动之后,新的内核已经开始工作,这时就可以在终端里进行NFS mount了(以在minicom为例)。输入如下指令:

  #mount -t nfs 10.5.22.247:/home/tmp /var/tmp /nfsmount -o nolock

  # mount

  执行完两条指令后,在Linux下的minicom里会看到如下信息:

  Rootfs on / type rootfs (rw)

  /dev/rom0 on / type rootfs (ro)

  /proc on/proc type proc (rw)

  /dev/ram0 on/var type ext2 (rw)

  /dev/ram1 on /disk type ext2 (rw)

  10.5.22.247:/home/tmp on /var/tmp type nfs (rw,v3,rsize=8192,hard, udp,nolock,addr=10.5.22.2)

  这样就将宿主机的/home/tmp目录挂载到了用户板的/var/tmp目录。


  结语

  通过以上两种方式的比较,可以看到,就开发的效率来说,NFS的方式明显具有优势。毕竟,用户开发的程序往往不能一次就调试成功,采用 NFS方式使得多人同时开发一个程序成为可能。事实上,除了文中提到的两种方式以外,还有其它以太网环境下的嵌入式开发手段,如telnet等,限于篇 幅,不再详细介绍。

在嵌入式系统的开发过程中,通常都要建立交叉编译环境,图1为常见的嵌入 式系统开发环境示意图,基于以太网下的调试一般应将宿主机和用户板接入到局域网中,本文以mClinux +S3C4510B的开发环境为例进行说明。通常的做法是在宿主机上安装RedHat Linux操作系统,并同时安装针对ARM开发的工具链arm-elf-tools。这样,在宿主机上编辑和编译好的用户程序,就可以通过以太网,将编译 后的可执行文件下载到用户板来运行。下载方式主要有以下几种。

  嵌入式文件系统要求分析

  嵌入式linux下常见的文件系统

  • RomFS:只读文件系统,可以放在ROM空间,也可以在系统的RAM中,嵌入式linux中常用来作

  根文件系统

  • RamFS:利用VFS自身结构而形成的内存文件系统,使用系统的RAM空间

  • JFFS/JFFS2:为Flash设计的日志文件系统

  • Yaffs:专门为Nand Flash设计

  • proc:为内核和内核模块将信息发送给进程提供一种机制,可以查看系统模块装载的信息

  • devFS:设备文件系统

  Linux上的Ext2fs

  • 支持4 TB 存储、文件名称最长1012 字符

  • 可选择逻辑块

  • 快速符号链接

  • Ext2不适合flash设备

  • 是为象IDE 设备那样的块设备设计的,逻辑块大小必须是512 byte、1 KB、2KB等

  • 没有提供对基于扇区的擦除/写操作的良好管理

  • 如果在一个扇区中擦除单个字节,必须将整个扇区复制到RAM,然后擦除,再重写入

  • 在出现电源故障时,Ext2fs 是不能防止崩溃的

  • 文件系统不支持损耗平衡,缩短了flash的寿命

  jffs/jffs2文件系统的优缺点

  • 日志文件系统

  • 提供了更好的崩溃、掉电安全保护

  • jffs2支持对flash的均匀磨损

  • 在扇区级别上执行闪存擦除/写/读操作要比Ext2文件系统好

  • 文件系统接近满时,JFFS2 会大大放慢运行速度——垃圾收集

  Nand上yaffs文件系统的优势

  • 专门为Nand flash设计的日志文件系统

  • jffs/jffs2不适合大容量的Nand flash

  • jffs的日志通过jffs_node建立在RAM中,占用RAM空间:对于128MB的Nand大概需要4MB的空间来维护节点

  • 启动的时候需要扫描日志节点,不适合大容量的Nand flash

  • FAT系统没有日志

  编译yaffs文件系统

  • mtd的最新补丁升级?

  • 接口更新,适合与yaffs

  • 与原有的mtd驱动程序不兼容,需要重写

  • 如果使用旧mtd驱动需要定义Makefile中MTD_OLD = -DCONFIG_YAFFS_USE_OLD_MTD

  • 参考文档: yaffs-rootfs-howto

  • 最新版的yaffs网站:http://www.aleph1.co.uk/armlinux/projects/yaffs

  使用yaffs文件系统

  • 通过cat /proc/yaffs命令可以看到yaffs系统的相关信息

  • mount -t yaffs /dev/mtdblock/0 /mnt/yaffs


  关于Linux文件系统

  JFFS 全称为:The Journalling Flash File System(日志闪存文件系统)最初由瑞典的 Axis Communications 开发,Red Hat 的 David Woodhouse 对它进行了改进。作为用于微型嵌入式设备的原始闪存芯片的实际文件系统而出现。JFFS文件系统是日志结构化的,这意味着它基本上是一长列节点。每个节点包含有关文件的部分信息 — 可能是文件的名称、也许是一些数据。相对于 Ext2 fs,JFFS 因为有以下这些优点而在无盘嵌入式设备中越来越受欢迎:

  1 JFFS 在扇区级别上执行闪存擦除/写/读操作要比 Ext2 文件系统好。

  2 JFFS 提供了比 Ext2 更好的崩溃/掉电安全保护。当需要更改少量数据时,Ext2 文件系统将整个扇区复制到内存(DRAM)中,在内存中合并新数据,并写回整个扇区。这意味着为了更改单个字,必须对整个扇区(64 KB)执行读/擦除/写例程 — 这样做的效率非常低。要是运气差,当正在 DRAM 中合并数据时,发生了电源故障或其它事故,那么将丢失整个数据集合,因为在将数据读入 DRAM 后就擦除了闪存扇区。JFFS 附加文件而不是重写整个扇区,并且具有崩溃/掉电安全保护这一功能。

  3 这可能是最重要的一点:JFFS 是专门为象闪存芯片那样的嵌入式设备创建的,所以它的整个设计提供了更好的闪存管理。

  要构建JFFS文件系统,首先要有硬件设备FLASH及支持JFFS文件系统的操作系统。


  申明:这份文档是按照自由软件开放源代码的精神发布的,任何人可以免费获得、使用和重新发布,但是你没有限制别人重新发布你发布内容的权利。发布本文的目的是希望它能对读者有用,但没有任何担保,甚至没有适合特定目的的隐含的担保。更详细的情况请参阅 GNU 通用公共许可证(GPL),以及GNU 自由文档协议(GFDL)。


  你应该已经和文档一起收到一份GNU 通用公共许可证(GPL)的副本。如果还没有,写信给:

  The Free Software Foundation, Inc., 675 Mass Ave, Cambridge,MA02139, USA

  欢迎各位指出文档中的错误与疑问


  一、flash读写的特殊性

  对于嵌入式系统,flash是很常见的一种设备,而大部分的嵌入式系统都是把文件系统建立在flash之上,由于对flash操作的特殊性,使得在flash上的文件系统和普通磁盘上的文件系统有很大的差别,对flash操作的特殊性包括:

  (1) 不能对单个字节进行擦除,最小的擦写单位是一个block,有时候也称为一个扇区。典型的一个block的大小是64k。不同的flash会有不同,具体参考flash芯片的规范。

  (2) 写操作只能对一个原来是空(也就是该地址的内容是全f)的位置操作,如果该位置非空,写操作不起作用,也就是说如果要改写一个原来已经有内容的空间,只能是读出该sector到ram,在ram中改写,然后写整个sector。

  由于这些特殊写,所以在flash这样的设备上建立文件也有自己独特的特点,下面我们就以jffs为例进行分析。


  二、jffs体系结构介绍

  1、存储结构

  在jffs中,所有的文件和目录是一样对待的,都是用一个jffs_raw_inode来表示

  整个flash上就是由一个一个的raw inode排列组成,一个目录只有一个raw inode,对于文件则是由一个或多个raw inode组成。

  2、文件组成

  在文件系统mount到flash设备上的时候,会扫描flash,从而根据flash上的所有属于一个文件的raw inode建立一个jffs_file结构以及node list。


  下面的图显示了一个文件的组成

  一个文件是由若干个jffs_node组成,每一个jffs_node是根据flash上得jffs_raw_inode而建立的,jffs_file主要维护两个链表

  版本链表:主要是描述该node创建的早晚,就是说version_head指向的是一个最老的node,也就意味着垃圾回收的时候最该回收的就是这个最老的node。

  区域链表:这个链表主要是为读写文件创建的,version_head指向的node代表的文件数据区域是0~~~n-1 之后依次的节点分别是 n~~~m-1 m~~~~o-1 ……。其中n《M《=“” p=“” /》


  3、操作

  对文件的读操作应该是比较简单,但是写操作,包括更改文件名等操作都是引起一个新的jffs_node的诞生,同时要写一个相映的raw inode到flash上,这样的操作有可能导致前面的某个jffs_node上面的数据完全失效,从而导致对应flash上的raw inode的空间成为dirty。


  下面举一个例子可能会更清楚一些。

  一个文件的range list是由上面的三个jffs_node组成,当我们做如下写操作的时候

  lseek( fd, 10, SEEK_SET );

  write( fd, buf,40 );

  第一个和最后一个node被截短了,第二个node完全被新数据替换,该node会从链表上摘下来,flash上空间变成dirty。如果做如下写操作的时候

  lseek( fd, 23, SEEK_SET );

  write( fd, buf,5 );

  此时,第二个node被分裂成两个node,同时产生一个新的node,range链表的元素变成五个。

关键字:嵌入式  开发环境  文件系统 引用地址:嵌入式开发环境介绍,嵌入式文件系统要求分析

上一篇:嵌入式技术优缺点分析,嵌入式入门学习方法
下一篇:LCD的ARM编程方式,LCD Linux程序如何写入?

推荐阅读

中国一年有5000万个摄像头需求,但实际只有50万个智能摄像头在应用,这个比例只有1%,这预示着智能安防才刚刚进入初级阶段。近期,与数十位智能安防领域从业者进行一对一交流,从企业方了解到智能安防当前发展现状,以及在实际运营过程中遇到的问题。通过企业走访过程,我们加深了对安防AI化发展的了解,也从相关信息和数据中发现了一些共识与趋势。共识1)...
  物联网硬件、联网装备和IoT操作系统,底层逻辑完全不同。这周观察到了更多有趣的信号。  其一,中国有20%的机床企业正在亏损。  根据中国机床工具协会发布的“2019年上半年机床工具行业经济运行情况”分析,机床工具行业5547家规上企业中,亏损企业1033家,亏损面为18.6%,该协会重点联系企业6月亏损企业占比为38.3%,而且1-6月金属加工机床新增订...
9月23日讯,电动汽车巨头特斯拉于于美国时间周二(22日)下午1时30分举办2020年股东大会,紧接着是众所瞩目的「电池日」(Battery Day)发表会,受到投资人高度期待。特斯拉CEO马斯克(Elon Musk)喊出2020年交车数年增30%至40%的目标,对今年营运展望乐观。据《华尔街日报》和CNBC报道,在特斯拉股东大会上,马斯克向股东表示,虽然2020年是特斯拉最...
Vishay推出额定功率为0.5 W的增强型厚膜片式电阻器件通过AEC-Q200认证,节省电路板空间,同时减少元件数量,降低加工成本宾夕法尼亚、MALVERN — 2021年9月23日—日前,Vishay Intertechnology,Inc.宣布,推出增强型Vishay Draloric RCC1206 e3厚膜片式电阻,外形尺寸为1206,额定功率0.5W。RCC1206 e3的功率是这种标准尺寸厚膜片式电阻的两倍,可...

史海拾趣

问答坊 | AI 解惑

RS232接口转USB接口的通信方法

USB作为一种新的PC机互连协议,使外设到计算机的连接更加高效、便利。这种接口适合于多种设备,不仅具有快速、即插即用、支持热插拔的特点,还能同时连接多达127个设备,解决了如资源冲突、中断请求(IRQs)和直接数据通道(DMAs)等问题。因此,越 ...…

查看全部问答∨

西思科技(上海)高薪诚聘嵌入式软件工程师(必须有两年以上WINCE经验)

公司专注WINCE/WINDOWS?MOBILE产品开发,主要产品为智能手机、GPS、车载娱乐系统有微软授权。有屏蔽房、频谱仪、网络仪等全套开发设备。因发展需要,在上海诚聘嵌入式软件工程师和应用软件工程师。 ?薪资:有意向后可以面谈,8-15k,另有项目提成 ...…

查看全部问答∨

熟悉keil2或keil3的师傅们帮我解决这个问题啊

现在代码编译生成不了.hex文件啊,郁闷啊!老是出现target not create!不知道是怎么回事?用keil 2和keil3都没用!!!还有就是老在for循环的括号前出现红色的标志!请高手指点…

查看全部问答∨

无线模块

无线模块网站 http://www.tianyi-dz.com qq:472230383 …

查看全部问答∨

我的电脑不支持自制的JTAG怎么办?

自制了一简易JTAG在自己电脑上联不上,在公司电脑却可以用,我在并口的模式下全试过了,还是不行,有什么解决办法??…

查看全部问答∨

stm32 配置usart

开始的时候需不需要调用函数 USART_ITConfig 来进行中断开启 而,中断中需不需要 调用 USART_ClearITPendingBit(,来清除中断标志位…

查看全部问答∨

Modelsim仿真的SymInitialize问题

哪位大侠遇到过这个问题: # SymInitialize:系统找不到指定的路径库。   以前没遇到过,查Modelsim的manual也没有 Google不好用,百度查不到。   只好到这里来求神拜神了!!   我个人感觉是不是跟Symbol库加载有关系,但 ...…

查看全部问答∨

请教C语言与汇编的效率与功耗?

最近在做超低低功耗产品,由于接手时程序基本完成,是用汇编编写的,程序的修改和维护很复杂,持续修改中,可是感觉问题越改越多;现在考虑要用C语言重写一下,对以后的维护会节约很多时间,可是现在摆在面前有几个问题,不知道大家有没有了解的。 ...…

查看全部问答∨

富士通芯片申请

http://www.fujitsu.com/cn/fss/freesample/ 有需要的可以去申请。这次申请速度不错,不到1周就有回复了。就是还没有发货,等待发货中…

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved