当前位置:首页 >> 其它课程 >> 嵌入式系统复习(一)

嵌入式系统复习(一)


嵌入式系统
信息电子工程学院

1

第一章:嵌入式系统概述 1. 一般定义
“以应用为中心,以计算机技术为 基础,软件、硬件可裁减,功能、可靠 性、成本、体积、功耗严格要求的专用 计算机系统。
嵌入式系统采用“量体裁衣”的方式把 所需的功能嵌入到各种应用系统中。

2

/> 嵌入式系统的应用领域示意图典型的

2、 嵌入式技术的应用领域 嵌入式系统应用实例
军事国防 工业控制
工控设备 智能仪表 汽车电子 网络设备 电子商务 军事电子

消费电子
信息家电
智能玩具

嵌入式应用

通信设备

移动存贮

网络
3

3、嵌入式系统的基本组成

4

嵌入式系统的架构图 3、嵌入式系统的基本组成
应用程序 操作系统 存储器

软件 结构
硬件 结构

输入

处理器

输出

5

软件硬件基本要素 3、嵌入式系统的基本组成
硬件
?
? ? ?

软件
实时操作系统(RTOS) ? 板级支持包(BSP) ? 设备驱动(Device Driver) ? 协议栈(Protocol Stack) ? 应用程序(Application)
?

嵌入式处理器 各种类型存储器 模拟电路及电源 接口控制器及接插件

6

1)嵌入式系统硬件系统
嵌入式系统的硬件是以嵌入式处理器为 核心,配置必要的外围接口部件。在嵌入式 系统设计中,应以最少的外围部件构成一个 应用系统,满足嵌入式系统的特殊要求。 一般包括有 :嵌入式处理器; 存储器; I/O系统和外设。

7

2)嵌入式系统的软件系统
嵌入式系统的软件包括 : 操作系

统、应用软件、驱动层软件。
(1)操作系统功能简介 操作系统层包含嵌入式内核、嵌入式 TCP/IP网络系统、嵌入式文件系统、嵌入式 GUI系统和电源管理等部分。其中嵌入式内核 是基础和必备的部分,其他部分要根据嵌入 式系统的需要来确定。
8

4、嵌入式系统的特点
采用32位RISC嵌入式微处理器和实 时操作系统组成的嵌入式控制系统,与 传统基于单片机的控制系统和基于PC的 控制方式相比,具有以下突出优点: ?性能方面:采用32位RISC结构微处理 器,主频从30MHz到1200MHz以上,接 近PC机的水平,但体积更小,能够真 正地“嵌入”到设备中。
9

嵌入式系统的特点
? 实时性方面:嵌入式控制器内嵌实时操作系统,能

够完全保证控制系统的强实时性。 ? 人机交互方面:嵌入式控制器可支持大屏幕的液晶 显示器,提供功能强大的图形用户界面,这些方面 的性能也接近于PC,优于单片机。 ? 系统升级方面:嵌入式控制器可为控制系统专门设 计,其功能专一,成本较低,而且开放的用户程序 接口(API)保证了系统能够快速升级和更新。

10

嵌入式系统与单片机的区别
嵌入式系统 ? 单片机系统 目前嵌入式系统的主流是以32位嵌入式微 处理器为核心的硬件设计和基于实时操作系 统的软件设计。由于有了OS可以执行多任务 调度,支持网络协议TCP/IP,所以嵌入式系 统可以比普通单片机系统更适合完成复杂的 任务。

11

嵌入式系统与PC之间的区别
嵌入式系统一般是专用系统,而PC是通用计 算平台; ? 嵌入式系统的资源比PC少得多;软件故障带 来的后果比PC机大得多; ? 嵌入式系统一般采用实时操作系统;有成本、 功耗的要求;得到多种微处理体系的支持并 需要专用的开发工具。
?

12

5、嵌入式处理器的分类
嵌入式微控制器 (MCU)

嵌入式DSP处理器 (DSP)

嵌入式处理器
嵌入式微处理器 (MPU)

嵌入式片上系统 (System On Chip)

