当前位置:文档之家› 第4章 嵌入式系统程序设计基础

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

1. 2. 3. 4. 5. 6. 7.
AREA ALIGN CODE16、CODE32 ENTRY END EQU EXPORT(或 GLOBAL)
IMPORT EXTERN 10. GET(或 INCLUDE) 11. INCBIN 12. RN 13. ROUT
8. 9.
4.2 汇编语言的语句格式
2.嵌入式系统中常用的C语言语句
C语言的语句有多种:如表达式语句、复 合语句、条件语句、循环语句、swith语句、 break语句、continue语句、返回语句等。 嵌入式系统开发中最为常用的是条件语句、 swith语句和循环语句,这些语句的用法和一 般C语言中类似。
条件语句
条件语句有两种格式,分别是两重选择和 多重选择,如下所述。
“+”、“-”、“×”、“/” 及“MOD”算术运算 符 示例: X/Y 表示X除以Y的商。 “ROL”、“ROR”、“SHL”及“SHR”移位运算符 示例:X:ROL:Y 表示将X循环左移Y位。 “AND”、“OR”、“NOT”及“EOR”按位逻辑运算 符 示例: :NOT:Y 表示将Y按位作逻辑非的操作。
宏定义
2、 [带参数的宏定义]:不仅进行简单的字符替换,还要 进行参数替换。
其一般形式为: #define 宏标识符(参数表) 宏体 如: #define S(a,b) (a)*(b)
宏定义说明
宏定义不是C语句,不必在行末加分号,否则,会连 分号一起进行置换; 在进行宏定义时,可以引用已定义的宏名字符,即使与 宏名相同,也不进行置换; 宏定义只做字符替换,不分配内存空间。
b)
#ifndef 标识符 程序段1 #else 程序段2 #endif
示例
#ifdef BIG_ENDIAN //大端模式下RTC寄存器地址宏定义 #define rRTCCON (*(volatile unsigned char *)0x1d70043) #define rRTCALM (*(volatile 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
AREA伪指令定 义一个段
汇编语言的子程序调用
在ARM汇编语言程序中,子程序的调用一般 是通过BL指令来实现的 。 格式:BL 子程序名
4.4 嵌入式C语言程序设计
返回
嵌入式C语言程序设计是利用基本的C语言知 识,面向嵌入式工程实际应用进行程序设计的语 言。 C语言是一种结构化的程序设计语言,它的优 点是运行速度快、编译效率高、移植性好和可读 性强。
逻辑表达式及运算符(2)
“=”、“>”、“<”、“>=”、“<= ”、“/=”、 “ <>” 运算符 示例: X <> Y 表示X不等于Y。 “LAND”、“LOR”、“LNOT”及“LEOR” 运算符 示例: X:LAND:Y 表示将X和Y 作逻辑与的操作
字符串表达式及运算符(3)
LEN运算符 :返回字符串的长度 示例: :LEN:X CHR运算符:将0~255之间的整数转换为一个 字符 示例: :CHR:M STR运算符:将一个数字表达式或逻辑表达式转 换为一个字符串 示例: :STR:X
ARM(Thumb)汇编语言的语句格式为: {标号} {指令或伪指令} {;注释}
返回
每一条指令的助记符可以全部用大写、或全部 用小写,但不许在一条指令中大、小写混用 长语句若分为多行来书写,在行的末尾用“\” 表示下一行与本行为同一条语句
汇编语言程序中常用的符号
符号的命名必须遵循以下的约定 : 符号区分大小写,同名的大、小写符号会被编 译器认为是两个不同的符号。 符号在其作用范围内必须唯一。 自定义的符号名不能与系统的保留字相同。 符号名不应与指令或伪指令同名。
示例:

与全局变量 定义类似 Test4 SETA0xaa SETA0xaa Test5 SETL Test6 SETS
GBLA Test1 GBLL Test2 GBLS Test3

{TRUE}

