当前位置:文档之家› ARM 堆栈分析

ARM 堆栈分析

ARM 堆栈分析
ARM 堆栈分析

ARM stack backtrace x.yin@https://www.doczj.com/doc/5e13915526.html,

Jun1,2009

目录目录目录

1前言2

2ARM寄存器和APCS2

2.1ARM寄存器 (2)

2.1.1ARM寄存器的定义 (2)

2.2APCS (3)

2.2.1应用程序和kernel的APCS (3)

2.2.2APCS-32简介 (3)

3示例代码4

3.1代码清单 (4)

3.1.1test.c (4)

3.1.2test.s (4)

4kernel中的函数callback trace6

2ARM寄存器和APCS 1前言

对于每个C语言开发者来说中,内存错误(内存泄漏,内存越界,野指针,空指针等)恐怕是再熟悉不过了。这些错误通常严重级别很高,隐藏很深而且会产生随机错误,即便在很多调试工具的帮助下,为了找到重现的路径,也需要花费大量的时间。对于uClinux来说,情况就更糟糕了,那些在x86上能够导致程序退出的错误,在uClinux 中大多数情况下并不会退出而只是产生奇怪的运行结果.我们知道,这类错误尽管可以在编码时尽量减少却无法做到全部根除,那么,在这类错误产生时,有什么办法能够帮助我们迅速定位呢?此时只能借助kernel了,如果Kernel在应用程序出错时dump出相应的函数调用顺序,那也就离解决问题不远了。

2ARM寄存器和APCS

在了解如何backtrace ARM下应用程序函数调用顺序之前,有必要先了解一下ARM的寄存器和APCS(ARM Procedure Call Standard).以我们的系统为例:?kernel:uClinux-2.4.22-uc0,

?CPU:PT110,ARM7TDMI兼容。

?gcc:2.95.3

2.1ARM寄存器

2.1.1ARM寄存器的定义

include/asm-armnommu/proc/ptrace.h

1/*this struct defines the way the registers are stored on the

2stack during a system call.*/

3

4struct pt_regs...{

5long uregs[18];

6};

7

8#define ARM_cpsr uregs[16]/*程序状态寄存器*/

9#define ARM_pc uregs[15]/*程序计数器下一条将要执行的指令,*/

10#define ARM_lr uregs[14]/*寄存器,返回地址link*/

11#define ARM_sp uregs[13]/*栈指针类似于,的x86esp*/

12#define ARM_ip uregs[12]/*暂存sp没什么大用,*/

13#define ARM_fp uregs[11]/*栈帧指针类似

于,的x86ebp*/

14#define ARM_r10uregs[10]

15#define ARM_r9uregs[9]

16#define ARM_r8uregs[8]

17#define ARM_r7uregs[7]

18#define ARM_r6uregs[6]

19#define ARM_r5uregs[5]

20#define ARM_r4uregs[4]

21#define ARM_r3uregs[3]

22#define ARM_r2uregs[2]

23#define ARM_r1uregs[1]

24#define ARM_r0uregs[0]

25#define ARM_ORIG_r0uregs[17]

2.2APCS2ARM寄存器和APCS

2.2APCS

2.2.1应用程序和kernel的APCS

编译一个简单的应用程序时,gcc会自动加上-D__ARM_ARCH_4T__-D__APCS_32 ,

$arm-elf-gcc-v-Wl,-elf2flt="-s32768"-Wall-o test test.c ......

/opt/toolchain/lib/gcc-lib/arm-elf/2.95.3/cpp0

-lang-c-v-D__GNUC__=2-D__GNUC_MINOR__=95

-Darm-Darm_elf-D__ELF__-D__arm__-D__arm_elf__

-D__ELF__-D__arm-D__arm_elf-Acpu(arm)-Amachine(arm)

-D__CHAR_UNSIGNED__-Wall-D__ARM_ARCH_4T__-D__APCS_32__

test.c/tmp/ccP0jvq3.i

汇编时同样会加上-mapcs-frame

......

/opt/toolchain/arm-elf/bin/as-mapcs-frame\

-o/tmp/ccZ2wPsV.o/tmp/cc8LUy5Y.s

......

编译时kernel同样会加上-mapcs-32-march=armv4,

make CFLAGS="-D__KERNEL__

-I/mnt/sda2/kernel/linux-2.4.22-em86xx/include

-Wall-Wstrict-prototypes-Wno-trigraphs

-O2-fno-strict-aliasing-fno-common-pipe-fno-builtin

-D__linux__-DNO_MM-mapcs-32-march=armv4-mtune=arm7tdmi

-mshort-load-bytes-msoft-float"-C drivers

也就是说无论编译kernel还是应用程序,ARM所用的APCS都为APCS-32.

2.2.2APCS-32简介

APCS,ARM过程调用标准(ARM Procedure Call Standard),提供了紧凑的编写

例程的一种机制,定义的例程可以与其他例程交织在一起。最显著的一点是对这些例

程来自哪里没有明确的限制。它们可以编译自C,Pascal也可以是用汇编语言写成的。APCS定义了:

?对寄存器使用的限制。

?使用栈的惯例。

?在函数调用之间传递/返回参数。

?可以被‘回溯’的基于栈的结构的格式,用来提供从失败点到程序入口的函数(和给

予的参数)的列表。APCS-32是APCS-2(-R和-U)的一个扩展,APCS-R用于

RISC OS应用程序在USR模式下进行操作;或在SVC模式下的模块/处理程序。

?sl=R10,fp=R11,ip=R12,sp=R13,lr=R14,pc=R15。

3示例代码

?它是唯一的最通用的APCS版本。因为所有编译的C程序都使用APCS-R。

?显式的栈限制检查。

?26-bit程序计数器。

?不在FP寄存器中传递浮点实参。

?不可重入。标志必须被恢复。

APCS32允许32-bit程序计数器,并且从执行在USR模式下的一个函数中退出时,允许标志不被恢复。其他事情同于APCS-R.上面的解释太过抽象,我们可以通过下面的示例代码和整个程序运行的堆栈压栈顺序来更形象地解释APCS和。

3示例代码

3.1代码清单

3.1.1test.c

1#include

2

3void func1(int p1,int p2,int p3,int p4,int p5)

4{

5return;

6}

7

8int main(int argc,char*argv[])

9{

10int i=10,j=5;

11func1(i,j,0,1,2);

12

13return0;

14}

3.1.2test.s

1func1:

2@args=4,pretend=0,frame=16

3@frame_needed=1,current_function_anonymous_args=

4mov ip,sp

5stmfd sp!,{fp,ip,lr,pc}

6sub fp,ip,#4

7sub sp,sp,#16

