奇怪的内存损坏问题,FreeRTOS,STM32F777II

Weird memory corruption issue, FreeRTOS, STM32F777II

我目前正在开发嵌入式固件,它在 STM32F777II 微控制器上使用 FreeRTOS 运行。在资源方面,我有大约 10 个优先级相同的任务(堆栈大小的总和将低于 40 KByte),大约 4 个队列,每个队列 1KByte,4 个二进制信号量。我知道如果不发布实际代码,这将是一个不完整的问题,但我的固件中确实没有任何我认为值得分享的与我的问题相关的特定部分。我的代码中有大量业务逻辑,我也无法完全共享。

我有一个结构,它由多个特定长度的 char 和 int 数组组成。其中 4 个任务分别使用这些结构。每个结构占用 space 的大约 15KByte,并且在 FreeRTOS 环境的全局 space 中定义,而不是任务的本地。这些结构仅是静态分配的,而不是在运行时动态分配的。而且由于我在声明时初始化了结构的几个成员,所以只有在我没有弄错的情况下它们才会转到 .data 部分。到现在为止,我的代码绝对没有任何问题,它 100% 正常工作,没有任何问题。现在我最近有一个要求,我必须将相同的结构添加到另外 2 个任务中。所以,我将这个 15KByte 结构添加到我的一个任务中,基本上只是分配和初始化,并没有在任何任务中进行任何处理。观察到没有问题,没有,没有数据损坏,没有。现在,当我再分配一个相同类型的结构变量时,我观察到项目中许多其他地方的数据损坏。一些队列停止正常工作并在读取时显示垃圾数据。其他一些缓冲区也显示数据损坏。我真的不确定为什么这个结构的另一个变量分配会在我项目的其他地方触发大量数据损坏。如果我删除这个分配,一切都会恢复正常。我的 MCU 有 512KB 的 RAM,根据 IDE 的构建分析器功能,它显示 RAM 使用率低于 40%,那么是什么触发了这个问题,有什么建议可以尝试吗?可能是因为 .data 或 .bss 部分重叠或其他原因?在此期间,我没有观察到系统中有任何堆栈溢出或硬故障。

为了快速解决问题,

我通过注释掉以下函数随机禁用了 D-cache

SCB_EnableDCache();

瞧,一切都开始正常运行,没有任何数据损坏的情况。

对于长 运行 和正确的分辨率:

我的编码似乎存在一些潜在问题。我需要查看内存使用情况以及具有不同属性的内存区域。查看总线,查看所有 DMA 使用情况和 MPU 内存设置。此外,检查易失性内存指令的正确用法、线程安全操作和 cache-coherency 问题。此外,根据需要使用内存防护和缓存刷新。

更多详情:Level 1 cache on STM32F7 Series and STM32H7 Series