首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

[求助]关于cw编译的问题,请高手们多多指教

一定是全局数组变量与其他全局变量出现地址冲突了。你可以去编译完成后生成的MAP文件里面确定下。不过强烈建议将RAM分为2块:前一块用来放堆栈及自动编译的全局变量,后一块用来放自己指定位置的全局变量、常数等。
楼主试下PRM文件里改成这样行不
RAM = READ_WRITE 0x0060 TO 0x0013F;
Z_RAM = READ_WRITE 0x0140 TO 0x015F;
//RAM = READ_WRITE 0x0060 TO 0x015F;
ROM = READ_ONLY 0xDC00 TO 0xFBFF;
END

PLACEMENT /* here all predefined and user segments are placed into the SEGMENTS defined above. */
DEFAULT_ROM INTO ROM;
DEFAULT_RAM INTO RAM;
// _DATA_ZEROPAGE, MY_ZEROPAGE INTO Z_RAM;
//SSTACK INTO RAM ;
程序里面用累似
uint  Uab           @ 0x140;
的方法指定数组的位置在Z_RAM里。
你还可以更改Z_RAM和RAM的大小,以达到不浪费RAM空间的目的。

我用12的单片机可能与你有点不一样。你可参照更改。以下是我的一个PRM文件
NAMES
END

SEGMENTS
    RAM  = READ_WRITE 0x0400 TO 0xFFF;
    RAM2 = READ_WRITE 0x1000 TO 0x1FFF;
    /* unbanked FLASH ROM */
    ROM_4000 = READ_ONLY  0x4000 TO 0x7FFF;
    ROM_8000 = READ_ONLY  0x8000 TO 0xBFFF;
    ROM_C000 = READ_ONLY  0xC000 TO 0xFEFF;
    /* banked FLASH ROM */
    PAGE_38 = READ_ONLY  0x388000 TO 0x38BFFF;
    PAGE_39 = READ_ONLY  0x398000 TO 0x39BFFF;
    PAGE_3A = READ_ONLY  0x3A8000 TO 0x3ABFFF;
    PAGE_3B = READ_ONLY  0x3B8000 TO 0x3BBFFF;
    PAGE_3C = READ_ONLY  0x3C8000 TO 0x3CBFFF;
    PAGE_3D = READ_ONLY  0x3D8000 TO 0x3DBFFF;
/*    PAGE_3E = READ_ONLY  0x3E8000 TO 0x3EBFFF; not used: equivalent to ROM_4000 */
/*    PAGE_3F = READ_ONLY  0x3F8000 TO 0x3FBFFF; not used: equivalent to ROM_C000 */
END

PLACEMENT
    _PRESTART,                   /* Used in HIWARE format: jump to _Startup at the code start */
    STARTUP,                     /* startup data structures */
    ROM_VAR,                     /* constant variables */
    STRINGS,                     /* string literals */
    VIRTUAL_TABLE_SEGMENT,       /* C++ virtual table segment */
    NON_BANKED,                  /* runtime routines which must not be banked */
    COPY,                         /* copy down information: how to initialize variables */
                                  /* in case you want to use ROM_4000 here as well, make sure
                                    that all files (incl. library files) are compiled with the
                                    option: -OnB=b */
                                 INTO  /*ROM_C000*/ ROM_4000;
    DEFAULT_ROM,
    MyConstSeg                   INTO  PAGE_38,PAGE_39,PAGE_3A,PAGE_3B,PAGE_3C,PAGE_3D;
    DEFAULT_RAM                  INTO  RAM;
    MyConstSeg1                  INTO  ROM_8000;
    MyVarSeg                     INTO  RAM2;
END

STACKSIZE 0x500

VECTOR 0 _Startup /* reset vector: this is the default entry point for a C/C++ application. */
//VECTOR 0 Entry  /* reset vector: this is the default entry point for a Assembly application. */
//INIT Entry      /* for assembly applications: that this is as well the initialisation entry point */
在定义变量时有2种情况
第一种(自己指定):uint  Uab           @ 0x1001;          //这样Uab就在1001地址也就是RAM2里面
第二种(系统编译):#pragma DATA_SEG DEFAULT
int i,k,m,n;//这样是放在RAM里面,系统自动400+500开始编译。

MAP文件里面:
- VARIABLES:
     AD1COUNT                                  1000       2       2       4   MyVarSeg   
     AD2COUNT                                  1002       2       2       4   MyVarSeg   
     In                                        1004       4       4       4   MyVarSeg   
     _Ia                                       1008       4       4       5   MyVarSeg   
这段是在RAM2里面
Device_Code                                902       2       2       0   .abs_section_902
     Uab                                        904       2       2       1   .abs_section_904
     Ubc                                        906       2       2       1   .abs_section_906
//这段是在RAM里面(400+堆栈的500所以从900开始)

希望对你能有帮助
返回列表