ARM微处理器举例
三星公司S3C2410的最小系统 提供Linux系统内核 系统稳定工作在203MHz主频 上 模块包括64MB SDRAM、16- 64MB flashROM 模块给出了S3C2410几乎所 有的信号,32位的数据总线, 保留充分扩展空间 为嵌入式技术爱好者提供了 一个廉价的中高端平台 科研人员高效的开发工具
14

6、嵌入式系统的开发模式

嵌入式系统开发的代码生成是在PC机上完成, 但由于嵌入式目标平台的不同,就要求在开发 机上的编译器能支持交叉编译(ARM-LINUXGCC) 、链接,然后将程序的代码下载到目标 机上指定位置,然后还要交叉调试。 主要流程为:编写-交叉编译、链接-定位 和下载-调试。嵌入式系统采用这种开发模式 主要是自身的特点决定的。

15

嵌入式系统软件的开发模式
需要使用交叉编译器,进行交叉开发。 交叉编译器(Cross-compiler):是一种运行在通用 计算机上的、但是能够生成在另一种处理器上运行 的目标代码的编译器。 ? 交叉开发:在一台通用计 算机上进行软件的编辑、 编译,然后下载到嵌入式 系统中运行调试。
?

宿主机

目标机
16

第二章 嵌入式系统开发的流程
嵌入式软件的开发流程与通用软件的开发流程 大同小异,但开发所使用的设计方法具有嵌入式 开发的特点。整个开发流程可分为:

?需求分析阶段 ?设计阶段 ?生成代码阶段 ?固化阶段

17

? 需求分析阶段

嵌入式系统应用需求中最为突出的是 注重应用的时效性,需求分析阶段的主要 任务是: (1)对问题的识别和分析 (2)制订规格说明文档 (3)需求评审

18

? 设计阶段

系统的设计阶段包括系统设计、任务设计 和任务的详细设计。 ?(1)数据流分析 ?(2)划分任务 ?(3)定义任务间的接口

19

? 生成代码阶段
生成代码阶段需要完成的工作包括代码编程、 交叉编译和链接、交叉调试和测试等。

20

? 生成代码阶段
代码编程

在嵌入式系统的开发过程中,一般采用 的方法是先在通用PC上编程,然后通过交叉 编译链接,将程序做成目标平台上可以运行 的二进制代码格式。最后将程序下载到目标 平台上的特定位置,在目标板上启动运行这 段二进制代码。

21

? 生成代码阶段
交叉编译和链接

嵌入式软件开发编码完成后,要进行编 译和链接以生成可执行代码。 嵌入式集成开发环境都支持交叉编译、 链接,如WindRiver公司的TornadoⅡ以及 GNU套件等。交叉编译链接生成两种类型的 可执行文件:调试用的可执行文件和固化 的可执行文件。

22

? 固化阶段

嵌入式系统的应用软件是针对特定的实际专业 领域的,基于相应的嵌入式硬件平台,并能完 成用户预期任务的计算机软件。
嵌入式软件的特点如下:

(1)软件要求固态化存储。 (2)软件代码要求高质量、高可靠性。 (3)系统软件的高实时性是基本要求。 (4)多任务实时操作系统成为嵌入式应用软件的必需。

23

嵌入式软件开发的要点
? 嵌入式应用软件高度依赖目标应用的软硬件 环境,软件的部分任务功能函数由汇编语言完 成,具有高度的不可移植性。

? 为了保证实时性能,使用效率高和速度快的 汇编语言是不可避免的。 ? 尽可能提高嵌入式应用软件的可移植性方法: (1)尽量用高级语言开发,少用汇编语言 (2)局域化不可移植部分 (3)提高软件的可重用性
24

嵌入式系统的调试
?嵌入式系统的调试过程:

?嵌入式系统的调试方法: 1.源程序模拟器方式 2.监控器方式 3.仿真器方式

25

板级支持包
由于嵌入式系统中采用微处理器/微控制器的多样 性,嵌入式操作系统的可移植性显得更加重要。所 以有些嵌入式操作系统的内核明确分成两层,上层 一般称为“内核”,而低层则称为“硬件抽象 层” ,底层的缩写是HAL,也有的厂商把硬件抽象 层称为BSP,即板级支持包,板级支持包是操作系 统与目标应用硬件环境的中间接口,它是软件包中 具有平台依赖性的那一部分。 板级支持包的主要功能包括两部分: ?在系统启动时,对硬件进行初始化 ?为驱动程序提供访问硬件的手段

