政务网站设计方案,广州推广策划公司,手机网站底部固定菜单,网页界面设计的类别Cached ? Non-Cached#xff1f;
在阅读TC3XX的用户手册时#xff0c;在内存映射表中#xff0c;有两个segment都是Program Flash#xff0c;而且大小都一样是3M#xff0c;一个是segment 8 另一个是segment10 这难免让人产生疑惑#xff0c;二者区别在哪#xff1f; …Cached ? Non-Cached
在阅读TC3XX的用户手册时在内存映射表中有两个segment都是Program Flash而且大小都一样是3M一个是segment 8 另一个是segment10 这难免让人产生疑惑二者区别在哪
通过搜索在infineon开发者论坛中发现有人在问类似的问题我将该问题的解答分析一下。 同一块物理闪存存在于缓存区域和非缓存区域。主要的区别在于CPU访问它们的方式。 缓存地址访问如果CPU通过缓存地址访问闪存那么获取的数据会存储在CPU的缓存中。后续的任何访问都会使用缓存中的数据而不是物理读取闪存。这可以显著加快程序的执行速度。 非缓存地址访问如果使用的地址是非缓存的那么读取操作总是物理执行的也就是每次都直接从闪存中读取数据而不使用CPU缓存。
需要注意的是使用缓存数据的方法有一定的风险。如果你更改了闪存中的基础数据但CPU缓存中的数据还未更新那么CPU读取到的将是旧的数据。这可能会导致数据的不一致性。所以在处理闪存中的数据时我们需要考虑到这种可能的情况并设计出正确的数据同步或者更新策略。
二者的访问机制对比与安全机制的选择
进一步了解闪存读写的一些操作和可能的问题。
数据一致性的检查
最好在非缓存的闪存(Non-cached)上做检查因为这样可以确保读取操作真正发生。因为如果使用缓存地址进行读取操作那么如果闪存中的数据在读取到缓存后被修改那么CPU缓存中的数据将会与实际的闪存中的数据不同从而可能引发问题。
闪存的写入和擦除是通过reflashing完成的。但是写入/擦除操作是通过DMU数据管理单元中的命令序列完成的。所以如果CPU已经从闪存读取数据到其缓存然后有一些操作reflash了PFlash那么你会发现CPU缓存中的数据和PFlash中的数据不同。
需要注意的是reflash需要花费大量的时间所以在运行代码时CPU可能会尝试加载其他数据到缓存并且会注意到闪存不可用因为它正在被更改。这里期望的是进行这样操作的软件程序员会在代码中添加一些检查机制但是也有可能出现没有做这样的检查。
因此设计好的数据一致性策略和正确的程序检查机制在处理闪存数据时十分重要以防止因数据不一致而引发的问题。
假设你的安全机制是想要检查闪存数据的安全性。因此如果你从缓存地址运行如果数据已经在缓存中你所做的只是检查缓存内容是否正确 - 你不会检查到闪存本身路径的安全性。当数据进入缓存时你已经证明了路径是正常的但你并没有检查之后会发生什么。如果数据因为尚未在缓存中而必须被获取那么你无论如何都不会获得速度提升因为你仍然需要获取数据。
所以总结一下对于一个安全机制我会使用非缓存地址以确保我们真正测试的是我们感兴趣的路径的安全性。
数据安全机制的选择
数据管理单元DMU会在需要的时候被用于重新编程闪存所以在标准操作中它不应该被运行。
当数据存储在缓存中时应该受到ECC错误检测和纠正的保护ECC值与数据一起存储。因此当从缓存中读取数据时CPU将检查ECC并在出现不匹配时标记错误因此缓存中的数据是受保护的。
ECC是一种用于检测和纠正单个数据位错误的技术。在数据被存储到缓存中时会生成对应的ECC值。然后在读取缓存中的数据时会重新计算ECC并与原来的ECC值进行比较如果出现不匹配说明数据在存储过程中或者存储期间发生了错误CPU就会触发一个错误信号。 ESM错误信号模块旨在检查PFlash的内容 - 如果你从缓存中获取内容那么你的安全机制将不再测试PFlash你每次只是重新读取缓存的内容假设所有的数据都在那里。
因此如果你反复从缓存中读取你可以看到你在缓存中是否有永久性或非永久性的错误但你不会标记PFlash为损坏并刷新/替换一个字线。为了确保你真的在测试PFlash我认为ESM必须使用非缓存地址。这确保你真的在检查PFlash本身是否被损坏然后你可以使用结果来看你是否需要更换或刷新闪存。
对缓存的访问机制
闪存在物理上是相同的。所以当CPU使用缓存地址进行读取时它首先会检查缓存内容如果命中了它就会从缓存中返回数据。如果没有命中它会从PFlash中进行256位BTR4的读取并把内容存入缓存。如果它在顺序执行一个程序那么它很可能会去读取闪存中的下一个256位数据。还要注意PFlash内置了一个预取机制 - 它会去获取下一个256位的数据假设这就是CPU接下来需要的。
如果你从非缓存地址访问那么缓存将不会被检查它将直接从PFlash访问。然而它会获取它需要的数据而不是总是做一个BTR4/256位的读取。为了保持性能PFIPFlash接口会将从PFlash读取的256位数据存储在本地缓冲区中并从中提供获取直到地址进入下一个256位那时它将获取该数据尽管如果有空闲的预取缓冲区它可能会去获取下一个256位数据。
CPU是否继续步进和获取将取决于程序和它预测接下来需要什么。
所以闪存在物理上同时存在于两个地址空间而缓存则被用以提高CPU的访问速度。然而你的安全机制是为了测试实际的PFlash这就是为什么使用非缓存地址是一个更好的主意因为这样你就可以确保你正在测试你打算测试的内容。并且通过获取10个页面你还可以确保你已经清空了所有可能的缓冲区并且真正从闪存返回了数据。