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.

[参考译文] CCS/TMS320C6678:SysBIOS堆大小问题。

Guru**** 2563910 points
Other Parts Discussed in Thread: SYSBIOS

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

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/593077/ccs-tms320c6678-sysbios-heap-size-problem

部件号:TMS320C6678
“Thread:SysBIOS”中讨论的其它部件

工具/软件:Code Composer Studio

现象:

  1. 在BareMetal项目中,链接器可以使用参数"-heap HEAPSIZE"中指定的大小为堆正确分配空间。 这里的大小可以设置为最大值0x7FFFFFF8,我可以在.map文件中看到分配信息。
  2. 在SysBIOS项目中,当我使用'bios.heapSize = 0x2000万等代码创建默认堆大小>= 0x2000万 (512MiB)时,我无法在最终输出的可执行文件的.map文件中找到堆空间分配。 使用的DDR3大小为0x0。
  3. 在SysBIOS项目中,当我缩小堆大小(如0x1FFFFFF8)时,我可以在.map文件中看到堆部分的分配。
  4. 已尝试相同的C6000 CGT 8.1 3和7.4 .21。
  5. 已尝试相同的SysBIOS 6.45 / 6.50。

我已查看以下链接:

在该链接中,它指出此问题是由链接程序的错误导致的,该错误无法为非常大的数组分配空间。

问题:

  1. 已经4年了,链接器的错误是否已修复?
  2. 似乎链接程序可以正确处理参数'-heap',所以SysBIOS是否有任何解决方法可以使用链接程序的参数'-heap'来分配缺省SysBIOS堆? 因为默认情况下,SysBIOS在生成的linker.cmd文件中设置'-heap 0x0'。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您能否查看映射文件并告诉我们DDR3有多大?

    托德
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    canfoderiskii,
    这里讨论了两个不同的概念。 一个是系统堆,分配给".heap"部分,这是在BareMetal应用程序中调用malloc()时分配内存的位置。

    在SYS/BIOS应用程序中,不使用该堆,这就是为什么-heap选项始终设置为0的原因。 SYS/BIOS堆(通过设置BIOS.heapSize定义)是保留在不同部分的缓冲区。 例如,默认情况下,您将使用HeapMem实例作为堆,并且在内存映射中,您将看到名为ti_SysBIOS_States_HeapMem_Instance_0_buf__a的缓冲区,位于“_far”部分。

    现在,当您说可以看到堆在小于0x2000万时已正确分配时,您是否意味着可以在".FAR "部分(或任何其他部分,如果您更改了缓冲区的部分)中看到大小合适的缓冲区? 这意味着链接程序错误已修复,尽管当我检查错误数据库中的错误时,似乎该错误尚未修复。

    SYS/BIOS不能使用堆来解决链接程序错误,因为如果链接程序不能分配大缓冲区,将哪一部分用于堆缓冲区并不重要。
    但是,并非所有堆都使用缓冲区。 我知道SYS/BIOS中有HeapCallback模块,您可以在其中实现自己的功能来分配内存, 这个函数只能调用malloc(),但我不知道你要做什么才能使用它,所以如果你想使用它,我必须问别人。

    因此,请告诉我您正在使用哪个堆管理器,以及当堆大小小于0x2000万时,您在内存映射中看到了什么,我们可以从那里进行工作。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    0x4000万,1GiB
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,Sasha。

    1.我没有更改默认堆实例,因此它是HeapMem。
    2.我使用了'bios.heapSection =".sysheap";'来更改默认堆的部分。
    3.当我使用"bios.heapSize = 0x2000万"时,在.map文件段分配映射中,没有名为.sysheap的部分。 但在.map文件的部分分配映射中,我可以找到其来源/长度为0x8000万/0x0的.sysheap。 并且其属性未初始化,并且没有输入的部分信息。
    4.当我将默认堆大小设置为0x1FFFFFF8时,在.map文件段分配映射中,.sysheap在此处列出,运行/加载/长度为0x8000万/0x80000000/0x1FFFFFF8。8000万。 在部分分配映射中,.sysheap的起源/长度为0x8000万/0x1FFFFFF8,其属性/输入部分为Uninitialized/lib_pe66.oe66 (.sysheap)。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我能够将您的问题复制到一个不涉及SYS/BIOS的更小的示例中。 源代码如下,链接线程中的编译器错误似乎尚未修复。 因此,不能对大小为0x2000万或更大的堆使用HeapMem,因为这需要该大小的缓冲区,而这是在遇到编译器错误时。 如果需要该大小的堆,则必须使用不使用缓冲区的堆管理器,并且SYS/BIOS中唯一这样的管理器是HeapCallback,在这里,基本上必须实现HeapCallback_malloc。 最简单的实现是从运行时库调用malloc()。

    遗憾的是,我没有看到任何其他可将SYS/BIOS堆管理器与该大小堆组合在一起的解决方法。

    这是说明问题的代码,您可以在其中选择大缓冲区的大小并观察内存映射:

    //char bigBuf[0x1ffffffff8];
    char bigBuf[0x2000万];
    #pragma data_section (bigBuf,".mysection")

    int main (void)
       bigBuf[3000]='I'
       返回0;
    }

     

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

    在使用链接程序的堆段时,我是否可以使用HeapStd替换HeapCallback?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    xdc.runtime.HeapStd也应该起作用,但很少与SYS/BIOS一起使用。 我想这是值得尝试的。