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, DATALDR R0, [R1](3) LDR R0, =DATA(4) TABLE EQU 800MOV R0, #TABLE(5) TABLE SPACE 201-6答:R0=DATA1这组数据在存储器中所存放的起始地址,由编译器分配;R1=0x0C0D0E0F; R2=0xF; R3=0x8020; [0x8020]=R11-7答:AREA SWITCH, CODE, READONLYENTRYAND R2, R0, 0x3 ;R2 R0的低两位MOV R2, R2, LSL #30 ;将低两位移动到高两位BIC R0, R0, 0x3 ;将R0的低两位清0AND R3, R1, 0xC0000000 ;R3R1的高两位MOV R3, R3, LSR #30 ;将高两位移动到低两位BIC R1, R1, 0xC0000000 ;将R1的高两位清0ORR R0, R0,R3 ;R1的高两位写入到R0的低两位ORR R1, R1, R2 ;R0的低两位写入到R1的高两位END1-8答:// main.cInclude “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.sAREA ASM, CODE, READONLYEXPORT sumsum MOV R2, #0LOOP LDR R3, [R0], #4ADD R2, R2, R3SUB R1, R1, 1CMP R1, 0BNE LOOPMOV R0, R2MOV PC, LREND1-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 <stdio.h>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.hvoid display1 (char *print_str);display2.hvoid display2 (char *print_str);display1.c#include "display1.h"void display1(char *print_str){printf("This is display1 print %sn",print_str);}display2.c#include "display2.h"void display2 (char *print_str){printf("This is display2 print %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)检测系统内存映射(Memory Map)。
(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/demo c 220 0(3)insmod demo.o4-1参见exam4-14-2参见exam4-24-3参见exam4-35-1 略5-2 略5-3C:\Qt\4.3.2>sqlite3 exam.dbSQLite version 3.5.4Enter ".help" for instructionsEnter SQL statements terminated with a ";"sqlite> create table book(ID Integer primarykey,Name varchar(20),Type varchar(10 ),Count Integer);sqlite> insert into book values(1,'SQLite3','Database',10);sqlite> insert into book values(2,'Qt4','GUI',20);sqlite> select * from book;1|SQLite3|Database|102|Qt4|GUI|20sqlite>5-4#include<stdio.h>#include<sqlite3.h>int main(){sqlite3 *db=NULL;int rc;char *Errormsg;int nrow;int ncol;char **Result;int i=0;rc=sqlite3_open("exam.db",&db);if(rc){fprintf(stderr,"can't open database:%s\n",sqlite3_errmsg(db));sqlite3_close(db);return 1;}elseprintf("open database successly!\n");char *sql="create table book(ID Integer primary key,Name varchar(20),Type varchar(10),Count Integer)";sqlite3_exec(db,sql,0,0,&Errormsg);sql="insert into book values(1,'SQLite3','Database',10)";sqlite3_exec(db,sql,0,0,&Errormsg);sql="insert into book values(2,'Qt4','GUI',20);";sqlite3_exec(db,sql,0,0,&Errormsg);sql="select * from book";sqlite3_get_table(db,sql,&Result,&nrow,&ncol,&Errormsg);printf("row=%d column=%d\n",nrow,ncol);printf("the result is:\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);return 0;}5-5参见案例6-1略6-2略6-3参见exam6-3。