镜像地址和实际地址的作用分别是做什么啊?


我在烧写程序结束后,去读取烧写的数据和flash中的数据时,发现对比的flash数据是镜像地址中的时候,对比的数据会出错;对比的数据是flash的实际地址时,数据检验通过,这是为什么啊!!

按我的理解,实际地址和镜像地址的数据应该是一样的,是时序的原因吗?

新人求大佬详细讲解一下,谢谢!!

Parents
  • 这块你要重点看一下,strartup.c 这个文件,flash数据区域的访问属性:把文件拉到头看一下,这个属性的意思,你看一下属性是如何设置的。一般如果是 non_sharealbe, 那么数据是对的吧。如果是outer_shareble, 那么数据落盘会有时延,每隔一段时间统一落盘。看 N2L的镜像地址是outer_shareble, 那么数据落盘有时延,就会有不一致的时候。outer_shareble的意义在于访问数据更快。

  • 是的,flash数据区域的访问属性我看了一下,

    如果是 NON_SHAREABLE ,那么数据就是对的,因为在NON_SHAREABLE 模式下,数据不会被缓存到cache,所有 observer 看到的内存是一致的

    是 OUTER_SHAREABLE 的时候,数据的最后一部分就会不一致。core在读取的时候会被缓存到每个core,对这个有点不理解,按照手册上说明的,应该是每个core读取到的数据是一致的,但是在校验时读取的数据和预想的数据不一致,这个不是很理解

  • 你可以用内存屏障相关的指令操作试一下。我这里给你一些参考:

    在ARM架构中,通常使用内存屏障(memory barrier)来确保共享内存的内存一致性。内存屏障是一类指令,用于控制读写操作在处理器中的顺序,以确保多个处理器核心对共享内存的访问保持一致。

    1.“DMB”(Data Memory Barrier):用于确保数据写回内存的顺序,以及对共享内存的读写操作在内存屏障之前的所有操作都已完成。

    2.“DSB”(Data Synchronization Barrier):用于确保对共享内存的读写操作在内存屏障之前的所有操作都已完成,同时阻塞处理器中的指令重排和流水线操作。

    这些内存屏障指令可以用于确保共享内存的数据一致性和可见性。具体使用哪种内存屏障指令以及何时使用取决于系统架构和编程需求。建议参考ARM Cortex R52处理器的技术文档和编程手册,以了解适用于你的系统的具体指令和使用方法。

    你也可以试着修改页表属性看看。

Reply
  • 你可以用内存屏障相关的指令操作试一下。我这里给你一些参考:

    在ARM架构中,通常使用内存屏障(memory barrier)来确保共享内存的内存一致性。内存屏障是一类指令,用于控制读写操作在处理器中的顺序,以确保多个处理器核心对共享内存的访问保持一致。

    1.“DMB”(Data Memory Barrier):用于确保数据写回内存的顺序,以及对共享内存的读写操作在内存屏障之前的所有操作都已完成。

    2.“DSB”(Data Synchronization Barrier):用于确保对共享内存的读写操作在内存屏障之前的所有操作都已完成,同时阻塞处理器中的指令重排和流水线操作。

    这些内存屏障指令可以用于确保共享内存的数据一致性和可见性。具体使用哪种内存屏障指令以及何时使用取决于系统架构和编程需求。建议参考ARM Cortex R52处理器的技术文档和编程手册,以了解适用于你的系统的具体指令和使用方法。

    你也可以试着修改页表属性看看。

Children
No Data