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

时间:2018-09-27 22:14:19

标签: corruption freertos heap-corruption memory-corruption

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

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

1 个答案:

答案 0 :(得分:0)

要快速解决问题,

我通过注释掉该功能来随机禁用 D缓存

SCB_EnableDCache();

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

要长期有效地解决问题,

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

更多详细信息:Level 1 cache on STM32F7 Series and STM32H7 Series