本帖最后由 hami51 于 2010-12-8 19:12 编辑
51单片机是最早的单片机,也是在国内应用最广泛的单片机,为大家所喜爱!但执行速度较其它单片机较慢。因此在编程时更加要注重程序的效率及编程上的技巧,最大限度的发挥其性能,满足项目开发的实际需要。大家都知道,在嵌入式开发中,C语言具有可移植性强和可读性好等优点,而汇编语言的高效、快速及可直接对硬件进行操作等优点又是C语言所难以达到的,本帖就为大家介绍一下KEIL C51所支持C和汇编混合编程的方法,将这两种语言的优点完美的结合,更大限度的发挥51单片机的性能,加快我们的产品开发周期!
如用此方法实现51单片机对320kbps mp3文件的播放就是一个很好的实例!下面就为大家介绍一下混合编程的方法。
所谓混合编程,就是在一个项目中,同时使用C和汇编两种语言。 C语言和汇编语言混合编程的方法形式多样,可以是以汇编语言为主体,在其中内嵌部分C语言;也可以是以C语言为主体在其中加入部分汇编语言(此方法实用价值较高,而被工程师们广泛的采用)。在此方法中,用汇编语言编写对有关硬件的驱动和处理、复杂的算法、实时性要求较高等底层的东西,来满足单片机对某些硬件高效、快速、精确的处理等性能上的要求。用C语言来编写程序的主体部分。这样就将C语言的可移植性强和可读性好与汇编语言的高效、快速及可直接对硬件进行操作等优点相结合。两者优劣互补、相得益彰,加快我们产品的开发周期,具有极高的现实意义和实用价值!
在KEIL C51中加入的汇编代码需按照其编译器中约定的规则才可以实现C语言程序对汇编代码的调用。即KEIL C51的命名规则和参数传递规则。
一. KEIL C51的命名规则
在KEIL C51中,编译器对C语言程序中的函数会自动的进行转换,转换规则如下表:
函数属性 函数举例 段中的函数名
无参数或无寄存器参数传递的函数 void func1(void) func1
含通过寄存器传递的参数 void func2(int) _func2
可重入函数 void func3(char)reentrant _?func3
二. KEIL C51函数的参数传递规则
(一)通过寄存器传递的函数参数表
参数长度 第1个形参 第2个形参 第3个形参
1字节(char) R7 R5 R3
2字节(int) R6(H) R7 R4(H) R5 R2(H) R3
3字节(通用指针) R1(H)~R3
4字节(long) R4(H)~R7
(二)函数返回值使用的寄存器列表
返回类 使用的寄存器
位数据(bit) 位累加器CY
1字节(char) R7
2字节(int) R6(H) R7
3字节(通用指针) R3(类型)R2(H) R1
4字节(long) R4(H)~R7
4字节(float) R4(H)~R7,32位IEEE格式,指数和符号位在R7
在混合编程中,最常用也是最实用的方法是在C语言中加入部分汇编语言的代码,分为两种方法。
方法1)在Keil C51的函数中直接插入汇编语句
方法2)按照Keil C51接口规则,编写汇编模块
方法1是利用编译控制命令#pragma asm(用来标识所插入的汇编语句的起始位置) 和 #pragma endasm (用来标识所插入的汇
编语句的结束位置) ,这两条命令必须成对出现,并可以多次出现。在Keil C51中不对插入的汇编代码做任何的处理。
方法2编写汇编模块,需对KEIL编译器的编译过程做些了解。Keil编译器的编译过程是首先将项目中的一个个源文件编译为目标代码(obj文件),然在再通过连接器产生为最终可执行的hex文件。
目标代码将其中的代码、数据、常量放在不同的“段”中,保存程序的段称为“代码段”,保存数据的段称为“数据段”,最终目标代码经过Keil的连接器按照“段”的要求转换为程序和数据地址固定的可执行文件。
在Keil软件中,“段”按定位属性分为:“可重定位段”和“绝对段”。
“可重定位段”:程序和数据在其分别所对应的存储单元(FLASH和RAM)中的存储地址是浮动的、可重定义的、相对可变的。
“绝对段”:其地址在连接前就已确定不变,连接器据此为它分配地址。
经Keil编译器生成的“段”具有如下属性:
1)段的存储属性(program code data pdata xdata bdata bit等);
2)段的起始地址;3)段的长度;
4)段的定位要求:绝对段地址固定,可重定位段定位的要求如要求代码段在2K范围内,数据段定位在可位寻址区等;
5)段名:包括程序和数据(变量和常量)的段的存储属性及段所属的程序模块(文件)。代码段: ?PR? funcname?Filename
数据段如:?DT? funcname?Filename; ?BI? funcname?Filename
标准段名前缀列表
段前缀 存储类型 含义
?PR? Program 程序存储区的代码
?CO? code 程序存储区的常量
?BI? Bit 内部数据存储区的可位寻址的位变量
?BA? Bdata 内部数据存储区的可位寻址的字节变量
?DT? Data 内部数据存储区的变量
?ID? Idata 内部数据存储区可间接寻址的变量
?PD? Pdata 外部数据存储区的页变量
?XD? Xdata 外部数据存储区的变量
KEIL C51在线汇编举例和汇编模块举例可供大家下载参考!
因《深入浅出玩转51单片机【高级篇】》之KEIL C51混合编程 视频教程无法上传,感兴趣的朋友可以到我的QQ邮箱的文件中转站中下载!
登录网址: http://mail.qq.com
用户名称: ybcomm51@qq.com
登录密码: ybcomm51 |