大家好,我的环境是VSCode+PlatformIO+OpenOCD,在搭建ch32v的开发环境,目前能够编译和烧写代码,代码烧录后的运行情况和预期不同,试图进行调试,该过程中出现如下问题:
完成GPIO配置后,main函数里有下述语句:
GPIOD->OUTDR |= GPIO_Pin_3; GPIOD->OUTDR &= ~GPIO_Pin_3; GPIOD->OUTDR |= GPIO_Pin_3; GPIOD->OUTDR &= ~GPIO_Pin_3; GPIOD->OUTDR |= GPIO_Pin_3; GPIOD->OUTDR &= ~GPIO_Pin_3;
当进行单步调试时,随着逐语句执行,开发板上与PD3相连的LED按照预期亮和灭。但是一旦加入一些最简单的延时代码后:
void delay(uint32_t val) { for (int i = val; i > 0; --i) { volatile int j = 1000; while (--j); } } int main() { // ... GPIO clock enable and initialization while (1) { GPIOD->OUTDR |= GPIO_Pin_3; delay(1000); GPIOD->OUTDR &= ~GPIO_Pin_3; delay(1000); } return 0; }
编译烧录后PD3的LED表现为常亮,当开启调试模式,执行到delay(1000)这一行并试图step over的时候,CPU似乎进入了复位,LED熄灭,调试终端持续打印:
Info : [wch_riscv.cpu.0] Hart unexpectedly reset!
[wch_riscv.cpu.0] Hart unexpectedly reset!
Info : [wch_riscv.cpu.0] Hart unexpectedly reset!
[wch_riscv.cpu.0] Hart unexpectedly reset!
Info : [wch_riscv.cpu.0] Hart unexpectedly reset!
[wch_riscv.cpu.0] Hart unexpectedly reset!
......
然而将上述代码while(1)中的两行GPIO赋值语句顺序颠倒后(即先关闭LED, 延时,再打开LED),烧录运行后表现为LED不亮。
请问上述调试报错表示哪里出现了问题?该现象是否是说明代码一旦执行到某个函数调用,就会自己崩掉?