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.

[参考译文] 编译器/TM4C1233D5PM:运行时 RAM 分配

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/711318/compiler-tm4c1233d5pm-run-time-ram-allocation

器件型号:TM4C1233D5PM
主题中讨论的其他器件: TM4C1233H6PM

工具/软件:TI C/C++编译器

大家好

我们在产品中使用 Tiva 系列 MCU。

最初、我们使用 了 TM4C1233D5PM、并在某个时候将其更改为 TM4C1233H6PM -也就是说、我们现场拥有两个 MCU。

两者之间的差异为:

TM4C1233H6PM、闪存:256、RAM:32
TM4C1233D5PM、闪存:64、RAM:24

我们经常向现场的器件推送固件更新。 到目前为止、我们已将针对 TM4C1233D5PM 编译的固件推送到  基于 TM4C1233D5PM 和 TM4C1233H6PM 的产品中-这种做法效果很好。

现在、我们要  在现场使用基于 TM4C1233H6PM 的产品中的附加 RAM。 我们希望能够为两个器件使用相同的固件文件。

固件可以运行时确定它是在 TM4C1233D5PM 还是 在 TM4C1233H6PM 上运行。

具体而言、我们希望在固件在 TM4C1233H6PM 上运行时分配更多的 FreeRTOS 堆。

你们中有人对我们如何以最巧妙的方式获得这一信息有什么建议吗?

谢谢

此致

Christian

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

    固件可以读取 SSIZE 寄存器来确定器件上的静态 RAM 容量。

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

    你(们)好

    感谢您参考 RAM 大小寄存器!

    我不确定设置链接器文件的最佳方法是什么。 我想一种解决方案是设置一个额外的 RAM 区域、链接器无法将该区域用于变量等 运行时、我将能够根据 SSIZE 寄存器确定是否应该向堆中添加额外的 RAM 区域。 这是否合理?

    谢谢

    BR

    Christian

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

    [引述 user="Christian Steiniche "]您是否有任何人建议我们如何以最巧妙的方式获得此信息?

    也许"优雅"-就像这里所用-会受到(部分) "定义的可变性?"的影响    (也许解释了它为什么收到切向地址...)

    优雅可能包括以下关键要素: "性能、速度、稳健性、新增功能和简单性"。    但很少-组合时出现"全部"(或以最佳方式运行)。   (事实上、我们公司已经注意到优化一个通常会降低其他几个!)     Élégance,对 L'T Ü V 的任何请求都应确定 具有最高感知 价值的元素

    我们还可以指出,"普遍堆增加"在某些条件下可能导致不必要/意外的后果。    改变"堆大小"-动态 -"如需/如/何时"(然后将"堆大小"恢复为"正常")-可能"最好"满足您的目标。   而且-这不是 "移动工作"的"CU 标识"-从"链接器到您的可执行代码"-这可能会添加其他"安全和优势!"

    因为( Élégance) MIT 和亚马逊已许可'FreeRTOS -一定程度的'L'μ L'-已(已)附加到您的项目。    (单个供应商产品-很少(如果有)-可以达到此类标准...)

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

    感谢您的回复。

    我不确定如何对此做出反应...

    我只需要一些关于如何处理不同数量的片上 RAM 运行时间的建议。 我想这是一种非常标准的情况、可能有一种共同的解决方案。 我不同意在这种特定情况下可以进行性能/速度等交易。

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

    [引用用户="Christian Steinich"]我不同意这种特定情况下可以进行性能/速度等交易。

    您对"优雅"的理解仍然是"多云"。

    没有人声称“性能/速度”... '可以进行交易。'   (这是另一个词(交易)-需要进一步定义...)

    我们可能会"同意不同意"-这始终是您的权利...   (我曾尝试"实际解决"您的请求-被认为是"模糊的"。)

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

    尊敬的 Christian:

    我必须承认、我没有将 FreeRTOS 与 TivaC 器件一起使用(我们提供 TIRTOS)、但我已经在 TI Hercules 安全器件上使用过它。 我认为它应该是类似的。 我的注释适用于使用 TI 编译器和链接器。

    看起来堆是作为文件 os_heap.c 中的静态变量创建的

    #pragma DATA_SECTION (ucHeap、".kernelHEAP")
    
    
    /*为堆分配内存。 */
    静态 uint8_t ucHeap[ configTOTAL_HEAL_SIZE ];
    
    

    请注意、#pragma 会将此变量放在链接器部分".kernelHEAP"中。 该段被分配到链接命令文件中的 RAM 中、而不会绑定到任何特定地址:

    部分
    {
    .intvecs:{}>向量
    闪存受保护区域中的/* FreeRTOS 内核*/
    .kernelTEXT:{}>内核
    .cinit :{}>内核
    .pinit :{}>内核
    /*将其余代码转换为用户模式闪存区域*/
    .text :{}>FLASH0
    .const :{}>FLASH0
    /* RAM 受保护区域中的 FreeRTOS 内核数据*/
    .kernelbss:{}>Kram
    .kernelHEAP:{}> RAM
    .bss :{}> RAM
    .data :{}> RAM
    sysmem :{}>RAM
    }
    

    例如、假设您要为24K RAM 器件的堆分配8K 字节的 RAM、为32KB 器件的堆分配16KB 的 RAM。 我将配置文件"FreeRTOSConfig.h"保留为8KB、并保留用于定义24KB RAM 的链接命令文件。 我会修改链接命令文件、以专门将".kernelHEAP"段放置在 RAM 的最后8KB 中。

    .kernelHEAP:{}> 0x20004000
    

    然后在函数 prvHeapInit()中,根据从 SSIZE 寄存器读取的值,将变量 xTotalHeapSize 初始化为8KB 或16KB。

    我再次从 TI Hercules 器件中获取了这些信息。 它可能与 FreeRTOS 的 TM4C 实现不匹配。 我希望这种做法不仅会使人感到困惑,而且还会带来更大的帮助。

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

    你(们)好 Bob

    非常感谢您提供的详细信息-这正是我想要的!

    使用 FreeRTOS (和 heap5.c)、甚至可以从 RAM 中的不同位置添加更多堆(无需 相邻)。  

    我们将使用您的示例并从此处开始工作。

    非常感谢!

    BR  

    Christian