“Testing”
符号定义伪指令(3)
4. RLIST 格式:名称 RLIST {寄存器列表} 示例: RegList RLIST {R0-R5,R8,R10} ;将寄存器列表名称定义为RegList,可在ARM 指令LDM/STM中通过该名称访问寄存器列表。
例题
题目:用预处理指令#define 声明一个常数,用以表
明1年中有多少秒(忽略闰年问题)。
分析:
两种错误写法: #define SECONDS 60 * 60 * 24 * 365 #define SECONDS (60 * 60 * 24 * 365)
正确答案:
#define SECONDS (60 * 60 * 24 * 365)UL
其他常用运算符
?运算符:返回某代码行所生成的可执行代码的 长度 示例: ?X DEF运算符:符判断是否定义某个符号 示例: :DEF:X
4.3 ARM汇编语言程序结构
返回
本节的重点在于了解ARM汇编语言的基 本程序结构、ARM汇编语言子程序的调用 方法。
ARM汇编语言的基本程序结构
组织代码 的单位 数据段 程序段 代码段 编 译 链 接 可执行
循环语句
在C语言中有3种循环语句:for循环语句、 while循环语句和do while循环语句,根据具 体的情况选择使用。
for循环语句格式:
for (表达式 1; 表达式 2; 表达式 3) { 语句; }
例题:使用for循环语句控制在8段数码管 上循环显示0~F。
void Digit_Led_Display(void) { int i; for( i=0; i<16; i++ ) { LED8ADDR = Symbol[value]; //LED8ADDR为8段数码管地址, //Symbol[]中为段码值 Delay(10000); //延时 } }
字符串表达式及运算符(4)
LEFT运算符:返回某个字符串左端的一个子串 示例: X:LEFT:Y RIGHT运算符:返回某个字符串右端的一个子串 示例: X:RIGHT:Y CC运算符:将两个字符串连接成一个字符串 示例: X:CC:Y
与寄存器和程序计数器(PC)相 关的表达式及运算符
BASE运算符:返回基于寄存器的表达式中寄存 器的编号 示例: :BASE:X INDEX运算符:返回基于寄存器的表达式中相对 于其基址寄存器的偏移量 示例: :INDEX:X
第4章嵌入式系统程序设计基础
本章介绍基于ARM的嵌入式系 统程序设计的一些基本概念,如 ARM汇编语言的伪指令、汇编语言 的语句格式和汇编语言的程序结 构等,同时介绍嵌入式C语言设计 基础、C与汇编语言的混合编程等 问题。
返回
4.1 ARM编译器所支持的伪指令
在ARM的汇编程序中,有如下几种伪指令: 符号定义伪指令 数据定义伪指令 汇编控制伪指令 宏指令以及其他伪指令
两重选择 if(条件表达式) 语句 1; else 语句 2; 多重选择 if(条件表达式 1) 语句 1; else if(条件表达式 2) 语句 2; „; else if(条件表达式 n-1) 语句 n-1; else 语句 n;
switch语句
switch(开关表达式) { case 常量表达式 1: [语句 1;] case 常量表达式 2: [语句 2;] „ case 常量表达式 n: [语句 n;] default: } [语句 n+1;]
符号定义伪指令(1)
符号定义伪指令用于定义ARM汇编程序中的变 量、对变量赋值以及定义寄存器的别名等操作 。 1. GBLA、GBLL和GBLS 格式:GBLA(GBLL或GBLS)全局变量名
示例:

GBLA Test1 GBLL Test2 GBLS Test3
Test1 SETA
定义一个全局的数字变量 为Test1,并赋值为0xaa 定义一个全局的逻辑变量 为Test2,并赋值为真
文件包含
定义:“文件包含”处理是指一个源文件可以将另外
一个源文件的全部内容包含进来,即将另外的文件包 含到本文件之中。 其一般形式为: #include "文件名" 或
#include <文件名>
条件编译
条件编译一般有以下两种形式: a) #ifdef 标识符 程序段1 #else 程序段2 #endif
映象文件
汇编语言源程序的基本结构 示例
AREA Init,CODE,READONLY ENTRY 名为Init的代码段, Start 属性为只读 ENTRY LDR R0,伪指令标 =0x3FF5000 识程序的入口点 LDR R1,0xFF STR R1,[R0] 指令序列 LDR R0,=0x3FF5008 LDR R1,0x01 STR R1,[R0] … … END END伪指令,指示代码段的结束
示例: GBLL Test …… GBLA Counter IF SETA 3 Test = TRUE 指令序列1 …… ELSE Counter < 10 WHILE 指令序列2 指令序列 ENDIF WEND
$标号 宏名 $参数1,$参数2,…… MEXIT用于从宏定义中跳转出去
相关主题