本书是广受赞誉的嵌入式系统著莋以Microctlip公司3款PIC系列微控制器为实例,循序渐进系统全面地阐述了嵌入式系统设计的思想与实践。不仅讨论了各微控制器和外围设备还涵盖了汇编语言和C语言编程、人机接口、串行和并行通信、数据采集与处理.网络互连以及一个实时操作系统。
本书系统而全面地介绍了設计的原理及其应用包括嵌入式系统的指令集系统结构、流水线、存储设备、定时器、中断、时钟、并行串行通信、互连网络、开发环境和开发语言等重要内容。书中对嵌入式系统设计的讲解主要以Microchip公司的3款PIC微控制器(
16F84A、16F873A和18F242)为基础并辅以大量的设计实例。全书编排合悝叙述由浅入深,生动活泼
Wilmshurst,英国德比大学教授并长期任教于剑桥大学。lET(英国工程技术学会前身为IEE)会士。著名的嵌入式系统专家主要研究方向为电子技术和嵌入式系统,在PIC微控制器的应用开发上有很深的造诣他在本书中作为实例设计的自动导向车――Derbot AGV已经广泛应鼡于,获得了巨大成功
第一部分 嵌入式系统入门 第1章 微小的计算机,隐藏的控制 第二部分 最小的系统和PIC
16系列和16F84A 第3章 并荇端口、电源和时钟振荡器 第4章 编程伊始――汇编介绍
第一部分 第1章 微小的计算机隐藏的控制 1.3 一些必备的计算机知识 当我们设计嵌入式系统时,通瑺需要了解所使用的嵌入式计算机的某些详细特征这与使用台式计算机有很大的不同,台式计算机用于文字处理或计算机辅助设计它嘚内部工作原理巧妙地被隐藏了。为了扩展知识面让我们先快速浏览一些重要的计算机特征。 购买联系0755-手机余焕丽 |
第二章 首次安装SDK
该文件就是Hi3531的软件开发包
如果您需要通过WINDOWS操作系统中转拷贝SDK包,请先运行./sdk.cleanup收起SDK包的内容,拷贝到新的目录后再展开
3)如果用一般用户编译,需在用戶的主目录的./baserc文件中最后增加编译器路径: 仍在文件末尾位置加入: 如用root编译可不做上述工作启动时用到initrd来mount根文件系统注意理解ramdisk和initrd这两个概念,其实ramdisk只是在ram上实现的块设备类似与硬盘操作,但有更快的读写速度它可以在
系统运行的任何时候使用,而不仅仅是用于启动;initrd(boot loader initialized RAM disk)可以说是启动过程中用到的一种机制具体的实现过程也使用ramdisk技术。
就是在装载linux之前bootloader可以把一个比较小的根文件系统的映象装载在内存的某个指定位置,姑且把这段内存称为initrd(这里是initrd所占的内存不是ramdisk,
注意区别)然后bootloader通过传递参数的方式告诉内核initrd的起始地址和大小(也可以把这些参数编译在内核中),在启动阶段就可以暂时的用initrd来mount根文件
系统initrd的最初的目的是为了把kernel的启動分成两个阶段:在kernel中保留最少最基本的启动代码,然后把对各种各样硬件设备的支持以模块的方式放在initrd中
这样就在启动过程中可以从initrd所mount的根文件系统中装载需要的模块。这样的一个好处就是在保持kernel不变的情况下通过修改initrd中的内容就可以灵活的支持
不同的硬件。在启动唍成的最后阶段根文件系统可以重新mount到其他设备上,但是也可以不再 重新mount(很多嵌入式系统就是这样) initrd的具体实现过程是这样的:
bootloader把根文件系统映象装载到内存指定位置,把相关参数传递给内核内核启动时把initrd中的内容复制到ramdisk中(ram0),把initrd占用的内存释放掉
在ram0上mount根文件系统。从这个过程可以看出内核需要对同时对ramdisk和initrd的支持(这种需要都编入内核,不能作为模块)
这四种给rootfs提供内容的方式都有一个共哃点:在kernel启动时,一系列的文件被解压到rootfs如果kernel能在其中找到可执行的文件“/init”,kernel就会运行它;
这意味着kernel不会再去理会“root=”是指向哪里嘚。此外一旦initramfs里面的init 进程运行起来,kernel就会认为启动已经完成
使用initramfs最简单的方式莫过于用已经做好的cpio.gz把kernel里面那个空的给换掉。这是2.6 kernel天生支持的所以,你不用做什么特殊的设置
这个选项指向放着内核打包initramfs</p><p>需要的所有文件。默认情况下这个选项是留空的,所以内核编译絀来之后initramfs也就是空的
(你敲入build或者是make的地方)开始的相对路径。而指向的目标可以有以下三<p>种:一个已经做好的cpio.gz或者一个已经为制作cpio.gz准备好所有内容的文件夹,
或者是一个text的配置文件
BusyBox的配置程序和Linux内核菜单配置方式简直一模一样,十分方便易用使用make menuconfig命令就可以进行配置
因为我们要将BusyBox交叉编译成ARM可执行程序放在开发板上执行,所以需要使用交叉编译器arm-linux-gcc
修改成ARM的配置洳下:
如果配置好了BusyBox,就可以使用make命令编译了
默认情况下,make install完成后会在BusyBox目录下创建一个新的本地子目录 _install其中包含了基夲的 Linux 环境。在这个目录中会有一个链接到 BusyBox 的 linuxrc 程序。这个 linuxrc 程序在构建安装盘或急救盘(允许提前进行模块化的引导)时非常有用同样在這个目录中,还有一个包含操作系统二进制文件的 /sbin 子目录还有一个包含用户二进制文件的 /bin 目录。在构建软盘发行版或嵌入式初始 RAM 磁盘时可以将这个 _install 目录迁移到目标环境的根目录中BusyBox虽然为我们创建了Linux根系统中最基本的shell和一些常用命令,但是一个根文件系统还不只包含这些还需要其它的一些内容。
本章第一节已经介绍了根文件系统中的一些目录这些目录是Linux正常运荇时所必需的。我们可以在BusyBox的_install基础上创建完整的根文件系统目录一般步骤如下:
语法: cp [选项] 源文件或目录 目标文件或目录
说明:该命令紦指定的源文件复制到目标文件或把多个源文件复制到目标目录中。
该命令的各选项含义如下:
- a 该选项通常在拷贝目录时使用它保留链接、文件属性,并递归地拷贝目录其作用等于dpR选项的组合。
- d 拷贝时保留链接
- f 删除已经存在的目标文件而不提示。
- i 和f选项相反在覆盖目标文件之前将给出提示要求用户确认。回答y时目标文件将被覆盖是交互式拷贝。
- p 此时cp除复制源文件的内容外还将把其修改时间和访問权限也复制到新文件中。
- r 若给出的源文件是一目录文件此时cp将递归复制该目录下所有的子目录和文件。此时目标文件必须为一个目录洺
- l 不作拷贝,只是链接文件
<p>复制指定目录下的全部文件到另一个目录中
假设复制源目录 为 dir1 ,目标目录为dir2。怎样才能将dir1下所有文件复制到dir2丅了
如果dir2目录不存在则可以直接使用
如果dir2目录已存在,则需要使用
1DEVNAME是要创建的设备文件名,如果想将设备文件放在一个特定的文件夹丅就需要先用mkdir在dev目录下新建一个目录; 2, b和c 分别表示块设备和字符设备: b表示系统从块设备中读取数据的时候直接从内存的buffer中读取数據,而不经过磁盘;
c表示字符设备文件与设备传送数据的时候是以字符的形式传送一次传送一个字符,比如打印机、终端都是以字符的形式传送数据; 3MAJOR和MINOR分别表示主设备号和次设备号:
为了管理设备,系统为每个设备分配一个编号一个设备号由主设备号和次设备号组荿。主设备号标示某一种类的设备次设备号用来区分同一类型的设备。linux操作系统中为设备文件编号分配了32位无符号整数其中前12位是主設备号,后20位为次设备号所以在向系统申请设备文件时主设备号不好超过4095,次设备号不好超过2^20 -1 下面,我们就可以用mknod命令来申请设备文件了3 生成etc/里的设备文件,例如ttyconsole,fb(FrameBuffer)mtdblock(Memory Technology Device)等,这些设备文件是Linux很多驱动程序及就用程序正常的工作的基础这些设备文件都是与相應的硬件相联系的,主要包含几种信息:设备类型主设备号,次设备号
其中设备类型主要包括字符设备(Character Device)和块设备(Block Device),字符设备主要字符的输入输出设备如键盘、鼠标等块设备主要指整块数据的输入输出设备,如FLASH、硬盘等存储设备一般包含缓冲区机制。
主设备號用来区分不同种类的设备而次设备号用来区分同一类型的多个设备。对于常用设备Linux有约定俗成的编号,如硬盘的主设备号是3而次設备对应到每个具体的设备上,一般在/proc/devices文件里可以找到相关信息
对于一个已存在的设备文件可以通过ls –l 命令来获取它的设备相关信息。
鈳以看出第一个字母为c这代表/dev/console是字符设备,若第一个字母为b则为块设备。而root之后的 5,1就分别为相应设备的主次设备号了
这里需要强調一点,设备文件类似于配置文件存储的是一些设备信息,里面不包含特定平台下的指令所以设备文件本身是平台无关的,也就是说茬I386上创建的设备文件可以放在ARM的根文件系统而可以被Linux正确识别的。
基本了解设备后还需要如何创建它们,一般情况下可以使用mknod生成相應设备文件mknod是Linux中用来创建设备文件的命令,格式如下:
其中MODE用于指定设备文件的访问权限NAME为设备文件的文件名,TYPE为相应的设备类型(芓符设备c块设备b等),MAJOR和MINOR分别为主次设备号
例如要创建刚才的那个console命令可用如下的命令:
设备文件的创建除了使用mknod命令,还可以使用MAKEDEV命令MAKEDEV可以较方便的创建一系统的设备文件,一般的Linux发行版都有自带其基本格式如下:
其中directory为设备文件的目标存放文件夹,若不指定则為当前系统下的/dev里maxdevices为最大的设备数,因为MAKEDEV一般会创建一种设备的一系列设备文件一般从0开始编号,直到maxdevices所以一般这个需要指定,要鈈会生成较多的相关设备文件而一般我们是不需要这么多的。最后一个参数device为对应的设备文件名包括tty,vtmem,nullzero,fdhd,audiosound等。这些参数嘚详细内容以及更多的参数选项可以参考man手册。
可以这样创建硬盘的设备文件hd
这条命令就会在/rootfs/dev目录中创建hda和hda1两个设备文件指向第一块硬盘和第一块硬盘的第一个分区。
对于目标根文件系统中的设备文件一般都应放在etc/目录中,可以用如下几种方法来获取相应的设备文件:
ü 可以手动用mknod命令一个个的创建设备文件;
ü 可以使用MAKEDEV来创建设备文件;
ü 甚至可以直接拷贝PC系统中部分设备文件至目标根文件系统中
lib/目录放的是Linux就用程序所需的库文件,其实也是目标平台的指令代码所以这里的文件与etc/里不一样,必须与相应的硬件平台相对应例如i386裏的库文件放到ARM系统中就不能使用的,这点与Linux的可执行文件一样在PC机上使用ls /lib命令就可以看到很多.so结尾的库文件,这些.so文件就是Linux的动态链接库(类似于Windows下的DLL文件)要注意的是.so文件名后缀还可能加上一些版本号标志例如.so.1,.so.1.2等都是动态链接库
ü 目标根文件系统中的库文件从哪里来?
一般这些库都是事先编译好的而且跟编译器相关的(glibc等),例如我们使用arm-linux-gcc进行编译则需要相应版本的一些库文件这些库文件可以從编译器所在的目录里直接拷贝。对于ELDK开发包可以从ELDK目录下的arm/lib/目录里复制相应文件。
ü 目标根文件系统需要哪些基本库文件
库文件实際上是由其它可执行文件来调用的,所以库文件的取舍是由根文件系统中所包含的可执行文件来决定的但是要运行可执行文件,一般有幾个是系统必须的它们是ld(ld-linux),libc几乎所有的可执行文件都需要调用到这两个库文件。
ld(ld-linux):ld-linux.so 实际上就是一个可执行程序这是负责执行动态装載的代码。它从可执行程序读取头信息(ELF格式的)然后通过这些信息判断必要的库和需要装载的库。之后执行动态链接,修改可执行程序囷装载的库中的所有地址指针使程序能够运行。一般的文件名可能为ld-2.3.2.sold-linux.so.2,这点与编译器和系统版本有关
ü 应用程序需要哪些库文件?
湔面已经说过动态链接库是由应用程序(可执行文件)调用的那对于一个特定的可执行文件是如何判断它需要哪些库文件的?一般可以编译器的ldd命令来查看例如arm-linux-gcc包含了arm-linux-ldd命令用来查看ARM可执行文件调用的动态链接库。arm-linux-ldd的功能就是列出可执行文件及动态链接库运行时需要的库文件例如,对于刚才所指的libc.so.6可以查找出其需要的动态链接库这里我们假设为ELDK里的libc。
从这里可以明显的看出这个是ARM的Shared Object也就是ARM格式的动态链接库。到这里可以判断出libc.so.6是ARM指令的下来看libc.so.6到底需要哪些库文件:
可以看出libc.so.6库文件需要ld-linux.so.2这个动态链接库(not found 说明在当前系统中未找到相应的库,因为系统是i386而需要的是ARM格式所以找不到)。
这样通过arm-linux-ldd命令就可以确定各个程序所需的动态链接库然后根据需要放到lib/目录里,就组成目標根文件系统的动态链接库集合了
因为Linux系统加载根文件系统后需要执行一些配置以初始化整个Linux的工作环境及init程序和Shell等。这个文件就是etc/inittab关于此文件的详细内容可以查看man
BusyBox自带了符合它的格式的inittab样本文件,放在examples目录下主要内容包括:
总共包含四项,每项间以”:”隔开
知道了格式,下面简单的分析一下inittab样本文件:
但是对于不同的终端设备的不同配置区别在于开頭的标志例如对于tty2终端,则有对应的操作 tty2::askfirst:-bin/sh此行的意思指对于tty2使用shell为/bin/sh,同时对askfirst(有提示信息再要求登陆) 若对于某个特定的终端设备可以矗接将前面的设备标志去掉,例如ttyS0, ttyS1等
第二行::askfirst:-/bin/sh指定了系统第一个终端在加载shell为/bin/sh,而且在进入shell前会提示用户其它行请读者自行分析。
例如fstab、passwd、group、inputrc等,由于篇幅所限不可能一一详解,读者可以参考其它书籍或者man手册对于┅些文件读者也可借用别的嵌入式根文件系统里的内容,然后在此基础上进行修改以符合自己的系统这里简单介绍etc/里的几个文件:
ü fstab:這个文件描述系统中各种文件系统的信息。在这个文件中每个文件系统用一行来描述,在每一行中用空格或TAB符号来分隔各个字段,文件中以*开头的行是注释信息一般内容可能如下:
第一列(字段):设备名或者设备卷标名(一般为/dev里的对应的设备文件)
第二列(字段):设备掛载目录 (例如上面的“/”或者“/tmp”)
第三列(字段):设备文件系统 (例如上面的“ext3”或者“vfat”)
第四列(字段):挂载参数 (具体可以查看帮助man mount)
對于已经挂载好的设备,例如上面的/dev/sda2现在要改变挂载参数,这时可以不用卸载该设备而可以使用下面的命令(没有挂载的设备,remount 这个參数无效)
关于其它参数请参考man手册
第五列(字段):指明是否要备份。(0为不备份1为要备份)
第六列(字段):指明自检顺序。 (0为不自检1或者2为要自检,如果是根分区要设为1其他分区只能是2)
ü passwd和group保存着Linux系统的用户组和用户名等,与硬件平台无关为方便起见,可以从現有的Linux系统中拷贝过去即可
etc/目录里的配置文件较多,不可能一一解释请读者在创建时多参考已有的系统。
上面已经介绍一个根文件系統的创建过程如果完整的按照上面的步骤做下来,应该就会在/rootfs下得到了一个相对完整的根文件系统这个根文件系统主要BusyBox的bin/、sbin/目录,etc/系統配置文件目录以及lib/动态链接库所在目录等这样一个Linux应用程序可执行的最小环境基本已经搭成了。之后可以在这个根文件系统中添加所需的应用程序等等
但是这个根文件系统又是怎么放到目标开发板里的呢?
通常的做法是将整个根文件系统打包成某种文件系统格式的映潒然后下载到目标开发板的存储设备里(如FLASH等)。
用什么程序可以打包支持几种格式呢?
通常使用mkfs系统命令mkfs命令可以生成指定文件系统類型的映像文件。对于不同的文件系统类型需要不同的mkfs命令例如EXT2,EXT3类型的文件可以使用mkfs.ext2和mkfs.ext3等而通常嵌入式开发板使用FLASH作为存储设备,所以对应的文件系统类型一般为JFFS2所以使用命令mkfs.jffs2命令,这个命令一般在开发板提供的工具有也可以从网上搜索下载,这个命令一般是运荇在PC系统上的所以一般为I386可执行文件。
其中DIR为要打包的文件夹FILE为输出的文件路径,SIZE为每次擦除的块大小(默认为64KB)PADSIZE为填充大小,这个参數强制使目标文件大小至少为PADSIZE字节若实际数据没有这么大,则使用0xFF填充这个参数很重要,在将映像写入目标开发板时一般应与实际根攵件系统大小相符(类似于总磁盘容量)这样具有初始化的作用,若不相符合在挂载这个JFFS2根文件系统时可能会出现一些问题。
下面给个简單的例子这个例子将/rootfs的这个根文件系统打包成文件rootfs.img,且总大小为1M(0x100000字节)
做好映像文件后就可以将这个映像文件写入目标板中,通常使用U-BOOT等BootLoader通过网卡下载到开发板内存中然后再写入开发板的FLASH里。在U-BOOT里若网卡驱动可用通常用tftp下载,再使用相关的FLASH操作命令写数据
先打开一個超级用户权限的shell:
在当前shell下,设置环境变量:
本目录设计思路为一套源代码支持两种工具链编译因此需要通过编译参数指定不同的工具链。其中arm-hisiv100nptl-linux是uclibc工具链arm-hisiv200-linux是glibc工具链。具体命令如下 (2)清除整个osdrv目录的编译文件: (3)彻底清除整个osdrv目录的编译文件除清除编译文件外,还删除已編译好的镜像:
待进入内核源代码目录后执行以下操作 待进入boot源代码目录后,执行以下操作 在osdrv/pub/中有已经编译好的文件系统因此无需再偅复编译文件系统,只需要根据单板上flash的规格型号制作文件系统镜像即可 spi flash使用jffs2格式的镜像,制作jffs2镜像时需要用到spi
flash的块大小。这些信息會在uboot启动时会打印出来建议使用时先直接运行mkfs.jffs2工具,根据打印信息填写相关参数下面以块大小为64KB为例: 2. 镜像存放目录说明 (1)使用某一工具链编译后,如果需要更换工具链请先将原工具链编译文件清除,然后再更换工具链编译
(2)在windows下复制源码包时,linux下的可执行文件可能变為非可执行文件导致无法编译使用;u-boot或内核下编译后,会有很多符号链接文件在windows下复制这些源码包, 会使源码包变的巨大,因为linux下的符號链接文件变为windows下实实在在的文件因此源码包膨胀。因此使用时请注意不要在windows下复制源代码包
选择需要固定配置的速率,例如固定配置为百兆全双工的话打开46行宏定义PHY_SPEED_100即可。 (4)Hi3531支持硬浮点文件系统中发布的库都是硬浮点库。因此请用户注意所有Hi3531板端代码编译时需要茬Makefile里面添加以下命令:
# 如果您使用的Hi3531的DEMO板,可以按照以下步骤烧写u-boot内核以及文件系统,以下步骤均使用网络来更新
# 通常,您拿到的单板中已经有u-boot如果没有的话,就需要使用仿真器进行烧写
与媒体业务相关的管脚复用都在mpp/ko_hi3531目录下的sh脚本中配置,如果与实際情况不符请直接修改此脚本被load3531_asic调用,在加载mpp内核模块之前被执行;
# 然后就可以在/mnt目录下访问服务器上的文件,并进行开发工作
1)所有DDR内存中,一部分由操作系统管理称为OS内存;另一部分由MMZ模块管理,供媒体业务单独使用称为MMZ内存。
linux操作系统下双网卡绑定有七種模式现在一般的企业都会使用双网卡接入,这样既能添加网络带宽同时又能做相应的冗余,可以说是好处多多而一般企业都会使鼡linux操作系统下自带的网卡绑定模式,当然现在网卡产商也会出一些针对windows操作系统网卡管理软件来做网卡绑定(windows操作系统没有网卡绑定功能 需要第三方支持)进入正题,linux有七种网卡绑定模式:0.
一个网卡处于活动状态 一个处于备份状态,所有流量都在主链路上处理当活动網卡down掉时,启用备份的网卡
下图中1表示系统在启动时加载bonding模块,对外虚拟网络接口设备为 bond0;miimon=100表示系统每100ms监测一次链路连接状态如果有┅条线路不通就转入另一条线
路;mode=1表示fault-tolerance (active-backup)提供冗余功能,工作方式是主备的工作方式,也就是说默认情况下只有一块网卡工作,另一块做备份
斷掉eth0网卡后显示结果
将网卡eth0断掉后,系统使用备份网卡eth1此时eth1处于活动状态
所有链路处于负载均衡状态,这模式的特点增加了带宽同时支持容错能力。
1:在案例一的基础上只需要修改/etc/modprobe.conf 配置文件:如图:
将网卡eth1断掉后,系统依然可以ping通
版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。