经过对比IAR与GCC的map文件
发现是0x30000000处这个SRAM0区域,在ld文件中没有定义,而在gd32h7xx_enet.c这个驱动文件中,
又是用
#elif defined (__GNUC__) /* GNU Compiler */
enet_descriptors_struct rxdesc_tab[ENET_RXBUF_NUM] __attribute__((section(".ARM.__at_0x30000000"))); /*!< ENET RxDMA descriptor */
enet_descriptors_struct txdesc_tab[ENET_TXBUF_NUM] __attribute__((section(".ARM.__at_0x30000160"))); /*!< ENET TxDMA descriptor */
uint8_t rx_buff[ENET_RXBUF_NUM][ENET_RXBUF_SIZE] __attribute__((section(".ARM.__at_0x30000300"))); /*!< ENET receive buffer */
uint8_t tx_buff[ENET_TXBUF_NUM][ENET_TXBUF_SIZE] __attribute__((section(".ARM.__at_0x30002100"))); /*!< ENET transmit buffer */
#endif /* __CC_ARM */
造成了内存分配区的混乱
于是,将LD文件修改如下:
增加:
MEMORY
{
FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 3840K
RAM (xrw) : ORIGIN = 0x24000000, LENGTH = 768K
SRAM0 (xrw) : ORIGIN = 0x30000000, LENGTH = 16K
SRAM1 (xrw) : ORIGIN = 0x30040000, LENGTH = 16K
}
增加
.enetram :
{
. = ALIGN(4);
_senetram = .;
__enetram_start__ = _senetram;
*(.ARM.__at_0x3*)
*(.ARM.__at_0x3)
. = ALIGN(4);
_eenetram = .;
__enetram_end__ = _eenetram;
} >SRAM0 AT> FLASH
再次打开DCache就没有问题了。
现在还有两个小问题,不得其解,上面的RAM如果把大小修改为1024K,同样会崩溃。
下面的内存分配段描述中,如果不加 AT>FLASH,下载到芯片时,会提示:
** Verify Started **
Error: checksum mismatch - attempting binary compare
embedded:startup.tcl:1136: Error: ** Verify Failed **
in procedure 'program'
in procedure 'program_error' called at file "embedded:startup.tcl", line 1197
at file "embedded:startup.tcl", line 1136
* 终端进程“cmd.exe /C ""C:\Program Files (x86)\openocd\bin\openocd.exe" -s "c:\Users\*******\Documents\MCUProjects\GD32H7TestSample\xTUCoreBoardPrj" -f interface/cmsis-dap.cfg -f gd32h7xx.cfg -c "program \"c:/Users/********/Documents/MCUProjects/GD32H7TestSample/xTUCoreBoardPrj/GccBuild/Debug/xTUCoreBoardPrj.hex\" verify" -c "reset run" -c "exit""”已终止,退出代码: 1。
* 终端将被任务重用,按任意键关闭。
这两个小问题暂时不知道如何解决
|