[WDT-3.15] ESP32 芯片特定条件下会出现 live lock 导致中断看门狗错误

影响版本: v3.0 v3.1

描述

使用芯片版本 v3.0,当程序同时满足下列条件时,会出现 live lock(活锁)现象,导致 CPU 一直处于访存状态,不能继续执行指令。

  1. 双核系统;

  2. 四条访问外存的指令/数据总线 (IBUS/DBUS) 中,有 3 条总线同时发起对同一个 cache 组的访问请求,并且三个 cache 请求均缺失。

变通方法

发生 live lock 时,软件主动或被动识别并解锁 cache line 竞争,之后两个核按队列节拍分时完成各自的 cache 操作,解锁 live lock。详细过程如下:

  1. 当两个核执行的指令均不在代码临界区中时出现 live lock,系统各类型中断会主动解除 cache line 竞争,解锁 live lock;

  2. 当两个核执行的指令位于代码临界区中时出现 live lock,在临界区中,系统会屏蔽 3 级及以下中断。因此软件预先为两个核各设置一个高优先级(4 级或 5 级)中断,将它们绑定到同一个定时器,并选择合适的定时器超时门限。由于 live lock 产生的定时器超时中断会迫使两个核均进入高优先级中断处理程序,从而释放两个核的 IBUS 以达到解锁 live lock 目的。解锁过程通过 3 个阶段完成:

    1. 第 1 阶段两个核均进行等待以清空 CPU write buffer;

    2. 第 2 阶段一个核 (Core 0) 等待,另一个核 (Core 1) 执行;

    3. 第 3 阶段 Core 1 等待,Core 0 执行。

解决方案

暂无 修复计划。