Keil C51使用教程---编程(四)

出处:21ic 发布于:2018-07-23 14:15:22

  ●地址访问
  ●C与汇编的接口
  ●C51软件包中的通用文件
  ●段名转换与程序优化
  节 地址访问
  C51提供了三种访问地址的方法:
  1. 宏:
  在程序中,用“#include”即可使用其中定义的宏来访问地址,包括:
  CBYTE、XBYTE、PWORD、DBYTE、CWORD、XWORD、PBYTE、DWORD
  具体使用可看一看absacc.h便知
  例如:
  rval=CBYTE[0x0002];指向程序存贮器的0002h地址
  rval=XWORD [0x0002];指向外RAM的0004h地址
  2. _at_关键字
  直接在数据定义后加上_at_ const即可,但是注意:
  (1)变量不能被初使化;
  (2)bit型函数及变量不能用_at_指定。
  例如:
  idata struct link list _at_ 0x40;指定list结构从40h开始。
  xdata char text[25b] _at_0xE000;指定text数组从0E000H开始
  提示:如果外部变量是I/O端口等可自行变化数据,需要使用volatile关键字进行描述,请参考absacc.h。
  3. 连接定位控制
  此法是利用连接控制指令code xdata pdata \data bdata对“段”地址进行,如要指定某具体变量地址,则很有局限性,不作详细讨论。
  第二节 Keil C51与汇编的接口
  1. 模块内接口
  方法是用#pragma语句具体结构是:
  #pragma asm
  汇编行
  #pragma endasm
  这种方法实质是通过asm与ndasm告诉C51编译器中间行不用编译为汇编行,因而在编译控制指令中有SRC以控制将这些不用编译的行存入其中。
  2. 模块间接口
  C模块与汇编模块的接口较简单,分别用C51与A51对源文件进行编译,然后用L51将obj文件连接即可,关键问题在于C函数与汇编函数之间的参数传递问题,C51中有两种参数传递方法。
  (1) 通过寄存器传递函数参数
  多只能有3个参数通过寄存器传递,规律如下表:
  参数数目 Char Int long,float 一般指针
  1 R7 R6 & R7 R4~R7 R1~R3
  2 R5 R4 & R5 R4~R7 R1~R3
  3 R3 R2 & R3 R1~R3
  (2) 通过固定存储区传递(fixed memory)
  这种方法将bit型参数传给一个存储段中:
  ?function_name?BIT
  将其它类型参数均传给下面的段:?function_name?BYTE,且按照预选顺序存放。
  至于这个固定存储区本身在何处,则由存储模式默认。
  (3) 函数的返回值
  函数返回值一律放于寄存器中,有如下规律:
  Return type Registev 说明
  Bit 标志位 由具体标志位返回
  char/unsigned char
  1_byte指针 R7 单字节由R7返回
  int/unsigned int
  2_byte指针 R6 & R7 双字节由R6和R7返回,MSB在R6
  long&unsigned long R4~R7 MSB在R4, LSB在R7
  Float R4~R7 32Bit IEEE格式
  一般指针 R1~R3 存储类型在R3 高位R2 低R1
  (4) SRC控制
  该控制指令将C文件编译生成汇编文件(.SRC),该汇编文件可改名后,生成汇编.ASM文件,再用A51进行编译。
  第三节 Keil C51软件包中的通用文件
  在C51\LiB目录下有几个C源文件,这几个C源文件有非常重要的作用,对它们稍事修改,就可以用在自己的专用系统中。
  1. 动态内存分配
  init_mem.C:此文件是初始化动态内存区的程序源代码。它可以指定动态内存的位置及大小,只有使用了init_mem( )才可以调回其它函数,诸如malloc calloc,realloc等。
  calloc.c:此文件是给数组分配内存的源代码,它可以指定单位数据类型及该单元数目。
  malloc.c:此文件是malloc的源代码,分配一段固定大小的内存。
  realloc.c:此文件是realloc.c源代码,其功能是调整当前分配动态内存的大小。
  2. C51启动文件STARTUP.A51
  启动文件STARTUP.A51中包含目标板启动代码,可在每个project中加入这个文件,只要复位,则该文件立即执行,其功能包括:
  ●定义内部RAM大小、外部RAM大小、可重入堆栈位置
  ●清除内部、外部或者以此页为单元的外部存储器
  ●按存储模式初使化重入堆栈及堆栈指针
  ●初始化8051硬件堆栈指针
  ●向main( )函数交权
  开发人员可修改以下数据从而对系统初始化
  常数名 意义
  IDATALEN 待清内部RAM长度
  XDATA START 指定待清外部RAM起始地址
  XDATALEN 待清外部RAM长度
  IBPSTACK 是否小模式重入堆栈指针需初始化标志,1为需要。缺省为0
  IBPSTACKTOP 指定小模式重入堆栈顶部地址
  XBPSTACK 是否大模式重入堆栈指针需初始化标志,缺省为0
  XBPSTACKTOP 指定大模式重入堆栈顶部地址
  PBPSTACK 是否Compact重入堆栈指针,需初始化标志,缺省为0
  PBPSTACKTOP 指定Compact模式重入堆栈顶部地址
  PPAGEENABLE P2初始化允许开关
  PPAGE 指定P2值
  PDATASTART 待清外部RAM页首址
  PDATALEN 待清外部RAM页长度
  提示:如果要初始化P2作为紧凑模式高端地址,必须:PPAGEENAGLE=1,PPAGE为P2值,例如指定某页1000H-10FFH,则PPAGE=10H,而且连接时必须如下:
  L51 PDATA(1080H),其中1080H是1000H-10FFH中的任一个值。
  以下是STARTUP.A51代码片断,红色是经常可能需要修改的地方:
  ;------------------------------------------------------------------------------
  ; This file is part of the C51 Compiler package
  ; Copyright KEIL ELEKTRONIK GmbH 1990
  ;------------------------------------------------------------------------------
  ; STARTUP.A51: This code is executed after processor reset.
  ;
  ; To translate this file use A51 with the following invocation:
  ;
  ; A51 STARTUP.A51
  ;
  ; To link the modified STARTUP.OBJ file to your application use the following
  ; L51 invocation:
  ;
  ; L51, STARTUP.OBJ
  ;
  ;------------------------------------------------------------------------------
  ;
  ; User-defined Power-On Initialization of Memory
  ;
  ; With the following EQU statements the initialization of memory
  ; at processor reset can be defined:
  ;
  ; ; the absolute start-address of IDATA memory is always 0
  IDATALEN EQU 80H ; the length of IDATA memory in bytes.
  ;
  XDATASTART EQU 0H ; the absolute start-address of XDATA memory
  XDATALEN EQU 0H ; the length of XDATA memory in bytes.
  ;
  PDATASTART EQU 0H ; the absolute start-address of PDATA memory
  PDATALEN EQU 0H ; the length of PDATA memory in bytes.
  ;
  ; Notes: The IDATA space overlaps physically the DATA and BIT areas of the
  ; 8051 CPU. At minimum the memory space occupied from the C51
  ; run-time routines must be set to zero.
  ;------------------------------------------------------------------------------
  ;
  ; Reentrant Stack Initilization
  ;
  ; The following EQU statements define the stack pointer for reentrant
  ; functions and initialized it:
  ;
  ; Stack Space for reentrant functions in the SMALL model.
  IBPSTACK EQU 0 ; set to 1 if small reentrant is used.
  IBPSTACKTOP EQU 0FFH+1 ; set top of stack to highest location+1.
  ;
  ; Stack Space for reentrant functions in the LARGE model.
  XBPSTACK EQU 0 ; set to 1 if large reentrant is used.
  XBPSTACKTOP EQU 0FFFFH+1; set top of stack to highest location+1.
  ;
  ; Stack Space for reentrant functions in the COMPACT model.
  PBPSTACK EQU 0 ; set to 1 if compact reentrant is used.
  PBPSTACKTOP EQU 0FFFFH+1; set top of stack to highest location+1.
  ;
  ;------------------------------------------------------------------------------
  ;
  ; Page Definition for Using the Compact Model with 64 KByte xdata RAM
  ;
  ; The following EQU statements define the xdata page used for pdata
  ; variables. The EQU PPAGE must conform with the PPAGE control used
  ; in the linker invocation.
  ;
  PPAGEENABLE EQU 0 ; set to 1 if pdata object are used.
  PPAGE EQU 0 ; define PPAGE number.
  ;
  ;------------------------------------------------------------------------------
  3. 标准输入输出文件
  putchar.c
  putchar.c是一个低级字符输出子程,开发人员可修改后应用到自己的硬件系统上,例如向C

 