26

第三章 ARM体系结构
ARM即Advanced RISC Machines的缩写。ARM公司1990年 成立,是设计公司。ARM是知识产权(IP)供应商,本身不生 产芯片,靠转让设计许可,由合作伙伴公司来生产各具特色 的芯片。

ARM处理器的3大特点是:

?耗电少、成本低、功能强; ?16位/32位双指令集; ?全球众多合作伙伴保证供应。

27

ARM体系结构的特点
ARM处理器为RISC芯片,其简单的结构使ARM内 核非常小,这使得器件的功耗也非常低。它具有经 典RISC的特点: ? 大的、统一的寄存器文件; ? 装载/保存结构,数据处理 操作只针对寄存器 的内容,而不直接对存储器进行操作; ? 简单的寻址模式; ? 统一和固定长度的指令域,简化了指令的译码, 便于指令流水线设计。

28

?

寄存器
ARM内含37个寄存器,其中:
?31个通用32位寄存器 ?6个状态寄存器

29

?

指令执行的阶段
计算机中的1条指令的执行可以分若干个阶段: ① 取指,从存储器中取出指令(fetch); ② 译码,指令译码(dec): ③ 取操作数,假定操作数从寄存器组中取(reg); ④ 执行运算(ALU); ⑤ 存储器访问,操作数与存储器有关(mem); ⑥ 结果写回寄存器(res)。

30

? ARM体系结构的3级流水线
ARM7体系结构采用了3级流水线,分为取指,译码和执 行。下图是单周期3级流水线的操作示意图。

31

? ARM体系结构的5级流水线

5级流水线把存储器的取指与数据存取分开, 增加了I-Cache和D-Cache以提高存储器存取的效 率,增加了数据写回的专门通路和寄存器,以减 少数据通路冲突。 这样,5级流水线分为:取指、指令译码、 执行、数据缓存和写回。

32

? ARM7TDMI
ARM体系结构的处理器内核有:ARM7TDMI、ARM8、 ARM9TDMI、ARM10TDMI及ARM11TDMI等。 ARM7TDMI名字原义如下: ?ARM7 ?T ?D ?M ?I 32位整数核的3V兼容的版本; 16位压缩指令集Thumb; 在片调试(Debug)支持,允许处理器响应调 试请求暂停; 增强型乘法器,与以前处理器 相比性能更高,产生全64位结果; 嵌入式ICE硬件提供片上断点和调试点支持。

33

? ARM9TDMI
流水线结构
ARM9TDMI处理器内核采用了5级流水线。

34

? ARM10TDMI
ARM10TDMI采用提高时钟速率、6级流水线、分支 预测逻辑、64位存储器和无阻塞的存/取逻辑等措 施,使ARM10TDMI的性能得到很大提高,是目前高 档ARM体系结构的处理器内核。
流水线结构

35

1 数据类型
ARM处理器支持下列数据类型: ?Byte 字节, 8位; ?Halfword 半字, 16位(半字必须与2字节边界对准); ?Word 字,32 位(字必须与4字节边界对准)。

36

处理器模式
ARM体系结构支持7种处理器模式。
处理器
用户 FIQ IRQ 管理 中止 未定义

模 式
usr fiq irq svc abt und


正常程序执行模式



支持高速数据传送或通道处理 用于通用中断处理 操作系统保护模式 实现虚拟存储器和/或存储器保护 支持硬件协处理器的软件仿真

系统

sys

运行特权操作系统任务

37

处理器工作状态
ARM处理器有两种工作状态: ?ARM: 32位,这种状态下执行字对准的ARM指令; ?Thumb:16位,这种状态下执行半字对准的Thumb指令。

ARM处理器在两种工作状态之间可以切换。ARM和 Thumb之间状态的切换不影响处理器的模式或寄存器 的内容。 (1)进入Thumb状态。当操作数寄存器的状态位 (位[0])为1时,执行BX指令进入Thumb状态。 (2)进入ARM状态。当操作数寄存器的状态位( 位[0])为0时,执行BX指令进入ARM状态。
38

