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

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

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

硬件使用jl8,将prm文件中ram和为一个,堆栈设为0x50。
1 在使用中定义了一个全局数组变量(7个成员),最后发现这个数组在ram中的位置直接影响到运行结果,即将这个数组定义在其他全局变量的前面运行的结果就不对,只有将此数组放在最后才能够正确运行。开始怀疑到是否堆栈不够(因为程序里使用了读写eeprom的程序),加大了堆栈到0x80,也还是不行。百思不得其解,于是只好将数组放在最后,暂时没有发现问题,但不知是为什么。
2 另外在调试的时候还有一个奇怪的现象。有一段程序都已能够正常运行,后来对这段程序进行了精简处理,去掉了程序中不用的变量及无用的代码,结果编译后的程序出现与前者不一样的结果。我的程序是用来测试485从节点通讯可靠性的,在使用不精简的程序时,与从机进行1000通讯没有发现任何问题,当使用精简程序后发现对从机进行1000通讯时,会有30多次从机未应答的现象,用示波器观察,从机还是给了回应,不知两次编译结果到底发生了什么变化。
以上我遇到的两个问题让我很困扰,请各位高手指教
首先谢谢你的回复。
1 从编译后生成的P&E_pcs.map文件中可以看到我申明数组的位置,堆栈的摆放是按照编译器默认的,放在所有声明全局变量的后边,从0xc1至0x110共0x50,看不出哪里会产生重叠呀。另外早先我也试过将堆栈放到最后,好像也是不行。
2 程序我仔细检查过了,没有发现精简时删除出错的地方,在删减时删除了一些全局变量,这个问题似乎又与上一个问题相似,全局变量定义的数量与位置影响了最终运行结果。[em16]
后来发现在精简程序的时候,为了减少全局变量的个数,将联合中定义的1位(此联合只用到此1位),转至其他联合中空余的位,程序运行时便会出现2中描述的现象。好郁闷呐,大家给点建议吧[em16]
感谢aressos的回复
我目前的prm中定义如下:
NAMES END /* CodeWarrior will pass all the needed files to the linker by command line. But here you may add your own files too. */

SEGMENTS /* here all RAM/ROM areas of the device are listed. Used in PLACEMENT below. */
//  Z_RAM  = READ_WRITE 0x0060 TO 0x00FF;
//  RAM    = READ_WRITE 0x0100 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 ;
END

STACKSIZE 0x50

VECTOR 0 _Startup /* reset vector: this is the default entry point for a C/C++ application. */

仅仅改变一个全局变量数组定义的位置,编译后执行的结果完全不一样。
下面我只列出好用和不好用时生产map文件中不一致的地方。
程序好用的:
- VARIABLES:
BackLightTime             B5       1       1       6   .common     
     cfg_use               B6       3       3      41   .common     
     mnum                  B9       7       7      56   .common   

SECTION USE IN OBJECT-ALLOCATION SECTION
SECTION: ".common"
LcdFlash refresh relay WorkStatus TempChange SleepTime FlashTime
BackLightTime cfg_use mnum

OBJECT LIST SORTED BY ADDRESS
BackLightTime        B5       1       1       6   .common     
     cfg_use         B6       3       3      41   .common     
     mnum            B9       7       7      56   .common   

程序不好用的:
- VARIABLES:
     mnum                  B5       7       7      56   .common     
BackLightTime             BC       1       1       6   .common     
     cfg_use               BD       3       3      41   .common
SECTION USE IN OBJECT-ALLOCATION SECTION
SECTION: ".common"
LcdFlash refresh relay WorkStatus TempChange SleepTime FlashTime mnum
BackLightTime cfg_use

OBJECT LIST SORTED BY ADDRESS
     mnum               B5       7       7      56   .common     
     BackLightTime      BC       1       1       6   .common     
     cfg_use            BD       3       3      41   .common   
另外我也尝试了aressor所说的将堆栈放在0x60~0xff当中,使用#pragma将部分变量也放在这个空间,但是还是不行,请大家帮助再分析分析,谢了。
返回列表