KEIL C51之绝对地址定位详解

发布者:山宝宝最新更新时间:2018-11-22 来源: eefocus关键字:KEIL  C51  绝对地址  定位 手机看文章 扫描二维码
随时随地手机看文章

       单片机空间分配看*.M51文件,ARM,DSP空间分配看*.map文件


       1、函数定位:


       假如要把C源文件 tools.c 中的函数


       int BIN2HEX(int xx)


       {


       ...


       }


       放在CODE MEMORY的0x1000处,先编译该工程,然后打开该工程的M51文件,在

* * * C O D E M E M O R Y * * *


       行下找出要定位的函数的名称,应该形如:


       CODE xxxxH xxxxH UNIT ?PR?_BCD2HEX?TOOLS


       然后在:


       Project->Options for Target ...->BL51 Locate:Code


       中填写如下内容:


       ?PR?_BCD2HEX?TOOLS(0x1000)


       再次Build,在M51中会发现该函数已放在CODE MEMORY的0x1000处了


       2.赋初值的变量定位


       要将某变量定位在一绝对位置且要赋初值,此时用 _at_ 不能完成,则如下操作:


       在工程中建立一个新的文件,如InitVars.c,在其中对要处理的变量赋初值(假设是code变量):


       char code myVer = {"COPYRIGHT 2001-11"};


       然后将该文件加入工程,编译,打开M51文件,若定义的是code型,则在

* * * C O D E M E M O R Y * * *


       下可找到:


       CODE xxxxH xxxxH UNIT ?CO?INITVARS


       然后在:


       Project->Options for Target ...->BL51 Locate:Code


       中填入:


       ?CO?INITVARS(0x200)


       再次编译即可。


       相应地,如为xdata变量,则InitVars.c中写:


       char xdata myVer = {"COPYRIGHT 2001-11"};


       然后将该文件加入工程,编译,打开M51文件,在* * * X D A T A M E M O R Y * * *

下可找到:


       XDATA xxxxH xxxxH UNIT ?XD?INITVARS


       然后在:


       Project->Options for Target ...->BL51 Locate:Xdata


       中填入:


       ?XD?INITVARS(0x200)


       再次编译即可。相应地,若定义的是data/idata等变量,则相应处理即可。


        3、若有多个变量或函数要进行绝对地址定位,则应按地址从低到高的顺序


        使用KeilC51软件,可以很方便地将代码或者数据绝对定位到某个地址。


        1、代码定位:


        方法1:使用伪指令CSEG。比如要将MyFunc1定位到代码区C:0x1000,则新建一个A51文件,添加以下内容:


        PUBLIC MYFUNC1


        CSEG AT 1000H


        MYFUNC1:


        ;其它代码


        RET


        在其它源文件中,就可以调用MyFunc()函数了。需要注意的是,编译器不检测传递参数的数目,仅检测函数是否有返回值。


        方法2:使用BL51 Locate选项。比如在main.c中定义了一个MyFunc2函数,并且要将该函数定位到代码区C:0x2000,则从菜单中选择Project->Options for Target 'Target1',在弹出的对话框中选择BL51 Locate页,在下面的code栏中写上?PR?MYFUNC2?MAIN(0x2000)即可。


        如果想定位多个函数,也可以使用*通配符。


        2、变量定位:


        只有全局变量可以绝对定位,局部变量无法实现绝对定位。


        方法1:使用_at_关键字。声明一个全局变量unsigned char data MyBuf1[8] _at_ 0x20;


        方法2:使用BL51 Locate选项。比如将main.c中定义的所有data型的全局变量定位到数据区D:0x28开始的空间,则从菜单中


        选择Project->Options for Target 'Target1',在弹出的对话框中选择BL51 Locate页,在下面的data栏中写上?DT?MAIN(0x28)即可。


        如果是idata,则使用?ID?MAIN(0x28),如果是xdata,则使用?XD?MAIN(0x28),如果是pdata,则使用?PD?MAIN(0x28)


        3、堆栈定位:


        在STARTUP.A51文件中定义了堆栈区?STACK,其起始地址同样可以在BL51 Locate页中设置,在Stack栏写上?STACK(0x80)


        还可以通过汇编实现


        // my.a51


        public my_flash_var


        cseg at 0F100H


        my_flash_var:


        db 55h


        end


        然后C声明


        // flash.c


        extern unsigned char code my_flash_var;


        BL51 locate 选项卡中


        code range 和 xdata range如果不填写,编译默认将程序中相应代码和变量从空间前面取起


        网上看到有人提到在keil中使用_at_进行绝对地址定位问题,我简单介绍一下它的用法。


        使用_at_关键字对存储器进行绝对地址定位程序如下


        #i nclude


        char xdata LED_Data[50] _at_ 0x8000;


        main()


        {


        LED_Data[0] = 0x23;


        }


        在keil中运行以上程序可以在存储器窗口中输入 x:0x8000 可以看到0x8000地址中的值为0x23.


        值得指出的几点是


        1.在给变量LED_Data[50]定位绝对地址空间时,不能对其赋初值。


        2.char xdata LED_Data[50] _at_ 0x8000;这条语句不能主函数中。有些网友提到在按着keil说明中用_at_进行绝对地址定位时,编译会出现错误274,就是将这条语句放在主函数中的原因。


        3.keil中地址是自动分配的,所以除非特殊情况否则不提倡使用绝对地址定位。初学者因帖别注意。不要把c当作汇编使用。


        对需要/RST复位后要保持变量不变,防止意外改变(比如升级到新程序,变量地址可能被编译器优化到其他地方),比较有用!!!!


