GD32H759 用vscode+eide开发的一些问题
本帖最后由 shuwei1984 于 2025-4-26 14:56 编辑GD32H759IMK6 芯片,野火的开发板
用VSCode + EIDE + Arm GNU Toolchain 工具 11.3.Rell版编译xpack+openocd + fireDAP仿真器下载运行
用VSCode带的 Cortex-Debug插件进行debug时,内存变量值经常取不到,都显示是个0。先怀疑是缓存的问题,使用SCB_InvalidateDCache_by_Addr命令先对要看的内存进行“Invalidate”操作后,可以看到断点时该变量的值。但只能对专门这样分配的全局内存数据起效果,对于局部变量没有用。
只能进行一些简单的调试判断。
今天又增加了LWIP功能,结果用gcc编译的在启动使用netconn api写的网络数据进程时,直接死掉了。调试因为变量无论怎么断点看都是个0值,没法调试看问题出在哪里。
同样的工程在IAR上编译调度时,没有这个问题。都能正常运行。我是一份代码做了两个调试环境。IAR就没这些问题。
另外,GD自己的模板生成系统生成的示例代码工程中,对GD32H7xx系列的*.ld文件过于简单,1024kB+16+ 16KB的RAM,ld文件里面只给定义了512kB。这个LD文件 有人扩写调试好的版本有没?
后续:
后来发现,是GD官方模板给我挖的大坑,我太信任GD官方给的资料了,谁能想到居然在官方模板例程中,*.ld文件里,居然只分配了一块512kB的内存,但是GD的peripheral的enet驱动里,又手动给网卡的缓冲分配了其它块的内存。结果用到网卡时,就乱套了,gcc编译连接时,也没提示有这个问题。
而GD官方给的用于IAR编译的*.icf文件,就把这几块内存给分配了,所以在IAR里没出问题。
具体我解决的方法见下面回贴,主贴里就不再写了。
除了Keil和IAR两个收费的开发工具外,开源的IDE工具还有哪些能用的?
栈先调大些,或单步确认下栈没有溢出,gcc编译出来的栈消耗会略大些。 开源的话用eclipse加编译器插件开发模式 aozima 发表于 2025-4-24 21:27
栈先调大些,或单步确认下栈没有溢出,gcc编译出来的栈消耗会略大些。
把栈改成了4K,没有效果.
/* memory map */
MEMORY
{
FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 3840K
RAM (xrw) : ORIGIN = 0x24000000, LENGTH = 512K
}
ENTRY(Reset_Handler)
SECTIONS
{
__stack_size = DEFINED(__stack_size) ? __stack_size : 4K;
这么一段代码中:
ip_addr_t server_ip;
// 一个用于网络通讯的功能块
void Task_NetCommunate(void* pvParameters)
{
u16_t server_port = 9999; // 服务器端口号初始化
// ip4addr_aton("192.168.10.153", &server_ip); // 服务器IP地址初始化
// vTaskDelay(5000);
server_ip.addr = 3232238233;
while(DEF_ON)
{
NetComm_ClientProcess(server_ip, server_port);
vTaskDelay(APP_CFG_TASK_COMM_LOCAL_TICKS);
}
}
运行到循环内,,server_ip.addr的值居然是个0,百思不得其解。Port值是9999倒没错。
gcc编译的锅还是怎么回事儿。 chenqianqian 发表于 2025-4-24 21:30
开源的话用eclipse加编译器插件开发模式
已下单去买GD-Link,到时候试试GD提供的IDE调试看看 在编译选项中降低优化级别。 GCC编译的工程可能未正确配置中断向量表或中断优先级。 开源IDE工具可以试试Eclipse + GNU MCU Eclipse插件。 本帖最后由 probedog 于 2025-4-25 13:34 编辑
{:smile:} LWIP的内存分配可能与GCC的内存管理实现不兼容,导致内存泄漏或越界。 laocuo1142 发表于 2025-4-25 13:28
在编译选项中降低优化级别。
不优化方式也是一样 stormwind123 发表于 2025-4-25 13:31
GCC编译的工程可能未正确配置中断向量表或中断优先级。
向量表用的是GD给的模版表 flycamelaaa 发表于 2025-4-25 14:03
LWIP的内存分配可能与GCC的内存管理实现不兼容,导致内存泄漏或越界。
断点跟踪到等待连接信号量时,就卡住不动了,信号量是FreeRTOS系统提供的功能。
ret = xSemaphoreTake(sem->sem, portMAX_DELAY);
到这一句,过几秒系统就崩了。 {:handshake:} 检查中断向量表是否正确配置。 probedog 发表于 2025-4-25 19:00
检查中断向量表是否正确配置。
向量表是GD对应型号MCU的模版中给的,没有修改过
不对的话,这个程序根本就运行不起来。把连接那个函数注释掉,程序就能运行。
IAR中运行正常无问题 https://bbs.21ic.com/icview-3449080-1-1.html 丙丁先生 发表于 2025-4-25 19:45
https://bbs.21ic.com/icview-3449080-1-1.html
谢谢!
关闭SCB_EnableDCache() 这个之后,再将栈调整到6kB,可以运行了,也有崩溃的时候。再调整栈大小到8K,不崩溃了。
但是只要打开了SCB_EnableDCache(),就必崩溃。
IAR中打开SCB_EnableDCache(),不会崩溃,检查了两个编译环境的宏,关于SCB_EnableDCache() 中两个是一样的,不存在IAR与GCC编译的源码不一样的情况。
两个程序map,再对比看看。 shuwei1984 发表于 2025-4-25 20:58
谢谢!
关闭SCB_EnableDCache() 这个之后,再将栈调整到6kB,可以运行了,也有崩溃的时候。再调整栈大小 ...
[研电赛技术支持] 借助人工智能提出问题并解决问题是怎样的过程?GD32H759 用vscode+eide开发的一些问题 https://bbs.21ic.com/icview-3449096-1-1.html
shuwei1984 发表于 2025-4-25 20:58
谢谢!
关闭SCB_EnableDCache() 这个之后,再将栈调整到6kB,可以运行了,也有崩溃的时候。再调整栈大小 ...
经过对比IAR与GCC的map文件
发现是0x30000000处这个SRAM0区域,在ld文件中没有定义,而在gd32h7xx_enet.c这个驱动文件中,
又是用
#elif defined (__GNUC__) /* GNU Compiler */
enet_descriptors_structrxdesc_tab __attribute__((section(".ARM.__at_0x30000000"))); /*!< ENET RxDMA descriptor */
enet_descriptors_structtxdesc_tab __attribute__((section(".ARM.__at_0x30000160"))); /*!< ENET TxDMA descriptor */
uint8_t rx_buff __attribute__((section(".ARM.__at_0x30000300"))); /*!< ENET receive buffer */
uint8_t tx_buff __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。
*终端将被任务重用,按任意键关闭。
这两个小问题暂时不知道如何解决
页:
[1]
2