版权与免责声明

凡本网注明“出处:维库电子市场网”的所有作品,版权均属于维库电子市场网,转载请必须注明维库电子市场网,https://www.dzsc.com,违反者本网将追究相关法律责任。

本网转载并注明自其它出处的作品,目的在于传递更多信息,并不代表本网赞同其观点或证实其内容的真实性,不承担此类作品侵权行为的直接责任及连带责任。其他媒体、网站或个人从本网转载时,必须保留本网注明的作品出处,并自负版权等法律责任。

如涉及作品内容、版权等问题,请在作品发表之日起一周内与本网联系,否则视为放弃相关权利。

相关技术资料
广告
上传BOM文件: BOM文件
*公司名:
*联系人:
*手机号码:
QQ:
应用领域:

有效期:
OEM清单文件: OEM清单文件
*公司名:
*联系人:
*手机号码:
QQ:
有效期:

扫码下载APP,
一键连接广大的电子世界。

在线人工客服

买家服务:
卖家服务:

0571-85317607

客服在线时间周一至周五
9:00-17:30

关注官方微信号,
第一时间获取资讯。

建议反馈

联系人:

联系方式:

按住滑块,拖拽到最右边
>>
感谢您向阿库提出的宝贵意见,您的参与是维库提升服务的动力!意见一经采纳,将有感恩红包奉上哦!