This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] RTOS/CC2640R2F:读取/写入闪存

Guru**** 2393725 points
Other Parts Discussed in Thread: CC2640R2F

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/717481/rtos-cc2640r2f-read-write-flash

器件型号:CC2640R2F
主题中讨论的其他器件: SimpliciTI

工具/软件:TI-RTOS

你(们)好。  

我想更好地了解 CC2640R2F 中闪存的组织方式。

我正在使用 SimpleBLEPeripheral 和 EmptyProject 的修改版本。

基本上、我有一个传感器、我需要从该传感器以1KSA/s 的速度对数十个数据进行采样 使用板载12位 ADC、大约为15KB。 在这些方面、我计划在通过 BLE 发送结果之前进行一些处理。  

在给定20KB SRAM 的情况下、我无法将所有这些采样保持在 SRAM 中进行处理、因此我想将它们保存在闪存中。

我知道用于读取/写入闪存的 NVS 函数、我有一些疑问:

  1. 我只读了2页4KB。 如果我有更多的可用闪存、为什么不能使用它?
  2. 在这个线程之后  、我能够将一个数组分配到闪存中。 当我尝试使用基本 C 语法(array[索引]= foo;)对其进行写入时,程序会挂起。 那么、我该如何写入它呢?
  3. 我还尝试更改链接器.cmd 文件并将.bss 段放入闪存中。 我成功地将全局大数组分配到闪存中、但我注意到、当调试程序时、加载完成后立即启动(通常程序在加载后在 main 的开始处停止)、但我无法理解它在何处挂起(类似于第2点)。

您会推荐什么? 请注意、我实际上不需要永久存储、数据可以在处理后擦除、并通过 BLE 进行传输。

此致、

插孔

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我认为从您的应用中继续写入内部闪存并不好、我建议您使用外部 EEPROM 或闪存进行此类存储。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你好,YK Chen,
    感谢您的回答。

    该板还包括一个通常用于存储的 SPI micro SD 卡。 但是、在不存在 micro SD 的情况下、器件也必须正常工作。 在这种情况下、我考虑使用内部闪存。

    将来的修订版肯定会考虑移除 SD 卡并添加外部存储器。 同时、您能否为我的问题建议最佳方法?

    此致、
    插孔
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Jack:

    我只读了2页4KB。 如果我有更多的可用闪存、为什么不能使用它?

    理论上、您可以为闪存区域使用任意数量的可用页面、默认情况下、我们的 NVS 示例仅设置为使用2。 假设您使用的是 NVS 驱动程序、则会在板级配置文件中进行配置。

    该主题  

    我能够将一个数组分配到闪存中。 当我尝试使用基本 C 语法(array[索引]= foo;)对其进行写入时,程序会挂起。 那么、我该如何写入它呢?

    不能像对 RAM 空间寻址时那样写入闪存区域。 必须对闪存进行编程、例如可以使用 NVS 驱动程序来完成此操作。

     

    我还尝试更改链接器.cmd 文件并将.bss 段放入闪存中。 我成功地将全局大数组分配到闪存中、但我注意到、当调试程序时、加载完成后立即启动(通常程序在加载后在 main 的开始处停止)、但我无法理解它在何处挂起(类似于第2点)。

    为什么要将.bss 段放在闪存中(或全局大数组?)? 虽然在闪存中有常量、但任何其他非常量变量都没有意义。  

    通常、不建议为此目的使用内部闪存、因为由于写入/擦除周期受到限制、您的闪存最终会中断。 如上所述,您可能应该使用更适合这种情况的某种外部存储。

    如果您没有其他选项、我建议您查看 GpRAM 和 AUX RAM 如何用于扩展您的可用 RAM 空间。 您可能会将这些用作数据的临时存储器。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、M-W、

    感谢您的回答。

    我尝试了有关 NVS 驱动程序的其他选项、因为我在文档中没有找到有关支持的闪存页数的任何要点。 这是一个好消息、我会尝试一下并告诉您。

    我无法使用 AUX RAM 来实现此目的、因为我需要传感器控制器来确保根据指定的时序对模拟数据进行采样。 使用主处理器时、我担心 ADC 可能会被其他任务中断。 接下来、ISR 是否可以中断更高优先级的任务? 如果我有几个优先级为1的任务(用于管理 I2C 和 SPI 传感器)、几个 ISR (用于传感器的中断)和一个优先级为 ADC 的2的任务、该怎么办? 我认为中断应该优先处理任务、对吗? 是否有任何方法可以更改特定任务的此行为?

    我将尝试使用 GPRAM。 但是、我已经阅读过、这比常规 RAM 慢得多。

    此致、

    插孔

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 Jack:

    ISR 的优先级始终高于任务、其优先级基本为 Hwi > Swi >任务、您可以在其中调整任何 Hwi、Swi 或任务中的优先级间。

    即使 GPRAM 可能更慢、闪存操作也会比这慢得多。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、M-W、

    我再次进行此转换、因为我无法按照您建议的方式修改板级配置文件。

    [引用用户="M-W"]

    理论上、您可以为闪存区域使用任意数量的可用页面、默认情况下、我们的 NVS 示例仅设置为使用2。 假设您使用的是 NVS 驱动程序、则会在板级配置文件中进行配置。

    [/报价]

    不过、我更仔细地阅读了该文档、并且了解到 SNV 存储是通过默认范围为0x80到0x8F 的 ID 进行管理的。 由于每个 ID 可用于存储256字节、因此总可用空间为4KB、如文档中明确说明的那样。 现在、您说过我可以在理论上增加这个空间、但在这个线程中:

    我无法。 我想知道 SNV 驱动程序的限制是什么、只允许将16个 ID 用于用户存储。

    此致、

    插孔

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 Jack:

    NVS 驱动器和作为堆栈一部分的 SNV 实现之间存在差异。 只要您实际上有可用的闪存、NVS 驱动程序(如 TI 驱动程序中所示)就不会对可用的闪存容量施加任何限制。

    为了再次强调这一点、我不认为将 ADC 值作为临时存储保存到闪存是一个好主意、因为这会使您的闪存快速磨损、同时也会耗费大量时间。 当 SD 卡不可用时、您最好尝试扩展可用 RAM 的数量以适应数据。