请问IAR 8051如何将常量定义在code和将常(变)量定义在xdata?

2020-01-13 18:22发布

这个研究了几天,都不成功

工程设置如下:
未命名-1.gif (50.16 KB, 下载次数: 0) 下载附件 2012-7-4 14:49 上传

代码如下:
#include "io8051.h"

int main()
{
    const unsigned char __xdata tmp = 32;
    __code const unsigned char array[] = {0xF3,0x68};
   
    SCON = 0x50;
    TMOD|= 0x20;
    TH1  = 0xFB;
    TL1  = 0xFB;
    TCON_bit.TR1  = 1;
    IE_bit.ES   = 1;       //允許串口中斷
   
    P0 = tmp;
    while(SCON_bit.TI ==0);
    SCON_bit.TI = 0;
    SBUF = tmp;
        
    return 0;
}

tmp和array[]的定义都提示错误:Error[Be009]: memory attributes not allowed on auto variables or parameters

网上搜索了一下,包括IAR的C/C++参考手册,都说用__xdata,__code就可以了,但无论怎么做都不行
按照此贴http://www.amobbs.com/thread-5482677-1-1.html,我已将想放在xdata区的常量声明了const(不声明const也试过,效果一样)

难道是我用的版本不同,太新??我用 8.10.3 的。

谢谢大家
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
5条回答
uc_c++
2020-01-13 21:43
tmp和array[]的定义都提示错误:Error[Be009]: memory attributes not allowed on auto variables or parameters
----------------------------------------------------------------------------------------------------------------------------------------------------------
已经说的很清楚了。
局部变量不能使用memory attributes。

原因很简单:局部变量是自动分配变量,由编译器自动分配到寄存器或者堆栈,不能加memory attributes。
__code const unsigned char array[] = {0xF3,0x68};
array是局部变量,是要放在堆栈的,难道楼主认为code区还能放堆栈不成?

只有静态分配变量才能加memory attributes

static const unsigned char __xdata tmp = 32;
static const unsigned char __code array[] = {0xF3,0x68};
----------------------------------------------------------------------------------
加上static关键字就行了,另外__xdata,__code等一般紧挨着变量名。





一周热门 更多>