嵌入式系统教学课件:34arm处理器编程分析.ppt
《嵌入式系统教学课件:34arm处理器编程分析.ppt》由会员分享,可在线阅读,更多相关《嵌入式系统教学课件:34arm处理器编程分析.ppt(43页珍藏版)》请在三一文库上搜索。
1、3.4 汇编语言与C/C+的混合编程,在C或C+代码中实现汇编语言的方法有内联汇编和内嵌汇编两种,使用它们可以在C/C+程序中实现C/C+语言不能完成的一些工作。,嵌入式C语言程序设计基础,C语言“预处理伪指令”在嵌入式程序设计中的应用 嵌入式程序设计中的函数及函数库 嵌入式程序设计中常用的C语言语句 嵌入式程序设计中C语言的变量、数组、结构、联合,C语言“预处理伪指令”在嵌入式程序设计中的应用,“预处理命令”可以改进程序设计的环境,提高编程效率,一般以#号打头 ,可分为以下三种 :,文件包含 宏定义 条件编译,文件包含,文件包含伪指令可将头文件包含到程序中,头文件中定义的内容包括符号常量、复
2、合变量原型、用户定义的变量类型原型和函数的原型说明等。 编译器编译预处理时用文件包含的正文内容替换到实际程序中。 文件包含伪指令的格式: #include ;标准头文件 #include“头文件名.h” ;自定义头文件 #include 宏标识符,宏定义,宏定义伪指令分为:简单宏、参数宏、条件宏、预定义宏及宏释放。,简单宏:# define 宏标识符 宏体 参数宏:# define 宏标识符(形式参数表) 宏体 条件宏定义: #ifdef 宏标识符 #ifndef 宏标识符 #undef 宏标识符 #define 宏标识符 宏体 #define 宏标识符 宏体 #else #else #und
3、ef 宏标识符 #define 宏标识符 宏体 #define 宏标识符 宏体 #endif #endif,条件编译,条件编译伪指令是写给编译器的,指示编译器在满足某一条件时仅编译源文件中与之相应的部分。其格式如右框中所示:,#if(条件表达式1) #elif(条件表达式2) #elif(条件表达式n) #else #endif,嵌入式C语言程序编写的简单构架,#include预编译指令 C语言代码,一般要用#include编译指令将所需要的头文件加到该程序中,这是很有必要的,尤其是对编写较大的程序代码时。随后是定义一些外部变量,并对程序中的函数进行声明。 主函数main()的编写; 在每一个
4、C语言代码中,一定要有一个main()函数,在该函数中完成该程序文件所要完成的各个功能,一般是通过调用各个子函数来完成。也可以调用其他文件中的函数。 完成相应功能的各个功能函数的编写。 各个函数之间可以相互调用。,嵌入式程序设计中常用的C语言语句,C语言语句格式为: 标号: 语句;,C语言语句很多,常用到的有以下几种: 条件语句 swith语句 循环语句,嵌入式C语言程序设计技巧,变量定义 参数传递 循环条件,变量定义,在变量声明的时候,最好把所有相同类型的变量放在一起定义,这样可以优化存储器布局。例: 对于局部变量类型的定义,使用short或char来定义变量并不是总能节省存储空间。有时使用
5、32位int或unsinged int局部变量更有效率一些,如图所示: 变量定义中,为了精简程序,程序员总是竭力避免使用冗余变量。但有时使用冗余变量可以减少存储器访问的次数这可以提高系统性能。,参数传递,为了使单独编译的C语言程序和汇编程序能够互相调用,定义了统一的函数过程调用标准ATPCS。 ATPCS定义了寄存器组中的R0R3作为参数传递和结果返回寄存器,如果参数数目超过四个,则使用堆栈进行传递。 内部寄存器的访问速度是远远大于存储器的,所以要尽量使参数传递在寄存器里面进行,即应尽量把函数的参数控制在四个以下。,循环条件,计数循环是程序中十分常用的流程控制结构,一般有以下两种形式: for
6、 (loop=1;loop=limit;loop+) for (loop=limit;loop!=0;loop-) 这两种循环形式在逻辑上并没有效率差异,但是映射到具体的体系结构中时,就产生了很大的不同,如下图所示:,C与汇编语言混合编程,ATPCS介绍 内嵌汇编 C和ARM汇编程序间相互调用,ATPCS介绍,ATPCS(ARM-Thumb Procedure Call Standard)是ARM程序和Thumb程序中子程序调用的基本规则,目的是为了使单独编译的C语言程序和汇编程序之间能够相互调用。 这些基本规则包括子程序调用过程中寄存器的使用规则、数据栈的使用规则和参数的传递规则。,寄存器的
7、使用规则,ATPCS规则寄存器的使用规则,子程序之间通过寄存器r0r3来传递参数,当参数个数多于4个时,使用堆栈来传递参数。此时r0r3可记作A1A4。 在子程序中,使用寄存器r4r11保存局部变量。因此当进行子程序调用时要注意对这些寄存器的保存和恢复。此时r4r11可记作V1V8。 寄存器r12用于保存堆栈指针SP,当子程序返回时使用该寄存器出栈,记作IP。 寄存器r13用作堆栈指针,记作SP。寄存器r14称为链接寄存器,记作LR。该寄存器用于保存子程序的返回地址。 寄存器r15称为程序计数器,记作PC。,数据栈的使用规则,根据堆栈指针指向位置的不同 和增长方向的不同可以分为以下4种数据栈
8、: FD (Full Descending) 满递减 ED (Empty Descending)空递减 FA (Full Ascending) 满递增 EA (Empty Ascending) 空递增 ATPCS规定数据栈为FD(满递减)类型,并且对数据栈的操作是8字节对齐的。,参数的传递规则,参数个数固定的子程序参数传递规则: 第一个整数参数,通过寄存器R0R3来传递。其他参数通过数据栈传递。 参数个数可变的子程序参数传递规则: 当参数不超过4个时,可以使用寄存器R0R3来传递参数;当参数超过4个时,还可以使用数据栈来传递参数 子程序结果返回规则 结果为一个32位的整数时,可以通过寄存器R0
9、返回;结果为一个64位整数时,可以通过寄存器R0和R1返回,依次类推。,C和ARM汇编程序间相互调用,在C和ARM汇编程序之间相互调用必须遵守ATPCS(ARM-Thumb Procedure Call Standard)规则。 C和汇编之间的相互调用可以从以下这三方面来介绍:,汇编程序对C全局变量的访问 在C语言程序中调用汇编程序 在汇编程序中调用C语言程序,汇编程序访问全局C变量,汇编程序可以通过地址间接访问在C语言程序中声明的全局变量。通过使用IMPORT关键词引入全局变量,并利用LDR和STR指令根据全局变量的地址可以访问它们。 对于不同类型的变量,需要采用不同选项的LDR和STR指令
10、,如下所示:,unsigned char LDRB/STRB unsigned short LDRH/STRH unsigned int LDR/STR char LDRSB/STRSB short LDRSH/STRSH,子程序-访问C 程序的全局变量,AREA globals,CODE,READONLY ENTRY EXPORT asmsubroutime IMPORT glovbvar ;声明外部变量glovbvar LDR R1,=glovbvar ;装载变量地址 LDR R0,R1 ;读出数据 ADD R0,R0,#1 ;加1 操作 STR R0,R1 ;保存变量值 MOV PC,L
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 嵌入式 系统 教学 课件 34 arm 处理器 编程 分析
链接地址:https://www.31doc.com/p-3054962.html