欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 财经 > 金融 > 【嵌入式系统】第3章 嵌入式系统程序设计,ARM指令集,THUMB指令集,汇编语言程序设计,嵌入式c程序设计

【嵌入式系统】第3章 嵌入式系统程序设计,ARM指令集,THUMB指令集,汇编语言程序设计,嵌入式c程序设计

2025/11/9 18:42:59 来源:https://blog.csdn.net/persona5joker/article/details/144412339  浏览:    关键词:【嵌入式系统】第3章 嵌入式系统程序设计,ARM指令集,THUMB指令集,汇编语言程序设计,嵌入式c程序设计

关注作者了解更多

我的其他CSDN专栏

过程控制系统

工程测试技术

虚拟仪器技术

可编程控制器

工业现场总线

数字图像处理

智能控制

传感器技术

嵌入式系统

复变函数与积分变换

单片机原理

线性代数

大学物理

热工与工程流体力学

数字信号处理

光电融合集成电路技术

电路原理

模拟电子技术

高等数学

概率论与数理统计

数据结构

C语言

模式识别原理

自动控制原理

数字电子技术

关注作者了解更多

资料来源于网络,如有侵权请联系编者

目录

ARM指令中的操作数符号

ARM指令中的移位操作

3.2  ARM指令的寻址方式

3.3  ARM指令集

数据处理指令

程序状态指令

分支指令

加载/存储指令

协处理器指令

异常中断指令

3.4  Thumb指令集

3.5  Thumb-2指令集

3.6  ARM处理器支持的伪指令

ADR伪指令

LDR伪指令

NOP伪指令

3.7  ARM汇编语言程序设计

ARM汇编语言的格式

在汇编语言程序中常用的符号

汇编语言程序中的表达式和运算符

ARM汇编器所支持的伪指令

汇编语言的程序结构

汇编语言的子程序调用与返回

3.8 CMSIS及其规范

基于CMSIS应用程序的软件层次

CMSIS包含三个层次

CMSIS代码基本规范

CMSIS代码推荐规范

CMSIS文件结构(例:以STM32F10x系列为例)

3.9 BootLoard及启动文件

启动文件的功能

3.10 嵌入式C程序设计

嵌入式C数据类型

嵌入式应用中常用运算符举例 

嵌入式应用中常用运算符举例续

嵌入式程序设计过程

嵌入式系统的程序结构

无RTOS下的轮询结构

无RTOS下的中断驱动结构

无RTOS下轮询与中断结合结构

基于RTOS的多任务并发执行结构

嵌入式C与汇编语言混合程序设计

基于STM32F10x的应用中汇编调用C实例

基CMSIS的固件库及文件结构

STM32F10x固件库文件结构


ARM指令中的操作数符号

1、#    立即数符号:32位立即数

2、0x  十六进制符号

3、!  更新基址寄存器符号

4、^     复制SPSR到CPSR符号

5、-   指示寄存器列表符号

ARM指令中的移位操作

3.2  ARM指令的寻址方式

 7种常见的寻址方式

1、立即寻址:ADD R0,R1,#10

2、寄存器寻址:MOV R1,R2

3、寄存器间接寻址:STR R0,[R1]