8str r0,[fp,#-16]

9str r1,[fp,#-20]

10str r2,[fp,#-24]

11str r3,[fp,#-28]

12b.L2

13.L2:

14ldmea fp,{fp,sp,pc}

15main:

16@args=0,pretend=0,frame=16

3.1代码清单3示例代码

17

@frame_needed =1,current_function_anonymous_args =

018mov ip,sp 19stmfd sp!,{fp,ip,lr,pc}20sub fp,ip,#421sub sp,sp,#2022str r0,[fp,#-16]23str r1,[fp,#-20]24bl __gccmain 25mov r3,#1026str r3,[fp,#-24]27mov r3,#528str r3,[fp,#-28]29mov r3,#230str r3,[sp,#0]31ldr r0,[fp,#-24]32ldr r1,[fp,#-28]33mov r2,#034mov r3,#135bl func136mov r0,#037b .L3

38.L3:

39

ldmea

fp,{fp,sp,pc}

f m e m o r y : h i

g

h a d d r e s s

m e m o r y : l o w a d d r e s s

图1:程序运行的函数栈结构

从上图可以看出:

1.栈是链接起来的‘桢’的一个列表,通过一个叫做‘回溯结构’的东西来链接它们。这

个结构存储在每个桢的高端。按递减地址次序分配栈的每一块。

2.寄存器sp总是指向在最当前桢中最低的使用的地址。寄存器fp(桢指针)应当是零

或者是指向栈回溯结构的列表中的最后一个结构,提供了一种追溯程序的方式,来反向跟踪调用的函数。

3.函数参数传递会尽可能的用寄存器,当函数参数大于4个时会用栈传递剩余参数。

而x86下只有有限的寄存器,仅当指定regparm时,才会使用寄存器传递参数。

4.从上层函数传递过来的参数会保存在该函数的栈中。当然我们也可以用-fomit-

frame-pointer的gcc编译选项把fp给去掉,好处是代码变短了,但是函数变得不可重入,所以如果有递归函数则不可去加入此选项.

4kernel中的函数callback trace

从上面的内容,我们只要在kernel中程序出错时循环打印上面lr中的值就可以得到我们想要的一系列的函数地址了。以我们的系统为例,当程序读写非法内存而出错时,我们可以在kernel中dump出函数调用顺序(pci bus fault irq).

1void xxx_interrupt(int irq,void*devinfo,struct pt_regs* regs)

2{

3......

4

5printk("(");

6

7switch(regs->ARM_cpsr&MODE_MASK){

8case USR_MODE:

9printk("USER");

10break;

11case FIQ_MODE:

12printk("FIQ");

13break;

14case IRQ_MODE:

15printk("IRQ");

16break;

17case SVC_MODE:

18printk("SVC");

19break;

20case ABT_MODE:

21printk("ABT");

22break;

23case UND_MODE:

24printk("UND");

25break;

26default:

27printk("UNKNOWN");

28break;

29}

30/*

31*Dump registers

32*/

33printk("pc=%08lx r0=%08lx r3=%08lx sp=%08lx lr=%08lx)",

34regs->ARM_pc,regs->ARM_r0,regs->ARM_r3,regs->ARM_sp

,regs->ARM_lr);

35printk("\n");

36printk("r0=%08lx r1=%08lx r2=%08lx r3=%08lx r4=%08lx)\n",

37regs->ARM_r0,regs->ARM_r1,regs->ARM_r2,regs->ARM_r3

,regs->ARM_r4);

38printk("r5=%08lx r6=%08lx r7=%08lx r8=%08lx r9=%08lx)\n",

39regs->ARM_r5,regs->ARM_r6,regs->ARM_r7,regs->ARM_r8

,regs->ARM_r9);

40printk("r10=%08lx fp=%08lx ip=%08lx sp=%08lx lr=%08lx pc

=%08lx)\n",

41regs->ARM_r10,regs->ARM_fp,regs->ARM_ip,regs->

ARM_sp,regs->ARM_lr,regs->ARM_pc);

42

43if((regs->ARM_cpsr&MODE_MASK)==USR_MODE){

44unsigned long ufp;/*Upper level fp*/

45unsigned long ulr;/*Upper level lr*/

46unsigned long ulfp;/*Upper level lr*/

47unsigned long s_sp;/*Start of sp*/

48unsigned long e_sp;/*End of sp*/

49s_sp=regs->ARM_sp;

50e_sp=s_sp+CONFIG_STACK_DEPTH;

51ufp=regs->ARM_fp;

52printk("\033[1;33mFor mode USR,do the back trace

..\033[0m\n");

53for(;;){

54if((ufp>e_sp)||(ufp

55break;

56

57ulr=*((unsigned long*)(ufp-4));

58ulfp=*((unsigned long*)(ufp-12));

59printk("\033[1;33mBT for lr=0x%lx,

function address:0x%lx\033[0m\n",ulr,

ulr-current->mm->start_code-4);

60ufp=ulfp;

61}

62}

63......

64

65}

上面的current->mm->start_code是当前进程的text段基地址,由于文件格式为BFLT

格式,start_code地址即为程序加载地址。lr-current->mm->start_code-4即可得到函数

在BFLT文件中的相对地址.本例中CONFIG_STACK_DEPTH=0x8000,即只打印sp sp+

32K地址内的函数地址,当程序所用栈不超过32k时,会打印出一些明显非法的值。下

面的示例就是程序发生错误时kernel dump出来的信息:

GPF:pid(21,)text_offset(0x12d9f0)(USER pc=90dada34

r0=00000000r3=6)

r0=00000000r1=00000000r2=9107fb7c r3=63b40008r4=00000028)

r5=600863b6r6=00000000r7=916d61e0r8=916ecf80r9=9171e408)

r10=917d40a0fp=9107fb98ip=9107fb7c sp=9107fb7c lr=90dada04pc=90dada34) For mode USR,do the back trace..

BT for lr=0x90dada04,function address:0x12d9c0

BT for lr=0x90dad5c8,function address:0x12d584

BT for lr=0x90dac840,function address:0x12c7fc

BT for lr=0x90cd86f0,function address:0x586ac

BT for lr=0x90cdfa40,function address:0x5f9fc

BT for lr=0x90cf3880,function address:0x7383c

BT for lr=0x90cf5de8,function address:0x75da4

参考文献参考文献BT for lr=0x90cf6340,function address:0x762fc

BT for lr=0x90cf7f70,function address:0x77f2c

BT for lr=0x90cc23d4,function address:0x42390

BT for lr=0x90c81c74,function address:0x1c30

BT for lr=0x90c817a8,function address:0x1764

BT for lr=0x90d9c4fc,function address:0x11c4b8

BT for lr=0x90d9c534,function address:0x11c4f0

BT for lr=0x90c80064,function address:0x20

得到函数地址后,可以用这个地址在对应的应用程序sym文件中查找出错的位置(BFLT 的sym文件生成:arm-elf-objdump-SD test.gdb>test.gdb.sym)

参考文献

[1]https://www.doczj.com/doc/5e13915526.html,/assembler/apcsintro.html.

[2]https://www.doczj.com/doc/5e13915526.html,/assembler/index.html

[3]https://www.doczj.com/doc/5e13915526.html,/help/index.jsp

[4]https://www.doczj.com/doc/5e13915526.html,/help/topic/com.arm.doc.ihi0042a/IHI0042A_aapcs.pdf

嵌入式技术基础与实践_习题参考答案

单片机习题参考答案 第1章概述习题参考答案 1.嵌入式系统的基本含义是什么?为什么说单片机是典型的嵌入式系统? 答:即MCU的含义是:在一块芯片上集成了中央处理单元(CPU)、存储器(RAM/ROM 等)、定时器/计数器及多种输入输出(I/O)接口的比较完整的数字处理系统。大部分嵌入式系统以MCU为核心进行设计。MCU从体系结构到指令系统都是按照嵌入式系统的应用特点专门设计的,它能很好地满足应用系统的嵌入、面向测控对象、现场可靠运行等方面的要求。因此以MCU为核心的系统是应用最广的嵌入式系统。 简述嵌入式系统的特点以及应用领域。 答:嵌入式系统属于计算机系统,但不单独以通用计算机的面目出现;嵌入式系统开发需要专用工具和特殊方法;使用MCU设计嵌入式系统,数据与程序空间采用不同存储介质;开发嵌入式系统涉及软件、硬件及应用领域的知识;嵌入式系统的其他特点,比如紧张的资源,较高稳定性要求,低功耗,低成本等。一般用于工业控制,智能家电,日常电子等领域。 3.比较MCU与CPU的区别与联系。 答:CPU是一个单独的PC处理器。而MCU,则有微处理器,存储器(RAM/ROM等)、定时器/计数器及多种输入输出(I/O)接口的比较完整的数字处理系统。所以可以这么说,MCU 是一个包含微处理器的嵌入式系统,而CPU紧紧是一个处理器而已。 4.举例说明嵌入式系统在日常生活中的应用。 答:日常数码产品:手机,MP3,U盘,相机等。 日常工业类:冰箱,空调,微波炉,汽车等。 5.C语言的那些特性使得它成为嵌入式系统中使用频率最高的高级语言。 答:相比底端汇编,更简单易学;与高级语言如(C++,C#,java等)相比,执行效率高,编译后的编码体积小,而且支持好的编译器还支持嵌入汇编代码;对位的操纵能力很强。6.阅读光盘中【第01章(概述)阅读资料】中的“嵌入式C语言工程简明规范”,用一页纸给出嵌入式C语言工程简明规范的要点。 答:此规范主要针对单片机编程语言和08编译器而言,包括命名、注释、编码规范性等内容。建议在一个工程或者一个项目中尽量遵循相同的代码规范,而不是说你只能拥有一个代码规范。 (1)命名规则:命名清晰明了,有明确含义,使用完整单词或约定俗成的缩写。通常,较短的单词可通过去掉元音字母形成缩写;较长的单词可取单词的头几个字母形成缩写。即"见名知意";命名风格要自始至终保持一致;命名中若使用特殊约定或缩写,要有注释说明;为了代码复用,命名中应避免适用与具体项目相关的前缀;应使用英语命名。 (2)注释:注释基本原则就是有助于对程序的阅读理解,说明程序在"做什么",解释代码的目的、功能和采用的方法。一般情况源程序有效注释量在30%左右。注释语言必须准确、易懂、简洁。边写代码边注释,修改代码同时修改相应的注释,不再有用的注释要删除。汇编和C中都用"//",取消";" 不使用段注释" /* */ "(调试时可用)。 使用文件注释必须说明文件名、项目名称、函数功能、创建人、创建日期、版本信息等相关信息。修改文件代码时,应在文件注释中记录修改日期、修改人员,并简要说明此次修改的目的。所有修改记录必须保持完整。文件注释放在文件顶端,用"/*……*/"格式包含。

arm堆栈操作(DOC)

arm堆栈操作 arm堆栈的组织结构是满栈降的形式,满栈即sp是要停留在最后一个进栈元素,降:就是堆栈的增长方向是从高地址向低地址发展。 arm对于堆栈的操作一般采用LDMFD (pop)和STMFD (push) 两个命令。 以前困惑的就是STMFD 命令对于操作数是按照什么顺序压栈的 比如:STMFD sp!{R0-R5,LR} 进栈顺序是: 高地址(1方式) LR R5 R4 ``````` R0 <-sp 低地址 还是: 高地址(2方式) R0

R1 ``` R5 LR <-sp 低地址 现在通过下表,可以轻松的解决这个问题:

按照图表,可知STMFD对应的是STMDB,根据arm指令手册,可知STMDB入栈顺序是(1方式) 而LDMFD对应的是LDMIA,这样这两个操作就可以成功配对: 以下是我在学习ARM指令中记录的关于堆栈方面的知识 1、寄存器R13 在ARM 指令中常用作堆栈指针 2、对于R13 寄存器来说,它对应6 个不同的物理寄存器,其中的一个是用户模式与系统模式共用,另外5个物理寄存器对应于其他5种不同的运行模式。采用以下的

记号来区分不同的物理寄存器: R13_ 其中,mode为以下几种模式之一:usr、fiq、irq、svc、abt、und。 3、寄存器R13在ARM指令中常用作堆栈指针,但这只是一种习惯用法,用户也可使用其他的寄存器作为堆栈指针。而在Thumb指令集中,某些指令强制性的要求使用R13作为堆栈指针。由于处理器的每种运行模式均有自己独立的物理寄存器R13,在用户应用程序的初始化部分,一般都要初始化每种模式下的R13,使其指向该运行模式的栈空间,这样,当程序的运行进入异常模式时,可以将需要保护的寄存器放入R13所指向的堆栈,而当程序从异常模式返回时,则从对应的堆栈中恢复,采用这种方式可以保证异常发生后程序的正常执行。 4、有四种类型的堆栈: 堆栈是一种数据结构,按先进后出(First In Last Out,FILO)的方式工作,使

孟祥莲嵌入式系统原理及应用教程部分习题答案

习题1 1. 嵌入式系统的概念的是什么?答:嵌入式系统是以应用为中心,以计算机技 术为基础,软、硬件可裁剪,适应应用系统对功能、可靠性、成本、体积、功耗等严格要求的专用计算机系统。(嵌入式系统是嵌入式到对象体系中的,用于执行独立功能的专用计算机系统。) 2. 嵌入式系统的特点是什么? 答:系统内核小;专用性强;运行环境差异大;可靠性要求高;系统精简和高实时性操作系统;具有固化在非易失性存储器中的代码嵌入式系统开发和工作环境 4. 嵌入式系统的功能是什么?答:提供强大的网络服务小型化,低成本,低 功能;人性化的人机界面;完善的开发平台 5. 嵌入式系统的硬件平台由哪些部分组成?答:嵌入式系统的硬件是以嵌入式处理器为核心,由存储器I/O 单元电路,通信模块,外部设备必要的辅助接口组成的。 7. 嵌入式操作系统的主要特点是什么?答:体积小;实时性;特殊的开发调试环境。 8. 叙述嵌入式系统的分类。答:按嵌入式微处理器的位数分类可以分为4 位、 8 位、16 位、32 位和64 位等;按软件实时性需求分类可以分为非实时系统(如PDA), 软实时系统(如消费类产品)和硬实时系统(如工业实时控制系统)按嵌入式系统的复杂程度分类可以分为小型嵌入式系统,中型嵌入式系统和复杂嵌入式系统。 习题2 处理器和工作状态有哪些?

答:ARM犬态:此时处理器执行32位的的字对齐的ARS旨令。 Thumb犬态:此时处理器执行16位的,半字对齐的Thumb旨令 2.叙述ARM9内部寄存器结构,并分别说明R13 R14 R15寄存器的 作用。 答:共有37个内部寄存器,被分为若干个组(BANK,这些寄存器包括31个通用寄存器,包括程序计数器(PC指针)6个状态寄存器。R13用作堆栈指针,R14称为子程序链接寄存器,R15用作程序计数器。处理器的工作模式有哪些? 答:用户模式:ARM处理器正常的程序执行状态。 快速中断模式:用于高速数据传输或通道处理 外部中断模式:用于通用中断处理管理模式:操作系统使用的保护模式数据访问终止模式:当数据或指令预期终止时进入该模式,可用于虚拟存储器及存储保护 系统模式:运行具有特权的操作系统任务 未定义指令终止模式:当未定义的指令执行时进入该模式,可用 于支持硬件协处理器的软件仿真。 微处理器支持的数据类型有哪些? 答:ARM微处理器中支持字节(8位)、半字(16位),字(32 位)

嵌入式系统原理及应用题目要求+程序代码

《嵌入式系统原理及应用》作业题目 作业1 一、调试下面的程序,并回答问题。 .global _start .text _start: LDR SP, =src LDMFD SP!,{R0-R6} STMFD SP!,{R0-R6} LDMFD SP!,{R3} LDMFD SP!,{R4} LDMFD SP!,{R5} LDMFD SP!,{R6} LDMFD SP!,{R0} LDMFD SP!,{R1} LDMFD SP!,{R2} stop: b stop .ltorg src: .long 1,2,3,4,5,6,7 .end 问:该程序完成了什么功能? 答: 该程序完成的功能:先把数据区堆栈中的1~7这七个数据送给R0~R0寄存器,然后又把寄存器列表中的R0~R7存入堆栈,然后又依次把堆栈中的1~7这七个数送给R3~R6,R0~R2,然后程序就结束了,在取数和存数的过程中。堆栈指针sp由0x0000变到0x8030再到0x804c,然后到0x8030,然后依次加4,最后到0x804c;程序计数器R15(PC)由0x8000地址依次加4 。 二、LDMFD,STMFD伪代码实现的原理。 答: 指令STMFD和LDMFD分析: 根据ATPCS规则,我们一般使用FD(Full Descending)类型的数据栈!所以经常使用的指令就有STMFD和LDMFD, 通过ARM对于栈操作和批量Load/Store指令寻址方式,可以知道指令STMFD和LDMFD 的地址计算方法:

STMFD指令的寻址方式为事后递减方式(DB) 而DB寻址方式实际存地址为: start_address = Rn - (Number_Of_Set_Bits_In(register_list)*4) end_address = Rn - 4 STM指令操作的伪代码: if ConditionPassed(cond) then address = start_address for i = 0 to 15 if register_list[i] == 1 Memory[address] = Ri address = address + 4 有上面两个伪代码可以得出STMFD SP!,{R0-R7,LR} 的伪代码如下:SP =SP -9×4; address =SP; for i = 0 to 7 Memory[address] = Ri; address= address + 4; Memory[address] = LR; LDMFD指令的寻址方式为事后递增方式(IA) IA存的实际地址的伪代码 start_address = Rn end_address = Rn + (Number_of_set_bits_in(register_list)*4) - 4 LDM指令操作的伪代码(未考虑PC寄存器): if ConditionPassed(cond) then address = start_address for i = 0 to 15 if register_list[i] == 1 Ri =Memory[address,4] address = address + 4 所以LDMFD SP!,{R0-R7,PC}^ (;恢复现场,异常处理返回)伪代码是: address = SP; for i = 0 to 7 Ri = Memory[address ,4] address = address + 4; SP = address; 作业2 一、用移位操作完成(R0)*10运算。 参考程序: .text .global _start

孟祥莲--嵌入式系统原理及应用教程-部分习题答案20150618

孟祥莲--嵌入式系统原理及应用教程-部分习题答案20150618

习题1 1.嵌入式系统的概念的是什么? 答:嵌入式系统是嵌入式到对象体系中的,用于执行独立功能的专用计算机系统。 2.嵌入式系统的特点是什么? 答:系统内核小;专用性强;运行环境差异大;可靠性要求高;系统精简和高实时性操作系统;具有固化在非易失性存储器中的代码嵌入式系统开发和工作环境 4.嵌入式系统的功能是是什么? 答:提供强大的网络服务小型化,低成本,低功能;人性化的人机界面;完善的开发平台 5.嵌入式系统的硬件平台由哪些部分组成? 答:嵌入式系统的硬件是以嵌入式处理器为核心,由存储器I/O单元电路,通信模块,外部设备必要的辅助接口组成的。 7.嵌入式操作系统的主要特点是什么? 答:体积小;实时性;特殊的开发调试环境。8.叙述嵌入式系统的分类。 答:按嵌入式微处理器的位数分类可以分为4位、8位、16位、32位和64位等;按软件实时性需求分类可以分为非实时系统(如PDA),软

实时系统(如消费类产品)和硬实时系统(如工业实时控制系统);按嵌入式系统的复杂程度分类可以分为小型嵌入式系统,中型嵌入式系统和复杂嵌入式系统。 习题2 1.ARM9处理器和工作状态有哪些? 答:ARM状态:此时处理器执行32位的的字对齐的ARM指令。 Thumb状态:此时处理器执行16位的,半字对齐的Thumb指令 2.叙述ARM9内部寄存器结构,并分别说明R13、R14、R15寄存器的作用。 答:共有37个内部寄存器,被分为若干个组(BANK),这些寄存器包括31个通用寄存器,包括程序计数器(PC指针)6个状态寄存器。R13用作堆栈指针,R14称为子程序链接寄存器,R15用作程序计数器。 4.ARM处理器的工作模式有哪些? 答:用户模式:ARM处理器正常的程序执行状态。 快速中断模式:用于高速数据传输或通道处

嵌入式原理与应用复习题

一.单项选择题 1. 下面哪项为错误的说法(A) A. 冯·诺依曼结构共用数据存储空间和程序存储空间,不共享存储器总线 B. 哈佛结构有分离的数据和程序空间及分离的访问总线 C. 哈佛结构在指令执行时,取址和取数可以进行并行操作 D. 哈佛结构指令执行时效率更高 2. 下列关于/etc/fstab文件描述,正确的是(D) A. fstab文件只能描述属于linux的文件系统 B. CD_ROM和软盘必须是自动加载的 C. fstab文件中描述的文件系统不能被卸载 D. 启动时按fstab文件描述内容加载文件系统 3. ARM9和ARM7的重要区别是(A) A . ARM9带有MMU功能 B . ARM9支持Thumb指令集 C . ARM9带有Cache功能 D . ARM9是哈佛结构 4. 如果数据的存储格式是大端模式,32bit宽的数0x在大端模式下的CPU内存中 的存放(假设从地址0x4000开始)。内存地址为0x4001的内容是(A) 5. 文件exer1的访问权限为rw-r--r--,现要增加所有用户的执行权限和同组用户 的写权限,下列命令正确的是(A) a+x g+w e x e r1765e x e r 1 o+x e x e r1g+w e x e r1 6. NAND FLASH和NOR FLASH的区别正确的是(D) A. NOR的读速度比NAND稍慢一些 的擦除速度远比NOR的慢 的写入速度比NOR慢很多 D.大多数写入操作需要先进行擦除操作。 7. gcc使用下列哪个选项可以查看编译的详细过程(B) A. -o B. -v D. -g 8. Boot Loader 的stage2通常使用C语言实现,以完成复杂的功能,并增加可读 性和可移植性,以下哪一步骤属于stage2的内容(D) A.为加载Boot Loader 的stage2 准备RAM 空间 B.设置好堆栈 C.硬件设备初始化 D.将kernel 映像和根文件系统映像从flash 上读到RAM 空间中 9. 怎样新建一个新文件:(A) 10. 在vi编辑器的命令模式中,删除一行的命令是:(B)

(完整版)嵌入式系统原理及应用复习知识点总结

第一章 1、嵌入式系统的应用范围:军事国防、消费电子、信息家电、网络通信、工业控制。 2、嵌入式系统定义:嵌入式系统是以应用为中心,以计算机技术为基础,软件与硬件可裁剪,适应应用系统对功能、可靠性、成本、体积、功耗严格要求的专用计算机系统。(嵌入式的三要素:嵌入型、专用性与计算机系统)。 3、嵌入式系统的特点:1)专用性强;2)实时约束;3)RTOS;4)高可靠性;5)低功耗;6)专用的开发工具和开发环境;7)系统精简; 4、嵌入式系统的组成: (1)处理器:MCU、MPU、DSP、SOC; (2)外围接口及设备:存储器、通信接口、I/O接口、输入输出设备、电源等;(3)嵌入式操作系统:windows CE、UCLinux、Vxworks、UC/OS; (4)应用软件:Bootloader 5、嵌入式系统的硬件:嵌入式微处理器(MCU、MPU、DSP、SOC),外围电路,外部设备; 嵌入式系统的软件:无操作系统(NOSES),小型操作系统软件(SOSES),大型操作系统软件(LOSES)注:ARM处理器三大部件:ALU、控制器、寄存器。 6、嵌入式处理器特点:(1)实时多任务;(2)结构可扩展;(3)很强的存储区保护功能;(4)低功耗; 7、DSP处理器两种工作方式:(1)经过单片机的DSP可单独构成处理器;(2)作为协处理器,具有单片机功能和数字处理功能; 第二章 1、IP核分类:软核、固核、硬核; 2、ARM处理器系列:(1)ARM7系列(三级流水,thumb指令集,ARM7TDMI); (2)ARM9系列(DSP处理能力,ARM920T)(3)ARM/OE(增强DSP)(4)SecurCone 系列(提供解密安全方案);(5)StrongARM系列(Zntle产权);(6)XScale系列(Intel产权);(7)Cortex系列(A:性能密集型;R:要求实时性;M:要求低成本) 3、ARM系列的变量后缀:(1)T:thumb指令集;(2)D:JTAG调试器;(3)快

