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.

[参考译文] CC2640R2F -优化的 RAM 使用

Guru**** 2589280 points


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

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/602139/cc2640r2f---optimized-ram-usage

您好,


我将 TI BLE 堆栈 v3.0.1与简单 BLE 外设一起用作示例库。

我们的项目需要额外的 RAM 来包含功能。

栈的读写数据占用1039字节的存储器。 (取自栈编译的.map 文件)

在应用中、IAR_Boundary.xcl 中 ICALL_ram0_start 地址被称为0x20003fe8

为了按堆栈使用未使用的空间,我们尝试更改 ICALL_RAM0_START 地址,但功能不能按预期工作。

是否可以通过更改 ICALL_RAM0_START 来将 RAM 用于应用?

提前非常感谢!

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

    不应该、您不应该修改边界文件-而应该使用来自传感器控制器的 RAM (如果您不使用它)或使用缓存作为 RAM 功能。

    software-dl.ti.com/.../platform.html

    或者减少静态 RAM 的使用并通过动态内存利用 ICall 堆

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

    你好,Rebel,

    感谢您的回复。 当我与 Krithiga 合作时、我想就您的答案发表评论:

    传感器控制器 RAM
    尽管其访问时间较慢、且后续的有效 cc2640r2更长、因此已在使用中、并且会对电池寿命时间产生负面影响。

    高速缓存
    由于(AFAIK)它的访问时间比 RAM 慢、所以听起来不是很吸引人、并且当从其内部闪存中取指令时、cc2640r2也被额外减慢。 再说一次、我希望对我们的电池寿命产生负面影响。

     

    减少静态 RAM 的使用
    这是我对 BLE 软件堆栈 v3.0.1的*完全*建议! 在应用方面、减少 RAM 的使用是不可行的、因为我们需要针对客户的用例实现一些数据处理。 更耗时的用例尚未实施。

     

    堆使用情况
    总的来说、这是一个好主意。 但是、在我们的具体案例中、我们必须处理两种类型的传感器数据、它们在体积上非常"不对称":

    sensor1:需要缓冲小于200字节
    Sensor2:需要缓冲3072字节、之后为12 KB

    因此、在分配 sensor2的缓冲器之前、IMO 并不能真正帮助释放 sensor1的缓冲器。

    此致、
    弗兰克。

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

    您好、Frank、

    堆栈链接器文件(在使用单独的堆栈和应用映像的情况下)为 ROM 中的代码使用的数据段保留大约3k 的数据;全局变量以及由此 ROM 代码的 cinit 初始化的数据段。 我想、这在.map 文件中隐藏在视图中、因为它只是保留的、不会在很大程度上链接、甚至不会被符号引用。

    关于缓存作为 GPRAM、您有一个问题、它将使应用程序运行速度稍慢、如果您需要在待机状态下保留内容、它还会增加一些恒定电流。 一位同事在100ms 广播间隔方案中测量了0.2µA μ A 以上的平均电流消耗。 您的里程可能会有所不同、但值得仔细研究和了解。 如果您能够忍受额外的电流消耗、那么这是一个8kB 的额外 RAM。 不过、我还不明白它比常规 RAM 慢。 您是否对此有参考或上下文?

    它也是动态使用 GPRAM 的选项。 这可以通过在睡眠模式中保留和不保留来实现
    1.调用 VIMSModeSet (VIMS_BASE、VIMS_MODE_DISABLED);//设置为 GPRAM [driverlib/VIMS.h]
    2.可选调用 Power_setConstraint (PowerCC26XX_SB_VIMS_Cache_retain)//在睡眠中保留高速缓存/gpram 内容[ti/drivers/power/PowerCC26XX.h]

    其中一个问题是链接器没有瞬态存储器的概念、因此最好不要使用指向此 RAM 区域的原始指针、也不要将变量声明为 NOINIT。 克拉姆的另一个问题是、如果 SNV 仅使用1个扇区而不是2个扇区、SNV 驱动器将在需要时盲目使用 GPRAM 区域进行压实。

    至于静态 RAM 的使用、如果禁用安全连接、则会节省~200字节。 如果您没有、还可以为包括空闲任务堆栈和 Hwi/主堆栈在内的各种任务减小堆栈的大小。 这应该在分析您的潜在最坏情况下的使用情况后完成、但可能有大约100个字节可以这样做。 您可以使用 Debugger -> Plugins ->TI-RTOS、然后菜单项 TI-RTOS ->Hwi-> Module 和 TI-RTOS -> Task -> Detailed 来查看 IAR 中的用法。 在 CCS 中、可在"Tools"->"RTOS Object View"下找到该选项。

    最后一种方法是、是否可以压缩存储器中的传感器数据? 我想熵不是很高、因此即使是像差分编码这样简单的东西也可以节省很多、但你的里程也可能会有所不同。

    此致、
    Aslak

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

    Hej Aslak、

    遗憾的是、您没有评论是否以及如何从20480字节中减少 BLE 软件堆栈的 RAM 使用。
    有机会、请允许我提供一些相关信息?

     

    请重新添加注释"堆栈链接器文件(如果您使用单独的堆栈和应用程序映像)为 ROM 中的代码使用的数据段保留约3k 的数据"。

    我从您的评论中了解到、由于是 ROM 代码、在这里几乎没有(只读:无)可做的事情。 我的理解是否正确?

    BTW:是的、我们使用单独的堆栈和应用程序映像。 如果我们不这样做、我们必须在应用程序中进行每次更改后重新认证我们的软件。 通过将应用程序和堆栈保持分离、我们必须仅在更改堆栈配置后运行重新认证。

     

    有关缓存用作 GPRAM 时程序执行速度较慢的问题

    我对缓存的理解是、cm3内核实现了从内部闪存中预取指令的一些策略。 然后、指令可以从缓存加载到 cm3的处理单元中、也就是说、RAM 的访问时间比内部闪存的访问时间更短。

    如果我们现在使用缓存作为 GPRAM、则需要从内部闪存读取每条指令(访问时间越慢意味着执行时间越长)、并且在它绝对确定接下来需要提取什么指令之前无法读取 (在处理单元完成条件分支指令中的跳转计算后)。

    此致、
    弗兰克。

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

    您好、Frank、

    我不确定我是否理解14kB。 当您说 stack 时、您意味着什么都不是您的应用程序 c 文件(如果愿意)、还是意味着堆栈映像?

    根据有关 ram0_start 的语句、应用程序映像的存储器范围应为0x20000000-0x20003fe8、即16.3kB。 因此、堆栈映像使用我提到的3k、您无法更改它、另一个 KB、总共0x5000-0x3fe8 = 4120b。

    在这些用于应用的16kB 空间中、空间按照.map 文件中所示分配、用于本地变量、堆栈等 剩下的任何内容都将提供给 iCall 堆。

    在 simple_peripheral 中、默认使用8KB、其中1KB 是 Hwi 堆栈、1.6KB 是 BLE 堆栈/任务结构(BIOS 堆)、440字节是 GAPRole 任务堆栈、640字节是应用堆栈、512字节是空闲任务堆栈。 大约4k。 可以减少这些堆栈。

    您认为缓存实际上会进行缓存、而当它是 RAM 时则不会进行缓存。 仍有一个有效的指令行预取、该指令为64位宽。 Thumb2指令等同于~4指令。

    我建议测试 GPRAM、看看您是否可以使用它。 如果您能提供有关14kB 的更多详细信息、这也会很有帮助。

    此致、
    Aslak

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

    您好、Aslak、

    在收到您的帖子之前、我的理解是基于我从软件开发部门的同事那里收到的信息、即以下数字:

     CC2640R2提供的20480字节 RAM
    -由 TI BLE 软件栈 v3.0.1 .hex 文件分配的14859字节(单独的图像)

    ========================================================================================================

    =当 CM3和传感器控制器之间不使用双端口 RAM 时、为应用剩余5621字节 RAM。
    CM3和传感器控制器之间具有+2048字节的双端口 RAM

    ===

    =当在 CM3和传感器控制器之间使用双端口 RAM 时、为应用剩余7669字节 RAM

     

    根据您的帖子、我认为我们的应用实际上具有16.3kB 的 RAM。 接下来、我将与来自发展部门的同事讨论您的帖子、并仔细检查上面的计算结果。

    在此之前、我将尝试按照您提供的数字进行操作:

    您说我们的应用实际上有16.3kB 的 RAM 可用。

    作为我们基于 TI 简单外设示例(用于 IAR 工具链)的应用程序、使用了大约8KB 字节、其中 HWI 堆、BIOS 堆、GAPRole 任务、应用任务、空闲任务使用了大约4KB 字节。

    这意味着大约4kBytes 被简单外设数据(变量和结构)使用、如果不是出于我们的目的、我们可以将这些数据进行微调。

    此时、大约16.3k 字节-(8k 字节- 4k 字节)=大约12.3k 字节剩余用于我们的应用数据。 请告诉我这是否正确。 否则、请告诉我出错的地方。

    谢谢、此致、
    弗兰克。

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

    弗兰克、

    我列出了 RAM 使用的主要影响因素、因此您的乐观减法有点错误。 在我没有说明的剩余4KB 中、您也有

    • 板级配置文件中的~570字节(驱动程序对象)、其中400字节为 Display 和 UART
    • 580字节用于射频驱动器
    • 497字节用于设备信息服务(这可以大幅减少、因为根据使用的配置文件、这些特性都是可选的)
    • 400字节 simple_gatt_profile、可完全删除
    • 1.5kB 其他内核
    • 577字节驱动程序全局变量。

    需要注意的是、您自己没有真正剩下的8k 系统 RAM、因为堆栈和应用程序需要动态地执行某些堆操作。 这因应用而异。

    我会邀请您熟悉 IAR 生成的.map 文件、因为它会向您(RTOS 和 ICall 堆除外)显示资金的确切使用位置。

    此致、
    Aslak