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.

[参考译文] CC2642R:CC2642 的内存问题

Guru**** 2964790 points

Other Parts Discussed in Thread: SYSCONFIG

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

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/1657111/cc2642r-memory-issues-of-cc2642

器件型号: CC2642R
主题: SysConfig 中讨论的其他器件

尊敬的 TI 支持工程师:
我目前使用的是 RTLS_Coordinator 项目。 我需要通过 BLE 广播实现无源连接和 RSSI 值收集、并执行几个定制应用任务。 为了减少内存占用量、我想检查是否可以禁用工程中的未使用任务。
应用程序当前在运行时崩溃、执行路径中的内存分配失败:iCall_createRemoteTasks→Task_create→Memory_alloc。
我是否可以通过 SysConfig 禁用未使用的模块以减少内存消耗?
此致、
 
邓俊杰
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    在为 CC2642 构建 RTLS_Coordinator 工程时、我看到我仅使用 16%的 RAM(77857 中的 12536 字节)。 您能否重新构建项目并运行“View > Memory Allocation“以查看您的内存使用情况?

    另一件事可能是您没有为堆分配足够的内存。 您是否知道您使用的堆策略以及堆大小是多少? 您可以共享地图文件吗?

    如果要优化应用的存储器、删除 SysConfig 中的 UART 等未使用的模块将减少存储器消耗。 我不建议删除线程、因为它们都是应用程序所必需的。 如果您认为问题是您没有足够的堆(我认为这不是问题)、可以尝试查看用户指南的这一章。

    此致、
    Lea

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好:
    下图显示了我的内存分配图。
    我采用的自动分配策略记录在我的地图文件中:
    20013c00  heapEnd
    200089d8  heapStart


    堆大小约为 44KB。
    但是、在此配置下仍无法创建我的一些自定义任务。
    我们在运行时实现动态任务创建。
    期待您的答复。
    邓俊杰
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    使用 CCS 时、您应该能够使用 RTOS 对象查看器查看应用程序的堆使用情况。 当应用程序未能分配任务时、能否向我显示 RTOS 对象查看器的堆相关数据? 您尝试为此任务分配多少? 是否在创建此任务之前进行任何堆分配?

    此致、
    Lea

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 Lea:
    ROV 工具无法识别我使用 TI-RTOS 构建的工程;它仅显示 FreeRTOS 模块、根本不显示 TI-RTOS 模块。 我的工程基于 SDK 8.32 中的 RTLS_Coordinator 示例开发、使用 TI-RTOS7 内核和 ticlang 编译器。
    初步计算表明、仅我们的任务和消息队列就至少需要 25 KB 的堆内存、而不考虑各种分散的动态内存分配产生的开销。
    我们的主要问题并不限于堆内存不足、我们还会遇到 Task_checkStacks 在运行时检测到的栈溢出。 下面提供了完整调用栈:
    Thread_can_TX_handle(分配的栈大小:1024 字节)
    →can_hw_send_msg
    →sya_can_send→can_write(通过 SPICC26X2DMA 驱动外部 TCAN455X 芯片)
    →OS_SEM_WAIT→SemaphoreP_Pend→Task_restore→Task_schedule
    →Task_checkStacks→Error_raiseX
    在任务切换期间、Task.c 中的第 481 行会触发 Task_checkStacks 栈验证错误。 CAN 传输线程通过 OS_THREAD_CREATE 创建、仅分配一个 1024 字节的栈。 CAN 驱动程序通过支持 DMA 的 SPICC26X2DMA SPI 外设与外部 TCAN455X CAN 收发器通信。 在进入 can_write 函数之前、can_hw_send_msg 链的调用栈已几乎占据全部栈容量。 后续 SPI DMA 传输逻辑会消耗额外的栈空间、最终导致栈溢出故障。
    我有两个问题需要您的建议:
    1. CAN_WRITE→TCAN455X→SPICC26X2DMA 调用路径消耗的典型堆栈深度是多少? 一个 1024 字节的栈通常是否足以用于此平台上的 CAN TX 线程? 如果容量不足、建议配置多大的栈?
    2. 我不需要 RTLS 功能。 我可以禁用 RTLS 来减少整体存储器占用空间吗? 我的应用只需要 BLE 功能和 RSSI 采集。
    此致
    Dengjunjie
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    我不知道推荐用于此类用途的栈深度是什么。 我建议您采取的步骤是大量增加栈、运行函数并在 RTOS 对象查看器中查看任务的栈峰值。 RTOS 对象查看器在 CCS 20 上不适用于 tirtos、但应该在 CCS 12 中按预期运行。

    相同。 BLE 堆栈可以使用 HCI_ReadRssiCmd 函数和连接索引获取 RSSI。 如果您不需要 RTLS、可以将其从 SysConfig 中删除。

    此致、
    Lea