一个故事看懂单片机中的堆栈

一个故事看懂单片机中的堆栈 因为单片机有CPU、存储器、IO等等,使他(人性化一点以配合下文)看起来就像一个比较小的计算机,所以在理解单片机的时候如果能把你之前有的那些也许仅仅是直 觉上的对计算机的理解融入进来的话,可能会对你学习 单片机的概念有极大的帮助,至少对于我是这样的。 我想在关于单片机的众多让你头晕脑胀、摸不着头脑甚 至想撞墙的概念里面,“堆栈”可能是其中 最可恶的一个,因为即使单单是从汉语的角度来理解这 个词就已经让你很晕了,其实我最初也想不通这是哪位 大侠的创意,不过不用担心,这里我们完全不去讨论关 于这个词的问题(这个词用得其实很好“堆”和“栈”都有他们各自思,准确的概括了这 个区域的功能,有兴趣可以Baidu一下),这里我会打一个比较有趣的比方,以此来绕过那些令你想撞墙的概念,并使你在直觉上对“堆栈”这个概念有一个 深刻的理解。你基本上应该清楚,单片机里面是有存储 区和CPU的,如果你不清楚,那么我刚刚告诉你了,请 记住。现在,请你把单片中的CPU想成一个人(你完全可以把他想成是你宿舍的那个天天和你吵嘴的同学,一会 你就会发现这会非常有趣)在这里就叫他C哥吧,不过这

