




已阅读5页,还剩24页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第七章 单片机与C语言的混合编程一、混合编程的原则对于一个程序,整体程序框架,大部分的程序用c语言编写,有些要求严格定时等要求的用汇编语言编写,有时可以达到较好的效果。混合编程最关键的问题是参数传递,也就是在连接时,不同语言编写的程序,参数是如何传递的。c51有一套严格的参数传递规定,一般来说用汇编编写的程序变量的传递参数所使用的寄存器是无规律的,汇编语言较随便。因此混合编程中,汇编语言服从c51的规定。按C51 的参数传递标准可让你的程序有很好的可读性,并有利于维护。很容易和C 编写的函数进行连接,如果你用汇编编写的函数和C编译器编译出来的代码风格一样的话,连接器将能够对你的数据段进行覆盖、分析。软件开发流程:PL/M51是intel早期提供的编程语言二、编译、连接的规则1、 C51中函数名的转换规则C51函数声明转换后的函数名说 明void func1(void)FUNC1无参数传递,函数名不改变type func2(args)_FUNC2有参数传递,前加“_”,通过寄存器传递type func3(args) reentrant_?FUNC3重入函数,有参数传递,前加“_?”,通过堆栈传递(在调用时也用寄存器传递,在函数中再转存入堆栈中)2、几个概念:1) 编译将源程序翻译成单片机可以执行的目标代码,产生一个目标文件(.OBJ)。源文件编译时只能得到相对地址。列表文件(.LST)是编译后生成的含源程序、目标代码和错误信息的可打印文件。2) 段的概念段是程序存储器或数据存储器的单位。分为绝对段和可重新定位段。绝对段是不能重新定位的,如主程序的开始,必然在0000H,中断矢量入口也不能变。绝对段没有段名。可以重新定位的段,例如函数,库函数等。要有段名、类型及属性。可以重新定位的段位置由连接时确定。3) 模块模块是按程序功能划分,包含一个或多个段的文件,由编程者命名。4) 连接与定位将各模块中所以具有相同段名及类型的段连接起来,连接以后各段都分配了绝对地址。生成一个完整的程序。例如在几个函数中都调用了sin(x),连接时就会合并到一起,在整个程序中计算sin(x)的段只有1个。产生一个可以固化到单片机中的文件(.HEX)。3.文件处理过程: 编辑:用编辑器分别编辑C源代码和汇编源代码。编译:用户编写的C语言源程序经过C51编译器编译后,生成浮动地址的目标代码文件。这种浮动地址的目标代码是不能直接装入805l单片机的EPROM中运行的,必须经过连接定位器L51的连接和定位,生成具有绝对地址的目标代码,才能在8051单片机中运行。连接:L51能将各个模块中具有相同名字的再定位部分段组合到个单一的再定位段中,同时产生个段表(MAP)。(1)段表中包含了每个段的类型、基地址、长度和段名。(2)在进行段组合时要求所有具有相同名字的部分段都有相同的存储器类型(CODE、DATA、IDATA、XDATA或BIT),如果类型不同则会发生错误。(3)L51能够进行多程序模块的连接,它具有静态覆盖功能,可使8051单片机中有限的存储器资源得到允分利用。(4)在连接定位的过程中能自动加入运行库中必要的库函数。(5)L51连接定位器生成绝对目标输出文件。注意:L5l采用静态覆盖技术来操作数据存储器,使8051系列单片机中有限的内部RAM得到充分的利用。对于由c51编译器或A51汇编器生成的目标模块中没有相互调用的参数和局部变量,将在存储器中覆盖,从而可产生非常紧凑的数据区。转换成 *.HEX文件:通过符号转换器0HS51转换成Inte1HEX文件,该文件可以固化到EPROM中。4、C51编译器的段名规则 1)段名 段名包含源程序文件名、存储类型和名字,名字就相当于C程序中的函数名。 存储类型用前缀表示: C源程序编译后,段名的形式如下:?PR?XIAOYAN?SHUIL ?C?LIB_CODE 其中:XIAOYAN?为名称,SHUIL为文件名,?PR?为段名前缀,含义如下: 段名前缀存储区类型说 明?PR?code可执行程序段?CO?code程序存储器中的常数数据段?BI?bit内部数据存储区的位类型数据段?BA?bdata内部数据存储区的可位寻址的数据段?DT?data内部数据存储区的数据段?FD?far外部数据存储区的far型数据段?FC?const far程序存储器中的far型常数数据段?ID?idata内部数据存储区的间接寻址的数据段?PD?pdata外部数据存储区的分页数据段?XD?xdata外部数据存储区的一般数据段?C?库文件5、设置变量地址有时候你不想在编译时才给变量分配地址,希望把变量存储在指定的地点,例如你想定义一个整型变量并把它存储到0x4050, 用C是不能够把变量指定在某个地址的。也不能指定位变量的地址。但是对于不需要初始化的变量,你可以用关键字_at_来指定地址。关键字_at_的另一个功能是能通过给I/O器件指定变量名,为你的输入输出器件指定变量名。例如要把变量byteval存储到片内地址0x32:unsigned char data byteval _at_ 0x32; 将变量inpreg存到片外0x4500处:unsigned char xdata inpreg _at_ 0x4500;三、 C51项目中汇编语言文件的格式1、声明部分1)模块名定义格式(在文件开始)NAME模块名用关键字NAME说明模块名2)子程序代码段声明格式(在模块名定义之后)如:?PR?_|_?函数名1(子程序名1)?模块名 SEGMENTCODE 主要说明符号类型,分配空间。3)子程序被调用属性声明格式(紧接前面)如:PUBLIC_|_?函数名1(子程序名1)用PUBLIC说明该模块可以与其他子程序、模块共享。调用它的模块必须在模块开头包含外部函数说明EXTERN3、 用汇编语言编程时段声明格式设汇编文件名字为Delay.asmNAME Delay;给该模块一个名字PUBLIC _DELAY;表示有参数传递?PR?_DELAY?Delay SEGMENT CODE;代码段声明RSEG ?PR?_DELAY?Delay ;RSEG表示可重定位_DELAY:(程序段)RET(在实际编汇编时,蓝色可以不要)变成以下形式是可以的:名字为Delay.asmNAME Delay;PUBLIC _DELAY;Delay SEGMENT CODE;RSEG Delay ;RSEG_DELAY:(程序段)RET(该格式对混合编程很重要,要记住)对于传递参数的功能函数,必须符合参数的传递规则。下面看一个用c调用汇编的例子。例:(混合编程2)dpjc.c(文件名)#define uchar unsigned char uchar add1(uchar x,uchar y);void main(void) uchar x,y,z;x=0x10;y=0x20;z=add1(x,y); 汇编语言源程序:(注意汇编的格式,文件名用字母)huib.asm(文件名)PUBLIC _ADD1;ADD1为函数名_ADD1?HUIB SEGMENT CODE;HUIB为文件名, _ADD1?可以省略RSEG _ADD1?HUIB;表示重定位,_ADD1?可以省略_ADD1:MOV A,R7 ADD A,R5 MOV R7,A RET END上面分别是两个文件,按下列步骤进行编辑、编译和连接:1)建立工程文件,然后建立C源文件dpjc.c和汇编源文件huibian.a51,建立方法相同。2、编译:将光标放在要编译的文件(如huibian.a51)右击,弹出浮动菜单。将光标移到“Translate”上单击(或用工具栏按钮)对该程序进行编译。将两个文件全部编译无误后,方可进行连接。3、连接:单击“Build target”工具栏按钮即可连接。4、运行:运行时要打开汇编窗口“Disassembly Window”和”Watch & Call Stack Window”窗口,观察汇编语言中的变量是如何传递的,注意变量是如何变化的。编译、连接以后产生的汇编代码如下: 3: void main(void) 4: 5: uchar x,y,z; 6: x=0x10; C:0x000F 7F10 MOV R7,#0x10 7: y=0x20; C:0x0011 7D20 MOV R5,#0x20 8: z=add1(x,y); C:0x0013 120019 LCALL ADD1(C:0019)C:0x0016 8F08 MOV 0x08,R7 9: C:0x0018 22 RET 5: _ADD1: MOV A,R7 C:0x0019 EF MOV A,R7 6: ADD A,R5 C:0x001A 2D ADD A,R5 7: MOV R7,A C:0x001B FF MOV R7,A 8: RET注意数据传递过程。4、用空函数编译查看汇编格式与数据传递将add1函数编写一个空函数:#define uchar unsigned char uchar add1(uchar a,uchar b) void main(void) uchar x,y,z; x=0x10; y=0x20; z=add1(x,y); 编译时,文件选项要选择“Generate Assembler SRC File”和“Assembler SRC File”,产生一个后缀为.SRC的文件。方法:在源程序名上右击鼠标,出现浮动菜单,将鼠标移到“options for File 文件名.c”,左击鼠标,在弹出窗口中选择即可,注意原来是灰色的,选择使其变为黑色。打开hunhebc3.SRC文件如下:; .hunhebc3.SRC generated from: hunhebc3.c; COMPILER INVOKED BY:; E:keilC51BINC51.EXE hunhebc3.c BROWSE DEBUG OBJECTEXTEND SRC(.hunhebc3.SRC)NAMEHUNHEBC3?PR?_add1?HUNHEBC3 SEGMENT CODE ?DT?_add1?HUNHEBC3 SEGMENT DATA OVERLAYABLE ?PR?main?HUNHEBC3 SEGMENT CODE ?DT?main?HUNHEBC3 SEGMENT DATA OVERLAYABLE EXTRNCODE (?C_STARTUP)PUBLICmainPUBLIC_add1RSEG ?DT?main?HUNHEBC3?main?BYTE: z?144: DS 1RSEG ?DT?_add1?HUNHEBC3?_add1?BYTE: a?040: DS 1 b?041: DS 1; #define uchar unsigned char; / extern uchar add1(uchar x,uchar y); uchar add1(uchar a,uchar b)RSEG ?PR?_add1?HUNHEBC3_add1:; SOURCE LINE # 3MOV a?040,R7MOV b?041,R5; ; SOURCE LINE # 4; ; SOURCE LINE # 5RET ; END OF _add1; void main(void)RSEG ?PR?main?HUNHEBC3main:USING0; SOURCE LINE # 6; ; SOURCE LINE # 7; uchar x,y,z; x=0x10; SOURCE LINE # 9;- Variable x?142 assigned to Register R7 -MOV R7,#010H; y=0x20; SOURCE LINE # 10;- Variable y?143 assigned to Register R5 -MOV R5,#020H; z=add1(x,y); SOURCE LINE # 11LCALL_add1MOV z?144,R7; ; SOURCE LINE # 12RET END用上述文件,较容易该位汇编程序。四、直接设置变量地址进行数据传递我们可以把变量存储在指定的地点,编译时编译系统不再给变量分配地址。该地址在C语言中用变量名调用,在汇编语言中由地址直接使用。Keil C可以让你使用关键字_at_来指定变量的存储地址。例如你可以定义:unsigned char data byteval _at_ 0x32;变量byteval在编译时就存放在片内RAM的32H单元,用汇编语言编写混合程序时,可以直接从32H单元取出变量byteval进行运算、处理。用_at_给变量指定地址时,不能进行初始化。 下面是该方法用于混合编程的例子。C语言的程序如下:(混合编程1)#includeextern void func(void);extern void func1(void);int a _at_ 0x30;/将a存到30、31Hint b _at_ 0x32;/将b存到32、33H main() int x4; func(); x4=a+b;/数据可以直接相加 a=20;/在C语言中赋值 b=40
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 梨树美食评比活动方案
- 桃子面塑活动方案
- 武威烤肉活动方案
- 汉服元宵活动方案
- 水果互动活动方案
- 母公司销售活动方案
- 椒江美食活动方案
- 民办学校家长活动方案
- 永州地球宣传周活动方案
- 沟通培训活动方案
- 四川省甘孜州道孚一中学2025届七下英语期末统考试题含答案
- 自救器发放管理制度
- 广东省深圳市宝安区2023-2024学年四年级下学期数学期末试卷(含答案)
- 缅甸语教学与学习作业指导书
- 水表制造企业生产条件要求征求意见稿
- T/CACEM 25-2023高速公路限速标志设置规范
- 医院感染暴发报告流程及处置预案
- 八年级英语下学期期末考试(广州专用)(解析版)
- 台州市椒江区通达金属表面处理有限公司年表面处理加工3000吨铝件、铁件、不锈钢、铜件、线路板等建设项目环境保护设施竣工验收监测报告
- 南京二模 南京市2025届高三年级第二次模拟考试 数学试卷
- 向父母借款买房合同协议
评论
0/150
提交评论