Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何将数据添加到闪存中的某个段会使程序出错;什么时候?_C_Performance_Embedded_Real Time - Fatal编程技术网

C 如何将数据添加到闪存中的某个段会使程序出错;什么时候?

C 如何将数据添加到闪存中的某个段会使程序出错;什么时候?,c,performance,embedded,real-time,C,Performance,Embedded,Real Time,我有一个实时嵌入式应用程序,主循环频率为10KHz。它在配置为从闪存引导的TI TMS320C上运行。我最近在一个源文件中添加了一个初始化的数组,但突然之间,时间被搞砸了(这种方式太复杂了,无法很好地解释——实际上,串行端口写入不再按时完成) 这件事让我感到困惑: 我甚至没有访问新数据,只是声明了一个初始化的数组 它取决于大小-仅当数组>40个字时,才会出现问题 我知道链接映射中没有溢出任何数据段 没有数据缓存,因此这不是由于中断缓存一致性造成的 你有什么想法可以简单地增加flash中.ci

我有一个实时嵌入式应用程序,主循环频率为10KHz。它在配置为从闪存引导的TI TMS320C上运行。我最近在一个源文件中添加了一个初始化的数组,但突然之间,时间被搞砸了(这种方式太复杂了,无法很好地解释——实际上,串行端口写入不再按时完成)

这件事让我感到困惑:

  • 我甚至没有访问新数据,只是声明了一个初始化的数组
  • 它取决于大小-仅当数组>40个字时,才会出现问题
  • 我知道链接映射中没有溢出任何数据段
  • 没有数据缓存,因此这不是由于中断缓存一致性造成的
你有什么想法可以简单地增加flash中.cinit段的大小,从而影响代码的计时吗

其他信息:

我认为代码可能已经移动了,但它与数据分离得很好。我通过内存映射验证了所有代码段在bug之前和之后都有相同的地址。我还验证了没有一个段是满的-映射中唯一更改的地址是.cinit部分中的少数地址。该部分包含用于初始化ram中变量(如我的数组)的数据值。在调用main()之后,永远不应该访问它。

我的怀疑可能表明数据/代码与底层媒体/内存之间的对齐方式发生了变化。添加到数据中会改变堆中内存的位置(取决于内存型号),并可能使代码跨越闪存设备上的“页面”边界,从而导致以前没有的延迟。

初始化是否会覆盖另一段相邻的代码?
是否存在使用数组的结构或变量,这些结构或变量现在更大,并且可能导致堆栈溢出?

中也可能存在银行或页面冲突。可能您有两个经常调用的例程(中断处理程序等),它们位于同一页,现在分成两页。

也许新的静态分配数组将现有数据推送到较慢的内存区域,导致对该数据的访问变慢?

如果数组是其地址空间块中的最后一个对象,该问题是否会再次出现?如果没有,请查看您的地图,尝试移动数组声明,以便逐个地将放置在它之后的内容移动到它之前。通过这种方式,您可以精确定位相关对象,并开始找出移动它会导致延迟的原因。

我冒着自己的风险,声称您这里没有性能问题,而是某种内存损坏,表现为性能问题。将数组添加到可执行文件以更改内存图片。因此,我的猜测是,您的内存损坏基本上是无害的(即覆盖未使用的内存部分),并且将内存移动超过40个字节会导致内存损坏造成更大的问题。哪一个才是真正的问题

经过一天多的跟踪和组装,我想我找到了答案。 根本原因问题原来是一个设计问题,只有当启动串行端口写入的ISR与更高优先级的ISR冲突时,才会导致故障。正是由于在一个循环中添加了一些额外的指令,才导致两个中断发生冲突,这一点才得以实现

所以问题变成了:在闪存中存储而不是访问额外的数据是如何导致执行额外的指令的


答案似乎与弗罗斯蒂和弗雷德里科的建议有关,但并不完全相同。新数组确实会移动一些现有变量,但不会跨越页面边界或移动到较慢的区域(在此板上,所有区域的访问时间都应相同)。但是它确实改变了一些经常访问的结构的偏移量,这会导致优化器发出稍微不同的指令序列来访问它们。一个数据对齐可能会导致一个周期的管道暂停,而另一个不会。这几条指令改变了时间,足以暴露根本的问题。

好主意,但所有代码地址都没有改变-请参阅我的其他信息。看起来不是这样的。事实上,即使我这样做,问题也会出现:int数组[10]={1,2,3,4};在RAM中保留6个未初始化的字作为缓冲区以防溢出。如果数组[]用作函数的参数或函数中的自动变量,则将在堆栈上分配它。如果它没有初始化,也没关系。您是否有办法检查使用了多少堆栈?