个人不同于常人,有一些特点,一会我们会慢慢说清楚,现在要告诉你的关于这个人的第一个特点 是:他的记忆能力很差。下面,请你把存储区想象成一 个一个排好的小盒子,这些盒子的作用大致可以分成两类:1、保存写有你命令的纸条,比如你在某个盒子里面的纸条上写着:去洗我的袜子!;2、保存你的一些东西,比如你那双正在污染宿舍空气的臭袜子。因为C哥是一 个记忆力不怎么好的人,所以,这些盒子都有自己的编号,以方便他查找。那么,现在,我们可以来说明一下单片机是如何工作的了。首先,你要把所有的命令还有 需要处理的东西放进那些小盒子,比如刚才提到的你那 双待洗的袜子还有那张纸条,这时你应该发现C哥另一 个特点:笨——他只会做你明确告诉他的事情,也就是说,如果你没有在纸条上写“去洗我的袜子!”,那么C哥极有可能会无动于衷地看着你的袜子直到他被熏晕倒,当然,更可能的情况是他根本 找不到你的袜子…好了,当你把要做的事情和该 怎么做写到盒子里之后,下面的任务就交给C哥了。C哥做事真的很讲原则,他会按照你给定的顺序或者 ——如果你没有给定的话,根据盒子上面的 编号按照从小到大的顺序——一个一个地打 开盒子,读取里面的命令、处理相应的事件,直到所有

