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.

[参考译文] RM48L930:如何将 os_heap 与 sysmem 相结合、或消除其中一个堆?

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/675845/rm48l930-how-to-combine-os_heap-with-sysmem-or-eliminate-one-of-these-heaps

器件型号:RM48L930

支持路径:/Product/Help、带器件选择/

您好!

我正在运行使用 HALCoGen 和 FreeRTOS 构建的 CCSv7项目。  在项目属性的 ARM 连接器-基本选项下、设置 C/C++动态内存分配的堆大小。  该存储 器位于.sysmem 中、在编译之后、.sysmem 的位置在创建的.map 文件中可见。  运行时支持库(rtsv7R4)中的 malloc()函数(file = memory.c)使用此堆区域。  C++运算符'new'的工作方式与我的代码中预期的一样。

另请注意、在 FreeRTOSConfig.h 中、configTOTAL_HEAL_SIZE 设置。  os_heap.c 中的 HALCoGen 代码使用此函数来创建其自己的堆(ucHEAP[])、该堆由 pvPortMalloc()使用。  pvPortMalloc()也按预期工作。  请注意,FreeRTOS 在创建任务和操作系统对象时使用 pvPortMalloc()。

因此、在我的当前设置中、我有2个不同的堆、如果每个堆被轻轻使用、这对于有限的 RAM 来说似乎是非常浪费的。  为什么 HALCoGen 有一个与运行时库分开的堆?  我可以合并这2个堆、以便最大限度地减小存储器占用空间吗?  您是否建议应用程序代码从不调用 pvPortMalloc(),而是使用 RTS 库(memory.c)中的 malloc()?

谢谢、

Keith

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

    与.sysmem 在 RAM 中的位置相关的后续问题。  我的 linker.cmd 文件如下所示:

    部分

    .intvecs:{}>向量

    闪存受保护区域中的/* FreeRTOS 内核*/

    .kernelTEXT:{}>内核

    .cinit:{}>内核

    .pinit:{}>内核

    /*将其余代码转换为用户模式闪存区域*/

    .text:{}> FLASH0| FLASH1

    .const:{}> FLASH0| FLASH1

    /* RAM 受保护区域中的 FreeRTOS 内核数据*/

    .kernelbss:{}>Kram

    .kernelHEAP:{}> RAM

    .bss:{}> RAM

    .data :{}> RAM

    /*用户代码开始(4)*/

    .sysmem:{}>RAM

    /*用户代码结束*/

    构建后、我的映射文件显示 sysmem 位于.bss 段之后、但位于.data 段之前。  我希望.sysmem 位于.data 段之后。  如何配置 link.cmd 文件来执行此操作?

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

    根据您的构建过程、如果您完全控制.cmd 文件(不是由工具自动创建)、那么我可以提供一些建议:

    一种方法是在.cmd 文件中使用 GROUP 指令。 您可以在汇编工具用户指南中找到更多详细信息、也可以包含在 CCS 帮助文件中。 手册中的示例是

    部分

    .text /*正常输出段*/
    .bss /*正常输出段*/
    组0x00001000:/*指定一组段*/

    .data /*组中的第一个段*/
    紧随.data 之后*分配的 term_rec //



    您可以删除0x00001000以允许链接器将组放置在其所需的位置、但顺序将与组{}中指定的顺序相同。

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

    我不知道将系统堆和 RTOS 堆组合在一起的方法。 RTOS 是基于第三方软件的产品、我认为它依赖于由 Halcogen 实现的指定定义。 如果你要进行自己的 RTOS 集成、你还必须确保 RTOS 特定堆区域的分配。 如果您认为尺寸浪费、只需将尺寸减小到更适合您的应用和使用要求的尺寸。

    关于段的放置、我认为这是基于在链接器命令文件中定义的顺序。 Halcogen 包含的正常命令文件具有您提到的顺序、因此我想知道您是否已禁用原始命令文件或将其从工程中删除? 如果是这种情况、我建议将问题发布到 CCS 论坛或尝试下面 Randy 的建议、看看是否可行。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    好的、谢谢 Chuck。