嵌入式系统开发基础基于ARM微处理器和Linux操作系统课后习题答案滕英岩

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

1-1什么是嵌入式系统?嵌入式系统和普通计算机系统的区别是什么?举例说明。答:问题一:嵌入式系统是以应用为中心,以计算机为基础,其软硬件可裁剪配置,对功能、可靠性、成本、体积、功耗有严格约束的一种专用计算机系统。问题二:比较项目嵌入式系统普通计算机系统引导代码BootLoader引导,针对不同电路进行移植主板的BIOS引导OSWindowsCE、VxWorks、Linux等,需要移植Windows、Linux,不移植驱动程序每个设备都必须针对电路板进行开发OS中含有大多数,直接下载协议栈移植OS或者第三方供应商提供开发环境借助服务器进行交叉编译在本机可开发调试仿真器需要不需要1-2简述嵌入式系统的构成答:硬件微处理器嵌入式系统的控制核心外围电路嵌入式系统的内存、I/O端口、复位电路、电源等外设USB、LCD、键盘等软件设备驱动接口负责嵌入式系统与外设的信息交互实时操作系统包括与硬件相关的底层软件、系统内核、设备驱动接口、通信协议、图形界面、标准化浏览器等可编程应用接口为编制应用程序提供各种编程接口库应用软件1-3答:R13:也记作SP,在ARM指令集中虽然没有强制,但是通常用于堆栈指针SP;在Thumb指令集中强制其作为堆栈指针。R14:也记作程序连接寄存器LR(LinkRegister),用于保存子程序调用或异常中断处理返回时程序的返回地址。R15:也记作程序计数器PC,用于标示下一条将要执行的指令地址。CPSR:程序状态寄存器,包含条件标识位、中断标识位、当前处理器模式等状态和控制位。SPSR:备份的程序状态寄存器。在异常中断处理过程中,用于保存被中断处理程序的执行现场和处理器状态。1-4答:(1)复位异常中断:当系统上电、复位、软件复位时产生该类型中断。(2)未定义指令异常中断:当ARM处理器或系统中的协处理器认为当前指令未定义时,产生该中断。通常利用该中断模拟浮点向量运算。(3)软件中断:可用于用户模式下特权操作的调用,既可以是系统功能,也可以是用户自定义的功能。(4)指令预取中止异常中断:如果处理器预取的指令地址不存在,或者该地址不允许当前指令访问,产生该类型的中断。(5)数据访问中止异常中断:如果数据访问的目标地址不存在,或者该地址不允许当前指令访问,则产生该中断。(6)外部中断:当处理器的外部中断请求引脚有效,而且CPSR的I控制位被清除时,产生该类型的中断(7)快速外部中断:当处理器的快速中断请求引脚有效,而且CPSR的F控制位被清除时,产生该中断。1-5答:(1)ADRR0,TABLE(2)ADRR1,DATALDRR0,[R1](3)LDRR0,=DATA(4)TABLEEQU800MOVR0,#TABLE(5)TABLESPACE201-6答:R0=DATA1这组数据在存储器中所存放的起始地址,由编译器分配;R1=0x0C0D0E0F;R2=0xF;R3=0x8020;[0x8020]=R11-7答:AREASWITCH,CODE,READONLYENTRYANDR2,R0,0x3;R2R0的低两位MOVR2,R2,LSL#30;将低两位移动到高两位BICR0,R0,0x3;将R0的低两位清0ANDR3,R1,0xC0000000;R3R1的高两位MOVR3,R3,LSR#30;将高两位移动到低两位BICR1,R1,0xC0000000;将R1的高两位清0ORRR0,R0,R3;R1的高两位写入到R0的低两位ORRR1,R1,R2;R0的低两位写入到R1的高两位END1-8答://main.cInclude“stdio.h”externintsum(intnum[],intn);main(){intarray[10]={20,30,23,5,15,64,6,15,72,73};intHE=sum(array,10);printf(“Thesumofarrayis%d”,HE);}//huibian.sAREAASM,CODE,READONLYEXPORTsumsumMOVR2,#0LOOPLDRR3,[R0],#4ADDR2,R2,R3SUBR1,R1,1CMPR1,0BNELOOPMOVR0,R2MOVPC,LREND1-9答:(1)要求很强的实时性,支持快速而明确的上下文切换(2)具有高度的可裁剪性,支持动态链接,能够通过装卸某些模块来达到系统所需要的功能(3)具有快速有效的中断和异常处理能力(4)具有优化的浮点支持(5)能够进行动态的内存管理2-1略。2-2略2-3略2-4按照要求完成以下操作。(1)创建文件夹test。mkdirtest(2)进入test目录。cdtest(3)在test目录下用Vi编辑一个新文件test.c,其内容如下:#includestdio.hintmain(){inta,i=0;a=0;while(i20){a=a+3;printf(thevalueofa=%d\n,a);sleep(1);i=i+1;return0;}}vitest.c(4)保存退出test.c。(5)按照下面的要求编译test.c。使用gcc-otest.otest.c编译,生成test.o。使用gcc-g-ogtest.otest.c编译,生成gtest.o。比较gtest.o与test.o的大小,哪个大?为什么?gtest.o比test.o大,因为前者加入了一些调试信息。(6)执行gtest.o与test.o。2-5使用GDB调试上面的程序gtest.o。(1)进入GDB调试环境,读入调试程序。gdbgtest.o(2)列出源文件内容。list(3)在程序a=0;处设置一个断点。breakpoint(4)在程序printf(thevalueofa=%d\n,a);处设置一个断点。(5)执行该程序。run(6)查看变量a的值。printa(7)查看变量a的类型。(8)执行下一个源程序行,从而执行其整体中的一个函数。(9)从断点开始继续执行到下一个断点。(10)查看变量a的值,看看a是否有变化?(11)不停地执行continue,直到程序结束。(12)退出GDB。2-6根据要求编写Makefile文件。五个文件分别是main.c、display1.h、display1.c、display2.h、display2.c,具体的代码如下:#includestdio.hintmain(intargc,char**argv){display1(hello);display2(hello);}display1.hvoiddisplay1(char*print_str);display2.hvoiddisplay2(char*print_str);display1.c#includedisplay1.hvoiddisplay1(char*print_str){printf(Thisisdisplay1print%sn,print_str);}display2.c#includedisplay2.hvoiddisplay2(char*print_str){printf(Thisisdisplay2print%sn,print_str);}(1)如果上述文件在同一个目录,请编写Makefile文件。(2)如果按照下面的目录结构存放文件,请编写Makefile文件。|---bin存放生成的可执行文件|---obj存放.o文件|---include存放display1.h和display2.h文件|---src存放main.c、display1.c、display2.c和Makefile(3)如果按照下面的目录结构存放文件,请编写Makefile文件。|---bin存放生成的可执行文件|---obj存放.o文件|---include存放display1.h和display2.h文件|---src存放main.c和Makefile|---src/display1存放display1.c和Makefile|---src/display2存放display2.c和Makefilesrc下面的makefileSRC_DIR=.INC_DIR=../includeOBJ_DIR=../objBIN_DIR=../bininclude$(SRC_DIR)/test/makefileinclude$(SRC_DIR)/test1/makefiledisplay1下面的makefileall:$(OBJ_DIR)/display1.o$(OBJ_DIR)/display1.ogcc-o$(BIN_DIR)/display1$^display2下面的makefile$(OBJ_DIR)/display2.o:$(SRC_DIR)/display2/display.cgcc-c$-o$@3-1答:1.建立宿主机开发环境,包括操作系统及编译器等2.配置宿主机相关服务及软件,如minicom、网络等3.建立引导加载程序BootLoader4.移植内核kernel5.建立根文件系统root6.建立应用程序的Flash磁盘分区7.开发应用程序8.烧写内核、根文件系统和应用程序9.发布产品3-2答:Stage1:(1)硬件设备初始化。(2)为加载BootLoader的Stage2准备RAM空间。(3)复制BootLoader的Stage2到RAM空间中。(4)设置好堆栈。堆栈指针的设置是为执行C语言代码做好准备。Stage2:(1)初始化本阶段要使用到的硬件设备。(2)检测系统内存映射(MemoryMap)。(3)将内核映像和根文件系统映像从Flash存储器上读到RAM空间中。(4)为内核设置启动参数。(5)调用内核。3-3答:1.数据结构file_operations2.设备注册:驱动程序模块通过函数register_chrdev来完成内核的注册。3.设备卸载:驱动程序模块通过函数unregister_chrdev来完成内核的卸载。4.打开/释放设备:驱动程序通过函数open来完成设备的打开。驱动程序通过函数release来完成设备的释放5.读写设备:read函数将数据从内核复制到应用程序空间,write函数则将数据从应用程序空间复制到内核。6.读写以外的I/O操作:驱动程序模块通过ioctl函数来完成读写以外的I/O操作,如锁设备等3-4答:(1)register_chrdev(0,”demo”,&demo_fops);(2)mknod/dev/democ2200(3)insmoddemo.o4-1参见exam4-14-2参见exam4-24-3参见exam4-35-1略5-2略5-3C:\Qt\4.3.2sqlite3exam.dbSQLiteversion3.5.4Enter.helpforinstructionsEnterSQLstatementsterminatedwitha;sqlitecreatetablebook(IDIntegerprimarykey,Namevarchar(20),Typevarchar(10),CountInteger);sqliteinsertintobookvalues(1,'SQLite3','Database',10);sqliteinsertintobookvalues(2,'Qt4','GUI',20);sqliteselect*frombook;1|SQLite3|Database|102|Qt4|GUI|20sqlite5-4#includestdio.h#includesqlite3.hintmain(){sqlite3*db=NULL;intrc;char*Errormsg;intnrow;intncol;char**Result;inti=0;rc=sqlite3_open(exam.db,&db);if(rc){fprintf(stderr,can'topendatabase:%s\n,sqlite3_errmsg(db));sqlite3

1 / 8
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功