嵌入式系统应用与学习心得体会

μC/OS嵌入式实时操作系统的应用和学习心得μC/OS-II 是一种基于优先级的抢占式多任务实时操作系统,包含了实时内核、任务管理、时间管理、任务间通信同步(信号量,邮箱,消息队列)和内存管理等功能。它可以使各个任务独立工作,互不干涉,很容易实现准时而且无误执行,使实时应用程序的设计和扩展变得容易,使应用程序的设计过程大为减化。它是一个完整的、可移植、可固化、可裁剪的抢占式实时多任务内核。μC/OS-II 绝大部分的代码是用ANSII的C语言编写的,包含一小部分汇编代码,使之可供不同架构的微处理器使用。至今,从8位到64位,μC/OS-II已在超过40种不同架构上的微处理器上运行。μC/OS-II已经在世界范围内得到广泛应用,包括很多领域,如手机、路由器、集线器、不间断电源、飞行器、医疗设备及工业控制上。实际上,μC/OS-II已经通过了非常严格的测试,并且得到了美国航空管理局的认证,可以用在飞行器上。这说明μC/OS-II是稳定可靠的,可用于与人性命攸关的安全紧要系统。除此以外,μC/OS-II 的鲜明特点就是源码公开,便于移植和维护。 我们在学习μC/OS嵌入式实时操作系统时用的教科书是任哲编著的《嵌入式实时操作系统μC/OS-Ⅱ原理及应用》,这本书介绍了嵌入式实时操作系统μC/OS-Ⅱ内核的任务管理和调度、系统时钟和节拍服务、时间管理、中断、任务的通信和同步、内存的简单管理原理,同时给出了实例。最后,还介绍了μC/OS-Ⅱ的移植方法。 在多任务系统中,内核负责管理各个任务,或者说为每个任务分配CPU时间,并且负责任务之间的通讯。内核提供的基本服务是任务切换。之所以使用实时内核可以大大简化应用系统的设计,是因为实时内核允许将应用分成若干个任务,由实时内核来管理它们。内核本身也增加了应用程序的额外负荷,代码空间增加ROM的用量,内核本身的数据结构增加了RAM的用量。但更主要的是,每个任务要有自己的栈空间,这一块吃起内存来是相当厉害的。内核本身对CPU的占用时间一般在2到5个百分点之间。μC/OS-Ⅱ有一个精巧的内核调度算法,实时内核精小,执行效率高,算法巧妙,代码空间很少,具有如下特点:只支持基于优先级的抢占式调度算法,不支持时间片轮循;64个优先级,只能创建64个任务,用户只能创建56个任务;每个任务优先级都不相同;不支持优先级逆转;READY 队列通过内存映射表实现快速查询;效率非常高;支持时钟节拍;支持信号量,消息队列,事件控制块,事件标志组,消息邮箱任务通讯机制;支持中断嵌套,中断嵌套层数可达255层,中断使用当前任务的堆栈保存上下文;每个任务有自己的堆栈,堆栈大小用户自己设定;支持动态修改任务优先级;任务TCB为静态数组,建立任务只是从中获得一个TCB,不用动态分配,释放内存;任务堆栈为用户静态或者动态创建,在任务创建外完成,任务创建本身不进行动态内存分配;任务的总个数(OS_MAX_TASKS)由用户决定;0优先级最高,63优先级最低;有一个优先级最低的空闲任务,在没有用户任务运行的时候运行。 任务的调度核心主要是在任务就绪表中查找具有最高优先级别的就绪任务及实现任务切换,即将找到的的最高优先级别的任务的“任务号”---> “当前任务的任务号OSPrioCur”;从OSTCBPrioTbl[]取出最高优先级别任务的任务控制块首地址---> “当前任务的任务控制块指针OSTCBCur”,最后调用OS_TASK_SW()完成现场切换(即将CPU的寄存器信息保存到当前正运行任务的私栈中,然后从待运行的高优先级别的任务私栈中弹出原先保存寄存器信息到

孟祥莲嵌入式系统原理及应用教程 部分习题答案

习题 1 1.嵌入式系统的概念的是什么? 答:嵌入式系统是以应用为中心,以计算机技术为基础,软、硬件可裁剪,适应应用系统对功能、可靠性、成本、体积、功耗等严格要求的专用计算机系统。(嵌入式系统是嵌入式到对象体系中的,用于执行独立功能的专用计算机系统。) 2.嵌入式系统的特点是什么? 答:系统内核小;专用性强;运行环境差异大;可靠性要求高;系统精简和高实时性操作系统;具有固化在非易失性存储器中的代码嵌入式系统开发和工作环境 4.嵌入式系统的功能是什么? 答:提供强大的网络服务小型化,低成本,低功能;人性化的人机界面;完善的开发平台 5.嵌入式系统的硬件平台由哪些部分组成? 答:嵌入式系统的硬件是以嵌入式处理器为核心,由存储器I/O单元电路,通信模块,外部设备必要的辅助接口组成的。 7.嵌入式操作系统的主要特点是什么? 答:体积小;实时性;特殊的开发调试环境。 8.叙述嵌入式系统的分类。 答:按嵌入式微处理器的位数分类可以分为4位、8位、16位、32位和64位等;按软件实时性需求分类可以分为非实时系统(如PDA),软实时系统(如消费类产品)和硬实时系统(如工业实时控制系统);按嵌入式系统的复杂程度分类

可以分为小型嵌入式系统,中型嵌入式系统和复杂嵌入式系统。 习题2 1.ARM9处理器和工作状态有哪些? 答:ARM状态:此时处理器执行32位的的字对齐的ARM指令。 Thumb状态:此时处理器执行16位的,半字对齐的Thumb指令 2.叙述ARM9内部寄存器结构,并分别说明R13、R14、R15寄存器的作用。答:共有37个内部寄存器,被分为若干个组(BANK),这些寄存器包括31个通用寄存器,包括程序计数器(PC指针)6个状态寄存器。R13用作堆栈指针,R14称为子程序链接寄存器,R15用作程序计数器。 4.ARM处理器的工作模式有哪些? 答:用户模式:ARM处理器正常的程序执行状态。 快速中断模式:用于高速数据传输或通道处理 外部中断模式:用于通用中断处理 管理模式:操作系统使用的保护模式 数据访问终止模式:当数据或指令预期终止时进入该模式,可用于虚拟存储器及存储保护 系统模式:运行具有特权的操作系统任务 未定义指令终止模式:当未定义的指令执行时进入该模式,可用于支持硬件协处理器的软件仿真。 5.ARM微处理器支持的数据类型有哪些? 答:ARM微处理器中支持字节(8位)、半字(16位),字(32位)三种数据类型。其中,字需要4字节对齐,半字需要2字节对齐。

嵌入式作业题答案概要

第1章嵌入式系统概述 1.什么是嵌入式系统?嵌入式系统的组成? 答:嵌入式系统是以应用为中心,以计算机技术为基础,并且软硬件可裁剪,适用于应用系统对功能、可靠性、成本、体积、功耗有严格要求的专用计算机系统。组成:嵌入式处理器、外围设备、操作系统、应用软件。 2.典型的嵌入式处理器有哪些? 3.答:微处理器、微控制器、DSP处理器、片上系统SOC。 4.典型的RTOS操作系统有哪些? 5.答:嵌入式Linux、μCLinux、Windows Embedded CE、Windows Embedded Compact 7、μC/OS-II、μC/OS-III、VxWorks、eCos等。 6.列举身边的嵌入式应用产品? 7.嵌入式系统的设计可以分成四个阶段:需求分析、架构设计和概要设计、详细设计和开发、测试反馈。 第2章 Cortex-M体系结构 8.ARM Cortex系统的处理器分为:____A_____、____R_____、_____M_____。 9.ARM Cortex-M3为32位微控制器,请问32位指的是CPU字长。 10.3、Cortex-M3 处理器能够以小端格式或大端格式访问存储器中的数据字,而访问代码时始使用小端格式。 11.ARM Cortex-M3体系结构采用哈佛总线结构,拥有独立的指令总线和数据总线,可以让取指与数据访问并行进行。 12.CM3寄存器分为通用寄存器,包括R0~R15。和特殊功能寄存器,包括程序状态寄存器、异常屏蔽寄存器、控制寄存器。 13.寄存器R13是堆栈指针寄存器。 14.寄存器R14是程序连接寄存器。 15.寄存器R15是程序PC。 16.CM3的堆栈指针分为__MSP__、__PSP_。存储器堆栈堆栈分为:向上生长(即向高地址方向生长)的递增堆栈;向下生长(即向低地址方 向生长),称为递减堆栈。堆栈指针指向最后压入堆栈的有效数据项,称为满堆栈;堆栈指针指向下一个数据项放入的空位置,称为空堆栈。试判断CM3属于递减堆栈堆栈和满堆栈堆栈。 17.在CM3中记录程序状态的寄存器是___xPSR____。都分别有些什么状态_应用状态、中断状态、可执状态。 18.PRIMASK寄存器的作用是___中断屏蔽寄存器____。 19.寄存器CONTROL的作用是控制处理器工作级别及堆栈切换。 20.CM3支持的4GB存储空间被划分成:CODE、片上RAM、片上外设、片外RAM、片外外设、内核私有6个区域。 21.CM3中有一个位绑定区分别位于片上RAM和片上外设区,其大小为1M字节,由32M字节空间的位绑定别名区来访问。 22.CM3支持16种系统异常,和240种外设中断。 23.SysTick是一个___24_____位的系统定时器。通常的功能是_作为操作系统时钟__。 第3章STM32基础及最小系统设计 24.STM32F103RBT7芯片的在片Flash存储器有128KB 字节,在片SRAM存储器有20KB 字节。 25.STM32F103RBT7芯片工作时电源电压是 3.3 V。 26.STM32最小系统电路包含:MCU芯片、电源电路、时钟电路、复位电路和启动设置电路。 27.连接在APB1上的设备有:电源接口、备分接口、CAN、USB、I2C1、I2C2、UART2、UART3、SPI2、WatchDog、Timer2、Timer3和Timer4。 28.连接在APB2上的设备有:UART1、SPI1、Timer1、ADC1、ADC2、I/O(PA~PE,第二功能I/O)。 29.假定STM32F103单片机外部振荡器是8MHz。执行下列程序。 void BSP_Init(void) { RCC_HSEConfig(RCC_HSE_ON); HSEStartUpStatus = RCC_WaitForHSEStartUp(); if(HSEStartUpStatus == SUCCESS) { RCC_PCLK2Config(RCC_HCLK_Div1); // PCLK2 = HCLK=72MHz RCC_PCLK1Config(RCC_HCLK_Div2); // PCLK1 = HCLK/2 =38MHz RCC_HCLKConfig(RCC_SYSCLK_Div1); //HCLK = SYSCLK =72MHz RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9); // PLLCLK = 8 * 9 = 72MHz RCC_PLLCmd(ENABLE); // Enable PLL

2015年本科期末考试《嵌入式系统原理及应用》最终版整理复习要点

嵌入式复习大纲 第一章 1、嵌入式系统定义及概念: 嵌入式系统是以应用为中心、以计算机技术为基础、软硬件可裁减、功能、可靠性、成本、体积、功耗严格要求的专用计算机系统 2、嵌入式系统的特点:(3个) 1)嵌入式系统通常是面向特定应用的; 2)嵌入式系统功耗低、体积小、集成度高、成本低; 3)嵌入式系统具有较长的生命周期; 4)嵌入式系统具有固化的代码; 3、嵌入式处理器的分类: 1)嵌入式微处理器(EMPU); 2)嵌入式微控制器(EMCU); 3)嵌入式DSP处理器(EDSP); 4)嵌入式片上系统(ESoC)。 4、嵌入式系统的组成: 由硬件层、中间层、系统软件层和应用软件层组成。 (1)硬件层中包含嵌入式微处理器、存储器(SDRAM、ROM、Flash等)、通用设备接口和I/O接口(A/D、D/A、I/O等) (2)硬件层与软件层之间为中间层,也称为硬件抽象层,该层一般包含相关底层硬件的初始化、数据的输入/输出操作和硬件设备的配置功能。BSP具有以下两个特点。 (3)系统软件层由实时多任务操作系统、、文件系统、图形用户接口、网络系统及通用组件模块组成。 5、嵌入式操作系统: 嵌入式实时操作系统μC/OS-II、嵌入式Linux、Windows Embedded、VxWorks、pSOS、等,以及应用在智能手机和平板电脑的Android、iOS等 6、嵌入式系统的设计方法:(需交叉编译和调试环境) (1)系统定义与需求分析 (2)系统设计方案的初步确立 (3)初步设计方案性价比评估与方案评审论证 (4)完善初步方案、初步方案实施 (5)软硬件集成测试 (6)系统功能性能测试及可靠性测试 第二章 1、ARM的CISC、RISC ARM7~ARM9 (1)CISC特点:复杂指令、各种类型的内存寻址方式、微程序结构、效率高 (2)RISC特点:固定指令长度、指令流水线处理、简化内存管理、硬件接线式控制、单周期执行、复杂度存于编译程序内 (3)冯诺依曼结构:输入输出设备、运算器、控制器、存储器 主要贡献:提出并实现了“存储程序”的概念 2、ARM7:采用3级流水线结构,采用冯诺依曼结构(程序存储与数据存储统一编址) ARM9:采用5流水线结构,采用哈弗体系结构(程序存储器与数据存储器分开独立编址) ARM10:采用6流水线结构,采用哈弗体系结构

