2022年KeilC高级编程 .pdf
《2022年KeilC高级编程 .pdf》由会员分享,可在线阅读,更多相关《2022年KeilC高级编程 .pdf(12页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、Keil C51 高级编程l 绝对地址访问l C 与汇编的接口l C51 软件包中的通用文件l 段名转换与程序优化第一节 绝对地址访问C51 提供了三种访问绝对地址的方法:1. 绝对宏:在程序中,用“include ”即可使用其中定义的宏来访问绝对地址,包括:CBYTE 、XBYTE 、PWORD 、DBYTE 、CWORD 、XWORD 、PBYTE 、DWORD具体使用可看一看absacc.h 便知例如:rval=CBYTE0 x0002; 指向程序存贮器的0002h 地址rval=XWORD 0 x0002; 指向外 RAM 的 0004h 地址2. _at_ 关键字直接在数据定义后加上
2、 _at_ const 即可,但是注意:(1)绝对变量不能被初始化;(2)bit 型函数及变量不能用 _at_指定。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 12 页 - - - - - - - - - 例如:idata struct link list _at_ 0 x40;指定 list 结构从 40h 开始。xdata char text25b _at_0 xE000;指定 text 数组从 0E000H 开始提示:如果外部绝对变量是I/O 端口等可自行变化数
3、据,需要使用volatile 关键字进行描述,请参考absacc.h 。3. 连接定位控制此法是利用连接控制指令code xdata pdata data bdata对“ 段” 地址进行,如要指定某具体变量地址,则很有局限性,不作详细讨论。第二节 Keil C51 与汇编的接口1. 模块内接口方法是用 pragma 语句具体结构是:#pragma asm汇编行#pragma endasm这种方法实质是通过asm 与 ndasm 告诉 C51 编译器中间行不用编译为汇编行,因而在编译控制指令中有SRC 以控制将这些不用编译的行存入其中。2. 模块间接口C 模块与汇编模块的接口较简单,分别用C51
4、 与 A51 对源文件进行编译,然后用 L51 将 obj 文件连接即可,关键问题在于C 函数与汇编函数之间的参数传递问题, C51 中有两种参数传递方法。(1) 通过寄存器传递函数参数最多只能有 3 个参数通过寄存器传递,规律如下表:名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 12 页 - - - - - - - - - 参数数目char int long,float 一般指针123 R7R5R3 R6 & R7R4 & R5R2 & R3 R4R7R4R7 R1R
5、3R1R3R1R3(2) 通过固定存储区传递 (fixed memory)这种方法将 bit 型参数传给一个存储段中:名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 12 页 - - - - - - - - - ?function_name?BIT将其它类型参数均传给下面的段:?function_name?BYTE, 且按照预选顺序存放。至于这个固定存储区本身在何处,则由存储模式默认。(3) 函数的返回值函数返回值一律放于寄存器中,有如下规律:return type Re
6、gistev 说明bit 标志位由具体标志位返回char/unsigned char 1_byte指针R7 单字节由R7返回int/unsigned int 2_byte指针R6 & R7 双字节由 R6 和 R7 返回,MSB 在 R6 long&unsigned long R4R7 MSB 在 R4, LSB 在 R7 float 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 12 页 - - - - - - - - - R4R7 32Bit IEEE 格式一般指针
7、R1R3 存储类型在 R3 高位 R2 低 R1(4) SRC 控制该控制指令将 C 文件编译生成汇编文件 (.SRC) ,该汇编文件可改名后,生成汇编.ASM 文件,再用 A51 进行编译。第三节 Keil C51 软件包中的通用文件在 C51LiB 目录下有几个 C 源文件,这几个 C 源文件有非常重要的作用,对它们稍事修改,就可以用在自己的专用系统中。1. 动态内存分配init_mem.C :此文件是初始化动态内存区的程序源代码。它可以指定动态内存的位置及大小,只有使用了init_mem( ) 才可以调回其它函数,诸如malloc calloc,realloc 等。calloc.c:此文
8、件是给数组分配内存的源代码,它可以指定单位数据类型及该单元数目。malloc.c :此文件是 malloc 的源代码,分配一段固定大小的内存。realloc.c :此文件是 realloc.c 源代码,其功能是调整当前分配动态内存的大小。2. C51 启动文件 STARTUP.A51 启动文件 STARTUP.A51 中包含目标板启动代码,可在每个project 中加入这个文件,只要复位,则该文件立即执行,其功能包括:l 定义内部 RAM 大小、外部 RAM 大小、可重入堆栈位置名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名
9、师精心整理 - - - - - - - 第 5 页,共 12 页 - - - - - - - - - l 清除内部、外部或者以此页为单元的外部存储器l 按存储模式初使化重入堆栈及堆栈指针l 初始化 8051 硬件堆栈指针l 向 main( ) 函数交权开发人员可修改以下数据从而对系统初始化常数名 意义IDATALEN 待清内部 RAM 长度XDATA START 指定待清外部RAM起始地址XDATALEN 待清外部 RAM 长度IBPSTACK 是否小模式重入堆栈指针需初始化标志,1 为需要。缺省为0IBPSTACKTOP 指定小模式重入堆栈顶部地址XBPSTACK 是否大模式重入堆栈指针需初
10、始化标志,缺省为0XBPSTACKTOP 指定大模式重入堆栈顶部地址PBPSTACK 是否 Compact 重入堆栈指针,需初始化标志,缺省为0PBPSTACKTOP 指定 Compact 模式重入堆栈顶部地址PPAGEENABLE P2初始化允许开关PPAGE 指定 P2 值PDATASTART 待清外部 RAM 页首址PDATALEN 待清外部 RAM 页长度名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 12 页 - - - - - - - - - 提示:如果要初始
11、化P2 作为紧凑模式高端地址,必须:PPAGEENAGLE 1,PPAGE 为 P2 值,例如指定某页1000H10FFH ,则 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 p
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 2022年KeilC高级编程 2022 KeilC 高级 编程
限制150内