打印

GD32H759 用vscode+eide开发的一些问题

[复制链接]
465|21
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
shuwei1984|  楼主 | 2025-4-24 19:12 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 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编译的锅还是怎么回事儿。

使用特权

评论回复
5
shuwei1984|  楼主 | 2025-4-25 10:51 | 只看该作者
chenqianqian 发表于 2025-4-24 21:30
开源的话用eclipse加编译器插件开发模式

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

使用特权

评论回复
6
laocuo1142| | 2025-4-25 13:28 | 只看该作者
在编译选项中降低优化级别。

使用特权

评论回复
7
stormwind123| | 2025-4-25 13:31 | 只看该作者
GCC编译的工程可能未正确配置中断向量表或中断优先级。

使用特权

评论回复
8
probedog| | 2025-4-25 13:32 | 只看该作者
开源IDE工具可以试试Eclipse + GNU MCU Eclipse插件。

使用特权

评论回复
9
probedog| | 2025-4-25 13:32 | 只看该作者
本帖最后由 probedog 于 2025-4-25 13:34 编辑

使用特权

评论回复
10
flycamelaaa| | 2025-4-25 14:03 | 只看该作者
LWIP的内存分配可能与GCC的内存管理实现不兼容,导致内存泄漏或越界。

使用特权

评论回复
11
shuwei1984|  楼主 | 2025-4-25 14:18 | 只看该作者
laocuo1142 发表于 2025-4-25 13:28
在编译选项中降低优化级别。

不优化方式也是一样

使用特权

评论回复
12
shuwei1984|  楼主 | 2025-4-25 14:19 | 只看该作者
stormwind123 发表于 2025-4-25 13:31
GCC编译的工程可能未正确配置中断向量表或中断优先级。

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

使用特权

评论回复
13
shuwei1984|  楼主 | 2025-4-25 14:23 | 只看该作者
flycamelaaa 发表于 2025-4-25 14:03
LWIP的内存分配可能与GCC的内存管理实现不兼容,导致内存泄漏或越界。

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

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

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

使用特权

评论回复
14
yzt233| | 2025-4-25 16:49 | 只看该作者

使用特权

评论回复
15
probedog| | 2025-4-25 19:00 | 只看该作者
检查中断向量表是否正确配置。

使用特权

评论回复
16
shuwei1984|  楼主 | 2025-4-25 19:35 | 只看该作者
probedog 发表于 2025-4-25 19:00
检查中断向量表是否正确配置。

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

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

IAR中运行正常无问题

使用特权

评论回复
17
丙丁先生| | 2025-4-25 19:45 | 只看该作者
https://bbs.21ic.com/icview-3449080-1-1.html

使用特权

评论回复
18
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,再对比看看。

使用特权

评论回复
19
丙丁先生| | 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

使用特权

评论回复
20
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_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。
*  终端将被任务重用,按任意键关闭。

这两个小问题暂时不知道如何解决

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

11

帖子

0

粉丝