第4章 嵌入式系统程序设计基础(第二版)_第1页
第4章 嵌入式系统程序设计基础(第二版)_第2页
第4章 嵌入式系统程序设计基础(第二版)_第3页
第4章 嵌入式系统程序设计基础(第二版)_第4页
第4章 嵌入式系统程序设计基础(第二版)_第5页
已阅读5页,还剩36页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第4章嵌入式系统程序设计基础

本章介绍基于ARM的嵌入式系统程序设计的一些基本概念,如ARM汇编语言的伪指令、汇编语言的语句格式和汇编语言的程序结构等,同时介绍嵌入式C语言设计基础、C与汇编语言的混合编程等问题。

主要内容汇编语言的语句格式

汇编语言的程序结构

ARM编译器所支持的伪指令

34.134.234.334.4嵌入式C语言程序设计4.1ARM编译器所支持的伪指令

在ARM的汇编程序中,有如下几种伪指令:符号定义伪指令数据定义伪指令汇编控制伪指令宏指令以及其他伪指令返回符号定义伪指令(1)

符号定义伪指令用于定义ARM汇编程序中的变量、对变量赋值以及定义寄存器的别名等操作。1.GBLA、GBLL和GBLS格式:GBLA(GBLL或GBLS)全局变量名符号定义伪指令(2)2.LCLA、LCLL和LCLS格式:LCLA(LCLL或LCLS)局部变量名3.SETA、SETL和SETS格式:变量名SETA(SETL或SETS)表达式

符号定义伪指令(3)4.RLIST格式:名称 RLIST{寄存器列表}示例:RegList RLIST {R0-R5,R8,R10};将寄存器列表名称定义为RegList,可在ARM指令LDM/STM中通过该名称访问寄存器列表。数据定义伪指令(1)

(1)DCB (2)DCW(DCWU) (3)DCD(DCDU) (4)DCFD(DCFDU)分配一片连续的字节存储单元分配一片连续的半字存储单元分配一片连续的字存储单元为双精度的浮点数分配一片连续的字存储单元数据定义伪指令(2)(5)DCFS(DCFSU) (6)DCQ(DCQU) (7)SPACE

(8)MAP

(9)FIELD 为单精度的浮点数分配一片连续的字存储单元分配一片以8字节为单位的连续的存储单元用于分配一片连续的存储单元用于定义一个结构化的内存表首地址用于定义一个结构化的内存表的数据域汇编控制伪指令

汇编控制伪指令用于控制汇编程序的执行流程,常用的汇编控制伪指令包括以下几条:(1)IF、ELSE、ENDIF(2)WHILE、WEND(3)MACRO、MEND(4)MEXIT示例:GBLL Test ……IF Test=TRUE

指令序列1ELSE

指令序列2ENDIFGBLACounterSETA 3 ……WHILE Counter<10

指令序列WEND语法格式:$标号 宏名 $参数1,$参数2,……MEXIT用于从宏定义中跳转出去其他常用的伪指令AREAALIGNCODE16、CODE32ENTRYENDEQUEXPORT(或GLOBAL)IMPORTEXTERNGET(或INCLUDE)INCBINRNROUT4.2汇编语言的语句格式ARM(Thumb)汇编语言的语句格式为:{标号} {指令或伪指令} {;注释}每一条指令的助记符可以全部用大写、或全部用小写,但不许在一条指令中大、小写混用

长语句若分为多行来书写,在行的末尾用“\”表示下一行与本行为同一条语句返回汇编语言程序中常用的符号

符号的命名必须遵循以下的约定:符号区分大小写,同名的大、小写符号会被编译器认为是两个不同的符号。符号在其作用范围内必须唯一。自定义的符号名不能与系统的保留字相同。符号名不应与指令或伪指令同名。汇编语言程序中的表达式和运算符表达式一般由变量、常量、运算符和括号构成,运算次序遵循如下的优先级:(1)优先级相同的双目运算符的运算顺序为从左到右。(2)相邻的单目运算符的运算顺序为从右到左,且单目运算符的优先级高于其他运算符。(3)括号运算符的优先级最高。数字表达式及运算符(1)

“+”、“-”、“×”、“/”及“MOD”算术运算符示例:X/Y表示X除以Y的商。“ROL”、“ROR”、“SHL”及“SHR”移位运算符示例:X:ROL:Y 表示将X循环左移Y位。

“AND”、“OR”、“NOT”及“EOR”按位逻辑运算符示例::NOT:Y 表示将Y按位作逻辑非的操作。逻辑表达式及运算符(2)

“=”、“>”、“<”、“>=”、“<=”、“/=”、“<>”运算符示例: X<>Y 表示X不等于Y。“LAND”、“LOR”、“LNOT”及“LEOR”运算符示例:X:LAND:Y 表示将X和Y作逻辑与的操作字符串表达式及运算符(3)

LEN运算符:返回字符串的长度示例::LEN:X

CHR运算符:将0~255之间的整数转换为一个字符示例::CHR:MSTR运算符:将一个数字表达式或逻辑表达式转换为一个字符串示例::STR:X字符串表达式及运算符(4)LEFT运算符:返回某个字符串左端的一个子串示例:X:LEFT:YRIGHT运算符:返回某个字符串右端的一个子串示例:X:RIGHT:YCC运算符:将两个字符串连接成一个字符串示例:X:CC:Y与寄存器和程序计数器(PC)相关的表达式及运算符