孟祥莲 嵌入式系统原理及应用教程 部分习题答案20150618

习题1 1.嵌入式系统的概念的是什么? 答:嵌入式系统是以应用为中心,以计算机技术为基础,软、硬件可裁剪,适应应用系统对功能、可靠性、成本、体积、功耗等严格要求的专用计算机系统。(嵌入式系统是嵌入式到对象体系中的,用于执行独立功能的专用计算机系统。) 2.嵌入式系统的特点是什么? 答:系统内核小;专用性强;运行环境差异大;可靠性要求高;系统精简和高实时性操作系统;具有固化在非易失性存储器中的代码嵌入式系统开发和工作环境 4.嵌入式系统的功能是什么? 答:提供强大的网络服务小型化,低成本,低功能;人性化的人机界面;完善的开发平台5.嵌入式系统的硬件平台由哪些部分组成? 答:嵌入式系统的硬件是以嵌入式处理器为核心,由存储器I/O单元电路,通信模块,外部设备必要的辅助接口组成的。 7.嵌入式操作系统的主要特点是什么? 答:体积小;实时性;特殊的开发调试环境。 8.叙述嵌入式系统的分类。 答:按嵌入式微处理器的位数分类可以分为4位、8位、16位、32位和64位等;按软件实时性需求分类可以分为非实时系统(如PDA),软实时系统(如消费类产品)和硬实时系统(如工业实时控制系统);按嵌入式系统的复杂程度分类可以分为小型嵌入式系统,中型嵌入式系统和复杂嵌入式系统。 习题2 1.ARM9处理器和工作状态有哪些? 答:ARM状态:此时处理器执行32位的的字对齐的ARM指令。 Thumb状态:此时处理器执行16位的,半字对齐的Thumb指令 2.叙述ARM9内部寄存器结构,并分别说明R13、R14、R15寄存器的作用。 答:共有37个内部寄存器,被分为若干个组(BANK),这些寄存器包括31个通用寄存器,包括程序计数器(PC指针)6个状态寄存器。R13用作堆栈指针,R14称为子程序链接寄存器,R15用作程序计数器。 4.ARM处理器的工作模式有哪些? 答:用户模式:ARM处理器正常的程序执行状态。 快速中断模式:用于高速数据传输或通道处理 外部中断模式:用于通用中断处理 管理模式:操作系统使用的保护模式 数据访问终止模式:当数据或指令预期终止时进入该模式,可用于虚拟存储器及存储保护 系统模式:运行具有特权的操作系统任务 未定义指令终止模式:当未定义的指令执行时进入该模式,可用于支持硬件协处理器的软件仿真。 5.ARM微处理器支持的数据类型有哪些? 答:ARM微处理器中支持字节(8位)、半字(16位),字(32位)三种数据类型。其中,字需要4字节对齐,半字需要2字节对齐。 7.叙述CPSR寄存器及其各位数据位的作用? 答:CPSR是当前程序状态寄存器,是在任何模式下都可以访问的通用状态寄存器,它包括

