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.

[参考译文] 编译器:对齐内存

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

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/925812/compiler-aligning-memory

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

您好:

我尝试对嵌入式 FIR 函数使用函数调用。  FIR 函数要求这两个数组一个接一个地堆叠。

我将变量定义如下:

extern float FIR_IN[1240];

extern float FIR_Coef[241];

我确实为每个语句定义了.bss 和.global 语句。

FIR_IN 必须位于 FIR_Coef 之前的存储器中、FIR 函数才能正确运行、但当我编译并查看映射时、它会将它们放置在所需的任何位置。

是否有命令结构可以保证这些数组在内存中的位置、以便一个数组跟随另一个数组?

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

    [引用 user="dan kantorski"] FIR 函数要求这两个数组一个接一个地堆叠在一起。

    这不是典型的情况。  是否可以更改此 FIR 函数?

    这些行...

    [引用用户="dan kantorski"]

    extern float FIR_IN[1240];

    extern float FIR_Coef[241];

    [/报价]

    (笑声) 仅为声明。  它们不会为这些阵列保留内存。  这就提出了一个问题...

    定义数组的代码在哪里?  或汇编代码中?

    您使用哪款 TI 器件?

    谢谢、此致、

    乔治

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

    我要将缓冲区定义为两个数组的两倍、并相应地设置 FIR_IN 和 FIR_Coeff 指针。

    即  

    UINT_8 buf[500];

    FIR_IN =&buf[0];

    FIR_Coeff =&buf[250];

     当然、您会使用适合您的类型。

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

    [引用 user="dan kantorski]FIR_IN 必须位于 FIR_Coef 之前的存储器中、以便 FIR 函数正确运行、但当我编译并查看地图时、它会将其置于所需的任何位置。您能否定义一个包含 FIR_IN 字段和 FIR_Coef 的结构?

    这是一种无需链接器命令即可控制相对放置的方法。

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

    使用的处理器是 TMS320C6726。  FIR 函数调用来自 TI 优化库、因此我实际上无法访问它。  我对自己的设计还不够了解。  存储器分配在具有此结构的 asm 文件中  

    .bss  FIR_IN、4960

    全局 FIR_IN

    .bss FIR_Coef、964

    全局 FIR_Coef

    使用的函数为"DSPF_sp_fir gen"、这是一种单精度通用 FIR 滤波器函数。   

    我可以尝试使用结构、也可以尝试在 asm 文件中进行定义:

    .bss FIR、5924  

    全局 FIR

    然后在 C 中

    外部浮点 FIR [1481]

    FIR_IN=&FIR[0]

    FIR_COEFF=FIR[1240]

    extern float 位于程序的顶部、因此可以通过所有子例程对其进行评估。  如果我在这些指针之后立即声明它们、那么所有子例程也会评估它们吗?

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

    [引用 user="dan kantorski"] FIR 函数调用来自 TI 优化库

    假设该 FIR 函数来自 DSPLIB。  我还假设您使用名为 C67x-DSPLIB 的 DSPLIB 变体:C67x DSP 库。

    [引用 user="dan kantorski"]使用的函数为"DSPF_sp_fir gen"

    该库中有一个该名称的函数。  该库附带 PDF 文档、其中提供了有关每个函数的详细信息。  在该函数的文档中、不要求输入数组和系数数组在存储器中相邻。   

    [引用 user="dan kantorski"] FIR 函数调用来自 TI 优化库,因此我实际上无法访问它。

    库安装包括源代码。  文件  dsp67x.src 包含汇编语言中实现的函数的所有源代码。  要查看此线程中使用的函数的源代码,请运行此命令...

    % ar6x -x dsp67x.src dspfp_sfir _gen.asm 

    命令 ar6x 是归档器。  它是 C6000编译器安装的一部分。  C6000汇编语言工具手册对此进行了说明。  选项-x 表示提取文件。  最后一个参数指定要提取的文件的名称。   

    通过检查源代码中函数的注释、您将了解到使用指令 LDDW 访问输入数组和系数数组、这意味着这些数组必须在8字节边界上对齐。  因此,这些行...

    [引用用户="dan kantorski"]

    .bss  FIR_IN、4960

    全局 FIR_IN

    .bss FIR_Coef、964

    全局 FIR_Coef

    [/报价]

    (笑声) 必须更改为...

    .bss FIR_IN、4960、8.
    全局 FIR_IN
    
    .bss FIR_Coef、964、8.
    全局 FIR_Coef 

    在.bss 行末尾的、8意味着存储器块与8字节边界对齐。  传入以接收计算结果的数组也满足同样的要求。   

    请告诉我这些建议是否能解决问题。

    谢谢、此致、

    乔治

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

    好的、我已经再次阅读了子例程的 PDF 说明、您答对了、似乎不需要对数组进行排序。  我误解了它的编写方式。  因此、我将在尝试时尝试它。  声明后的对齐术语将有助于确保我不会犯任何可能的错误、因此感谢您。  我会再回来回答这个问题。