嵌入式系统设计大作业授课老师:孙江敏学院:计算机学院学生姓名:学号:日期: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.看门狗(Watch Dog)实际是一个简单的定时器,在固定时间内若正常清零,则自动复位处理器。
( √)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⑤ Android5、PXA270嵌入式开发板的接口有哪些?全双工异步串行口和硬件流控制串行口,10M标准以太网接口10M/100M标准以太网接口,USB接口,红外通讯口,音频接口,存储卡口,视频和触摸屏接口摄像头接口,RTC时钟接口,调试接口,下载接口,电源接口。
6、请写出Nor Flash和Nand Flash的区别。
Flash是一种非易失闪存,它具有和ROM一样的掉电后数据不会丢失的7、冯·诺依曼架构与哈佛架构的区别。
①冯•诺依曼结构是一种程序指令存储器和数据存储器合并在一起的存储器结构。
②哈佛体系结构是一种将程序指令存储和数据存储分开的存储器结构。
8、单周期3级流水的情况下,第10个指令周期时,第几条指令执行结束?三级流水读取指令过程:①取指从存储器装载一条指令②译码识别将要被执行的指令③执行处理指令并将结果写会寄存器故ARM正在执行第1条指令的同时对第2条指令进行译码,并将第3条指令从存储器中取出。
所以,ARM7流水线只有在取第10条指令时,第7条指令才算完成执行。
9、下面是linux下的一个简单的设备驱动程序,写出linux设备驱动常用的数据结构,同时阅读下面代码,请给出测试程序中的每条语句加以注释。
设备驱动程序Keypad.c的源代码:#include <linux/module.h> //最基本的文件,支持动态添加和卸载模块。
#include <linux/fs.h> //包含了文件操作相关struct的定义#include <linux/init.h> //初始化头文件#include <linux/poll.h> //轮询文件#include <linux/types.h> //对一些特殊类型的定义,只是为了方便阅读。
#include <linux/rtc.h> //可以在芯片上产生周期性的中断#include <linux/delay.h> //延时头文件#include <asm/hardware.h> //与处理器相关的硬件#include <asm/delay.h> //延时头文件#include <asm/uaccess.h> //与处理器相关的入口#define LEDnKEY_MAJOR 251 //宏定义#define KEYPAD_NAME "X-Hyper250 Keypad" //宏定义#define KEYPAD_VERSION "Version 0.1" //宏定义#define EXT_KEY_CS EXT_PORT2 //宏定义#define EXT_LED_CS EXT_PORT3 //宏定义#define LED_SHOW 10 //宏定义void led_off_on(){int i;EXT_LED_CS = 0xff;for(i =0 ; i<8;++i){EXT_LED_CS = ~((1 << i) & 0xff);//点亮相应LED灯udelay(30000);//调用udelay函数来延迟}EXT_LED_CS = 0xff;}/*应用程序用open来打开设备文件,实际上调用驱动的lednkey_open()函数*/int lednkey_open(struct inode *inode, struct file *filp)//打开设备文件{MOD_INC_USE_COUNT;//模块自身通过MOD_INC_USE_COUNT,宏来管理自己被使用的计数。
return (0);}int lednkey_release(struct inode *inode, struct file *filp) //释放设备文件{led_off_on();MOD_DEC_USE_COUNT;return (0);}ssize_t lednkey_read(struct file *filp, char *Putbuf, size_t length, loff_t *f_pos) { //按键读取函数unsigned short BottonStatus;unsigned char Bottontmp = 0;int i;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);//将数据从内核态拷贝到用户态return length;}ssize_t lednkey_write(struct file *filp, const char *Getbuf, size_t length, loff_t *f_pos){int num;unsigned char UsrWantLed;copy_from_user( &UsrWantLed, Getbuf, length);//将数据从用户态拷贝到核心态num = ( (UsrWantLed) & 0xff ); //确定哪一位要进行设定EXT_LED_CS = ~(1 << (num-1));//点亮相应LED灯return (0);}int lednkey_ioctl(struct inode *inode, struct file *filp, unsigned int cmd,unsigned long arg){ //lednkey_ioctl 接口函数,主要用于获取或者改变正在运行的设备参数switch(cmd){case LED_SHOW:{if(arg)led_off_on();break;}}return 0;}/*以下这驱动函数与用户应用程序里对设备文件操作的函数相对应*/struct file_operations lednkey_fops = {open: lednkey_open,read: lednkey_read,write: lednkey_write,ioctl: lednkey_ioctl,release: lednkey_release,};static int _init xhyper250_keypad_init(void){/*初始化设备函数,在函数名之前加上这个属性之后,系统会在初始化完成之后丢弃初始化函数,收回它所占用的内存,以减小内核所占用的内存空间,它只对内建的驱动起作用*/int result;result = register_chrdev(LEDnKEY_MAJOR, "lednkey", &lednkey_fops);/*向操作系统注册一个主号为251,设备名为"lednkey",并传递设备驱动程序的指针为lednkey_fops(全局变量),其中register_chrdev()是内核提供的函数,作用是完成注册新的字符设备*/printf("%s %s initialized.\n",KEYPAD_NAME, KEYPAD_VERSION);led_off_on();return 0;}static void _exit xhyper250_keypad_exit(void){ //向操作系统卸载设备函数unregister_chrdev( LEDnKEY_MAJOR, "lednkey" );led_off_on();}module_init(xhyper250_keypad_init); //显式声明初始化设备函数module_exit(xhyper250_keypad_exit); //显式声明卸载设备函数测试文件的源代码如下:#include<stdio.h>#include<stdlib.h>#include<unistd.h>#include<sys/types.h>#include<sys/stat.h>#include<fcntl.h>#define LED_SHOW 10int fd;static char *dev_name = "/dev/keypad";int main(int argc, char **argv){int data = 0, pre_data;fd = open( dev_name , O_RDWR ); //使用函数open打开设备keypadif( !(fd >=0) ){printf("%s file open failed\n", dev_name );exit(-1); //打开失败,显示出错信息}printf("\nkeypad App : press the push button see show led - Exit Ctrl-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 %d LED\n",data);write( fd, (const char *)&data, sizeof((const char )data) );} //采用忙等待方式扫描用户输入,传递给write函数}close( fd );//使用函数close关闭设备keypadreturn 0;}10、基于嵌入式的智能家居系统设计,重点在于完成智能家居控制平台的结构、功能和设计分析,画出相应的结构功能框图。