C7x:CPU NLC 模块在中断时未清除状态
详细信息:
在以下情况下将会发生数据损坏:
- 一个应用程序正在运行,并涉及任务切换。在这种情况下,至少有 2 个任务可能使用 NLC。
- 当为任务 A 提供中断时,发出了一条 NLCINIT,然后是 TICK。此操作最终会设置 NLC 模块中的一些内部状态,说明我们需要在下一条 TICK 时将 ILCNT_INIT 值重新加载到 ILCNT,因为它计算出的转发用例已刷新。在接到中断时,该状态未被正确清除。
- ISR 执行任务切换并切换到任务 B,任务 B 也在运行 NLC 代码。要返回到的 NLC 代码需要继续进行,并且其 ILCNT_INIT 值与原任务中的 NLC 循环不同。
- 从 ISR 返回后,下一条 TICK 会因状态损坏最终将 ILCNT 设置为错误的值 (ILCNT_INIT - 2)。
此时 ILCNT 已损坏,NLC 循环将执行错误次数的迭代,从而导致数据损坏。
权变措施:
在保存上下文的过程中,在 ISR 中发出 NLCINIT(参数无关紧要,随后无需发出 TICK/BNL)。权变措施不会影响性能。