孟祥莲嵌入式系统原理及应用教程部分习题答案

习题1 1.嵌入式系统的概念的是什么? 答:嵌入式系统是以应用为中心,以计算机技术为基础,软、硬件可裁剪,适应应用系统对功能、可靠性、成本、体积、功耗等严格要求的专用计算机系统。(嵌入式系统是嵌入式到对象体系中的,用于执行独立功能的专用计算机系统。) 2.嵌入式系统的特点是什么? 答:系统内核小;专用性强;运行环境差异大;可靠性要求高;系统精简和高实时性操作系统;具有固化在非易失性存储器中的代码嵌入式系统开发和工作环境 4.嵌入式系统的功能是什么? 答:提供强大的网络服务小型化,低成本,低功能;人性化的人机界面;完善的开发平台 5.嵌入式系统的硬件平台由哪些部分组成? 答:嵌入式系统的硬件是以嵌入式处理器为核心,由存储器I/O单元电路,通信模块,外部设备必要的辅助接口组成的。 7.嵌入式操作系统的主要特点是什么? 答:体积小;实时性;特殊的开发调试环境。 8.叙述嵌入式系统的分类。 答:按嵌入式微处理器的位数分类可以分为4位、8位、16位、32位和64位等;按软件实时性需求分类可以分为非实时系统(如PDA),软实时系统(如消费类产品)和硬实时系统(如工业实时控制系统);