关键字:KEIL  C51  绝对地址  定位 引用地址:KEIL C51之绝对地址定位详解

上一篇:单片机c51和一般的c语言有何不同之处?
下一篇:单片机C51中的NOP指令使用经验

推荐阅读最新更新时间:2024-03-16 16:18

C51程序设计中的sizeof详细解析
一、sizeof的概念   sizeof是C语言的一种单目操作符,如C语言的其他操作符++、--等。它并不是函数。sizeof操作符以字节形式给出了其操作数的存储大小。操作数可以是一个表达式或括在括号内的类型名。操作数的存储大小由操作数的类型决定。  二、sizeof的使用方法   1、用于数据类型    sizeof使用形式:sizeof(type)    数据类型必须用括号括住。如sizeof(int)。   2、用于变量    sizeof使用形式:sizeof(var_name)或sizeof var_name    变量名可以不用括号括住。如sizeof (var_name),sizeof var_name等都是正确形式
[单片机]
新品牌新定位!紫光展锐迈向全球数一数二IC设计企业新征程
集微网消息(文/茅茅),紫光集团旗下展讯和锐迪科于今年1月宣布正式合并,由此也正式拉开了“紫光展锐”的新征程。而今天,紫光展锐又正式发布全新的品牌标识及定义,这标志着吸纳了展讯和锐迪科两家高科技企业的紫光展锐正式完成协同整合,实现了品牌的全线升级。 新品牌:“展”翅腾飞,“锐”意进取 2013年12月,紫光集团以18亿美元收购展讯通信;2014年7月,紫光集团以9.07亿美元的价格完成对锐迪科微电子的收购;2016年2月,紫光展锐成立,展讯和锐迪科隶属于紫光展锐旗下,但是两家公司仍独立运营,有各自的体系架构和人员配置。 2018年1月19日,紫光集团旗下展讯和锐迪科宣布正式合并,由此也正式拉开了“紫光展锐”的新征程。毋庸置疑,全新
[手机便携]
Accerion推出针对移动机器人的亚毫米级精度定位传感器
Accerion发布了一种新的用于移动机器人和自动引导车辆的定位 传感器 。 该公司表示,这种名为Triton的传感器为需要最高程度的灵活性,适应性,速度和精度的制造商和物流运营商“设定了移动机器人和AGV定位的新标准” 在全球试点项目中进行了数月的现场测试后,Triton强大,可靠且可用于高性能物流操作,支持诸如免费导航,高精度对接和虚拟生产线跟踪等用例。 成功的试点计划包括支持邮政业的群机器人,电子商务和集成仓库机器人。 具有亚毫米级精度的无基础设施的本地化技术使移动机器人能够在动态环境中执行精确的工作。 仓库履行是Triton的第一个市场,是全球增长最快的部门之一。Accerion响应了市场需求,工程师
[汽车电子]
Accerion推出针对移动机器人的亚毫米级精度<font color='red'>定位</font>传感器
2011年GPS手机出货量将翻两番
2007年11月1日—— 据市场研究机构Isuppli预测,由于美国政府要求“应急呼叫911”(E911)功能,以及无线运营商积极提供各种基于定位的服务,预计从2006年至2011年,全球范围内具备GPS功能的手机的出货量将翻两番。 支持GPS功能的手机出货量将由2006年的1.096亿部增长到2011年的4.44亿部。到2011年,支持GPS的手机在全部出货手机中所占比例将由2006年的11.1%增加到29.6%。 下图是iSuppli预测的全球GPS手机出货量: “除了提供手机照相、多媒体和连接性解决方案外,手机原始设备制造商(OEM)正在探索将GPS功能集成到终端中,以此作为增加产品附加值的优势之一。”iSuppli
[焦点新闻]
KEIL C51中的多模块应用
通常一个C51程序工程按功能可以分成多个模块, 一个模块通常由两个文档组成一个头文件 *.h, 对模块中的数据结构和函数原型进行描述;另一个为C文件*.C , 对数据实例或对象进行定义,以及函数算法的具体实现,如I2C.C, ADC.C, DAC.C, LED.C 等,为了文件的调用,我们要为每个模块定义一个头文件,以I2C.C 来说,定义I2C.H。 #ifndef GRAPHICS_H /*防止graphics.h被重复引用*/ #define GRAPHICS_H #include math.h /*引用标准库的头文件*/ #include myheader.
[单片机]
KEIL下搭建基于 STM32 和 rt-thread 的开发环境
RT_thread开发人员是用MDK(Keil)进行开发管理的,当然也提供了IAR等开发环境的配置。针对初学者都提供了相关的教程和案例,不过项目开发,还是得讲究一下如何有效搭建开发环境和配置。 MDK(Keil)的安装和配置(破解)就略过了。能进行开发移植系统的程序员如果还不会最基础的开发环境搭建,那……去闭关修炼吧。 芯片选择:ST(意法半导体)-STM32F103ZE 原因: 开发必备。大多单片机爱好者,学习过程基本是:菜鸟52- 逐步深入stm32- 深度中毒ARM。 ST芯片应用广泛。ST的性价比(点赞)和高性能在各领域都发挥着重要作用(好用吖)。 ST开发容易。固件库和资料都很全,网上大把教程和学习板(
[单片机]
在<font color='red'>KEIL</font>下搭建基于 STM32 和 rt-thread 的开发环境
定位5G性能旗舰,iQOO Pro将于8月份登场
今天iQOO手机官方微博宣布定位是5G性能旗舰的iQOO Pro将于8月份登场。 值得注意的是,早前iQOO官方就放出了首款5G手机将于8月份登场的消息,此次则是把iQOO 5G版手机的名字确认下来了。 目前iQOO Pro已经通过了3C认证,页面显示它的型号为V1916A,由维沃移动通信有限公司生产,标配型号为V3030A-CN的充电头,最大支持11V/4A的充电功率,也就是44W的超快闪充。 除了通过3C认证之外,iQOO Pro也拿到了中国工信部电信设备进网试用批文,页面显示它的许可证号为00-B220-199013,支持NR NSA/TD-LTE/LTE FDD/TD-SCDMA/WCDMA/cdma2000/
[手机便携]
<font color='red'>定位</font>5G性能旗舰,iQOO Pro将于8月份登场
KEIL RTX51 TINY内核的分析与应用
摘要:简要介绍RTX51 TINY的基本情况和使用方法;详细分析这个内核的任务管理和内存管理的运行机制,并给出其主要代码流程图。 关键词:单片机 实时操作系统的RTX51 1 RTX51简介 1.1 RTX51 TINY特性 RTX51是KEIL公司开发的用于8051系列单片机的多任务实时操作系统。它有两个版本,RTX51 FULL和RTX51 TINY。 RTX51 TINY是RTX51 FULL的子集,仅支持按时间片循环任务调度,支持任务间信号传递,最大16个任务,可以并行地利用中断。具有以下等待操作:超时、另一个任务或中断的信号。但它不能进行信息处理,不支持存储区的分配和释放,不支持占先式调度。RTX51 TIN
[应用]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved