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

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

1-1 什么是嵌入式系统?嵌入式系统和普通计算机系统的区别是什么?举例说明。

答:

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

1-2 简述嵌入式系统的构成

1-3

答:R13:也记作SP,在ARM指令集中虽然没有强制,但是通常用于堆栈指针SP;在Thumb 指令集中强制其作为堆栈指针。

R14:也记作程序连接寄存器LR(Link Register),用于保存子程序调用或异常中断处理返回时程序的返回地址。

R15:也记作程序计数器PC,用于标示下一条将要执行的指令地址。

CPSR:程序状态寄存器,包含条件标识位、中断标识位、当前处理器模式等状态和控制位。

SPSR:备份的程序状态寄存器。在异常中断处理过程中,用于保存被中断处理程序的执行现场和处理器状态。

1-4

答:(1)复位异常中断:当系统上电、复位、软件复位时产生该类型中断。

(2)未定义指令异常中断:当ARM处理器或系统中的协处理器认为当前指令未定义时,产生该中断。通常利用该中断模拟浮点向量运算。

(3)软件中断:可用于用户模式下特权操作的调用,既可以是系统功能,也可以是用户自定义的功能。

(4)指令预取中止异常中断:如果处理器预取的指令地址不存在,或者该地址不允许当前指令访问,产生该类型的中断。

(5)数据访问中止异常中断:如果数据访问的目标地址不存在,或者该地址不允许当前指令访问,则产生该中断。

(6)外部中断:当处理器的外部中断请求引脚有效,而且CPSR的I控制位被清除时,产生该类型的中断

(7)快速外部中断:当处理器的快速中断请求引脚有效,而且CPSR的F控制位被清除时,产生该中断。

1-5

答:(1)ADR R0, TABLE

(2) ADR R1, DATA

LDR R0, [R1]

(3) LDR R0, =DATA

(4) TABLE EQU 800

MOV R0, #TABLE

(5) TABLE SPACE 20

1-6

答:

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

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

1-7

答:

AREA SWITCH, CODE, READONLY

ENTRY

AND R2, R0, 0x3 ;R2 R0的低两位

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

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

AND R3, R1, 0xC0000000 ;R3R1的高两位

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

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

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

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

END

1-8

答:

// main.c

Include “stdio.h”

extern int sum (int num[], int n);

main(){

int array[10]={20, 30, 23, 5,15,64,6,15,72,73 };

int HE=sum(array, 10);

printf(“The sum of array is %d”, HE);

}

//huibian.s

AREA ASM, CODE, READONLY

EXPORT sum

sum MOV R2, #0

LOOP LDR R3, [R0], #4

ADD R2, R2, R3

SUB R1, R1, 1

CMP R1, 0

BNE LOOP

MOV R0, R2

MOV PC, LR

END

1-9

答:(1)要求很强的实时性,支持快速而明确的上下文切换

(2)具有高度的可裁剪性,支持动态链接,能够通过装卸某些模块来达到系统所需要的功能

(3)具有快速有效的中断和异常处理能力

(4)具有优化的浮点支持

(5)能够进行动态的内存管理

2-1 略。

2-2 略

2-3 略

2-4 按照要求完成以下操作。

(1)创建文件夹test。

mkdir test

(2)进入test目录。

cd test

(3)在test目录下用Vi编辑一个新文件test.c,其内容如下:

#include

int main()

{

int a,i=0;

a=0;

while(i<20)

{

a=a+3;

printf("the value of a=%d \n",a);

sleep(1);

i=i+1;

return 0;

}

}

vi test.c

(4)保存退出test.c。

(5)按照下面的要求编译test.c。

使用gcc -o test.o test.c编译,生成test.o。

使用gcc -g -o gtest.o test.c编译,生成gtest.o。

比较gtest.o 与 test.o的大小,哪个大?为什么?

gtest.o 比 test.o 大,因为前者加入了一些调试信息。

(6)执行gtest.o与test.o。

2-5 使用GDB调试上面的程序gtest.o。

(1)进入GDB调试环境,读入调试程序。

gdb gtest.o

(2)列出源文件内容。

list

(3)在程序a=0;处设置一个断点。

breakpoint

(4)在程序printf("the value of a=%d \n",a);处设置一个断点。

(5)执行该程序。

run

(6)查看变量a的值。

print a

(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"

int main(int argc,char **argv)

{

display1 ("hello");

display2("hello");

}

display1.h

void display1 (char *print_str);

display2.h

void display2 (char *print_str);

display1.c

#include "display1.h"

void display1(char *print_str)

相关文档
最新文档