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/MSP432P401R:如何强制编译器不内联"汇编函数"?

Guru**** 2611705 points


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

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/641829/ccs-msp432p401r-how-to-force-compiler-not-to-inline-assembly-function

部件号:MSP432P401R

工具/软件:Code Composer Studio

您好,

我正在测量SRAM上堆栈段的使用情况。

对于测试,程序设计为包含不同数量的局部变量,如1.01万或1000。

(我的实验是在使用Code Composer Studio v7的MSP432P401R评估板上进行的。)

然而,随着实验的进行,发生了一些奇怪的事情。

即局部变量的数量会影响程序的汇编代码。

如果局部变量的数量为10, 则使用LDM或STM汇编代码存储在堆栈中。

但是,由于局部变量的数量大于100, 因此调用了另一个函数。

函数的名称是"__aebi_memcpy(), __aebi_memcpy4(), __aebi_memcpy8(),memcpy()",用包含推入和POP代码的'.asmfunc stack_usage(0)'指定。

(在CCS v7的调试模式下检查了所有汇编代码和函数调用。)

1.我得出这样的结论是因为ARM编译器的优化(例如函数内联)。

  这是正确的猜测吗? 还是有其他原因呢?

如果是,我想让编译器不要 随意使用该函数。

  这意味着,我想让我的程序只使用诸如LDM或STM之类的汇编代码,而不是memcpy()。

  我已经使用了一个名为--disable_inlining的编译器选项,但没有任何效果。

  有什么办法可以做吗?

谢谢你  

  

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

    Koo9 说:
     有没有办法?[/QUOT]

    可能不是。  也就是说,我不是很明白你在做什么。  请发送一个测试案例,该案例会执行以下操作...

    [报价用户="Koo9"]

    但是,由于局部变量的数量大于100, 因此调用了另一个函数。

    函数的名称是"__aebi_memcpy(), __aebi_memcpy4(), __aebi_memcpy8(),memcpy()",用包含推入和POP代码的'.asmfunc stack_usage(0)'指定。

    [/引述]

    请按照文章 How to Submit a Compiler Test Case中的说明进行操作

    谢谢,此致,

    -George

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

    感谢您的回复。 很抱歉混淆了。

    我想做的是,

    我希望我的程序使用的栈段与相同的汇编代码“不考虑局部变量的数量”。

    以下是两个附加的预处理文件的详细信息:  

    1. main_compilertestcell_num10.pp

    -这是编译器测试用例的源文件,带有10个局部变量。

    它由main和功能1组成。 Function1是用户定义的函数,只需执行1000次气泡排序。

    2.main_compilertestcell_num100.pp  

    -这是编译器测试用例的源文件,包含100个局部变量。

    它由main和功能1组成。 Function1是用户定义的函数,只需执行1000次气泡排序。

    (局部变量的数量10和100是两个附加文件的唯一差异。)

    在这两种情况下,TI v 16.9 .6.LTS编译器都与以下编译器选项配合使用:

    ****为项目CompilerTestCase构建配置调试****

    "C:\\ti\\ccsv7\\utils\\bin\\gmake "-k -j 4 main_compilertetc8.obj -o
    '正在构建文件:../main_compilertestcase。c'
    '调用:ARM编译器'
    c:\ti/ccsv7/tools/compiler/ti-CGT-arm_rps.6.ls/bin/armcl" 16.9 -mv7m4 --code_state=16 --float_support=FPv4SPD16 -me --include_path="C:/users/ESLAB/workspace_v7/compilerr/compilere_432r_spr_from_spd=10_prox_proc_p_p_spd=-from_p_1c_ prox_p_p_spd_from_spd=-p_p_from_p_from_f_spd_f_-from_j_-f_p_from_jc_jc_p_from_f_-f_-f_p_p_jc_j_f_-f_jc_-f_jc_p_-r_-p_p_-f_-f_-f_jc_-f_jc_p_-p_-f_jc_-f_ 16.9
    '完成的构建:../main_compilertestcase。c'
    ''

    ****构建已完成****

    e2e.ti.com/.../main_5F00_compilertestcase_5F00_num10_5F00_and_5F00_num100.zip

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

    要控制编译器初始化大型本地数组的方式。  不幸的是,没有办法这样做。  此帖子的其余部分将提供更多详细信息。

    较小阵列的测试用例具有以下行来创建和初始化本地阵列...

    volatile int array11[10]={
    5.59771983亿,4.6764万, 63,100.0606万,7.1781万
    }; 

    我们将其称为"test10.c"。

    另一个测试用例具有类似的数组,但具有100个值。  我们将其称为"test100.c"。

    在这两种情况下,常量值表都被放入内存中。  函数开头的代码将此常量表复制到堆栈中数组的位置。  问题是:到底是如何实施复制的?  在test10.c中,使用了一系列LDM和STM指令。  在test100.c中,调用RTS函数memcpy。  在test100.c的情况下,您要告诉编译器不要调用memcpy,而是使用一系列LDM和STM指令。  不幸的是,没有办法这样做。

    谢谢,此致,

    -George