嗨,对话框中,
我想知道当我在VES中写太多的时候会发生什么。例如,假设VESpartition_entry_size / AD_NVMS_VES_MULTIPLIER = 128 / 8 = 16 kBytes.将16kB的数据写入8次,占用全部空间。如果我写超过8次呢?在写第9个16kB之前,我需要擦除整个VES 128kB flash吗?
谢谢你!
嗨andoridfm2013,
请参见第2.4.2节。大的Flash适配器的概念教程。根据他的教程:
VES驱动器提供访问分区入口电源故障和佩戴保护。为了实现这一点,VES驱动程序将数据写入闪存中的随机位置,而不需要在同一位置被修改时擦除整个扇区。这是通过将同一用户提供的地址写入不同的flash位置来实现的。VES驱动程序提供了虚拟寻址,也就是说,在进行读写操作之前,用户指定的地址被转换为真实的flash位置。要做到这一点,flash的大小必须大于用户可见的寻址空间。一个常见的经验法则是所需的虚拟EEPROM大小的8倍。
该规则在SDK中使用AD_NVMS_VES_MULTIPLIER宏,可以在头文件ad_nvms_veses .h中找到。特别是,对于1mbyte的flash模型,通用分区是128kbytes (0x20000),因此虚拟地址空间是:
partition_entry_size / AD_NVMS_VES_MULTIPLIER = 128 / 8 = 16 kBytes。
此外,flash扇区被划分为若干个容器,每个容器保存一系列虚拟EEPROM地址的数据。容器的大小在编译时可配置为2n字节,默认情况下已使用AD_NVMS_VES_CONTAINER_SIZE宏配置为64字节。
存储在RAM中的容器分配表(CAT)用于跟踪有效容器的位置,扇区分配表(SAT)保存每个扇区的状态(%dirty, free)。容器的选择大小是CAT所需的RAM总量和每个扇区潜在的擦除周期数之间的权衡。容器的大小越小,占用的内存就越多。特别地,CAT中的每个条目由2个字节组成。因此,在我们这个12kbytes的虚拟EEPROM的例子中,计算被占用RAM的公式是:12288 / (64- 4)= 205 CAT条目= 205 * 2 = 410字节。
注意:只有当在flash中频繁写入/修改一小块数据时,才应该使用VES特性。如前所述,唯一标记为VES的区域是NVMS_GENERIC_PART分区条目。Dialog提供的BLE持久存储机制使用这个分区条目,因此必须启用VES特性。否则,所有相关操作都会失败。
你能告诉我你的要求是什么,你想用VES完成什么吗?
谢谢,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次呢?所有闪光灯都是脏的。谁将负责清除以前肮脏的816kb ?我应该擦除整个VES flash或SDK处理吗?
如果SDK处理所有的擦除。这是否意味着我可以重写16kB的次数,因为它是在flash擦除限制?如果是这种情况,我将在16kB VES闪存上写一个循环缓冲区,以保持向其写入打印日志。
希望这能解释清楚。
你好,
对于日志数据,我们强烈建议使用LOG分区-你不应该使用VES。NVMS_GENERIC_PART条目用于存储一般数据,比如绑定数据。它不应该用于记录数据。为什么不增加LOG分区来存储日志数据呢?
谢谢你的回复。我们的产品已经交付给客户了。增加LOG分区是Suota做不到的,对吗?所以我们必须对当前(默认)flash分区进行操作。
我搜索关键字“NVMS_GENERIC_PART”在项目中,它根本没有使用。如果VES驱动程序将在通用部分中所有可用空间写完后处理擦除任务。我认为存储日志应该是可以的,是吗?
顺便问一下,你上面提到的bonding data是什么意思?它在源代码的某处,我可以参考请?
一般来说,我们强烈不建议在SUOTA期间修改分区,特别是如果它是一个产品的话。
增加ONLY the LOG分区是可能的,如果任何其他分区没有改变(相同的地址和长度),如果没有任何重叠。换句话说,如果在LOG分区的末尾有一个空的flash间隙,那么可以通过执行SUOTA来增加它。但是,在这种情况下,您必须在启动时编写自己的代码,以便删除以前的分区。这不是直接的实现,不推荐使用。
对于GENERIC部分,这被标记为VES,并且应该用于一小块日期。BLE管理器访问这个分区,并包含所有BLE相关信息。如果它用于日志记录,那么访问数据将会非常慢。
关于你的最后一个问题,请参阅以下用户指南第七节:
//www.wsdof.com/sites/default/files/um-b-044-da1468x_software_platform_reference_6v0.pdf
嗨andoridfm2013,
请参见第2.4.2节。大的Flash适配器的概念教程。根据他的教程:
VES驱动器提供访问分区入口电源故障和佩戴保护。为了实现这一点,VES驱动程序将数据写入闪存中的随机位置,而不需要在同一位置被修改时擦除整个扇区。这是通过将同一用户提供的地址写入不同的flash位置来实现的。VES驱动程序提供了虚拟寻址,也就是说,在进行读写操作之前,用户指定的地址被转换为真实的flash位置。要做到这一点,flash的大小必须大于用户可见的寻址空间。一个常见的经验法则是所需的虚拟EEPROM大小的8倍。
该规则在SDK中使用AD_NVMS_VES_MULTIPLIER宏,可以在头文件ad_nvms_veses .h中找到。特别是,对于1mbyte的flash模型,通用分区是128kbytes (0x20000),因此虚拟地址空间是:
partition_entry_size / AD_NVMS_VES_MULTIPLIER = 128 / 8 = 16 kBytes。
此外,flash扇区被划分为若干个容器,每个容器保存一系列虚拟EEPROM地址的数据。容器的大小在编译时可配置为2n字节,默认情况下已使用AD_NVMS_VES_CONTAINER_SIZE宏配置为64字节。
存储在RAM中的容器分配表(CAT)用于跟踪有效容器的位置,扇区分配表(SAT)保存每个扇区的状态(%dirty, free)。容器的选择大小是CAT所需的RAM总量和每个扇区潜在的擦除周期数之间的权衡。容器的大小越小,占用的内存就越多。特别地,CAT中的每个条目由2个字节组成。因此,在我们这个12kbytes的虚拟EEPROM的例子中,计算被占用RAM的公式是:12288 / (64- 4)= 205 CAT条目= 205 * 2 = 410字节。
注意:只有当在flash中频繁写入/修改一小块数据时,才应该使用VES特性。如前所述,唯一标记为VES的区域是NVMS_GENERIC_PART分区条目。Dialog提供的BLE持久存储机制使用这个分区条目,因此必须启用VES特性。否则,所有相关操作都会失败。
你能告诉我你的要求是什么,你想用VES完成什么吗?
谢谢,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次呢?所有闪光灯都是脏的。谁将负责清除以前肮脏的816kb ?我应该擦除整个VES flash或SDK处理吗?
如果SDK处理所有的擦除。这是否意味着我可以重写16kB的次数,因为它是在flash擦除限制?如果是这种情况,我将在16kB VES闪存上写一个循环缓冲区,以保持向其写入打印日志。
希望这能解释清楚。
谢谢你!
你好,
对于日志数据,我们强烈建议使用LOG分区-你不应该使用VES。NVMS_GENERIC_PART条目用于存储一般数据,比如绑定数据。它不应该用于记录数据。为什么不增加LOG分区来存储日志数据呢?
谢谢,PM_Dialog
嗨PM_Dialog,
谢谢你的回复。我们的产品已经交付给客户了。增加LOG分区是Suota做不到的,对吗?所以我们必须对当前(默认)flash分区进行操作。
我搜索关键字“NVMS_GENERIC_PART”在项目中,它根本没有使用。如果VES驱动程序将在通用部分中所有可用空间写完后处理擦除任务。我认为存储日志应该是可以的,是吗?
谢谢你!
嗨PM_Dialog,
顺便问一下,你上面提到的bonding data是什么意思?它在源代码的某处,我可以参考请?
谢谢你!
嗨andoridfm2013,
一般来说,我们强烈不建议在SUOTA期间修改分区,特别是如果它是一个产品的话。
增加ONLY the LOG分区是可能的,如果任何其他分区没有改变(相同的地址和长度),如果没有任何重叠。换句话说,如果在LOG分区的末尾有一个空的flash间隙,那么可以通过执行SUOTA来增加它。但是,在这种情况下,您必须在启动时编写自己的代码,以便删除以前的分区。这不是直接的实现,不推荐使用。
对于GENERIC部分,这被标记为VES,并且应该用于一小块日期。BLE管理器访问这个分区,并包含所有BLE相关信息。如果它用于日志记录,那么访问数据将会非常慢。
关于你的最后一个问题,请参阅以下用户指南第七节:
//www.wsdof.com/sites/default/files/um-b-044-da1468x_software_platform_reference_6v0.pdf
谢谢,PM_Dialog