嵌入式系统开发基础基于ARM微处理器和Linux操作系统的课后答案.docx

上传人:b****8 文档编号:23587710 上传时间:2023-05-18 格式:DOCX 页数:13 大小:19.60KB
下载 相关 举报
嵌入式系统开发基础基于ARM微处理器和Linux操作系统的课后答案.docx_第1页
第1页 / 共13页
嵌入式系统开发基础基于ARM微处理器和Linux操作系统的课后答案.docx_第2页
第2页 / 共13页
嵌入式系统开发基础基于ARM微处理器和Linux操作系统的课后答案.docx_第3页
第3页 / 共13页
嵌入式系统开发基础基于ARM微处理器和Linux操作系统的课后答案.docx_第4页
第4页 / 共13页
嵌入式系统开发基础基于ARM微处理器和Linux操作系统的课后答案.docx_第5页
第5页 / 共13页
点击查看更多>>
下载资源
资源描述

嵌入式系统开发基础基于ARM微处理器和Linux操作系统的课后答案.docx

《嵌入式系统开发基础基于ARM微处理器和Linux操作系统的课后答案.docx》由会员分享,可在线阅读,更多相关《嵌入式系统开发基础基于ARM微处理器和Linux操作系统的课后答案.docx(13页珍藏版)》请在冰豆网上搜索。

嵌入式系统开发基础基于ARM微处理器和Linux操作系统的课后答案.docx

嵌入式系统开发基础基于ARM微处理器和Linux操作系统的课后答案

1-1什么是嵌入式系统?

嵌入式系统和普通计算机系统的区别是什么?

举例说明。

答:

问题一:

嵌入式系统是以应用为中心,以计算机为基础,其软硬件可裁剪配置,对功能、可靠性、成本、体积、功耗有严格约束的一种专用计算机系统。

问题二:

比较项目

嵌入式系统

普通计算机系统

引导代码

BootLoader引导,针对不同电路进行移植

主板的BIOS引导

OS

WindowsCE、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,DATA

LDRR0,[R1]

(3)LDRR0,=DATA

(4)TABLEEQU800

MOVR0,#TABLE

(5)TABLESPACE20

1-6

答:

R0=DATA1这组数据在存储器中所存放的起始地址,由编译器分配;

R1=0x0C0D0E0F;R2=0xF;R3=0x8020;[0x8020]=R1

1-7

答:

AREASWITCH,CODE,READONLY

ENTRY

ANDR2,R0,0x3;R2R0的低两位

MOVR2,R2,LSL#30;将低两位移动到高两位

BICR0,R0,0x3;将R0的低两位清0

ANDR3,R1,0xC0000000;R3R1的高两位

MOVR3,R3,LSR#30;将高两位移动到低两位

BICR1,R1,0xC0000000;将R1的高两位清0

ORRR0,R0,R3;R1的高两位写入到R0的低两位

ORRR1,R1,R2;R0的低两位写入到R1的高两位

END

1-8

答:

//main.c

Include“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.s

AREAASM,CODE,READONLY

EXPORTsum

sumMOVR2,#0

LOOPLDRR3,[R0],#4

ADDR2,R2,R3

SUBR1,R1,1

CMPR1,0

BNELOOP

MOVR0,R2

MOVPC,LR

END

1-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,其内容如下:

#include

intmain()

{

inta,i=0;

a=0;

while(i<20)

{

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,具体的代码如下:

#include"stdio.h"

intmain(intargc,char**argv)

{

display1("hello");

 display2("hello");

}

display1.h

voiddisplay1(char*print_str);

display2.h

voiddisplay2(char*print_str);

display1.c

#include"display1.h"

voiddisplay1(char*print_str)

{

printf("Thisisdisplay1print%sn",print_str);

}

display2.c

#include"display2.h"

voiddisplay2(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和Makefile

src下面的makefile

SRC_DIR=.

INC_DIR=../include

OBJ_DIR=../obj

BIN_DIR=../bin

include$(SRC_DIR)/test/makefile

include$(SRC_DIR)/test1/makefile

display1下面的makefile

all:

$(OBJ_DIR)/display1.o$(OBJ_DIR)/display1.o

gcc-o$(BIN_DIR)/display1$^

display2下面的makefile

$(OBJ_DIR)/display2.o:

$(SRC_DIR)/display2/display.c

gcc-c$<-o$@

3-1

答:

1.建立宿主机开发环境,包括操作系统及编译器等

2.配置宿主机相关服务及软件,如minicom、网络等

3.建立引导加载程序BootLoader

4.移植内核kernel

5.建立根文件系统root

6.建立应用程序的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_operations

2.设备注册:

驱动程序模块通过函数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.o

4-1参见exam4-1

4-2参见exam4-2

4-3参见exam4-3

5-1略

5-2略

5-3

C:

\Qt\4.3.2>sqlite3exam.db

SQLiteversion3.5.4

Enter".help"forinstructions

EnterSQLstatementsterminatedwitha";"

sqlite>createtablebook(IDIntegerprimarykey,Namevarchar(20),Typevarchar(10

),CountInteger);

sqlite>insertintobookvalues(1,'SQLite3','Database',10);

sqlite>insertintobookvalues(2,'Qt4','GUI',20);

sqlite>select*frombook;

1|SQLite3|Database|10

2|Qt4|GUI|20

sqlite>

5-4

#include

#include

intmain()

{

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_close(db);

return1;

}else

printf("opendatabasesuccessly!

\n");

char*sql="createtablebook(IDIntegerprimarykey,Namevarchar(20),Typevarchar(10),CountInteger)";

sqlite3_exec(db,sql,0,0,&Errormsg);

sql="insertintobookvalues(1,'SQLite3','Database',10)";

sqlite3_exec(db,sql,0,0,&Errormsg);

sql="insertintobookvalues(2,'Qt4','GUI',20);";

sqlite3_exec(db,sql,0,0,&Errormsg);

sql="select*frombook";

sqlite3_get_table(db,sql,&Result,&nrow,&ncol,&Errormsg);

printf("row=%dcolumn=%d\n",nrow,ncol);

printf("theresultis:

\n");

for(i=0;i<(nrow+1)*ncol;i++)

printf("Result[%d]=%s\n",i,Result[i]);

sqlite3_free(Errormsg);

sqlite3_free_table(Result);

sqlite3_close(db);

return0;

}

5-5

参见案例

6-1略

6-2略

6-3参见exam6-3。

6-4参见案例

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 考试认证 > 交规考试

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1