工具/软件:
在 FreeRTOS 环境中使用 SPI 时、我发现一个奇怪的竞态条件错误。 通过启用跟踪、我注意到如果 ClockP_timerTickISR 被 UDMA_eventIsrFxn 中断、则一些存储器似乎已损坏、例如 FreeRTOS 任务名称已清零。
我起初怀疑堆栈溢出、但我尝试增加所有任务(包括 IDLE 和 TIMER Svc)的堆栈大小、但似乎没有帮助。
我还尝试在 FreeRTOS 任务名称上启用数据断点、但无法达到要求(我发现很奇怪 — 我通过观察另一个全局变量来验证它是否有效,通过读取该位置的存储器可以看到该断点为 0(不过,我可能在某个地方犯了一个错误))。
更改 UDMA 中断优先级(已硬编码(!) 在 source/drivers/UDMA/UDMA_event.c 中、从 1 到 10 可修复问题(因为计时器中断硬编码为 9)。 这很有趣、因为这意味着 UDMA_eventIsrFxn 可能会被 ClockP_timerTickISR 中断、但反过来不会中断。 显然不是一个很好的解决方案。。。
在我们的代码中、SPI 充当从器件、我们将 48 个 3k 字节的块来回传输@ 50MHz、我们使用回调模式并从 ISR 开始下一次传输(通过调用 MCSPI_TRANSFER)。 我们为收到的每个块发布一个信标。 通过反复这样做,我们能够在几分钟内跳起来。 如果作为主器件运行、我预计会得到相同的结果、因此希望它很容易重现。
此致、
结束