当前位置:首页 > 技术心得 > 正文内容

C51: LOCATING INITIALIZED VARIABLES AT ABSOLUTE ADDRESSES 如何初始化绝对定址的变量

xjtudll9年前 (2017-08-05)技术心得13620


http://www.keil.com/support/docs/301.htm

QUESTION 问题描述

I want to locate some initialized constants and variables in memory, but I can't initialize and locate them with the _at_ keyword. What's wrong?

我想初始化一些常量和变量,但我无法初始化成功当我使用_at_绝对定址后。

ANSWER 答案

C51 does not allow you to both locate a variable using the _at_ keyword and initialize it. You may use the linker to locate the variable.

Keil C51常量或变量使用_at_关键词绝对定址后,将无法直接初始化。但是可以先初始化变量,然后通过编译器设置绝对定址。

For example, if you want to locate an initialized constant array into code space...

举例如下:

  1. Declare your array as follows: 首先在C文件里申明并初始化变量
    char const code My_Array[] = {   1,2,3,4,5 };
  2. Go to your linker map file a see what the segment name is for this array. Note that during this process you will probably get a warning about an unused function or something similar. This is because the compiler is expecting your array to be a function since you specified that it is in code space. Don't worry about this warning.
    查看Map文件,寻找数组的segment的名字。
    如果程序中没有用到数组,可能会有warning提示。
    69da49f9-cc42-43ab-a368-fb6f0e5e64b8

    这个警告可以忽略。我们需要知道的是segment的名字。
    例如Map文件:
    98b00312-5d51-453d-8293-0354616e5978

    C文件名称是Temp.c,所以其segment名字是“ ?CO?TEMP”

  3. Use the BL51 CODE directive or the LX51 SEGMENTS directive to specify the location of the constant segment. If the C source file name is TEMP.C the constant segment is named ?CO?TEMP. The entry ?CO?TEMP(0x5000) in the linker directive locates the segment to absolute memory address 5000h.
    如果是BL51,填入: ?CO?TEMP(0x5000)。如下图所示,0x5000表示地址。
    8e0dea59-f6b8-4365-893c-d334d1eaf8ce

    如果是LX51,填入?CO?TEMP(C:0x5000) 不要搞错了,与BL51是不同的。
    8c9383d9-5551-44e5-bf0c-2d70d41fdaf2

If you use µVision2 and BL51 enter ?CO?TEMP(0x5000) under Options for Target - BL51 Locate - Code:. For LX51, enter ?CO?TEMP(C:0x5000) under Options for Target - LX51 Locate - User Segments.

设置完后,重新编译,查看Map文件,我们就会发现temp.c被定址到了0x5000。

eab1e583-a19d-4064-a2db-3103c8cf1d98

这个方法有个很大的缺点,就是只能定址segment,由于文件名先天性就是一个segment,所以将数组单独放在一个c文件里,间接实现了数组的绝对定址。

SEE ALSO


扫描二维码推送至手机访问。

版权声明:本文由鸟的天空发布,如需转载请注明出处。

本文链接:http://xjtudll.cn/Exp/465/

标签: keil51
分享给朋友:

“C51: LOCATING INITIALIZED VARIABLES AT ABSOLUTE ADDRESSES 如何初始化绝对定址的变量” 的相关文章

Protel99SE PCB各层的含义

本文收集于网络,整理而成,原文作者未知。 我们在进行印制电路板设计前,第一步就是要选择适用的工作层。Protel 99 SE提供有多种类型的工作层。只有在了解了这些工作层的功能之后,才能准确、可靠地进行印制电路板的设计。 Protel 99 SE所提供的工作层大致可以分为7类:Signal La...

WinClone更新了

WinClone,Mac下备份Windows系统的好软件。可以克隆BootCamp分区安装的Windows,也可以将克隆文件安装到BootCamp分区。 之前已经写过一篇WinClone备份还原Windows的简易教程:http://xjtudll.cn/Exp/171/ 基本上来说,使用还是较简单...

网址后面多了一串字符串?jdfwkey

最近一段时间,每天第一次打开自己网站的时候,网址后面老会自动加一串字符串?jdfwkey,很奇怪,而且看起来就跟广告页面网址一样。发现这个问题后,立马联系了客服,客服说是打开了硬件防火墙,防DDOS攻击的。网上搜索了一遍,发现好多人出现过这种情况,大家的意见是:1、影响网站收录。2、来源于搜索引擎的...

Multisim示波器设置

Multisim示波器设置

在使用Multisim的时候,经常要用到示波器,但是在用到双通道的时候,两通道波形显示的颜色经常是一样的,无法直观的分辨到底是哪个通道。 其实Multisim里面有设置: 选中与示波器相连的那根线,右键,选择图块颜色,操作后会出现颜色选择的窗口,如下图。 选择一个颜色即可。 以一个电路图为例,下图...

电阻主要技术参数

电阻主要技术参数

1、额定功率 电阻器在电路中长时间连续工作不损坏或不显著改变其性能时所允许消耗的最大功率,称为电阻器的额定功率。 为防止电阻器在电路中被烧毁,选择电阻器时,应使额定功率高于实际消耗功率的1.5~2倍。市场上销售的电阻器,对小于0. 5W的一般不标其功率,使用者凭经验,按体积大小估计。同类电阻,体...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。