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.

[参考译文] TMS320F28027:编译__rpt_mov_IMM (void * dst、int src、int count)内在函数时出错

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/769275/tms320f28027-error-compiling-__rpt_mov_imm-void-dst-int-src-int-count-intrinsic

器件型号:TMS320F28027
Thread 中讨论的其他器件:controlSUITE

大家好、

我正在尝试使用此内在函数

void * result =__rpt_mov_IMM (void * dst、int src、int count);

这样的方式

interrupt some _int()
{...

已签名 int IMM_ZC_HIGH_RPM_ZC_FUNC[BL_ZC_HIGH_RPM_ZC_FUNC_array_MASK + 1];//[32];


__rpt_mov_RPM (BL_ZC_HIGH_RPM_ZC_FUNC、-1、BL_ZC_HIGH_ZC_RPM_RAL_RUNC_MASK
);
...} 

并得到这样的编译器错误:

>>编译失败
_code_/subdir_rules.mk:16:目标'_code_/blr2_z_cross_evo3_04_07_18.obj'的配方失败
"./_code_/BLR2_z_cross_evo3_04_07_18.c"、第2672行:警告#69-D:整数转换导致符号更改
>>./_code_/BLR2_z_cross_evo3_04_07_18.c、第2672行:
内部错误:逗号不匹配


这可能是一个严重的问题。 请使用与客户支持联系
此问题的说明以及导致此问题的源文件示例
出现内部错误消息。

无法继续编译-中止!

如果我尝试使用负 int 填充数组、则编译此代码时不会出现问题。

我需要用-1填充数组、因此我已经尝试了上面的-1、0xFFFF、65535 -没有区别。 如果 src 为正、则没关系。

有人能帮我解决这个问题吗

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    哦、忘了说、我使用的是 CCS 版本:8.3.0.00009
    和编译器 TI v 18.14.4.LTS
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢您报告问题。  我可以重现相同的行为。  我在 SDOWP 系统中提交了 CodeGen-5862、以对其进行调查。  欢迎您在我的签名中点击下面的 SDOWP 链接。

    作为变通办法,请考虑用执行相同操作的循环替换内在函数...

    对于(I = 0;I <= BL_ZC_HIGH_RPM_ZC_FUNC_array_mask;i++) BL_ZC_HIGH_RPM_ZC_FUNC[i]=-1; 

    如果使用优化--opt_level=2或更高版本进行编译,编译器会生成与内在函数相同的代码。

    谢谢、此致、

    乔治

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

    尊敬的乔治:

    感谢您的回复、但是

    遗憾的是、不是、编译器不会生成相同的内在函数。

    我使用 opt level=5、编译器为生成

    对于(I = 0;I <= BL_ZC_HIGH_RPM_ZC_FUNC_array_mask;i++)
    {
    BL_ZC_HIGH_RPM_ZC_FUNC[i]=-1;
    }
    

    此代码:

    MOVL XAR4、#_BL_ZC_HIGH_RPM_ZC_FUNC;[CPU_ARAU]
    
    MOVB XAR0、#7;[CPU_ALU]
    $L105:
    .dwmt .psn 文件"./_CODE_/BLR2_DAC_evo3_04_18_1.74+、[MOAR4+|64+、|MOAR4+|64+、|MOAR4+|MOARX64+、
    
    
    
    64+|64+、
    
    
    64+|MOAR4+|MOAR4+|MOAR4+|MOAR64+|MOAR64+|64+|64+、64+|MOAR4+|MOAR64+|64+|64+|MOAR64+|64+、64+|MOAR4+|MOALU+|MOALU+|64+|MOAR4+|64+|MOALU+|64+|MOAR4+|MOAL4+|MOAR4+|MOAR4+|MOAL4+|MOAL4+|MOAL4+|MOAL4+|MOAL4+| [CPU_ALU]|2674|
    MOV *XAR4++,#-1;[CPU_ALU]|2674|
    MOV *XAR4++,#-1;[CPU_ALU]|2674|
    MOV *XAR4++,#-1|[CPU_MOU+|2674+
    |XAR4+
    
    ;[CPU *644+
    |MOU+|MOU+
    
    |644+|MOAR4+|MOU+|64|MOU+、[CPU *1674+|644+|MOU+|MOU+、644+|644+|MOU+|MOU+|MOU+|MOU+、[CPU *1674+|MOU+|644+|644+|MOU+、644+|MOU+|MOU+|644+|MOU+|64644+|MOU+|MOU+、64644+|MOU+、[CPU *1674+ [CPU_ALU]|2674|
    .dwpsn 文件".../../blr2_z_cross_evo3_04_07_18.c",第2672行,第17列,IS_stmt,ISA 0
    BANZ $C$L105,AR0-;[CPU]|2672| 

    还有其他想法吗?

    我有另一个优化问题-您能为该 if-else if 结构建议最佳代码(C 代码/内在函数/asm)吗


    (笑声) signed int var; ... if (var >0) { VAR = 1; } 否则、如果(var < 0) { var =-1; } (笑声)

    提前感谢。

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

    [引用 user="Konstantin Shirokov"]遗憾的是,编译器不会生成相同的内在函数。

    我应该更好地解释了解决方法。  我没有您的所有代码和构建选项。  因此、我无法准确再现您看到的内容。  对于我编写的简单测试用例、我获得了与内在函数相同的汇编代码。

    [引用 user="Konstantin Shirokov"]是否有其他想法?

    尝试更改构建选项。  使用不同的优化级别。  或者、如果您使用它、则开关-opt_for_speed 的值会有所不同 。   

    [引用 user="Konstantin Shirokov"]如果结构为 if-else,您能否建议最佳代码(C 代码/内在函数/asm)[/引用]

    执行该操作的内在函数不存在。  如果您使用优化进行编译、我希望您可以获得与手动编写的汇编代码一样出色的代码。  是这样吗?

    谢谢、此致、

    乔治

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

    尊敬的乔治:

    您使用的编译器版本是什么?

    我的版本是18.1.4.LTS、这是编译器命令行:

    -v28 -ml -mt -O4 -opt_for_speed=5 -include_path="..." --include_path="..." --include_path="..." --include_path="..." --include_path="..." --advice:performance=all --diag_warning=225 --diag_wrap=off --display_error_number -k

    如您所见、我使用 opt_level = 4、速度与尺寸之间的折衷= 5

    第二个问题-我的优化 if-else 目标是消除条件跳转-只是平面代码。

    例如、如果我为任意长度的数组增加循环指针、我应该写入:

    uint16 ptr;
    ...
    
    PTR++;
    
    if (ptr >= N)
    {
    ptr = 0;
    } 

    但是、如果我使用2^N 个元素的数组、我可以做得更好:

    uint16 ptr;
    ...
    ptr =(ptr + 1)&(N-1);
    …… 

    那么、也许我可以在上面提到 if-else、如果结构是以类似的平坦方式计算的。?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    UPS、抱歉、最后一个示例
    ptr =(ptr + 1)&(2^N-1);
    当然
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引用 user="Konstantin Shirokov"]您使用的编译器版本是什么?

    相同的一个。  版本18.1.4.LTS。   

    您希望我找到特定于您的代码的权变措施。 为此、我需要您提供的测试用例、以保证出于相同的原因看到相同的输出。  因此、对于包含问题__rpt_mov_IMM 的源文件、请按照文章 如何提交编译器测试用例中的说明进行操作。

    [引用 user="Konstantin Shirokov"]至第二个问题-如果结构是消除条件跳转、则我的优化 if-else 目标是纯平代码。

    C28x CPU 具有类似这样工作的条件指令。  编译器会在适当时使用它们。  在这种情况下、我希望编译器使用条件指令。  是发射分支吗?

    谢谢、此致、

    乔治

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

    您好、George、

    好的、我稍后将提交一个代码。

    至于 我的第二个问题-是的、编译器生成 B 指令。  

    我找到了一个解决方案。 也许这不是最好的、但比编译器生成的 if-elseif 结构更快、不要占用流水线、并且在正负情况下具有相同的时钟周期:

    /*if (zc_func >0)
    {
    ZC_func = 1;
    }
    否则、如果(zc_func < 0)
    {
    ZC_func =-1;
    }*/
    //使用此内在函数。 语义是相同的
    ZC_func =_min (zc_func、1); //10个 CPU 周期
    ZC_func =_max (zc_func、-1); 

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

    为了建议具体的解决方法、我非常感谢我请求的测试案例。

    谢谢、此致、

    乔治

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

    "c:/ti_ccs8/ccsv8/tools/compiler/ti-cgt-C2000-18.1.4.sps/bin/cl2000"-v28 -ml -mt -o4 -opt_for_speed=5 -include_path="c2000_18.1.board_include_display_codestion="c_tcp_board_board_board_suppref_track_code.come_board_code_board_board_board_board_board.cn_board.cn_board_board.cn_board_board.cn_board.cn_board.cn_probe_display_board.cn_board.cn_board.cn_board.cn_board.cn_board.cn_board.cn_board.cn_board.cn_board.cn_board.cn_board.cn_board.cn_prob&content_prob.cn_board.cn_board.cn_board.cn_board.cn_board.cn_prob.cn_board.cn_board.cn_board.cn_prob.cn /Users/user/Desktop/WinApplication/BLR_PC_ccs8/BLR2/_code_/Headers_from_controlSUITE/include /Users/user/Desktop/WinApplication/BLR_PC_ccs8/BLR2/_code_/Headers_from_controlSUITE /Users/user/Desktop/WinApplication/BLR_PC_ccs8/BLR2/_code_/Headers_from_controlSUITE/include_defs /Users/user/Desktop/WinApplication/BLR_PC_ccs8/BLR2
    已完成构建:"../_code_/BLR2_main.c"

    Comliler 版本18.1.4.LTS

    e2e.ti.com/.../BLR2_5F00_main.pp.txt

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

    感谢您的测试案例。  以下是需要考虑的权变措施。  将选项 -opt_for_speed 的值更改为3或更低。 这会导致问题循环使用 RPT 实现。    

    谢谢、此致、

    乔治

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

    但是、降低 OPT 电平将如何影响代码的其余部分? 这不会导致总体性能下降? 您能不能建议我如何测量它?

    该微控制器是否有其他编译器? 因为老实说、看到生成的代码、我认为 TI 编译器在阅读手册后没有提供我所期望的优化。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    George、您能问 TI 编译器开发人员该编译器行为的逻辑是什么? 为什么在最大选择级别它生成的代码效率较低? 如何进一步使用 OPT 级别参数?
    非常感谢。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引用 user="Konstantin Shirokov"]但降低 OPT 级别对代码的其余部分有何影响? [/报价]

    降低选项--opt_for_speed 的值只会影响速度和大小之间的权衡。  它不影响由选项--opt_level 控制的总体优化。

    [引用 user="Konstantin Shirokov "]该微控制器是否有其他编译器?

    谢谢、此致、

    乔治

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

    "降低选项-opt_for_speed 的值只会影响速度和大小之间的权衡。  它不会影响由选项--opt_level 控制的总体优化。"

    这对我来说不太清楚... 您的意思是"过度优化"? "仅影响速度和尺寸之间的权衡"这一说法与"不影响总体优化"相矛盾。 这是怎么可能的?  --opt_for_speed 设置背后的逻辑是什么?

    我应该使用什么设置来获得最快的代码?  --opt_for_speed = 3或 --opt_for_speed = 5、为什么?

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

    请查看 选项-opt_for_speed 和-opt_level 说明是否有用。

    谢谢、此致、

    乔治