寄存器组织
ARM处理器总共有37个寄存 器: ? 31 个 通 用 寄 存 器 , 包 括 程序计数器(PC)。这些寄 存器是32位的。 ? 6个状态寄存器。这些寄 存器也是32位的,但只使用 了其中的12位。

39

? 通用寄存器
通用寄存器(R0~R15)可分成3类: ? 不分组寄存器R0~R7: 在所有的处理器模式下,它们每一个都访问一样的32位物理寄存器 。 ? 分组寄存器R8~R14: 它们每一个访问的物理寄存器取决于当前的处理器模式。每种处理 器模式有专用的分组寄存器用于快速异常处理。寄存器R13通常用作 堆栈指针,称作SP。 寄存器R14用作子程序链接寄存器,也称为链接 寄存器LR。 ?寄存器R8~R12各有两组物理寄存器。一组为FIQ模式,另一组为 除FIQ以外的其它模式。 ?寄存器R13、R14各有6个分组的物理寄存器。1个用于用户模式 和系统模式,而其它5个分别用于5种异常模式。 ? 程序计数器R15: ?在ARM状态,位[1:0]为0,位[31:2] 保存PC ?在Thumb状态,位[0]为0,位[31:1]保存 PC。
40

? Thumb状态的寄存器集
Thumb 状态下的寄存器集是ARM状态下的寄存器集的子集。程序员可以直接访问8个 通用寄存器(R0~R7)、PC、SP、LR和CPSR。每一种特权模式都有一组SP、LR和SPSR。

41

异常
异常由内部或外部源产生并引起处理器处理一个事件,例如外部 中断或试图执行未定义指令都会引起异常。 ARM支持7种类型的异常。
异常类型 复位 未定义指令 软件中断(SWI) 预取中止(取指令存储器中止) 数据中止(数据访问存储器中止) IRQ(中断) FIQ(快速中断) 模 管理 未定义 管理 中止 中止 IRQ FIQ 式 正常地址 0x00000000 0x00000004 0x00000008 0x0000000C 0x00000010 0x00000018 0x0000001C 高向量地址 0xFFFF0000 0xFFFF0004 0xFFFF0008 0xFFFF000C 0xFFFF0010 0xFFFF0018 0xFFFF001C

?当异常出现时,异常模式分组的R14和SPSR用于保存状态。 ? 当处理异常返回时,把SPSR传送到CPSR,R14传送到PC。这可用两种 方法自动完成,即 ?使用带“S”的数据处理指令,将PC作为目的寄存器; ?使用带恢复CPSR的多加载指令。
42

异常
异常优先级 优先级 1(最高) 复位 2 3 4 数据中止 FIQ IRQ 异 常

5

预取中止

6(最低) 未定义指令、SWI

43

ARM基本寻址方式
寻址方式是根据指令中给出的地址码字段来寻找真实操 作数地址的方式。ARM处理器支持的基本寻址方式有: ?寄存器寻址 ?立即寻址 ?寄存器移位寻址 ?寄存器间接寻址 ?变址寻址 ?多寄存器寻址 ?堆栈寻址 ?块复制寻址 ?相对寻址

44

? 寄存器寻址

所需要的值在寄存器中,指令中地址码给出的是寄存器编号,即寄存器 的内容为操作数。例如指令: ADD R0,R1,R2 ; R0?R1+R2

这条指令将2个寄存器(R1和R2)的内容相加,结果放入第3个寄存器R0 中。必须注意写操作数的顺序,第1个是结果寄存器,然后是第一操作数 寄存器,最后是第二操作数寄存器。

45

? 立即寻址
立即寻址是一种特殊的寻址方式,指令中在操作码字段后面的地址码 部分不是通常意义上的操作数地址,而是操作数本身。这样的数称为立 即数。例如指令: ADD AND R3,R3,#1 R8,R7,#0xff ; ; R3?R3+1 R8?R7[7:0]

第2个源操作数为一个立即数,以“#”为前缀,十六进制值以在“#” 后加“0x”或“&”表示。 第1条指令完成寄存器R3的内容加1,结果放回R3中。第2条指令完成 R7的32位值与0FFH相“与”,结果为将R7的低8位送到R8中。

46

?寄存器移位寻址
这种寻址方式是ARM指令集特有的。第2个寄存器操作数在与第1个操作数 结合之前,选择进行移位操作。例如指令: ADD R3,R2,R1,LSL #3 ; R3?R2+8×R1

