第七章 单片机混合编程.docVIP

  • 5
  • 0
  • 约5.92千字
  • 约 22页
  • 2018-03-09 发布于湖北
  • 举报
第七章 单片机混合编程

第七章 单片机与C语言的混合编程 一、混合编程的原则 对于一个程序,整体程序框架,大部分的程序用c语言编写,有些要求严格定时等要求的用汇编语言编写,有时可以达到较好的效果。 C51函数声明 转换后的函数名 说 明 void func1(void) FUNC1 无参数传递,函数名不改变 type func2(args) _FUNC2 有参数传递,前加“_”,通过寄存器传递 type func3(args) reentrant -?FUNC3 重入函数,有参数传递,前加“_?”,通过堆栈传递(在调用时也用寄存器传递,在函数中再转存入堆栈中) 混合编程最关键的问题是参数传递,也就是在连接时,不同语言编写的程序,参数是如何传递的。已经知道,c51有一套严格的参数传递规定,一般来说用汇编编写的程序变量的传递参数所使用的寄存器是无规律的,汇编语言较随便。因此混合编程中,汇编语言服从c51的规定。按照C51 的参数传递标准可让你的程序有很好的可读性,并有利于维护。编写出来的函数很容易和C 编写的函数进行连接,如果你用汇编编写的函数和C编译器编译出来的代码风格一样的话,连接器将能够对你的数据段进行覆盖、分析。 二、编译、连接的规则 1、 C51中函数名的转换规则 2、几个概念: 编译 将源程序翻译成单片机可以执行的目标代码,产生一个目标文件(.OBJ)C51编译器的段名规则 1)段名 段名包含源程序文件名、存储类型和名字,名字就相当与C程序中的函数名。注意:所有的段名都被转换为大写字符保存,因此混合编程时,用汇编语言编写段名要用大写。 存储类型用前缀表示: 段名前缀 存储区类型 说 明 ?PR? code 可执行程序段 ?CO? code 程序存储器中的常数数据段 ?BI? bit 内部数据存储区的位类型数据段 ?BA? bdata 内部数据存储区的可位寻址的数据段 ?DT? data 内部数据存储区的数据段 ?FD? far 外部数据存储区的far型数据段 ?FC? const far 程序存储器中的far型常数数据段 ?ID? idata 内部数据存储区的间接寻址的数据段 ?PD? pdata 外部数据存储区的分页数据段 ?XD? xdata 外部数据存储区的一般数据段 ?C? 库文件 C源程序编译后,段名的形式如下: ?PR?XIAOYAN?SHUIL ?C?LIB_CODE 其中:XIAOYAN?为名称,SHUIL为文件名,?PR?为段名前缀 ,含义如下: 5、设置变量地址 有时候我们希望把变量存储在指定的地点,特别是在主控制器初始化SRAM之后,从8051系统才开始工作的情况,在这种情况下两个系统必须在存储器分配上达成一致。如果你不想在编译时才给变量分配地址,Keil C可以让你指定变量的存储地址。例如你想定义一个整型变量并把它初始化为0x4050, 用C是不能够把变量指定在某个地址的,另外你也不能指定位变量的地址,但是对于不需要初始化的变量你可以使用关键字_at_来指定地址。 你的变量将分配在DATA段中下面是一个指定地址的例子 unsigned char data byteval _at_ 0x32; 关键字_at_的另一个功能是能通过给I/O器件指定变量名,为你的输入输出器件指定变量名。例如你在XDATA段的地址0x4500处有一个输入寄存器,你可以通过下面的代码为它指定变量名: unsigned char xdata inpreg _at_ 0x4500; 以后在读该输入寄存器的时候只要使用变量名inpreg就可以了。 三、 C51项目中汇编语言文件的格式 1、声明部分 1)模块名定义格式(在文件开始) NAME 模块名 用关键字NAME说明模块名 2)子程序代码段声明格式(在模块名定义之后)如: ?PR?[_|_?]函数名1(子程序名1)?模块名 SEGMENT CODE ?PR?[_|_?]函数名2(子程序名2)?模块名 SEGMENT CODE : ?PR?[_|_?]函数名n(子程序名n)?模块名 SEGMENT CODE 主要说明符号类型,分配空间。 3)子程序被调用属性声明格式(紧接前面)如: PUBLIC [_|_?]函数名1(子程序名1) PUBLIC [_|_?]函数名2(子程序名2) : PUBLIC [_|_?]函数名n(子程序名n) 用PUBLIC说明该模块可以与其他子程序、模块共享。调用它的模块必须在模块开头包含外部函数说明EXTERN 3、 用汇编语言编程时段声明格式 设汇编文

文档评论(0)

1亿VIP精品文档

相关文档