4、基址加变址寻址:LDR R1,[R1,#4]

5、相对寻址:BL SUB1

6、堆栈寻址

7、块拷贝(多寄存器)寻址:LDMIA R0,{R1-R5}

3.3  ARM指令集

数据处理指令

程序状态指令

  程序状态指令用于在程序状态寄存器和通用寄存器之间传送数据。

MRS—程序状态寄存器到通用寄存器的数据传送指令    例如:MRS R0,CPSR;传送CPSR的内容到R0

MSR—通用寄存器到程序状态寄存器的数据传送指令    例如:MSR SPSR,R0;传送R0的内容到SPSR

分支指令

  分支指令用于实现程序流程的跳转,ARM指令集中的分支指令可以完成从当前指令向前或向后的32MB的地址空间的跳转,包括4条指令:

B转移指令

BL带返回的转移指令

BLX带返回且带状态切换的转移指令

BX带状态切换的转移指令

加载/存储指令

加载指令用于将存储器中的数据传送到寄存器,存储指令则完成相反的操作。 加载存储指令有三类:

单一数据加载/存储

批量数据加载/存储

数据交换指令

协处理器指令

  ARM协处理器指令包括5条:

CDP(协处理器数操作指令)

LDC(协处理器数据加载指令)

STC(协处理器数据存储指令)

MCR(ARM处理器寄存器到协处理器寄存器的数据传送指令)

MRC(协处理器寄存器到ARM处理器寄存器的数据传送指令)。

异常中断指令

ARM微处理器所支持的异常中断指令有如下两条:

SWI — 软件中断指令

示例:   SWI     0x01    ;该指令调用操作系统编号为01的系统例程。

BKPT — 断点中断指令 示例:BKPT      0XF010

支持16位的立即数

3.4  Thumb指令集

Thumb指令集指令编码长度为16位,但指令的操作数和指令地址仍是32位;

Thumb指令集是ARM指令系统的一个子集 ;

Thumb指令集在保留32代码优势的同时,大大的节省了系统的存储空间。  

数据处理指令

分支指令

加载/存储指令

异常中断指令

3.5  Thumb-2指令集

Thumb-2是一种新型混合指令集,融合了16位和32位指令,用于实现密度和性能的最佳平衡。

数据处理指令     (见P.73表3.12)

分支指令与程序处理指令 (P.75表3.13)

加载与存储指令      (P.75见表3.14)  

3.6  ARM处理器支持的伪指令

指令性指令:可以执行的指令

伪指令:是一种指示性语句,是不可执行的指令。

指令性语句汇编后由相应的机器代码所取代,指示汇编程序为数据分配内存空间或相应寄存器,不产生任何机器代码。

ARM处理器支持的伪指令有ADR、LDR和NOP三类。

ADR伪指令

功能:将程序相对偏移地址或寄存器偏移地址加载到指定寄存器中。 格式:ADR{cond} Rd,expr

示例:       Mloop    MOV R1,#0xf9                ADR    R0,mloop                   ;将mloop对应相对偏移地址传送到R0中    

LDR伪指令

功能:将32位常量或一个地址加载到到指定寄存器中 。

格式:LDR{cond} Rd,=[expr|lable-expr]    

示例:

   LDR R1,=0x1234        ;R1=0x1234

Mloop    LDR    R2,#0xABCDEF98      ;R2=0xABCDEF98           

LDR    R3,=mloop                       ;将mloop对应地址传送到R3中

NOP伪指令

功能:空操作,产生所需的ARM无操作代码,用于简单延时,与MOV Rd,Rd等效  。

格式:NOP     

示例:                LDR R7,=1000

LOOP        NOP              ;作为延时主体           

 SUB R7,R7,#1             BNZ LOOP

3.7  ARM汇编语言程序设计

ARM汇编语言的格式

ARM汇编中常用符号

ARM汇编中的常用表达式和运算符

ARM汇编器所支持的伪指令

ARM汇编语言程序结构

ARM汇编语言的格式

语句格式:  

{标号}   {指令或伪操作}   {;注释}

标号:从一行的行头开始,不能包含空格

指令或伪操作:指令的前面必须有空格或符号(不能顶格写)

注释:以“;”开头

续行:如果一条语句太长,可将该长语句分为若干行来书写,在行的末尾用“\”表示下一行与本行为同一条语句。

在汇编语言程序中常用的符号

常量:数字常量(32位)、逻辑常量和字符串常量

变量:数字变量(8~32)、逻辑变量和字符串变量

变量代换:$         

      在ARM汇编语言程序设计中,经常使用各种符号代替地址、变量和常量等,以增加程序的可读性。尽管符号的命名由编程者决定,但并不是任意的,必须遵循以下的约定。

汇编语言程序中的表达式和运算符

在汇编语言程序设计中,也经常使用各种表达式。表达式一般由变量、常量、运算符和括号构成。常用的表达式有数字表达式、逻辑表达式和字符串表达式,其运算次序遵循如下的优先级:

括号运算符的优先级最高。 优先级相同的双目运算符的运算顺序为从左到右。 相邻的单目运算符的运算顺序为从右到左,且单目运算符的优先级高于其他运算符。

ARM汇编器所支持的伪指令

在ARM的汇编程序中,有如下几种伪操作: 符号定义伪操作 数据定义伪操作 汇编控制伪操作 其他伪操作。

汇编语言的程序结构

汇编语言的子程序调用与返回

ARM汇编语言子程序都有一个子程序的名称,也有子程序的返回指令,采用MOV PC,LR返回。        如果一个子程序不在调用的同一个文件中,则需要先用IMPORT声明是外部的,IMPORT声明可以放在AREA语句之前。

     在ARM汇编语言程序中,子程序的调用一般是通过BL指令来实现的。    

   BL   子程序名

3.8 CMSIS及其规范

   CMSIS(Cortex Microcontroller Software Interface Standard)是ARM Cortex™ 微控制器软件接口标准,是 Cortex-M 处理器系列与供应商无关的硬件抽象层。使用CMSIS,可以为处理器和外设实现一致且简单的软件接口,从而简化软件的重用、缩短微控制器新开发人员的学习过程,并缩短新产品上市时间。

基于CMSIS应用程序的软件层次

CMSIS包含三个层次

(1)内核外设访问层(CPAL=Core Peripheral Access Layer) 。由ARM公司负责实现,包括对寄存器名称、地址的定义,对核寄存器、NVIC、调试子系统的访问接口定义等。

(2)中间件访问层(MWAL=Middleware Access Layer)。     定义了访问中间件的一些通用API函数,该层也有ARM公司负责,但芯片厂家也要根据自己器件的设备特性更新。

(3)片上外设访问层(DPAL, Device Peripheral Access Layer)。     由芯片厂商负责实现,其实现与CPAL类似,负责对硬件寄存器地址以及外设访问接口进行定义。该层可调用CPAL层提供的接口函数,同时根据设备特性对异常向量表进行扩展,以处理相应外设的中断请求。

CMSIS代码基本规范

(1)CMSIS的C代码遵照MISRA2004规则。

(2)使用标准ANSIC头文件<stdint.h>定义的标准数据类型,在stm32f10x.h中包含

(3)#define定义的包含表达式的常数必须用括号括起来。查看stm32f10x.h

(4)变量和参数必须有完全的数据类型。在stm32f10x.h中定义

(5)CPAL(内核外设访问层)层的函数必须是可重入的。 (6)CPAL层的函数不能有阻塞代码,也就是说等待、查询等循环必须在其他的软件层中。

(7)定义每个异常/中断的处理函数:每个异常处理函数的后缀是_Handler,每个中断处理器函数的后缀是_IRQHandler。如看门狗中断处理函数WDT_IRQHandler,查看STM32F10x的中断向量。

(8)默认的异常中断处理器函数(弱定义)包含一个无限循环。

(9)用#define将中断号定义为后缀为_IRQn的名称。

CMSIS代码推荐规范

 (1) 定义外设访问函数、中断函数名称时首字母大写。

(2)对于某个外设相应的函数,一般用该外设名称作为其前缀。

(3)按照Doxygen规范撰写函数的注释,注释使用C90风格(/*注释*/)或者C++风格(//注释),注释内容如下:

 ①一行函数简介;  

  ②参数的详细解释;    

③返回值的详细解释;

    ④函数功能的详细描述。

CMSIS文件结构(例:以STM32F10x系列为例)

3.9 BootLoard及启动文件

    Boot Loader:是应用程序运行之前的引导加载程序,类似于PC的BIOS程序,目的是将PC指针引导到C语言程序main入口。

ARM处理器启动过程:

BootLoader主要任务

启动文件的功能

主要包括链接地址描述以及各种初始化的程序两大类,实现以下功能:

(1)描述文件实现功能

描述文件的功能主要包括指定程序下载的地址和指定程序执行的地址。

(2)初始化程序的功能

初始化程序的功能主要包括异常向量初始化、内存环境初始化以及其它硬件初始化。

在MDK-ARM(KEIL)环境下浏览一下启动文件, 具体分析详见P.95~P.100

3.10 嵌入式C程序设计

一、嵌入式C程序设计基础(P.100-P.107)     

数据类型、运算符、常用语句等。

二、嵌入式程序设计过程(P.107)

三、嵌入式系统的程序结构(P.109-P.110)

四、汇编语言与C语言混合编程(P.111)

五、基于CMSIS的固件库及其使用(P.113)

嵌入式C数据类型

位数

CC99(stdint.h)数据类型

含义

有符号数范围

无符号数范围

8

char

int8_t

uint8_t

字节数

有符号字节数

无符号字节数

-2n-1~2n-1-1 (n=8)

0~2n-1 (n=8)

16

short

int16_t

uint16_t

16位数

16位有符号数

16位无符号数

-2n-1~2n-1-1 (n=16)

0~2n-1 (n=16)

32

int

int32_t

uint32_t

long

float

32位整型数

32位有符号数

32位无符号数

32位数整型数

32位浮点数,8个点

-2n-1~2n-1-1 (n=32)

0~2n-1 (n=32)

64

long long

int64_t

uint64_t

double

long double

64位整型数

64位有符号数

64位无符号数

双精度浮点数,16个点长

双精度浮点数,32个点

-2n-1~2n-1-1 (n=64)

0~2n-1 (n=64)

嵌入式应用中常用运算符举例 

嵌入式应用中常用运算符举例续

嵌入式系统中常用的C语言语句(P104~107)

1、表达式语句 2、复合语句 3、条件语句(if   /  else) 4、循环语句(for / while) 5、swith语句 6、break语句 7、continue语句 8、返回语句

嵌入式程序设计过程

嵌入式系统的程序结构

嵌入式应用程序有4种基本的处理流程:

(1)基于轮询的处理流程;

(2)基于中断驱动的处理流程;

(3)基于轮询与中断相结合的处理流程;

(4)基于处理并发任务的处理流程。

无RTOS下的轮询结构

轮询结构适用于简单应用,程序设计上实际上是一个死循环,在这个循环体内,查询满足执行不同条件的任务,查询的次序也决定了任务的优先级。

无RTOS下的中断驱动结构

  采用中断驱动方式,是在满足任务处理条件时由外设发一个中断请求,这时微控制器通过中断向量表找出其中断服务程序入口地址,进入中断服务程序中执行相应任务。

无RTOS下轮询与中断结合结构

   中断处理程序仅做相关标志状态及关键事务的处理,返回后大量的运算处理尽量在主程序中完成

基于RTOS的多任务并发执行结构

     使用实时嵌入式操作系统(RTOS)来处理多任务。对于更加复杂的应用程序,可借助于RTOS来处理不同任务。RTOS将处理时间划分为多个时间片,在有多个应用进程运行时,只有一个进程会获得时间片。

嵌入式C与汇编语言混合程序设计

   ARM体系结构支持C以及与汇编语言的混合编程,在一个完整的程序设计中,除了初始化部分用汇编语言完成以外,其主要的编程任务一般都用C完成。 汇编语言与C的混合编程通常有以下几种方式: (1) 在C代码中嵌入汇编指令。   (2) 在汇编程序和C的程序之间进行变量的互访。   (3) 汇编程序和C程序间的相互调用。 详见P.112-P.113

基于STM32F10x的应用中汇编调用C实例

基CMSIS的固件库及文件结构

   固件库是芯片厂家按照CMSIS标准编写的对ARM芯片的驱动函数库,在CMSIS层次结构中属于器件级外设函数。目前ARM微控制器生产厂家均提供相关的器件级外设函数库提供给给用户使用。因此只要知道CMSIS基本规范,查看函数库的使用说明即可应用到系统中。

  在嵌入式系统的组成中,固件库就是设备驱动程序,处于硬件与OS之间的中间层软件。在不使用嵌入式操作系统的嵌入式系统中,固件库则是处于硬件和应用层之间的中间件。

STM32F10x固件库文件结构

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词