寄存器R1的内容逻辑左移3位,再与寄存器R2内容相加,结果放入R3中。

可以采取的移位操作如有:
?LSL:逻辑左移(Logical Shift Left)。寄存器中字的低端空出的位补0。
0

?LSR:逻辑右移(Logical Shift Right)。寄存器中字的高端空出的位补0。
0

47

?寄存器移位寻址
可以采取的移位操作如有:
?ASR:算术右移(Arithmetic Shift Right)。算术移位的对象是 带符号数,若源操作数为正数,则字的高端空出的位补0。若源操 作数为负数,则字的高端空出的位补1。

? ROR:循环右移(ROtate Right)。从字的最低端移出的位填入字的高 端空出的位。

? RRX:扩展为1的循环右移(Rotate Right eXtended by 1 place)。 操作数右移一位,空位(位[31])用原C标志值填充。
C

48

?寄存器间接寻址
指令中的地址码给出某一通用寄存器的编号。在被指定的寄存器 中存放操作数的有效地址,而操作数则存放在存储单元中,即寄存 器为地址指针。例如指令: LDR STR R0,[R1] R0,[R1] ; R0?[R1] ; R0?[R1]

寄存器间接寻址使用一个寄存器(基址寄存器)的值作为存储器 的地址。第1条指令将寄存器R1指向的地址单元的内容加载到寄存器 R0中。第2条指令将寄存器R0存入寄存器R1指向的地址单元。

49

