您的位置:首页 > 编程语言 > C语言/C++

C/C++内存泄漏及其检测工具

2011-12-26 19:38 239 查看
项目使用了飞思卡尔的HCS12XEP100芯片,根据spec说明有64k的RAM可以使用。但是在做测试的时候,总共跑起来也就8K就赛满了。再看spec,得知其中默认能使用的只有8K,其余的都是通过RPAGE寄存器来访问的,同时从网上也得知需要配置.prm文件和#pragma一起配合使用。一直搞得很糊涂。后来发现.prm中有这么一段:
/* paged RAM: 0x1000 TO 0x1FFF; addressed through RPAGE */
RAM_XGATE_STK = READ_WRITE 0xF81000 TO 0xF810FF; /* The stack is set by the XGATE compiler option -Cstv=8100 */
RAM_F0 = READ_WRITE 0xF01000 TO 0xF01FFF ALIGN 2[1:1]; /* is also mapped to XGATE: 0x0000..0x0FFF */
RAM_F1 = READ_WRITE 0xF11000 TO 0xF11FFF ALIGN 2[1:1]; /* is also mapped to XGATE: 0x1000..0x1FFF */
RAM_F2 = READ_WRITE 0xF21000 TO 0xF21FFF ALIGN 2[1:1]; /* is also mapped to XGATE: 0x2000..0x2FFF */
RAM_F3 = READ_WRITE 0xF31000 TO 0xF31FFF ALIGN 2[1:1]; /* is also mapped to XGATE: 0x3000..0x3FFF */
RAM_F4 = READ_WRITE 0xF41000 TO 0xF41FFF ALIGN 2[1:1]; /* is also mapped to XGATE: 0x4000..0x4FFF */
RAM_F5 = READ_WRITE 0xF51000 TO 0xF51FFF ALIGN 2[1:1]; /* is also mapped to XGATE: 0x5000..0x5FFF */
RAM_F6 = READ_WRITE 0xF61000 TO 0xF61FFF ALIGN 2[1:1]; /* is also mapped to XGATE: 0x6000..0x6FFF */
RAM_F7 = READ_WRITE 0xF71000 TO 0xF71FFF ALIGN 2[1:1]; /* is also mapped to XGATE: 0x7000..0x7FFF */
RAM_F8 = READ_WRITE 0xF81100 TO 0xF81FFF ALIGN 2[1:1]; /* is also mapped to XGATE: 0x8100..0x8FFF */
RAM_F9 = READ_WRITE 0xF91000 TO 0xF91FFF ALIGN 2[1:1]; /* is also mapped to XGATE: 0x9000..0x9FFF */
RAM_FA = READ_WRITE 0xFA1000 TO 0xFA1FFF ALIGN 2[1:1]; /* is also mapped to XGATE: 0xA000..0xAFFF */
RAM_FB = READ_WRITE 0xFB1000 TO 0xFB1FFF ALIGN 2[1:1]; /* is also mapped to XGATE: 0xB000..0xBFFF */
RAM_FC = READ_WRITE 0xFC1000 TO 0xFC1FFF ALIGN 2[1:1]; /* is also mapped to XGATE: 0xC000..0xCFFF */
RAM_FD = READ_WRITE 0xFD1000 TO 0xFD1FFF ALIGN 2[1:1]; /* is also mapped to XGATE: 0xD000..0xDFFF */
/* RAM_FE = READ_WRITE 0xFE1000 TO 0xFE1FFF; intentionally not defined: equivalent to RAM: 0x2000..0x2FFF */
/* RAM_FF = READ_WRITE 0xFF1000 TO 0xFF1FFF; intentionally not defined: equivalent to RAM: 0x3000..0x3FFF */
每一段刚好4K,也就是说64K的RAM除了默认使用的8K之外还有56K,也就是14段,基本与上面的吻合。





需要映射的部分RAM就是通过上图中的4K RAM window段和RPAGE寄存器共同作用来寻址的。
但是怎么在代码中使用,也就是我的全局数据段如何才能放到这些段中。经过网上搜索和自己调试发现操作步骤如下:
(1) 在.prm中的PLACEMENT字段下将上面 RAM_F1等起个名字,如下所示
PAGED_RAM_TEST INTO RAM_F1;
PAGED_RAM_TEST就是我们在代码文件中要用到的名字
(2) 在代码文件中将要放到RAM_F1的数据放到下面语句之下
#pragma DATA_SEG __RPAGE_SEG PAGED_RAM_WAN
根据#pragma的说明,除非遇到其他的类型(例如函数)或者别的用#pragma说明的数据段,否则在此之后的数据都放到#pragma声明的数据段内
(3) 编译工程,查看.map文件,会发现PAGED_RAM_TEST对应段的数据大小

本文出自 “bluefish” 博客,请务必保留此出处http://bluefish.blog.51cto.com/214870/589037
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: