感觉这几天编译bsp,所有的问题都被我遇到了,今天的问题如下:
Error: Ram start overlaps rom binary
出错内容如下:
- Processing NK
- Writing D:/WINCE600/OSDesigns/Mini2440-with-QQ/Mini2440-with-
- QQ/RelDir/Mini2440_ARMV4I_Release/NK.bin
- Error: Ram start overlaps rom binary
- Rom end : 0x82356260
- Ram start: 0x8200e000
- NK
- physfirst 80200000
- physlast 82356260
- ulRAMFree 8200e000
- Fatal error hit, exiting...
- Table of contents 82353768 00002af8 ( 11000)
- Writing ROM signature and TOC pointer at 80200040
- Kernel data copy section 807bee7c 00000020 ( 32)
- ROM Header 82353714 00000054 ( 84)
- First DLL Address: 4001c001
- Last DLL Address: 416dc0b1
- Physical Start Address: 80200000
- Physical End Address: 82356260
- Start RAM: 82000000
- Start of free RAM: 8200e000
- End of RAM: 83e00000
- Number of Modules: 230
- Number of Copy Sections: 2
- Copy Section Offset: 807bee7c
- Kernel Flags: 00000002
- FileSys 4K Chunks/Mbyte: 48 <2Mbyte 48 2-4Mbyte 0 4-6Mbyte 0
- >6Mbyte
- CPU Type: 01c2h
- Miscellaneous Flags: 0002h
- Extensions Pointer: 80201570
- Total ROM size: 02156260 ( 34955872)
- makeimg: FATAL ERROR: Command returned non-zero exit code 1 (dec).
- makeimg: FATAL ERROR: Command returned non-zero exit code 1 (dec).
- Mini2440-with-QQ - 4 error(s), 10 warning(s)
- ========== 生成: 0 成功或最新,1 失败,0 被跳过 ==========
仔细看了一下错误,找到了
Error: Ram start overlaps rom binary
Ram的空间与ROM的空间重叠了。
在5.0的时候Ram与ROM的大小设置在config.bib文件里面的。
但是,我在vs2005的工程里面却没找到,害到我直接去BSP目录底下找才找到。
(如果网友知道在vs2005中如何找到config.bib麻烦告知一下,PB5.0可以直接在项目里面找到的)
打开config.bib文件,发现内容如下
- MEMORY
- NK 80200000 01e00000 RAMIMAGE ;01e00000 30M
- RAM 82000000 01e00000 RAM
- ; FLASH 92000000 00100000 RESERVED
- ; Common RAM areas
- AUD_DMA 80002000 00000800 RESERVED
- SDIO_DMA 80010000 00010000 RESERVED
- ARGS 80020800 00000800 RESERVED
- DBGSER_DMA 80022000 00002000 RESERVED
- SER_DMA 80024000 00002000 RESERVED
- IR_DMA 80026000 00002000 RESERVED
- SLEEP 80028000 00002000 RESERVED
- EDBG 80030000 00020000 RESERVED
- DISPLAY 80080000 00180000 RESERVED
- CONFIG
- COMPRESSION=ON
- KERNELFIXUPS=ON
- IF IMGPROFILER
- PROFILE=ON
- ELSE
- PROFILE=OFF
- ENDIF
- ;
- ; ROMFLAGS is a bitmask of options for the kernel
- ; ROMFLAGS 0x0001 Disallow Paging
- ; ROMFLAGS 0x0002 Not all KMode
- ; ROMFLAGS 0x0010 Trust Module only
- ;
- IF IMGTRUSTROMONLY
- IF IMGNOTALLKMODE
- ROMFLAGS=12
- ELSE
- ROMFLAGS=10
- ENDIF
- ELSE
- IF IMGNOTALLKMODE
- ROMFLAGS=02
- ELSE
- ROMFLAGS=00
- ENDIF
- ENDIF
- ROMSTART=80200000
- ROMWIDTH=32
- ROMSIZE=01e00000 ;01e00000 30M
- FSRAMPERCENT=0x30303030
可以看到
NK 80200000 01e00000 RAMIMAGE ;01e00000 30M(注释是本人加上去的)
RAM 82000000 01e00000 RAM
和
ROMSTART=80200000
ROMWIDTH=32
ROMSIZE=01e00000 ;01e00000 30M(注释是本人加上去的)
看一下出错信息,ROM总共是多大。
Total ROM size: 02156260 ( 34955872)
这个大概是33M左右的大小,超过了设置的ROMSIZE规定的大小,
同时,82356260=80200000(ROMSTART) +02156260 (ROMSIZE),82356260明显超过了RAM的起始地址82000000。
因此,现在问题来了,有两个步骤。
1、把ROMSIZE的大小放大。
2、根据ROMSIZE的大小重新调整RAM的起始地址
我的调整结果如下:
- MEMORY
- ; NK 80200000 01e00000 RAMIMAGE
- ; RAM 82000000 01e00000 RAM
- NK 80200000 02300000 RAMIMAGE ;35M
- RAM 82500000 01e00000 RAM
- ; FLASH 92000000 00100000 RESERVED
- ; Common RAM areas
- AUD_DMA 80002000 00000800 RESERVED
- SDIO_DMA 80010000 00010000 RESERVED
- ARGS 80020800 00000800 RESERVED
- DBGSER_DMA 80022000 00002000 RESERVED
- SER_DMA 80024000 00002000 RESERVED
- IR_DMA 80026000 00002000 RESERVED
- SLEEP 80028000 00002000 RESERVED
- EDBG 80030000 00020000 RESERVED
- DISPLAY 80080000 00180000 RESERVED
- CONFIG
- COMPRESSION=ON
- KERNELFIXUPS=ON
- IF IMGPROFILER
- PROFILE=ON
- ELSE
- PROFILE=OFF
- ENDIF
- ;
- ; ROMFLAGS is a bitmask of options for the kernel
- ; ROMFLAGS 0x0001 Disallow Paging
- ; ROMFLAGS 0x0002 Not all KMode
- ; ROMFLAGS 0x0010 Trust Module only
- ;
- IF IMGTRUSTROMONLY
- IF IMGNOTALLKMODE
- ROMFLAGS=12
- ELSE
- ROMFLAGS=10
- ENDIF
- ELSE
- IF IMGNOTALLKMODE
- ROMFLAGS=02
- ELSE
- ROMFLAGS=00
- ENDIF
- ENDIF
- ROMSTART=80200000
- ROMWIDTH=32
- ;ROMSIZE=01e00000
- ROMSIZE=2300000 ;35M
- FSRAMPERCENT=0x30303030
我将ROMSIZE设置成35M的大小。
当然解决这个问题的方法还有其他方法
导致这个错误的原因是NK.bin的实际大小超过了config.bib文件中定义的大小。
有两个方法可以解决这个问题。
方法一:删除一些不必要的组件,然后重新Sysgen
方法二:修改config.bib文件
下面是我的config.bib文件的一段:
- NK 8C200000 01C00000 RAMIMAGE
- RAM 8DE00000 02200000 RAM
- .
- .
- ROMSTART=8C200000
- ROMWIDTH=32
- ROMSIZE=01c00000
- .
这里定义的NK的大小是01C00000,也就是28M。
而实际上我现在的NK已经达到了30,733,179,也就是29.3M。
这就是导致问题的主要原因。
解决方法:
首先把01C00000改成01E00000(30M)
然后把8DE00000改成8E100000(+2M)
把02200000改成02000000(-2M)
最后把ROMSIZE=01c00000改成ROMSIZE=01E00000
重新Sysgen
(这里面如果NK超过32M,Build Options中需要勾选上
“Run-Time Image Can be Larger than 32 MB”)
作者:朱铭雷