第4章嵌入式系统程序设计基础(第二版)剖析

上传人:今*** 文档编号:107948401 上传时间:2019-10-21 格式:PPT 页数:41 大小:1.83MB
返回 下载 相关 举报
第4章嵌入式系统程序设计基础(第二版)剖析_第1页
第1页 / 共41页
第4章嵌入式系统程序设计基础(第二版)剖析_第2页
第2页 / 共41页
第4章嵌入式系统程序设计基础(第二版)剖析_第3页
第3页 / 共41页
第4章嵌入式系统程序设计基础(第二版)剖析_第4页
第4页 / 共41页
第4章嵌入式系统程序设计基础(第二版)剖析_第5页
第5页 / 共41页
点击查看更多>>
资源描述

《第4章嵌入式系统程序设计基础(第二版)剖析》由会员分享,可在线阅读,更多相关《第4章嵌入式系统程序设计基础(第二版)剖析(41页珍藏版)》请在金锄头文库上搜索。

1、第4章嵌入式系统程序设计基础,本章介绍基于ARM的嵌入式系统程序设计的一些基本概念,如ARM汇编语言的伪指令、汇编语言的语句格式和汇编语言的程序结构等,同时介绍嵌入式C语言设计基础、C与汇编语言的混合编程等问题。,主要内容,汇编语言的语句格式,汇编语言的程序结构,ARM编译器所支持的伪指令,4.1,4.2,4.3,4.4,嵌入式C语言程序设计,4.1 ARM编译器所支持的伪指令,在ARM的汇编程序中,有如下几种伪指令: 符号定义伪指令 数据定义伪指令 汇编控制伪指令 宏指令以及其他伪指令,返回,符号定义伪指令(1),符号定义伪指令用于定义ARM汇编程序中的变量、对变量赋值以及定义寄存器的别名等

2、操作 。 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(

3、DCDU) (4)DCFD(DCFDU),分配一片连续的字节存储单元,分配一片连续的半字存储单元,分配一片连续的字存储单元,为双精度的浮点数分配一片连续的字存储单元,数据定义伪指令(2),(5)DCFS(DCFSU) (6)DCQ(DCQU) (7)SPACE (8)MAP (9)FIELD,为单精度的浮点数分配一片连续的字存储单元,分配一片以8字节为单位的连续的存储单元,用于分配一片连续的存储单元,用于定义一个结构化的内存表首地址,用于定义一个结构化的内存表的数据域,汇编控制伪指令,汇编控制伪指令用于控制汇编程序的执行流程,常用的汇编控制伪指令包括以下几条: (1)IF、ELSE、ENDIF

4、 (2)WHILE、WEND (3)MACRO、MEND (4)MEXIT,示例: GBLL Test IF Test = TRUE 指令序列1 ELSE 指令序列2 ENDIF,GBLA Counter SETA 3 WHILE Counter 10 指令序列 WEND,语法格式: $标号 宏名 $参数1,$参数2,,MEXIT用于从宏定义中跳转出去,其他常用的伪指令,AREA ALIGN CODE16、CODE32 ENTRY END EQU EXPORT(或GLOBAL),IMPORT EXTERN GET(或INCLUDE) INCBIN RN ROUT,4.2 汇编语言的语句格式,A

5、RM(Thumb)汇编语言的语句格式为: 标号 指令或伪指令 ;注释 每一条指令的助记符可以全部用大写、或全部用小写,但不许在一条指令中大、小写混用 长语句若分为多行来书写,在行的末尾用“”表示下一行与本行为同一条语句,返回,汇编语言程序中常用的符号,符号的命名必须遵循以下的约定 : 符号区分大小写,同名的大、小写符号会被编译器认为是两个不同的符号。 符号在其作用范围内必须唯一。 自定义的符号名不能与系统的保留字相同。 符号名不应与指令或伪指令同名。,汇编语言程序中的表达式和运算符,表达式一般由变量、常量、运算符和括号构成 ,运算次序遵循如下的优先级: (1) 优先级相同的双目运算符的运算顺序

6、为从左到右。 (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”及“L

7、EOR”运算符 示例: X:LAND:Y 表示将X和Y 作逻辑与的操作,字符串表达式及运算符(3),LEN运算符 :返回字符串的长度 示例: :LEN:X CHR运算符:将0255之间的整数转换为一个字符 示例: :CHR:M STR运算符:将一个数字表达式或逻辑表达式转换为一个字符串 示例: :STR:X,字符串表达式及运算符(4),LEFT运算符:返回某个字符串左端的一个子串 示例: X:LEFT:Y RIGHT运算符:返回某个字符串右端的一个子串 示例: X:RIGHT:Y CC运算符:将两个字符串连接成一个字符串 示例: X:CC:Y,与寄存器和程序计数器(PC)相关的表达式及运算符,

8、BASE运算符:返回基于寄存器的表达式中寄存器的编号 示例: :BASE:X INDEX运算符:返回基于寄存器的表达式中相对于其基址寄存器的偏移量 示例: :INDEX:X,其他常用运算符,?运算符:返回某代码行所生成的可执行代码的长度 示例: ?X DEF运算符:符判断是否定义某个符号 示例: :DEF:X,4.3 ARM汇编语言程序结构,本节的重点在于了解ARM汇编语言的基本程序结构、ARM汇编语言子程序的调用方法。,返回,ARM汇编语言的基本程序结构,程序段,组织代码 的单位,数据段,代码段,映象文件,可执行,编译链接,汇编语言源程序的基本结构 示例,AREA Init,CODE,REA

9、DONLY ENTRY Start LDR R0,=0x3FF5000 LDR R1,0xFF STR R1,R0 LDR R0,=0x3FF5008 LDR R1,0x01 STR R1,R0 END,AREA伪指令定义一个段,名为Init的代码段,属性为只读,ENTRY伪指令标识程序的入口点,指令序列,END伪指令,指示代码段的结束,汇编语言的子程序调用,在ARM汇编语言程序中,子程序的调用一般是通过BL指令来实现的 。 格式:BL 子程序名,4.4 嵌入式C语言程序设计,嵌入式C语言程序设计是利用基本的C语言知识,面向嵌入式工程实际应用进行程序设计的语言。 C语言是一种结构化的程序设计语

10、言,它的优点是运行速度快、编译效率高、移植性好和可读性强。,返回,4.4.1 嵌入式C语言设计基础,1. 预处理命令的应用 预处理命令可以改进程序设计环境,提高编程效率。 C提供的预处理功能主要有以下三种:宏定义、文件包含和条件编译。,宏定义,1、 不带参数的宏定义:用一个指定的标识符来代表一个字符串。 其一般形式为: #define 宏标识符 宏体 如: #define PI 3.1415926,宏定义,2、 带参数的宏定义:不仅进行简单的字符替换,还要进行参数替换。 其一般形式为: #define 宏标识符(参数表) 宏体 如: #define S(a,b) (a)*(b),宏定义说明,宏

11、定义不是C语句,不必在行末加分号,否则,会连分号一起进行置换; 在进行宏定义时,可以引用已定义的宏名,可以层层置换; 对程序中用双括号括起来的字符串内的字符,即使与宏名相同,也不进行置换; 宏定义只做字符替换,不分配内存空间。,例题,题目:用预处理指令#define 声明一个常数,用以表明1年中有多少秒(忽略闰年问题)。 分析: 两种错误写法: #define SECONDS 60 * 60 * 24 * 365 #define SECONDS (60 * 60 * 24 * 365) 正确答案: #define SECONDS (60 * 60 * 24 * 365)UL,文件包含,定义:“

12、文件包含”处理是指一个源文件可以将另外一个源文件的全部内容包含进来,即将另外的文件包含到本文件之中。 其一般形式为: #include “文件名“ 或 #include ,条件编译,条件编译一般有以下两种形式: a) #ifdef 标识符 程序段1 #else 程序段2 #endif b) #ifndef 标识符 程序段1 #else 程序段2 #endif,示例,#ifdef BIG_ENDIAN /大端模式下RTC寄存器地址宏定义 #define rRTCCON (*(volatile unsigned char *)0x1d70043) #define rRTCALM (*(volati

13、le unsigned char *)0x1d70053) #define rALMSEC (*(volatile unsigned char *)0x1d70057) #else /小端模式下RTC寄存器地址宏定义 #define rRTCCON (*(volatile unsigned char *)0x1d70040) #define rRTCALM (*(volatile unsigned char *)0x1d70050) #define rALMSEC (*(volatile unsigned char *)0x1d70054) #endif,2.嵌入式系统中常用的C语言语句,C语

14、言的语句有多种:如表达式语句、复合语句、条件语句、循环语句、swith语句、break语句、continue语句、返回语句等。 嵌入式系统开发中最为常用的是条件语句、swith语句和循环语句,这些语句的用法和一般C语言中类似。,条件语句,条件语句有两种格式,分别是两重选择和多重选择,如下所述。,switch语句,循环语句,在C语言中有3种循环语句:for循环语句、while循环语句和do while循环语句,根据具体的情况选择使用。,for循环语句格式:,例题:使用for循环语句控制在8段数码管 上循环显示0F。 void Digit_Led_Display(void) int i; for(

15、 i=0; i16; i+ ) LED8ADDR = Symbolvalue; /LED8ADDR为8段数码管地址, /Symbol中为段码值 Delay(10000); /延时 ,循环语句,例题:在嵌入式系统中没有程序的结尾,通常在主函数中有一个死循环,如何实现死循环? while(1) ,while循环语句格式:,do while循环语句格式:,4.4.2 汇编语言与C语言的混合编程,汇编语言与C/C+的混合编程通常有以下几种方式: (1) 在C/C代码中嵌入汇编指令。 (2) 在汇编程序和C/C的程序之间进行变量的互访。 (3) 汇编程序、C/C程序间的相互调用。,实际的编程应用,程序的初始化部分用汇编语言完成, 然后用C/C完成主要的编程任务 , 汇编程序和C/C程序之间一般没有 参数的传递,也没有频繁的相互调用,C程序调用汇编程序示例,#include Extern void strcopy(char *d,const char *s) / 声明Strcopy为完成字符串比较工作的函数 int main() int flag; const char *str=”this is a string”; const char *dst=”this is different”; printf(“the two strings are:n”); printf(“%s

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号