shuwei1984 发表于 2025-4-24 19:12

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工具还有哪些能用的?

aozima 发表于 2025-4-24 21:27

栈先调大些,或单步确认下栈没有溢出,gcc编译出来的栈消耗会略大些。

chenqianqian 发表于 2025-4-24 21:30

开源的话用eclipse加编译器插件开发模式

shuwei1984 发表于 2025-4-25 10:49

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编译的锅还是怎么回事儿。

shuwei1984 发表于 2025-4-25 10:51

chenqianqian 发表于 2025-4-24 21:30
开源的话用eclipse加编译器插件开发模式

已下单去买GD-Link,到时候试试GD提供的IDE调试看看

laocuo1142 发表于 2025-4-25 13:28

在编译选项中降低优化级别。

stormwind123 发表于 2025-4-25 13:31

GCC编译的工程可能未正确配置中断向量表或中断优先级。

probedog 发表于 2025-4-25 13:32

开源IDE工具可以试试Eclipse + GNU MCU Eclipse插件。

probedog 发表于 2025-4-25 13:32

本帖最后由 probedog 于 2025-4-25 13:34 编辑

{:smile:}

flycamelaaa 发表于 2025-4-25 14:03

LWIP的内存分配可能与GCC的内存管理实现不兼容,导致内存泄漏或越界。

shuwei1984 发表于 2025-4-25 14:18

laocuo1142 发表于 2025-4-25 13:28
在编译选项中降低优化级别。

不优化方式也是一样

shuwei1984 发表于 2025-4-25 14:19

stormwind123 发表于 2025-4-25 13:31
GCC编译的工程可能未正确配置中断向量表或中断优先级。

向量表用的是GD给的模版表

shuwei1984 发表于 2025-4-25 14:23

flycamelaaa 发表于 2025-4-25 14:03
LWIP的内存分配可能与GCC的内存管理实现不兼容,导致内存泄漏或越界。

断点跟踪到等待连接信号量时,就卡住不动了,信号量是FreeRTOS系统提供的功能。

ret = xSemaphoreTake(sem->sem, portMAX_DELAY);

到这一句,过几秒系统就崩了。

yzt233 发表于 2025-4-25 16:49

{:handshake:}

probedog 发表于 2025-4-25 19:00

检查中断向量表是否正确配置。

shuwei1984 发表于 2025-4-25 19:35

probedog 发表于 2025-4-25 19:00
检查中断向量表是否正确配置。

向量表是GD对应型号MCU的模版中给的,没有修改过

不对的话,这个程序根本就运行不起来。把连接那个函数注释掉,程序就能运行。

IAR中运行正常无问题

丙丁先生 发表于 2025-4-25 19:45

https://bbs.21ic.com/icview-3449080-1-1.html

shuwei1984 发表于 2025-4-25 20:58

丙丁先生 发表于 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,再对比看看。

丙丁先生 发表于 2025-4-25 21:51

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 22:09

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
查看完整版本: GD32H759 用vscode+eide开发的一些问题