下半学期西电嵌入式系统设计大作业.docx
- 文档编号:9264881
- 上传时间:2023-02-03
- 格式:DOCX
- 页数:19
- 大小:1.37MB
下半学期西电嵌入式系统设计大作业.docx
《下半学期西电嵌入式系统设计大作业.docx》由会员分享,可在线阅读,更多相关《下半学期西电嵌入式系统设计大作业.docx(19页珍藏版)》请在冰豆网上搜索。
下半学期西电嵌入式系统设计大作业
嵌入式系统设计大作业
授课老师:
孙江敏
学院:
计算机学院
学生姓名:
学号:
日期:
2016年6月12日
嵌入式系统设计大作业
1、判断题
(×)1.嵌入式系统调试通常可以分为硬件级调试和在线仿真器调试。
(√)2.在ARM处理器中,快速中断(FIQ)的优先级高于外部中断(IRQ)。
(×)3.ROM能够永久或半永久地保存数据,ROM内的数据永远不会丢失。
(√)4.内建测试系统(BIST)是SoC片上系统的重要结构之一,JTAG测试接口是IC芯片测试方法的标准。
(×)5.VHDL的基本单元描述不包括库。
(×)6.嵌入式ARM架构的嵌入式处理器同时支持大端、小端(Big/Little-Endian)数据类型。
(×)7.嵌入式操作系统通常采用整体式内核或层次式内核的结构。
(×)8.ARM7TDMI中的T代表增强型乘法器。
(×)9.看门狗(WatchDog)实际是一个简单的定时器,在固定时间内若正常清零,则自动复位处理器。
(√)10.ARM-CPU由多家不同制造商生产,芯片外部提供的总线是不一致的。
(√)11.Linux内核稳定、功能强大并且可以裁减,因为非常适合嵌入式应用。
(√)12.Linux内核的中断服务程序运行于与所有进程都无关的中断上下文中。
(√)13.Linux遵循POSIX标准,意味着绝大多数UNIX应用程序不需要任何改动就可以在Linux系统上编译且运行。
(×)14.Linux内核支持可以裁减的功能,因此它属于微内核架构。
(√)15.Linux在fork()时采用了写时拷贝(简称COW)技术,允许父进程和子进程同时共享相同的物理页面。
(√)16.任何一个Linux应用程序都需要调用exit()函数。
(√)17.当前的Linux调度算法非常高效,但是查找当前最高优先级的可运行程序时,开销会随着可运行程序的多少而变化。
(√)18.Linux的系统调用是作为C库的一部分提供的。
(×)19.为了对硬件做出迅速的响应并完成对时间严格的操作,中断处理下半部必须在关中断状态下执行。
(×)20.Linux的内存管理采用了分页的机制,因此即使是内核本身也全部是分页的。
(×)21.嵌入式系统由上到下主要分为3个层次:
应用软件层,系统软件层,硬件层。
(×)22.嵌入式系统的软硬件是独立设计的。
(√)23.嵌入式系统设计需要建立交叉开发环境。
(√)24.通用系统程序开发不需要建立和使用交叉编译环境。
(√)25.对于C++代码,gcc命令只能编译其源文件,而不能自动和C++程序使用的库链接。
(√)26.嵌入式系统可以没有操作系统。
(√)27.JTAG测试允许多个器件通过JTAG接口串联在一起形成一个JTAG链,能实现对各个器件分别测试。
(×)28.GDB调试器只支持本地调试应用程序。
(√)29.KGDB程序是一个专门用于调试Linux内核的GDB调试桩。
(×)30.片上调试器是存在重叠RAM。
2、叙述嵌入式平台的搭建过程,以linux为例。
①建立交叉编译环境
一般开发机上已经有一套开发工具,称之为原生开发套件。
一般用原生开发套件来写程序,在开发机上再安装一套开发工具,这套开发工具编译出来的程序,如内核、系统工作或者自己的程序,放在目标主机上运行。
一般的开发机都是X86平台,原生开发套件开发的工具,也针对X86平台,而目标主机可能是PowerPC、IXP、MIPS。
所以,用交叉编译环境针对某一类具体平台。
交叉开发环境一般需要二进制工具程序、编译器、C链接库,嵌入式开发常用的三类软件是:
Binutils、Gcc、uClibc。
GNU包含的工具套件不仅于此,有时会根据实际需要,进行选择。
②编译内核
开发工具是针对某一类硬件平台,内核同样也是。
这一步需要用第一步中建立的工具,对内核进行编译。
③建立根文件系统
也就是建立平常看到的bin、dev、proc……等目录,以及一些必备的文件;另外,还需要为目标系统安装一些常用的工具软件,如ls、ifconfig。
一个办法是找到这些工具的源代码,用第一步建立的交叉编译工具来编译,但是这些软件一般数量多,而且其中某些体积较大,不适合嵌入式系统。
所以一般用busybox来完成的,包括系统引导软件init;最后,还需要为系统建立初始化的引导文件,如inittab。
④启动系统
在这一步,把建立好的目标、文件、程序、内核及模块全部拷贝到目标机存储器上,如硬盘。
然后为系统安装bootloader。
对于嵌入式系统,有许多引导程序可供我们使用。
不过它们许多都有硬件平台的限制。
当然,如果工作在X86下,可以直接用lilo来引导。
做到这一步时,将目标存储设备挂上目标机,如果顺利,就可以启动系统了。
当然,针对某些特别的平台,不能像硬盘这样拷贝,就需要读卡器、烧录。
但是基本的方法是相通的。
⑤优化和个性化系统
通过前四步,已经得到了一个可以正常工作的系统。
之后只需根据个人的工作习惯进行设置。
3、给出现今有哪些用于嵌入式开发的芯片名称,他们分别是哪些公司的产品?
体系结构是什么?
①基于32位RISC微处理器芯片的ARM7系列,ARM9系列,ARM9E系列,ARM10E系列都是ARM公司的产品,arm9以上的体系结构是哈佛总线体系结构以下的是冯。
诺依曼体系。
②TI公司的DSP处理器内核是哈佛总线体系结构。
③PowerPC公司的芯片,基于RISC结构,是哈佛总线体系结构。
④MIPS公司的芯片,基于RISC结构,是哈佛总线体系结构。
4、现今较流行的嵌入式操作系统有哪些
① VxWork
② Linux
③ μC/OS-Ⅱ
④ windows CE
⑤ Android
5、PXA270嵌入式开发板的接口有哪些?
全双工异步串行口和硬件流控制串行口,10M标准以太网接口10M/100M标准以太网接口,USB接口,红外通讯口,音频接口,存储卡口,视频和触摸屏接口摄像头接口,RTC时钟接口,调试接口,下载接口,电源接口。
6、请写出NorFlash和NandFlash的区别。
Flash是一种非易失闪存,它具有和ROM一样的掉电后数据不会丢失的特性。
它主要分为Nor Flash和 Nand Flash。
他们的主要区别如下所示:
Nor Flash
NandFlash
接口时序同SRAM,容易使用
地址/数据线复用,数据位较窄
读取速度较快
读取速度较慢
檫除速度慢,以64-128KB的块为单位
檫除速度快,以8-32KB的块为单位
写入速度慢(因为一般要檫除)
写入速度快
随机存取速度较快,支持XIP(eXecuteInPlace,芯片内执行),适用于代码存储。
在嵌入式系统中,常用于存放引导程序、根文件等
顺序读取速度较快,随机存取速度慢,适用于数据存储(如大容量的多媒体应用)。
在嵌入式系统中,常用于存放用户文件系统等
单片容量较小为1-32MB
单片容量较大为8-128MB,提高了单元密度
最大檫写次数为10万次
最大檫写次数为100万次
7、冯·诺依曼架构与哈佛架构的区别。
①冯•诺依曼结构是一种程序指令存储器和数据存储器合并在一起的存储器结构。
②哈佛体系结构是一种将程序指令存储和数据存储分开的存储器结构。
8、单周期3级流水的情况下,第10个指令周期时,第几条指令执行结束?
三级流水读取指令过程:
1取指从存储器装载一条指令
2译码识别将要被执行的指令
③执行处理指令并将结果写会寄存器
故ARM正在执行第1条指令的同时对第2条指令进行译码,并将第3条指令从存储器中取出。
所以,ARM7流水线只有在取第10条指令时,第7条指令才算完成执行。
9、下面是linux下的一个简单的设备驱动程序,写出linux设备驱动常用的数据结构,同时阅读下面代码,请给出测试程序中的每条语句加以注释。
设备驱动程序Keypad.c的源代码:
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#defineLEDnKEY_MAJOR251//宏定义
#defineKEYPAD_NAME"X-Hyper250Keypad"//宏定义
#defineKEYPAD_VERSION"Version0.1"//宏定义
#defineEXT_KEY_CSEXT_PORT2//宏定义
#defineEXT_LED_CSEXT_PORT3//宏定义
#defineLED_SHOW10//宏定义
voidled_off_on()
{
inti;
EXT_LED_CS=0xff;
for(i=0;i<8;++i)
{
EXT_LED_CS=~((1<
udelay(30000);//调用udelay函数来延迟
}
EXT_LED_CS=0xff;
}
/*应用程序用open来打开设备文件,实际上调用驱动的lednkey_open()函数*/
intlednkey_open(structinode*inode,structfile*filp)//打开设备文件
{
MOD_INC_USE_COUNT;//模块自身通过MOD_INC_USE_COUNT,宏来管理自己被使用的计数。
return(0);
}
intlednkey_release(structinode*inode,structfile*filp)//释放设备文件
{
led_off_on();
MOD_DEC_USE_COUNT;
return(0);
}
ssize_tlednkey_read(structfile*filp,char*Putbuf,size_tlength,loff_t*f_pos)
{//按键读取函数
unsignedshortBottonStatus;
unsignedcharBottontmp=0;
inti;
BottonStatus=(EXT_KEY_CS&0xff);//按键状态
for(i=0;i<8;++i)
{
if(((BottonStatus>>i)&1)==0)//判断哪个按键按下
Bottontmp=(i+1);
}
copy_to_user(Putbuf,&Bottontmp,length);//将数据从内核态拷贝到用户态
returnlength;
}
ssize_tlednkey_write(structfile*filp,constchar*Getbuf,size_tlength,loff_t*f_pos)
{
intnum;
unsignedcharUsrWantLed;
copy_from_user(&UsrWantLed,Getbuf,length);//将数据从用户态拷贝到核心态
num=((UsrWantLed)&0xff);//确定哪一位要进行设定
EXT_LED_CS=~(1<<(num-1));//点亮相应LED灯
return(0);
}
intlednkey_ioctl(structinode*inode,structfile*filp,unsignedintcmd,unsignedlongarg)
{//lednkey_ioctl接口函数,主要用于获取或者改变正在运行的设备参数
switch(cmd)
{
caseLED_SHOW:
{
if(arg)
led_off_on();
break;
}
}
return0;
}
/*以下这驱动函数与用户应用程序里对设备文件操作的函数相对应*/
structfile_operationslednkey_fops={
open:
lednkey_open,
read:
lednkey_read,
write:
lednkey_write,
ioctl:
lednkey_ioctl,
release:
lednkey_release,
};
staticint_initxhyper250_keypad_init(void)
{
/*初始化设备函数,在函数名之前加上这个属性之后,系统会在初始化完成之后丢弃初始化函数,收回它所占用的内存,以减小内核所占用的内存空间,它只对内建的驱动起作用*/
intresult;
result=register_chrdev(LEDnKEY_MAJOR,"lednkey",&lednkey_fops);
/*向操作系统注册一个主号为251,设备名为"lednkey",并传递设备驱动程序的指针为lednkey_fops(全局变量),其中register_chrdev()是内核提供的函数,作用是完成注册新的字符设备*/
printf("%s%sinitialized.\n",KEYPAD_NAME,KEYPAD_VERSION);
led_off_on();
return0;
}
staticvoid_exitxhyper250_keypad_exit(void)
{//向操作系统卸载设备函数
unregister_chrdev(LEDnKEY_MAJOR,"lednkey");
led_off_on();
}
module_init(xhyper250_keypad_init);//显式声明初始化设备函数
module_exit(xhyper250_keypad_exit);//显式声明卸载设备函数
测试文件的源代码如下:
#include
#include
#include
#include
#include
#include
#defineLED_SHOW10
intfd;
staticchar*dev_name="/dev/keypad";
intmain(intargc,char**argv)
{
intdata=0,pre_data;
fd=open(dev_name,O_RDWR);//使用函数open打开设备keypad
if(!
(fd>=0))
{
printf("%sfileopenfailed\n",dev_name);
exit(-1);//打开失败,显示出错信息
}
printf("\nkeypadApp:
pressthepushbuttonseeshowled-ExitCtrl-C\n",dev_name);//打开成功,提示用户输入
ioctl(fd,LED_SHOW,1);//循环显示LED,看LED是否正常
while
(1)
{
do
{
pre_data=data;
read(fd,(char*)&data,sizeof(data));
data=(data&0xff);
}while(data==0);
if(pre_data==0)
{
printf("Write%dLED\n",data);
write(fd,(constchar*)&data,sizeof((constchar)data));
}//采用忙等待方式扫描用户输入,传递给write函数
}
close(fd);//使用函数close关闭设备keypad
return0;
}
10、基于嵌入式的智能家居系统设计,重点在于完成智能家居控制平台的结构、功能和设计分析,画出相应的结构功能框图。
11、建立五个文件:
ex1.c文件,ex2.c文件,ex.h文件,ex.c文件,makefile文件,其中ex1.c文件和ex2.c文件分别输出hellolinux1和hellolinux2,ex.h文件包含ex1.c文件和ex2.c文件中的函数,ex.c文件为包含main函数的文件,来调用ex1.c文件和ex2.c文件中的函数,编写makefile文件对上述文件进行编译和执行。
上机记录:
加减乘除运算-函数库:
加减乘除运算-动态链接库:
↘↘↘
↘↘↘
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 学期 嵌入式 系统 设计 作业