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

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

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


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 如何初始化绝对定址的变量” 的相关文章

Word中如何定位

Word中如何定位

文章来源:http://cuiyingfeng.blog.51cto.com/43841/61155 大家在日常工作中经常会接触word文档,在使用编辑时基本上会遇到如下两个问题: 1、我从目录中选择一个条目,跳入正文,现在想返回目录重新选择条目 2、我修改了一个地方,在浏览了这篇文档一部分内...

金蝶 报废/补料是否会参与倒冲领料

金蝶 报废/补料是否会参与倒冲领料

产品入库倒冲领料单没有考虑报废补料数量,一般领料时则会考虑。此种情况可以通专过【报废倒冲领属料】的功能生成【生产领料单】。 请按下列方法步骤操作: 1、登录K/3主控台,依次单击【生产管理】→【生产任务管理】→【生产物料报废/补料】,双击【生产物料报废/补料单-维护】; 2、打开...

MySQL导入sql文件错误ERROR 1044 : Access denied for user ‘root’@'localhost’ to database ‘information_schema’

MySQL导入sql文件错误ERROR 1044 : Access denied for user ‘root’@'localhost’ to database ‘information_schema’

参考资料: http://www.linuxidc.com/Linux/2014-03/97586.htm http://stackoverflow.com/questions/4824986/error-1044-access-denied-for-user-rootlocalhost-to-da...

BOS单据审核后插件中解锁字段

m_BillInterface.LockCell   Dim dct As KFO.Dictionary     Dim lBillStatusBak As String     lBillStatusBak = m_BillIn...

金蝶K3-销售价取价规则什么?按什么优先级?

【系统逻辑】销售价格取值规则如下:1、销售价格取值优先顺序:价格政策-基本价格政策-物料参考售价。2、不同价格政策下,同一物料的价格,按照销售价格政策优先级取值,优先级数字越小越优先;3、相同价格政策下,同一物料存在多个条目时,优先取符合条件最后审核的价格条目。...

mircrosoft project2010怎么设置任务级别,降级

mircrosoft project2010怎么设置任务级别,降级

参考资料: http://zhidao.baidu.com/link?url=hW3eTVmKLi2WzQM_jTfsCb2btmRnrmixR8tfFfiRn1YTtM6ylBBXMsnQHpEAUefawNdg-bTiFeXh9Of-U47Mma 两个方法: 1、任务菜单---计划列表---那两...

发表评论

访客

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