? 变址寻址
变址寻址就是将基址寄存器的内容与指令中给出的位移量相加,形成 操作数有效地址。变址寻址用于访问基址附近的存储单元,包括基址加 偏移和基址加索引寻址。寄存器间接寻址是偏移量为0的基址加偏移寻 址。 基址加偏移寻址 ?前索引寻址方式:基址需加(或减)最大4KB的偏移 来计算访问的地址。 例如:LDR R0,[R1,#4] ; R0?[R1+4] ?后索引寻址方式:基址不带偏移作为传送的地址, 传送后自动索引。 例如:LDR R0,[R1],#4 ; R0?[R1] ; R1?R1+4 基址加索引寻址

指令指定一个基址寄存器,再指定另一个寄存器(索 引),其值作为位移加到基址上形成存储器地址。 例如:LDR R0,[R1,R2] ; R0?[R1+R2]

50

? 多寄存器寻址
一次可以传送几个寄存器的值。允许一条指令传 送16个寄存器的任何子集(或所有16个寄存器)。 例如指令:

LDMIA

R1,{R0,R2,R5}

; R0?[R1] ; R2?[R1+4] ; R5?[R1+8]

由于传送的数据项总是32位的字,基址R1应该字 对准。这条指令将R1指向的连续存储单元的内容送 到寄存器R0、R2和R5。
51

? 堆栈寻址
有4种类型的堆栈表示递增和递减的满和空堆栈的各种组 合。ARM处理器支持所有这4种类型的堆栈。 ? 满递增:堆栈通过增大存储器的地址向上增长,堆栈指针 指向内含有效数据项的最高地址。

? 空递增:堆栈通过增大存储器的地址向上增长,堆栈指针 指向堆栈上的第一个空位置。
? 满递减:堆栈通过减小存储器的地址向下增长,堆栈指针 指向内含有效数据项的最低地址。 ? 空递减:堆栈通过减小存储器的地址向下增长,堆栈指针 指向堆栈下的第一个空位置。
52

? 块复制寻址
ARM支持两种不同角度的寻址机制:堆栈角度和块复制角度,两者 都映射到相同的基本指令。堆栈和块拷贝角度的多寄存器加载和存储 指令映射如下图。

53

? 相对寻址

相对寻址是变址寻址的一种变通,由程序计数器PC提供基地址。 指令中的地址码字段作为位移量,两者相加后得到操作数的有效地址。 位移量指出的是操作数与现行指令之间的相对位置。例如指令: BL SUBR … SUBR … MOV PC,R14 ; 转移到SUBR ; 返回到此 ;子程序入口地址 ;返回

54

条件执行
几乎所有的ARM指令均可包含一个可选的条件码,句法说明中以{cond} 表示,只有在CPSR中的条件码标志满足指定的条件时,带条件码的指令才 能执行。并使用后缀“S”来区分是否根据执行结果修改条件码标志。
操作码[31:28] 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 助记符后缀 EQ NE CS/HS CC/LO MI PL VS VC HI LS GE LT GT LE AL 标 志 含 义 Z置位 Z清零 C置位 C清零 N置位 N清零 V置位 V清零 C置位且Z清零 C清零或Z置位 N和V相同 N和V不同 Z清零且N和V相同 Z置位或N和V不同 任何 相等 不等 大于或等于(无符号>=) 小于(无符号<) 负 正或零 溢出 未溢出 大于(无符号>) 小于或等于(无符号<=) 带符号>= 带符号< 带符号> 带符号<= 总是(通常省略)
55

? ARM存储器访问指令
(1)LDR和STR——字和无符号字节
[例 子]

LDR R8,[R10] ; R8?[R0] LDRNE R2,[R5,#960]! ;(有条件地)R2?[R5+960],R5?R5+960 STR R2,[R9,#consta-struc] ;consta-struc是常量的表达式,该
;常量值的范围为0~4 095 STRB R0,[R3, -R8,ASR #2] ;R0?[R3-R8/4],存储R0的最低有效 ;字节,R3和R8不变 STR R5,[R7], #-8 ;R5?[R7],R1?R7-8 LDR R0,localdata ;加载一个字,该字位于标号lacaldata所在地址

56

? ARM数据处理指令
算术/逻辑运算指令

57

? ARM转移指令
(1)B和BL ? B(Branch)指令引起处理器转移到label。 句法: B {cond} label ? BL(Branch and Link)指令将下一条指令的地址拷贝 到R14(LR,链接寄存器),并引起转移到label。 句法: BL {cond} label
(2)BX :引起处理器转移到Rm中的地址。若Rm的位[0]为1, 则指令集变换到Thumb。 句法: BX {cond} Rm (3)BLX:带链接转移并可选地交换指令集。 句法: BLX {cond} Rm BLX label

58

? 杂项ARM指令
(1)SWI,引起软件中断。这意味着处理器模式变换为管理模式,CPSR保 存到管理模式的SPSR中,执行转移到SWI向量。 句法: SWI {cond} immed_24 其中:immed_24为表达式,其值为0~224-1范围内的整数。 (2)MRS,将CPSR或SPSR的内容传送到通用寄存器。 句法: MRS {cond} Rd,psr 其中:Rd 目标寄存器。Rd不允许为R15。 psr CPSR或SPSR。 (3)MSR,用立即数或通用寄存器的内容加载CPSR或SPSR的指定区域。 句法: MSR {cond} <psr>_<fields>,#immed_8r MSR {cond} <psr>_<fields>,Rm 其中:<psr> CPSR或SPSR。 <fields> 指定传送的区域。 immed_8r 值为数字常量的表达式。常量必须对应于8位位图在32 位字中循环移位偶数位后的值。 Rm 源寄存器。
59

3 Thumb指令集与ARM指令集的区别
Thumb指令集

Thumb在32位体系结构上实现了16位指令集,以 提供: ?比16位体系结构更高的性能; ?比32位体系结构更高的代码密度。

Thumb指令集与ARM指令集的区别

? ? ? ?

转移指令; 数据传送指令; 单寄存器加载和存储指令; 多寄存器加载和存储指令。

60

4.2.1 ARM汇编器支持的伪指令
伪指令是ARM汇编语言程序中的一些特殊指令助记符,这 些助记符与指令系统的助记符不同,没有相对应的操作码, 它们所完成的操作称为伪操作。

伪指令在源程序中的作用是为完成汇编程序做各种准备工 作的,这些伪指令仅在汇编过程中起作用,一旦汇编结束, 伪指令的使命就完成了。 ARM汇编器支持的伪指令包括:符号定义伪指令、数据定 义伪指令、汇编控制伪指令、宏指令以及其他伪指令。

61

ARM汇编器支持的常见伪指令
分类 符号定义 伪指令 数据定义 伪指令 汇编控制 伪指令 指令 GBLA/GBLL/GBLS/LCLA/LCL L/LCLS/SETA/SETL/SETS/RLI ST DCB/DCW/DCD/ DCFD/DCFS/ DCQ/ SPACE/ MAP/ FIELD IF/ELSE/ENDIF/ WHILE/WEND/ 举例 GBLA Test1 ;定义一个名为Test1的全局数值字变量 str DCB “This is a test” ;分配起始地址为str的一段连续字节存储 单元存放字符串 IF Test=TRUE ;如果条件成立 指令序列1 ;执行指令序列1 ELSE ;否则执行指令序列2 指令序列2 ENDIF MACRO Seg 指令序列 MEND ;定义一个名为Seg的宏指令 AREA Init,CODE,READONLY,ALIGN=3 ;定义了一个代码段,段名为Init,属性 为只读,并指定其后的指令为8(23)字 62 节对齐。

宏指令

MACRO/MEND/ MEXIT

其他 伪指令

AREA/ALIGN/CODE16/CODE3 2/ENTRY/END/EQU/EXPORT/ GLOBAL/IMPORT/EXTERN/G ET/INCLUDE/INCBIN

ARM汇编语言程序的基本结构
在ARM汇编语言程序中,以程序段为单位来组织代码。 段是相对独立的指令或数据序列,具有特定的名称。段可以 分为代码段和数据段,代码段的内容为执行代码,数据段存 放代码运行时所需的数据。

可执行映像文件通常由以下几部分构成: ? 一个或多个代码段,代码段为只读属性。 ? 零个或多个包含初始化数据的数据段,数据段的属 性为可读写。 ? 零个或多个不包含初始化数据的数据段,数据段的 属性为可读写。

63

? 一个含有子程序调用的代码段的例子
AREA Init,CODE,READONLY ENTRY LDR R0, =0x3FF5000 LDR R1, 0x0f STR R1, [R0] LDR R0, =0x3F50008 LDR R1, 0x1 STR R1, [R0] BL PROC ;子程序调用 … PROC ;子程序开始 … MOV PC,LR ;从子程序返回 … END

64

例:编写一具有完整汇编格式的程序,实现冒泡法排 序功能。设无符号字数据存放在从0x400004开始的区 域,字数据的数目字存放在0x400000中。
AREA START MOV LP R1,#0x400000 SORT,CODE,READONLY ENTRY

SUBS BEQ MOV LDR LP1
LDR LDR CMP

R1,R1,#1 STRLO EXIT STRLO R7,R1 SUBS R0,=0x400004 BNE
R2,[R0],#4 EXIT R3,[R0] END R2,R3 B

R3,[R0, # -4] R2,[R0] R7,R7,#1 LP1 LP

65

C语言与汇编语言混合编程应遵守的规则
在C程序和ARM汇编程序之间相互调用时必须遵守ATPCS规 则。寄存器的使用规则 ?子程序之间通过寄存器r0~r3来传递参数,当参数个数 多于4个时,使用堆栈来传递参数。 ?在子程序中,使用寄存器r4~r11保存局部变量。 ?寄存器r12用于保存堆栈指针SP,当子程序返回时使用该 寄存器出栈,记作IP。寄存器r13用作堆栈指针,记作SP。 寄存器r14称为链接寄存器,记作LR。寄存器r15称为程序 计数器,记作PC。 ?堆栈的使用规则

66

汇编程序调用C程序的方法
汇编程序调用C程序的方法为:首先在汇编程序中使用 IMPORT伪指令事先声明将要调用的C语言函数;然后通过 BL指令来调用C函数。 例如在一个C源文件中定义了如下求和函数: int add(int x,int y){ return(x+y); } 调用add()函数的汇编程序结构如下: IMPORT add ;声明要调用的C函数 … MOV r0,1 MOV r1,2 BL add ;调用C函数add

67

C程序调用汇编程序的方法
C程序调用汇编子程序的方法为:首先在汇编程序中使用EXPORT伪指 令声明被调用的子程序,表示该子程序将在其他文件中被调用;然后 在C程序中使用extern关键字声明要调用的汇编子程序为外部函数。
例如在一个汇编源文件中定义了如下求和函数: EXPORT add ;声明add子程序将被外部函数调用 … add ;求和子程序add ADD r0,r0,r1 MOV pc,lr … 在一个C程序的main()函数中对add汇编子程序进行了调用: extern int add(int x,int y); //声明add为外部函数 void main(){ int a=1,b=2,c; c=add(a,b); //调用add子程序 … }
68

C程序中内嵌汇编语句
在C语言中内嵌汇编语句可以实现一些高级语言不能实现或者高级语言 不容易实现的功能以及时间紧迫的功能。 内嵌的汇编器支持大部分ARM指令和Thumb指令,但是不支持诸如直接 修改PC实现跳转的底层功能,也不能直接引用C语言中的变量。 嵌入式汇编语句在形式上表现为独立定义的函数体,其语法格式为: _ _asm { 指令[;指令] … [指令] }

69

基于ARM的C语言与汇编语言混合编程举例
举例:一个向串口不断发送0x55的例子。
启动代 码的整 体框架 … IMPORT Main AREA Init ,CODE, READONLY; ENTRY … BL Main ;跳转到Main()函数处的C/C++程序 … END ;标识汇编程序结束 #include "..\inc\config.h" //将有关硬件定义的头文件包含进来 unsigned char data; //定义全局变量 void Main(void){ Target_Init(); //对目标板的硬件初始化 Delay(10); //延时 data = 0x55; //给全局变量赋值 while(1) { Uart_Printf("%x",data); //向串口送数 Delay(10); }}
70

C语言写 的主函数


更多相关文档:

嵌入式系统复习提纲

嵌入式系统复习提纲_教育学_高等教育_教育专区。嵌入式1、什么是嵌入式系统?与...它的三要素是嵌入、专用、 计算机。嵌入式系统就是一个具有特定功能或用途的...

嵌入式系统复习资料

嵌入式系统复习资料_工学_高等教育_教育专区。第1章 嵌入式系统导论 1.嵌入式...STM32 内含复位电路支持,当任意一个下列事件发生时都将引起系统自动复 位: ①...

嵌入式系统复习

问答题、编程题举例: 1嵌入式系统的定义、主要特点。 答案要点: 目前国内一个普遍被认同的定义是:以应用为中心、以计算机技术为基础、软件硬件可 裁剪、适应...

嵌入式系统复习内容(答案整理)

嵌入式系统复习内容(答案整理)_工学_高等教育_教育专区。第一章 嵌入式系统概述 1. 嵌入式系统是什么? 目前,对嵌入式系统的定义多种多样: IEEE(国际电气和电子...

带答案的嵌入式系统 复习提纲

带答案的嵌入式系统 复习提纲_工学_高等教育_教育专区。嵌入式系统 复习提纲嵌入式系统复习提纲第一章 1, 什么是嵌入式系统?IEEE(国际电气和电子工程师协会)的定...

嵌入式系统原理及应用复习知识点总结

嵌入式系统原理及应用复习知识点总结_教育学_高等教育_教育专区。高等学校计算机专业“十一五”规划教材 出版社:西安电子科技大学 版次:2010年2月第一版 主编:...

嵌入式系统复习重点

S。 3、采用 Keil C51 语言编程,定义一 int 变量,并赋初值,int v1= -...在嵌入式计算机系统中,下列部件都能够存储信息:《嵌入式系统复习 ①SRAM、②...

嵌入式系统复习终极版

嵌入式系统复习重点一、题型 填空题 单选题 名词解释 简答题 设计题 2`×10 2`×5 2`×5 5`×6 15`×2 二、考点 第一章 嵌入式系统概述 1、嵌入式...

嵌入式系统期末复习资料

嵌入式期末复习资料 (1) 1页 2财富值如要投诉违规内容,请到百度文库投诉中心;...(P1 的第一段也读一读) 2、 嵌入式系统一般由 嵌入式微处理器 、 外围...

嵌入式系统复习提纲

嵌入式系统复习提纲第一章 绪论 1. 嵌入式系统的定义 (1) 广义:根据 IEEE(电气和电子工程师协会)的定义,嵌入式系统是“用来控制或监 视机器、装置或工厂等大...
更多相关标签:
网站地图

文档资料共享网 nexoncn.com copyright ©right 2010-2020。
文档资料共享网内容来自网络,如有侵犯请联系客服。email:zhit325@126.com