BASE运算符:返回基于寄存器的表达式中寄存器的编号示例::BASE:XINDEX运算符:返回基于寄存器的表达式中相对于其基址寄存器的偏移量示例::INDEX:X其他常用运算符

?运算符:返回某代码行所生成的可执行代码的长度示例:?XDEF运算符:符判断是否定义某个符号示例::DEF:X4.3ARM汇编语言程序结构本节的重点在于了解ARM汇编语言的基本程序结构、ARM汇编语言子程序的调用方法。

返回ARM汇编语言的基本程序结构程序段

组织代码的单位数据段代码段

映象文件可执行编译链接

汇编语言源程序的基本结构示例AREA Init,CODE,READONLYENTRYStartLDR R0,=0x3FF5000LDR R1,0xFFSTR R1,[R0]LDR R0,=0x3FF5008LDR R1,0x01STR R1,[R0]……ENDAREA伪指令定义一个段名为Init的代码段,属性为只读

ENTRY伪指令标识程序的入口点

指令序列END伪指令,指示代码段的结束汇编语言的子程序调用

在ARM汇编语言程序中,子程序的调用一般是通过BL指令来实现的。格式:BL 子程序名4.4嵌入式C语言程序设计嵌入式C语言程序设计是利用基本的C语言知识,面向嵌入式工程实际应用进行程序设计的语言。C语言是一种结构化的程序设计语言,它的优点是运行速度快、编译效率高、移植性好和可读性强。返回4.4.1嵌入式C语言设计基础1.预处理命令的应用

预处理命令可以改进程序设计环境,提高编程效率。C提供的预处理功能主要有以下三种:宏定义、文件包含和条件编译。

宏定义1、

[不带参数的宏定义]:用一个指定的标识符来代表一个字符串。其一般形式为:

#define

宏标识符

宏体

如:#define

PI

3.1415926

宏定义2、

[带参数的宏定义]:不仅进行简单的字符替换,还要进行参数替换。其一般形式为:

#define

宏标识符(参数表)

宏体

如:#define

S(a,b)

(a)*(b)宏定义说明宏定义不是C语句,不必在行末加分号,否则,会连分号一起进行置换;在进行宏定义时,可以引用已定义的宏名,可以层层置换;对程序中用双括号括起来的字符串内的字符,即使与宏名相同,也不进行置换;宏定义只做字符替换,不分配内存空间。例题题目:用预处理指令#define声明一个常数,用以表明1年中有多少秒(忽略闰年问题)。

分析:

两种错误写法: #defineSECONDS60*60*24*365 #defineSECONDS(60*60*24*365)正确答案:

#defineSECONDS(60*60*24*365)UL

文件包含

定义:“文件包含”处理是指一个源文件可以将另外一个源文件的全部内容包含进来,即将另外的文件包含到本文件之中。

其一般形式为:

#include

"文件名"

#include

<文件名>条件编译

条件编译一般有以下两种形式:

a) #ifdef

标识符

程序段1

#else

程序段2

#endif

b) #ifndef

标识符

程序段1

#else

程序段2

#endif

示例#ifdefBIG_ENDIAN//大端模式下RTC寄存器地址宏定义#definerRTCCON(*(volatileunsignedchar*)0x1d70043)#definerRTCALM(*(volatileunsignedchar*)0x1d70053)#definerALMSEC(*(volatileunsignedchar*)0x1d70057)……#else//小端模式下RTC寄存器地址宏定义#definerRTCCON(*(volatileunsignedchar*)0x1d70040)#definerRTCALM(*(volatileunsignedchar*)0x1d70050)#definerALMSEC(*(volatileunsignedchar*)0x1d70054)……#endif2.嵌入式系统中常用的C语言语句

C语言的语句有多种:如表达式语句、复合语句、条件语句、循环语句、swith语句、break语句、continue语句、返回语句等。嵌入式系统开发中最为常用的是条件语句、swith语句和循环语句,这些语句的用法和一般C语言中类似。条件语句

条件语句有两种格式,分别是两重选择和多重选择,如下所述。switch语句

循环语句

在C语言中有3种循环语句:for循环语句、while循环语句和dowhile循环语句,根据具体的情况选择使用。for循环语句格式:例题:使用for循环语句控制在8段数码管上循环显示0~F。voidDigit_Led_Display(void){inti;for(i=0;i<16;i++){LED8ADDR=Symbol[value];//LED8ADDR为8段数码管地址,//Symbol[]中为段码值Delay(10000);//延时

}}循环语句

例题:在嵌入式系统中没有程序的结尾,通常在主函数中有一个死循环,如何实现死循环?

while(1){…}while循环语句格式:dowhile循环语句格式:4.4.2汇编语言与C语言的混合编程

汇编语言与C/C++的混合编程通常有以下几种方式:(1)在C/C++代码中嵌入汇编指令。(2)在汇编程序和C/C++的程序之间进行变量的互访。(3)

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论