|
近日通过OpenOCD调试NuttX,发现一个诡异问题,通过OpenOCD烧写NUTTX至STM32的Flash中,NuttX运行起来之后Openocd通信就出错了:
怀疑过STM32F405器件,也怀疑过STLink硬件或驱动,但通过以下实验均排除了:
1: 使用STlink V2烧写NuttX至STM32F405RGT6,存在问题;
2: 使用b-g431b-esc1集成的基于STM32F03的ST-Link烧写NuttX至STM32G31存在同样的问题.
在网上搜索,有人遇到过类似问题,并给了解决方案:
Error: jtag status contains invalid mode value – communication failure = SOLVED!
但NuttX那么大,到底有没有类似指令呢?在NuttX的issue中搜索也没找到答案,不得已,采用Code::Blocks单步调试NuttX,费了九牛二虎之力,终于定位到IDLE任务,它调用了stm32的idle函数:
#if !(defined(CONFIG_DEBUG_SYMBOLS) && defined(CONFIG_STM32_DISABLE_IDLE_SLEEP_DURING_DEBUG))
即:没使能CONFIG_DEBUG_SYMBOLS或没使能CONFIG_STM32_DISABLE_IDLE_SLEEP_DURING_DEBUG 则NuttX在空闲时就会调用WFI指令使STM32内核进入睡眠态以便省电.
由于CONFIG_DEBUG_SYMBOLS已经使能,只需再使能CONFIG_STM32_DISABLE_IDLE_SLEEP_DURING_DEBUG即可关闭WFI指令:
在System Type中选中Disable IDLE Sleep (WFI) in debug mode ,重新编译后问题解决
|
|