楼主试下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开始)
希望对你能有帮助 |