按嵌入式系统的复杂程度分类可以分为小型嵌入式系统,中型嵌入式系统和复杂嵌入式系统。 习题2 处理器和工作状态有哪些? 答:ARM状态:此时处理器执行32位的的字对齐的ARM指令。 Thumb状态:此时处理器执行16位的,半字对齐的Thumb指令2.叙述ARM9内部寄存器结构,并分别说明R13、R14、R15寄存器的作用。 答:共有37个内部寄存器,被分为若干个组(BANK),这些寄存器包括31个通用寄存器,包括程序计数器(PC指针)6个状态寄存器。R13用作堆栈指针,R14称为子程序链接寄存器,R15用作程序计数器。处理器的工作模式有哪些? 答:用户模式:ARM处理器正常的程序执行状态。 快速中断模式:用于高速数据传输或通道处理 外部中断模式:用于通用中断处理 管理模式:操作系统使用的保护模式 数据访问终止模式:当数据或指令预期终止时进入该模式,可用于虚拟存储器及存储保护 系统模式:运行具有特权的操作系统任务 未定义指令终止模式:当未定义的指令执行时进入该模式,可用于支持硬件协处理器的软件仿真。 微处理器支持的数据类型有哪些? 答:ARM微处理器中支持字节(8位)、半字(16位),字(32位)

一文让你彻底明白“应用工程的堆与栈”

应用工程的堆与栈 一、基本知识 C语言因其高效率而成为目前嵌入式微控制器(MCU)编程中使用最多的编程语言,堆栈是C语言区别于汇编语言的最大特点,也是其高效运行的基础。1、定义 1)基本含义 事实上,堆栈包括堆(heap)和栈(s tack)两个不同的概念,只是因为其二者都占用MCU的片上RAM空间并对系统内存进行分配和管理,而被习惯性放在一起说。 在单片机应用中,堆栈是个特殊的存储区,主要功能是暂时存放数据和地址,通常用来保护断点和现场。 可以理解成堆栈是位于MCU片上RAM空间上的一个特殊存储区。 小注: ?堆:队列优先,先进先出(FIFO—first in first out) ?栈,先进后出(FILO—First-In/Last-Out)。 2)详解介绍 ①堆(heap)是用于动态分配内存的RAM区域,heap的空间是用户手动申请和释放的:C语言中的malloc(size),calloc(num,size)函数分配heap,释放使用free(*heap)函数; ②栈(stack)用于分配函数临时变量、在函数调用或中断产生时保存内核CPU 运行时上下文(run time context—包括内核CPU通用寄存器、SP和PC寄存器、状态寄存器(如S12内核的CCR寄存器,存放内核CPU的计算状态)及函数当前的临时变量)以及函数参数传递;其占用的RAM大小与CPU架构(不同的内核CPU其位宽和CPU寄存器数量各不相同)和编译器采用的嵌入式应用程序二进制接口(Embedded Application Binary Interface)有关。 小注: ?栈(Stack)是CPU根据程序运行需求自动分配(也叫push,即压栈)和释放 (也称作pop,即出栈)的,无需用户自己维护,但需要在C工程的链接文件

ARM9在嵌入式中的应用实例

ARM9在嵌入式中的应用实例 ——启动程序的实现 【摘要】:本文给出了基于ARM9嵌入式系统的启动程序的实现流程,并针对存储器控制单元的使用以及目标文件的分布装载等技术难点进行详细分析。 【关键词】嵌入式系统、启动程序、ARM9 嵌入式系统被定义为:以应用为中心、以计算机技术为基础、软件硬件可裁剪、适应应用系统对功能、可靠性、成本、体积、功耗严格要求的专用计算机系统。嵌入式系统的核心部件是各种类型的嵌入式处理器,随着嵌入式系统不断深入到人们生活中的各个领域,嵌入式处理器得到前所未有的飞速发展。 典型的32位RISC芯片──ARM处理器,不论是在PDA,STB,DVD等消费类电子产品中,还是在GPS,航空,勘探,测量等军方产品中都得到了广泛的应用。越来越多的芯片厂商早已看好ARM的前景,如Intel,NS,Ateml,Philips,NEC,CirrusLogic等公司都有相应的产品。在1999年,ARM突破1.5亿个,市场份额超过了50%,已经成为业界的龙头。 在基于ARM9的嵌入式系统过程中,发现技术难点主要在于系统启动程序的编写,为此本文详细论述了在ARM9基础上开发嵌入式系统时启动程序的实现。 1.启动程序流程 嵌入式系统的资源有限,程序通常都是固化在ROM中运行。ROM中程序执行前,需要对系统硬件和软件运行环境进行初始化,这些工作由用汇编语言编写的启动程序完成。 启动程序是嵌入式程序的开头部分,应与应用程序一起固化在ROM中,并首先在系统上运行。它应包含进各模块中可能出现的所有段类,并合理安排它们的次序。 写好启动程序是设计好嵌入式程序的关键,系统启动程序所执行的操作依赖于正在开发其软件的系统,一般流程如下: 2.详细步骤 (1)设置入口指针 启动程序首先必须定义入口指针,而且整个应用程序只有一个入口指针。 (2)设置中断向量 ARM7要求中断向量表必须设置在从0地址开始,连续8×4字节的空间,分别是复位、未定义指令错误、软件中断、预取指令错误、数据存取错误、IRQ、FIQ和一个保留的中断向量。

堆栈在树形结构中使用的实例

'================================================================== ============= ' 堆栈在树形结构中使用的实例 ' By Lee1892, 2012.12.09 '------------------------------------------------------------------------------- ' 本实例实现一下功能: ' (1) 树形结构中,按级数汇总数量,即每级汇总该级下全部数量 ' (2) 按树形结构设置Excel的数据分组及分级显示 ' (3) 使用方框与连接线绘制树形,类似TreeView效果 '------------------------------------------------------------------------------- ' 原始数据中,有全部数形结构数据,各节点唯一的编号、能指示节点所在级数的符号、 ' 节点的名称、需要统计的数量。该树形结构各分支的级数不确定,仅在各分支的末梢节点有 ' 待统计的数量数据。 '------------------------------------------------------------------------------- ' 本代码采用字典对象模拟堆栈,对原始数据循环一次扫描完成统计计算并绘制树形图, ' 可学习到堆栈、字典对象、结构图绘制、数据分组分级显示、代码操控单元格公式等多方面 ' 内容。 ' 本实例可应用于材料清单(BOM)的统计、公司结构绘制等多种实践。 '================================================================== ============= Const TR_LEVEL_MARK = "+" Const TR_COL_INDEX = "A" Const TR_COL_LEVEL = "B" Const TR_COL_NAME = "C" Const TR_COL_COUNT = "D" Const TR_COL_TREE_START = "F" Const TR_ROW_HEIGHT = 23 Const TR_COL_LINE_WIDTH = 3 Const TR_COL_BOX_MARGIN = 4 Sub CalculationAndDrawTree() Dim iMaxRow&, i&, j&, dic, aKeys, iLevelLast%, iLevelNow% '全部恢复 'Undo_All Application.ScreenUpdating = False '最大行号

相关主题
文本预览
相关文档 最新文档