写超过8次到VES flash?

了解更多常见问题教程

7个职位/ 0个新职位
最后发表
andoridfm2013
离线
最后看到:2个月1个星期前
加入:2017-04-07 05:11
写超过8次到VES flash?

嗨,对话框中,

我想知道当我在VES中写太多的时候会发生什么。例如,假设vepartition_entry_size / AD_NVMS_VES_MULTIPLIER = 128 / 8 = 16 kBytes。将16kB的数据写入8次后,所有空间将被占用。如果我写超过8次呢?在写入第9个16kB之前,我应该擦除整个VES 128kB flash吗?

谢谢你!

设备:
PM_Dialog
离线
最后看到:12小时16分钟前
工作人员
加入:2018-02-08 11:03
嗨andoridfm2013,

嗨andoridfm2013,

请参阅2.4.2节。大的Flash适配器的概念教程。根据他的教程:

VES驱动程序在断电和佩戴保护的情况下提供对分区入口的访问。为了实现这一点,VES驱动程序将数据写入闪存中的随机位置,而无需在同一位置被修改时擦除整个扇区。这是通过为同一个用户提供的地址写入不同的闪存位置来实现的。VES驱动程序提供虚拟寻址,即在进行读写操作之前,将用户指定的地址转换为真实的闪存位置。要实现此功能,flash大小必须大于用户可见的寻址空间。一个常见的经验法则是需要的虚拟EEPROM大小的8倍。

该规则在SDK中使用AD_NVMS_VES_MULTIPLIER宏,可以在ad_nvms_ves_h头文件中找到。特别地,对于1mbyte闪存模型,通用分区是128kbytes (0x20000),因此虚拟地址空间大约是:

partition_entry_size / AD_NVMS_VES_MULTIPLIER = 128 / 8 = 16 kBytes。

此外,闪存扇区被划分为若干个容器,其中每个容器保存一系列虚拟EEPROM地址的数据。容器的大小在编译时可配置为2n字节,默认情况下使用AD_NVMS_VES_CONTAINER_SIZE宏在ad_nvms_ves.h中配置为64字节。

一个存储在RAM中的容器分配表(CAT)用于跟踪有效容器的位置,一个扇区分配表(SAT)保存每个扇区的状态(%dirty, free)。容器的选择大小是CAT所需的RAM数量和每个扇区潜在的擦除周期数之间的权衡。容器的大小越小,占用的RAM越多。特别地,CAT中的每个条目由2个字节组成。因此,在我们的例子中,对于12kbytes的虚拟EEPROM,计算占用RAM的公式为:12288 / (64- 4)= 205 CAT entries = 205 * 2 = 410字节。

注意:VES特性只应该在频繁地在flash中写入/修改一小块数据时使用。如前所述,唯一标记为VES的区域是NVMS_GENERIC_PART分区项。Dialog提供的BLE持久存储机制使用这个分区条目,因此必须启用VES特性。否则,所有相关操作都会失败。

您能说明一下您对VES的要求是什么,您想要完成什么吗?

谢谢,PM_Dialog

andoridfm2013
离线
最后看到:2个月1个星期前
加入:2017-04-07 05:11
嗨PM_Dialog,

嗨PM_Dialog,

感谢您的及时回复。我读过的Flash适配器的概念

我想将错误打印日志保存到flash中,以便android应用程序可以稍后读取它来检查为什么发生了错误。

我们的android应用程序有时BLE连接中断,重新连接也失败,因为很难轻易重现这个问题(它每1~2周发生一次),所以我们不能在实验室用RS232打印测试它,而是尝试在它发生后收集错误上下文。分区LOG_PART用于其他目的,所以我必须使用NVMS_GENERIC_PART。由于我们不知道问题发生的时间,在问题发生之前可能会保存大量的打印日志,flash将不时被覆盖。

我理解VES的机制是写到flash的不同位置,以避免频繁擦除flash,但每个flash扇区都会有机会在长时间运行后被写一次。如果CAT找不到任何没有写过的地方怎么办?

例如:有128kB/8 = 16kB的VES。

1.当向它写入16kB时,第一个16kB被写入,

2.当覆盖16kB时,第一个16kB将被标记为'dirty',第二个16kB将被使用。

3.等等……当覆盖16kB 8次时,所有128kB将是脏的。

4.如果覆盖16kB 9次会怎样?所有的闪光都是肮脏的。谁来负责擦掉之前肮脏的8 16kB?我应该擦除整个VES flash还是SDK来处理它?

如果SDK处理所有擦除。这是否意味着我可以覆盖16kB的次数,因为它是在闪存擦除限制?如果是这种情况,我将在那个16kB的VES闪存上写一个环形缓冲区,以保持写入打印日志到它。

希望这能解释清楚。

谢谢你!

PM_Dialog
离线
最后看到:12小时16分钟前
工作人员
加入:2018-02-08 11:03
你好,

你好,

对于记录数据,我们强烈建议使用LOG分区——您不应该使用VES。NVMS_GENERIC_PART条目用于存储通用数据,如绑定数据。它不应该用于记录数据。为什么不增加LOG分区来存储日志记录数据?

谢谢,PM_Dialog

andoridfm2013
离线
最后看到:2个月1个星期前
加入:2017-04-07 05:11
嗨PM_Dialog,

嗨PM_Dialog,

谢谢你的回复。我们的产品已经交付给客户。增加LOG分区是Suota做不到的,是吗?所以我们必须对当前(默认)闪存分区进行操作。

我在project中搜索关键字“NVMS_GENERIC_PART”,它根本没有被使用。如果VES驱动程序将在通用部分的所有可用空间写完后处理擦除任务。我想保存原木没问题吧?

谢谢你!

andoridfm2013
离线
最后看到:2个月1个星期前
加入:2017-04-07 05:11
嗨PM_Dialog,

嗨PM_Dialog,

顺便问一下,你上面提到的“绑定数据”是什么?在源代码的某个地方,我可以参考一下吗?

谢谢你!

PM_Dialog
离线
最后看到:12小时16分钟前
工作人员
加入:2018-02-08 11:03
嗨andoridfm2013,

嗨andoridfm2013,

通常,我们强烈不建议在SUOTA期间修改分区,特别是如果它是一个产品的话。

只增加LOG分区,如果其他分区没有改变(相同的地址和相同的长度),并且没有任何重叠,则有可能增加LOG分区。换句话说,如果在LOG分区的末尾有一个空的flash间隙,那么可以通过执行SUOTA来增加它。但是,在这种情况下,您必须在启动期间编写自己的代码,以便擦除之前的分区。它不是直接的实现,也不推荐使用。

如果是通用部分,则标记为VES,应该用于小块的数据。该分区由BLE管理器访问,并包含所有BLE相关信息。如果它被用于日志记录,那么访问数据将会非常慢。

关于你的最后一个问题,请参阅以下使用指南的第7节:

//www.xmece.com/sites/default/files/um-b-044-da1468x_software_platform_reference_6v0.pdf

谢谢,PM_Dialog