实在不好意思,在下用的GD32H7,但考虑到GD32H7与stm32h7高度相似,咱论坛又是国内mcu水平相当顶尖环境,so...
先说现象:只要是gd32h7+tli(也就是LTDC)+exmc(也就是FMC)驱动sdram刷屏,并且启用了seggerRTT用于输出调试信息。不管是freeRTOS、rtt-nano还是裸机环境,只要让seggerRTT在开机时大量输出内容(比如初始化日志),那么随后在开启ltdc后,seggerRTT就会在明明没有软件调用它的前提下,大量输出历史信息,就好像是_SEGGER_RTT的upbuffer的rdOff的值跑飞了一样,大量输出之前已经输出过的内容,且内容长度不定,输出数量不定。sdram为16位宽、32MB、166MHz频率,屏幕是1024*600@RGB565.
比如:“[C] 纯文本查看 复制代码 int main(void)
{
sys_cache_enable(); /* 使能CPU cache */
// SEGGER_RTT_printf(0, "RTT TEST 0000: 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\r\n");
// SEGGER_RTT_printf(0, "RTT TEST 0001: 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\r\n");
// SEGGER_RTT_printf(0, "RTT TEST 0002: 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\r\n");
// SEGGER_RTT_printf(0, "RTT TEST 0003: 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\r\n");
// SEGGER_RTT_printf(0, "RTT TEST 0004: 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\r\n");
// SEGGER_RTT_printf(0, "RTT TEST 0005: 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\r\n");
// SEGGER_RTT_printf(0, "RTT TEST 0006: 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\r\n");
// SEGGER_RTT_printf(0, "RTT TEST 0007: 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\r\n");
// SEGGER_RTT_printf(0, "RTT TEST 0008: 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\r\n");
// SEGGER_RTT_printf(0, "RTT TEST 0009: 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\r\n");
// SEGGER_RTT_printf(0, "RTT TEST 0010: 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\r\n");
// SEGGER_RTT_printf(0, "RTT TEST 0011: 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\r\n");
// SEGGER_RTT_printf(0, "RTT TEST 0012: 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\r\n");
// SEGGER_RTT_printf(0, "RTT TEST 0013: 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\r\n");
// SEGGER_RTT_printf(0, "RTT TEST 0014: 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\r\n");
// SEGGER_RTT_printf(0, "RTT TEST 0015: 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\r\n");
// SEGGER_RTT_printf(0, "RTT TEST 0016: 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\r\n");
// SEGGER_RTT_printf(0, "RTT TEST 0017: 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\r\n");
// SEGGER_RTT_printf(0, "RTT TEST 0018: 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\r\n");
// SEGGER_RTT_printf(0, "RTT TEST 0019: 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\r\n");
delay_init(600); /* 延时初始化 */
usart_init(115200); /* 初始化串口 */
usmart_init(300); /* 初始化USMART */
led_init(); /* 初始化LED */
mpu_memory_protection(); /* 保护相关存储区域 */
sdram_init(EXMC_SDRAM_DEVICE0); /* 初始化SDRAM */
lcd_init(); /* 初始化LCD */
key_init(); /* 初始化按键 */
tp_dev.init(); /* 触摸屏初始化 */
timerx_int_init(10 - 1, 30000 - 1); /* 300 000 000 / 30000 = 10KHz 10KHz的计数频率,计数10次为1ms */
my_mem_init(SRAMIN); /* 初始化内部SRAM内存池 */
my_mem_init(SRAMEX); /* 初始化外部SDRAM内存池 */
my_mem_init(SRAMDTCM); /* 初始化内部DTCM内存池 */
my_mem_init(SRAMITCM); /* 初始化内部ITCM内存池 */
delay_ms(1000);
lv_init(); /* lvgl系统初始化 */
lv_port_disp_init(); /* lvgl显示接口初始化,放在lv_init()的后面 */
lv_port_indev_init(); /* lvgl输入接口初始化,放在lv_init()的后面 */
lv_demo_benchmark(); /* lvgl例程 */
//
while (1)
{
// tp_dev.scan(0); /* 触摸扫描 */
lv_task_handler(); /* lvgl的事务处理 */
}
} ”
这是裸机程序,那么看rtt-viewer输出:[C] 纯文本查看 复制代码 RTT TEST 0015: 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
RTT TEST 0016: 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
RTT TEST 0017: 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
RTT TEST 0018: 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
RTT TEST 0019: 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
RTT TEST 0000: 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
RTT TEST 0001: 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
RTT TEST 0002: 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
RTT TEST 0003: 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
RTT TEST 0004: 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
RTT TEST 0005: 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
RTT TEST 0006: 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
RTT TEST 0007: 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
RTT TEST 0008: 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
RTT TEST 0009: 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
RTT TEST 0010: 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
RTT TEST 0011: 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
RTT TEST 0012: 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
RTT TEST 0013: 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
RTT TEST 0014: 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
RTT TEST 0015: 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
RTT TEST 0016: 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
RTT TEST 0017: 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
RTT TEST 0018: 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
RTT TEST 0019: 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
RTT TEST 0000: 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
RTT TEST 0001: 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
RTT TEST 0002: 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
RTT TEST 0003: 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
RTT TEST 0004: 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
RTT TEST 0005: 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
RTT TEST 0006: 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
RTT TEST 0007: 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
RTT TEST 0008: 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
RTT TEST 0009: 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
RTT TEST 0010: 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
RTT TEST 0011: 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
RTT TEST 0012: 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
RTT TEST 0013: 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
RTT TEST 0014: 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
RTT TEST 0015: 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
RTT TEST 0016: 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
RTT TEST 0017: 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
RTT TEST 0018: 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
RTT TEST 0019: 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
0-19行内容被输出不止一次。调整过ltdc频率,当频率下降、swd频率下降时,重复输出的频率会降低,比如ltdc 15MHz、swd 500khz;当ltdc频率上升、swd上升时,重复输出频率增加,但也不是严格相关。
我gd32h7反复测试确认,之前运行好的例程,只要加上seggerRTT,马上复现;之前seggerRTT运行好好的程序,只要启动ltdc(tli),问题马上出现。
deepseek已经技穷,gpt表示他没思路了。群友表示有可能axi总线竞争,但我改了半天axi的QoS也没看到改善:[C] 纯文本查看 复制代码
void bsp_syscfg_axi_config(void) {
AXI_SPX_RDQOS_CTL(SLAVE_PORT0) |= ((0x0f) & AXI_SPX_RDQOS_CTL_RDQOS); /* 将 CPU 读 QoS 设为最高优先级 0xF */
AXI_SPX_RDQOS_CTL(SLAVE_PORT1) |= ((0x07) & AXI_SPX_RDQOS_CTL_RDQOS); /* 将 CPU 读 QoS 设为最高优先级 0xF */
AXI_SPX_RDQOS_CTL(SLAVE_PORT5) |= ((0x00) & AXI_SPX_RDQOS_CTL_RDQOS); /* 将 TLI 读 QoS 设为最低优先级 0x0 */
// AXI_MPXBM_ISS_CTL(MASTER_PORT4) |= AXI_MPXBM_ISS_CTL_RD_ISSOV; // 将EXMC的读发起能力限制为1
/* 限制TLI(MASTER_PORT5)的读发起能力为1 */
AXI_MPX_ISS_CTL(MASTER_PORT5) |= AXI_MPX_ISS_CTL_RD_ISSOV;
LOG_DBG_NORECORD("TLI SP5 RDQOS_CTL = 0x%08X\n", AXI_SPX_RDQOS_CTL(SLAVE_PORT5));
LOG_DBG_NORECORD("TLI SP5 WRQOS_CTL = 0x%08X\n", AXI_SPX_WRQOS_CTL(SLAVE_PORT5));
LOG_DBG_NORECORD("TLI SP5 ISS_CTL = 0x%08X\n", AXI_SPX_ISS_CTL(SLAVE_PORT5));
LOG_DBG_NORECORD("CPU SP1 RDQOS_CTL = 0x%08X\n", AXI_SPX_RDQOS_CTL(SLAVE_PORT1));
LOG_DBG_NORECORD("CPU SP1 WRQOS_CTL = 0x%08X\n", AXI_SPX_WRQOS_CTL(SLAVE_PORT1));
LOG_DBG_NORECORD("TLI SP5 RDQOS_CTL = 0x%08X\n", AXI_SPX_RDQOS_CTL(SLAVE_PORT5));
LOG_DBG_NORECORD("TLI SP5 WRQOS_CTL = 0x%08X\n", AXI_SPX_WRQOS_CTL(SLAVE_PORT5));
LOG_DBG_NORECORD("EXMC TARG4 BM_ISS_CTL = 0x%08X\n", AXI_MPXBM_ISS_CTL(MASTER_PORT4));
LOG_DBG_NORECORD("AXI_SRAM TARG6 BM_ISS_CTL = 0x%08X\n", AXI_MPXBM_ISS_CTL(MASTER_PORT6));
// /* 将 CPU 读 QoS 设为最高优先级 0xF */
// __AXI_SPX_READ_QOS_SET(SLAVE_PORT1, 0xF);
// /* 将 TLI 读 QoS 设为最低优先级 0x0 */
// __AXI_SPX_READ_QOS_SET(SLAVE_PORT5, 0x0);
}
我之前尝试降低ltdc频率、sdram频率,降低swd频率,把RTT控制块和上下缓存扔进TCM比如0x20000000,问题依旧出现。菜鸟实在是没招了,遂来论坛求助。
|