《嵌入式系统》考点完全整理.docx
《《嵌入式系统》考点完全整理.docx》由会员分享,可在线阅读,更多相关《《嵌入式系统》考点完全整理.docx(16页珍藏版)》请在冰豆网上搜索。
《嵌入式系统》考点完全整理
冯·诺依曼体系结构、哈佛体系结构
CISC复杂指令集RISC精简指令集
常用的Flash芯片:
NORFlash,NANDFlash
MMU:
内存管理单元(MemoryManagementUnit)
由最小系统组成的电路开发板称为核心板
对嵌入式系统的应用项目来说,系统的关键并不单纯在于微处理器的速度,而在于整个系统在性能、功耗和成本间的折中。
Bootloader:
嵌入式系统加电运行的第一段代码,具体完成如下工作:
1.设置系统硬件:
CPU,RAM,Flash,串口,时钟
2.设置堆栈指针
3.创建内核需要的信息
调用操作系统内核
bootloader一般被加载到内存中的0x00000000地址上
启动加载(bootloading)模式
–从目标机的ROM上将操作系统加载到RAM中运行
–产品发布后采用的工作模式
下载(downloading)模式
–Bootloader通过串口或网络从宿主机上下载操作系统内核和根文件系统映像文件到目标机的RAM中
–可以被bootloader写入到目标机的ROM中,或直接被引导
–前期开发时采用的模式
根文件系统一般为只读模式,需要使用额外的工具生成映像文件,并将其烧写到Flash芯片的相应分区中
–mk.cramfs
–root.cramfs
EDA:
电子设计自动化
PCB:
印制电路板
ICE:
(在线)仿真器
PLD:
可编程逻辑器件
FPGA:
现场可编程门阵列(主流技术)
设计流程
需求分析
作用
使用户和设计者有效交流、沟通,明确设计目标
✓设计者-设计什么?
有哪些要求?
✓
用户-将得到的系统是什么样的?
目标
形成需求文档
内容
功能性需求
✓输入、输出信号,操控方式,etc.
非功能性需求
✓可靠性,速度,功耗,……
✓成本,大小,重量,设计时间,etc.
规格说明
✓与需求分析的比较
✓对用户需求的进一步提炼
✓更准确、更一致、更详细,可创建系统结构
✓目标
✓形成规格说明书(验收合同)
✓内容
✓包含系统体系结构设计的足够信息
✓描述(工作框图)
✓自然语言
✓形式化语言,UML
系统结构设计
•描述系统如何实现所述功能需求
•对硬件软件进行划分
•硬件(构件)选型
•是设计成功与否的关键
•结构化设计方法
•以算法为中心,从处理到处理的数据流
•从输入、输出入手,形成较粗的系统大框架
•细化框架内的每个部分,进一步确定模块间的关系
•面向对象的方法
•以“类”及交互模式为中心
软硬件构件设计
•基于体系结构,对系统软硬件进行详细设计
•软硬件并行设计(划分)
•如采用现成的硬件模块,大部分工作集中在软件设计上(选择商用硬件模块,提高可靠性)
•除了基本系统、物理接口、基本逻辑电路以外,许多硬件的功能都可以由软件来实现.
通常由软件来实现的部分:
•操作系统:
任务调度、资源管理、设备驱动
•协议栈:
TCP/IP
•应用软件框架:
数据库访问接口,QT
系统集成
•把软件、硬件、执行装置和被控对象集成在一次进行调试
•发现并改进前述单元设计过程的错误
•测试
–看是否满足规格说明书中给定的功能
–是质量得到保证的基础
ARM
ARM7处理器内核包含2个指令集:
ARM+Thumb
•ARM状态:
32bit,执行字方式的指令(默认状态)
•Thumb状态:
16bit,执行半字方式的指令
•两个状态的切换不影响处理器运行模式或寄存器内容
ARM的7种运行模式
ARM指令vs.Thumb指令
•Thumb没有协处理器指令、64位乘法指令、访问程序状态寄存器的指令
•Thumb状态下,单个数据加载/存储指令只能访问R0至R7
•Thumb指令的操作结果需放入其中一个操作数寄存器内
•实现特定功能的程序,需要更多的Thumb指令
•系统不能只支持Thumb,复杂的工作还需ARM指令来完成
•编译C程序时,可以选择编译为Thumb指令还是ARM指令
ARM的存储管理单元(MMU)
•多数ARM处理器具有MMU
•MMU管理嵌入式系统的虚拟存储器(与OS的虚拟内存管理模块配合使用)
•MMU:
完成虚拟空间到物理空间的映射+控制访问权限
•MMU的权限管理:
决定一块内存是否允许读或写
GCC的执行过程
–预处理(也称预编译,Preprocessing)
对头文件(include)、预编译语句(如define等)进行分析,使用GCC的选项-E
–编译(Compilation)
将预处理后的文件转换成汇编语言,生成文件.s,使用GCC的选项-S
–汇编(Assembly)
由汇编变为目标代码(机器代码),生成.o的文件,使用GCC的选项-c
–连接(Linking)
连接目标代码,生成可执行程序
GCC优化
gcc–Ohello.c–ohello
GDB基本命令
•设置断点
–break:
进入指定函数时停住。
(简写:
b)
–break:
在指定行号停住
•查看断点设置
–infob
•清除断点
–delete[breakpoints][range](简写:
d)
–breakpoints为断点号,range表示断点号的范围(如:
2-4)。
如果不指定断点号,则表示删除所有的断点。
–disable断点,gdb不会删除,当还需要时,enable即可
•恢复程序运行和单步调试
–run(简写r):
从程序开始运行程序
–continue(简写c):
恢复程序运行,直到程序结束,或是下一个断点到来。
–step(简写s):
单步执行,进入调用的函数的内部
–next(简写n):
单步执行,不会进入调用的函数内部
–finish(简写f):
如果已进入了某函数,而想退出该函数返回到它的调用函数中
•查看运行时数据
–print:
查看当前程序的运行数据。
为格式。
–printvar:
打印变量的值
–print&var:
打印变量的地址
•退出GDB
–quit(简写q)
Makefile由一系列规则组成,规则格式如下:
target:
dependency_files依赖关系
command命令
NFS
•NFS(NetworkFileSystem)指网络文件系统服务,NFS服务可以使网络上的同为Linux或Unix系统主机共享文件系统。
•NFS可以将远程文件系统载入在本地文件系统下。
远程的硬盘、目录和光驱都可以变成本地主机目录树中的一个子目录。
载入后与处理自己的文件系统一样使用即可。
•NFS的使用分为
–服务器端——提供要共享的文件,被挂载(mount)端
–客户端——通过挂载mount实现对共享文件的访问操作
•客户端只要用mount就可以把远程宿主机的NFS目录文件挂接到自己的文件系统下,客户端使用NFS目录文件就和使用本地的文件一样
BootLoader的功能
•硬件设备初始化(CPU的主频、SDRAM、中断、串口等)
•内核启动参数
•启动内核
•与主机进行交互,从串口、USB口或者网络口下载映象文件,并可以对Flash等存储设备进行管理
大多数BootLoader都包含两种不同的操作模式:
–启动模式(启动加载模式)
–下载模式
大多数BootLoader都分为两大部分
stage1
依赖于处理器体系结构,板级初始化的代码通常都放在stage1中,用汇编语言实现
•硬件设备初始化
–屏蔽所有的中断、设置CPU的速度和时钟频率、RAM初始化、初始化LED、关闭CPU内部指令/数据cache
•为加载BootLoader的stage2准备RAM空间
•拷贝BootLoader的stage2到RAM空间中
–stage2的可执行映像在固态存储设备的存放起始地址和终止地址
–RAM空间的起始地址
•设置好堆栈
–设置堆栈指针SP,为执行C语言代码做好准备
•跳转到stage2的C入口点
stage2
通常用C语言来实现,这样可以实现更复杂的功能,而且代码会具有更好的可读性和可移植性。
•初始化本阶段要使用到的硬件设备
–初始化串口、计时器等
•检测系统内存映射(memorymap)
–内存映射指在整个存储器物理地址空间中指出哪些地址范围被分配,用来寻址系统的RAM单元
•将kernel映像和根文件系统映像从Flash上读到RAM空间中
•为内核设置启动参数
•调用内核
信号(Signal)
•在软件层次上模拟中断机制
•可在用户进程和内核进程间直接交互
•内核进程可以发送信号给用户进程
•异步通信方式
–可以在任何时候发给某个进程
–如果进程当前未被执行,该信号有内核先保管起来
–如果一个信号被进程设置为阻塞,则延迟传递
信号的三个阶段
一个进程可以选择忽略某些信号而只处理其他一些信号,另外,一个进程还可以选择信号的处理方式;总的来说,这都是与特定进程相联系的,因此,建立信号与进程间的对应关系就是信号处理。
Signal的发送函数:
•kill()
–不仅可以终止进程,还可以向进程发送其他信号
–intkill(pid_tpid,intsig)
pid:
要响应该信号发送的进程号
sig:
信号(进程应该响应的方式)进程对收到的signal有三种处理方式:
忽略、按照自定义方式处理、按照默认方式处理
成功则返回0,否则返回-1
•raise()
–进程向自身发送信号,
–raise(sig)效果等于kill(getpid(),sig)
•alarm()
–相当于一个定时器,时间一到就发送信号,alarm(seconds)
•pause()
–将调用进程挂起,直至捕捉到信号为止,pause()
–通常用于判断信号是否到达
Signal函数:
•sighandler_tsignal(intsignum,sighandler_thandler)
•signum:
进程收到的信号
•handler(宏或自定义的信号处理函数)
–SIG_IGN:
忽略该信号
–SIG_DFL:
采用系统默认的方式处理该信号
•返回值:
上一次信号处理配置(成功),-1(失败)
structfile不同于FILE
–前者在kernel中工作,后者在用户程序中使用(定义在C函数库内)
–#include
minor:
次设备号(区分同类设备)
设备驱动程序初始化时要向kernel注册
–2.4:
register_chrdev(unsignedintmajor,constchar*name,structfile_operations*fops)
驱动使用计数器
MOD_INC_USE_COUNT;
MOD_DEC_USE_COUNT;
或:
try_module_get(THIS_MODULE);
module_put(THIS_MODULE);
在内存中分配连续的存储区域
data=(char*)kmalloc(sizeof(char)*count,GFP_KERNEL);
insmodXXXXX.o
lsmod
查看主设备号:
cat/proc/devices
创建字符设备:
mknod/dev/device_namecxxx0
使用request_irq()为中断服务例程分配一个硬件中断号,并登记相应的中断处理程序
intrequest_irq(
unsignedintirq,
void(*handler),
unsignedlongirqflags,
constchar*devname,
void*dev_id
);
使用free_irq()函数来释放中断
voidfree_irq(unsignedintirq,void*dev_id);
声明了一个信号量sem并初始化它的值为1
voidinit_NUMTEX(structsemaphore*sem);
与down()类似,获得信号量sem,将sem值减1,但不会被信号打断,返回值用来区分获得信号量而正常返回(返回0),还是被信号中断(返回负值)
intdown_interruptible(structsemaphore*sem);
voidup(structsemaphore*sem);
连接板子:
1.打开串口连接
2.Ifconfig……
3.cat/etc/exports
4./etc/init.d/nfsrestar
5.mount-tnfs-onolock192.168.0.1:
/arm2410s/host
1.makedep,生成变量依赖关系
2.makeclean,删除生成的模块和目标文件
3.makezImage,编译内核并生成的映像文件zImage
4.makemodules,编译模块
5.makemodules_install,安装编译后的模块
Linux内核的配置系统有三个部分组成,除非是内核配置系统的维护者,否则无需了解上述功工具的实现原理。
本实验中,内核源码在/arm2410s/kernel-2410s,可以在RedHat主机的终端上进入该目录进行查看。
这三个部分是:
•makefile:
分布在Linux内核源码中,定义Linux内核的编译规则;
•config.in:
配置文件,给用户提供配置选择的功能:
•makemenuconfig:
配置工具,包括配置命令解释器和用户界面。
makeconfig和makexconfig是另外两个内核配置工具,本实验中使用makemenuconfig。
内核配置文件.config,包含由用户选择的配置的选页,用来存放内核配置后的结果,在本实验中,.config文件为/arm/kernel-2410s目录下的后缀为.config文件