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/MSP430FG4618:杂散"在这里可能需要一个 NOP……"在 MSP 处理器的 GCC 中使用_enable_interrupts ()的警告

Guru**** 2542990 points
Other Parts Discussed in Thread: MSP430FG4618

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

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/846332/ccs-msp430fg4618-spurious-a-nop-may-be-needed-here-warnings-using_enable_interrupts-in-gcc-on-msp-processors

器件型号:MSP430FG4618

工具/软件:Code Composer Studio

通过浏览这些论坛、可以看到一些与虚假"此处可能需要 NOP "错误相关的注释、但这些注释与连续启用/禁用中断指令相关。 我还看到了这些响应单机_enable_interrupts 调用。

这可能已经有一段时间了、但随着 CCS 最近升级到 V9.1.0、我一直在查看生成的任何警告、以期降低噪声。 我无法解决这些问题。

该代码用 C 语言编写、并使用 GNU v8.3.0.16进行编译。 该逻辑使用_enable_interrupts 和_disable_interrupts 作为 eint 和 dint 的入口点。 从 MSP430 GCC 用户指南(SLAU464E、6月19日)的第4.9.4节(有关中断状态更改的 NOP 指令)中、可以看到与启用和禁用中断相关的任何必要的前置和后置 NOP 指令都在_enable_interrupts 和_disable_interrupts 宏中正确处理、 从对 in320.h 的透视中可以看出这种情况。 但是、编译器会在中断使能指令之后继续报告警告"此处可能需要 NOP"(以及等效的"之前")。 在_disable_interrupts 周围没有生成警告。

我在_enable_interrupts 宏和_no_operation 宏周围有一个游戏、但警告仍然存在。 并不奇怪、因为我相信 NOP 已经存在、但汇编器无法识别它们并生成警告。

这不是一个大问题,但更少的噪音总是更好!

Andrew

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

    您好!

    您是否能够提供生成这些警告的简短 C 代码片段?

    谢谢、

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

    这太简单了!

    只是将其简化为一些最小代码、当然、它工作正常。 真是个惊喜。 使用这个最小代码,我可以通过按预期在_enable_interrupts ()和原始 eint 之间切换来关闭和打开警告。

    所有警告均遵循以下表格;

    C:\Users\Andrew\AppData\Local\Temp\ccwZeFhA.s:汇编器消息:
    C:\Users\Andrew\AppData\Local\Temp\ccwZeFhA.s:48:警告:在中断使能指令之前、这里可能需要 NOP

    我一直在尝试陷阱中间汇编器列表以在其中进行透视、但它似乎都被 GCC 或 CCS 清理、并且找不到保留它的方法。 我一直在编译器上使用-S 选项、该选项"应该"保留汇编器列表、但我怀疑 CCS 在任何情况下都将删除此选项、因为我无法捕获此列表。 有关如何保留生成的汇编器文件的任何想法? 有什么其他想法可以处理正在发生的情况? 这至少会让我们知道是否插入了 NOP (我猜不是?)。

    (实际上只是想了、这是在 CCS 中打开汇编器窗口的情况下实际运行代码。 多年没有这么做、目前没有 MSP 设置来实现它、但给我几天时间...)

    谢谢、此致

    Andrew

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

    [引用用户="Andrew McLaren "]

    我一直在尝试陷阱中间汇编器列表以在其中进行透视、但它似乎都被 GCC 或 CCS 清理、并且找不到保留它的方法。 我一直在编译器上使用-S 选项、该选项"应该"保留汇编器列表、但我怀疑 CCS 在任何情况下都将删除此选项、因为我无法捕获此列表。 有关如何保留生成的汇编器文件的任何想法? 有什么其他想法可以处理正在发生的情况? 这至少会让我们知道是否插入了 NOP (我猜不是?)。

    (实际上只是想了、这是在 CCS 中打开汇编器窗口的情况下实际运行代码。 多年没有这么做、目前没有 MSP 设置来实现它、但给我几天时间...)

    [/报价]

    "-save-temps"选项是您要查找的选项。 我将此选项添加到 Project Properties>Build>GNU Compiler>Miscellaneous 中的“Miscellaneous C source Specific flags”中。 GCC 现在将保留构建目录中的一些有用文件。 我认为在项目属性对话框中为该选项设置一个特定的复选框会很有用。 我将与 TI 合作、看看我们是否可以添加此内容。

    "*。i"文件是预处理的 C 源文件。 如果您希望提取测试用例而又不需要提供支持的头文件、这将非常有用。 编译该文件所需的所有定义和声明都将位于".i"中、只是将其简化为更小的测试用例。

    "*。s"文件是我们可以检查的汇编代码、以查看触发 NOP 警告的位置。

    此致、

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

    感谢您的指针 Jozef。

    我可以看到发生了什么、但不知道为什么。 我将放入.c、.i 和.s 的相应位以及编译器命令和生成的警告的转储。

    首先是库例程中的 C

    disable_interrupts ();
    status = EVT_RaiseInterruptEvent (vector、flags、evt_context);
    _enable_interrupts ();

    和预处理的 C (.I)

    _asm____volatile__("dint{nop");
    status = EVT_RaiseInterruptEvent (vector、flags、evt_context);
    _asm____ volatile__("eint");

    生成的汇编器-在 eint 周围没有任何 nop 是不足为奇的

    Dint{nop
    ;删除了执行调用的汇编器
    提示

    编译器命令和输出;

    调用:GNU 编译器

    "c:/ti/ccs910/ccs/tools/compiler/msp430-gcc-8.3.0.16_win32/bin/msp430-elf-gcc-8.3.0.exe "-c -mmcu=MSP430FG4618 -mhwmult=none -i"C:/Data/Projects/Software/Micro/Common /trunk/EVT_EventHandler.c -i"C:/ti/ccs910/ccs/tools/compiler/msp430-gcc-8.3.0.16_win32/msp430-elf/include -i"C:/ti/ccs910/ccs/ccs_base/msp430/include_gcc -O0 -g -gdwarf-3 -gstrict-dwarf -Wall -mlarge-save-temps -mcode-region=none -mdwarf-3 -gstrict -mstrict -mstrandt/evler"-mf-evm/evler"-t/t_embandt_emmv-trune.t/embe-t/emmf-v/t/evrunk -mf-v/t/t/evl"-date"-t/t/t/embandt/evru-

    evt_eventandler.s:汇编器消息:
    evt_eventhandler.s:264:警告:在中断使能指令之前、这里可能需要 NOP
    evt_eventhandler.s:267:警告:在一个中断使能指令之后、这里可能需要一个 NOP
    已完成构建:"./trunk/EVT_EventHandler.c

     

    只是为了进行比较、我对一些虚拟代码执行了相同的序列-这会生成可执行文件而不是库、但不要认为这会影响任何内容。

    首先、C -只是在启用和禁用之间抛出了一个循环。

    disable_interrupts ();
    while (CTR < 10){CTR++;}
    _enable_interrupts ();

    和预处理的 C (.I)

    _asm____volatile__("dint{nop");
    while (CTR < 10){CTR++;}
    _asm____volatile__("nop{eint{nop");

    生成的汇编器

    ;17英寸./trunk/NOP_Test.c。1.
    Dint{nop
    ;删除了中间的内容
    ;19 "../trunk/NOP_Test.c。1.
    nop{eint{nop

    编译器命令和输出;

    调用:GNU 编译器

    "c:/ti/ccs910/ccs/tools/compiler/msp430-gcc-8.3.0.16_win32/bin/msp430-elf-gcc-8.3.0.exe "-c -mmcu=MSP430FG4618 -mhwmult=none -i"C:/Data/Projects/Software/Micro/Common/trunk -i"C:/Data/Projects/Software/Micro/Common_Tests -i"C:/ti/ccs910/ccs/tools/compiler/msp430-gcc-8.3.0.16_win32/msp430-elf/include -i"C:/ti/ccs910/ccs/ccs_base/msp430/include_gcc -i"-O0 -g -gdwarf-3 -gstrict -dwarf -Wall -mlarge-save-tempps -i"-mf_test-mf_not"-mf_date"-mf_brune/tune./trunk/NOP_Test.c -mf_date"-trunk -mfrom_brune.none"-mf-not_date"-date"-mf_trunk -mf-not/not_date"-mf-not_date"-mf_br
    已完成构建:"./trunk/NOP_Test.c

     

    自从我接触过汇编器已经有很多年了、但 nop{eint}nop 的风格对我来说有点陌生。 中间大括号是否是某种类型的语句分隔符?

    我对 in430.h (其中_enable_interrupts 宏已展开)有了一个透视图、有趣的是、nop{eint{nop sequence}仅替代 MSP430X 和 XV2处理器、否则它只是一个 eint。 dint{nop 序列应用于所有处理器。 我想知道它是否未能检测到它的430X 编译、但编译指令中的任何内容看起来都不正确。 有什么想法吗? 现在、我只需在_enable_interrupts 周围添加_no_operations、这应该是安全的。

    谢谢、此致

    Andrew

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

    感谢您提供这些额外信息。

    [引用用户="Andrew 迈凯伦]自从我接触汇编器以来、已经有很多年了、但 nop{eint}nop 的风格对我来说有点陌生。 中间大括号是否是某种类型的语句分隔符?

    是的、这是一个用于分隔语句的 GNU 汇编器结构、您是对的。 此主题 https://e2e.ti.com/support/tools/ccs/f/81/p/503224/1822907#1822907中有一些详细信息

    [引用用户="Andrew 迈凯伦]我浏览了 in430.h (其中扩展了_enable_interrupts 宏)、有趣的是、nop{eint{nop sequence}仅替代 MSP430X 和 XV2处理器、否则它只是一个 eint。 dint{nop 序列应用于所有处理器。 我想知道它是否未能检测到它的430X 编译、但编译指令中的任何内容看起来都不正确。 有什么想法吗? 现在、我只需在_enable_interrupts 周围添加_no_operations、这应该是安全的。

    因此、只要 在 包含 in430.h 之前定义了_MSP430_has_MSP430X_CPU__、"_enable_interrupts"就会扩展为"nop{eint}nop"。

    MSP430FG4618.h 中定义了_MSP430_HAS_MSP430X_CPU__、MSP430FG4618.h 包含在 MSP430.h 中

    我做了一个快速实验、如果你在"msp430.h"之前包含"in430.h"、那么这个汇编器错误会被发出、因为 in430.h 不知道何时包含你有一个430X CPU、但是汇编器知道它是一个430X CPU。

    我怀疑这是您问题的原因。 您应该只需要在程序中包含"msp430.h"、这将会引入任何其他所需的头文件。

    我们可以肯定地改善此处头文件的行为。 GCC 在使用 MSP430X CPU 时生成内置定义-"_MSP430X__"。 除了/而不是器件头文件创建的"__MSP430_has __CPU__"宏之外,还应检查此项。

    此致、

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

    您好、Jozef、

    你绝对是对的! 事实上、这不仅仅是订单-这个特定的模块在某种程度上错过了 msp430.h include! 我最初认为必须在包含链中进一步挑选它、但没有任何迹象表明这一点。 但是、它所做的唯一接近 MSP 细节的事情是中断管理、因此我假设那里没有引用任何特定于处理器的定义的其他内容。

    出于兴趣、是否有任何指定符合 CCS、GCC 环境所需的 C 结构的内容(例如对 MSP430.h 的要求、其相对于诸如 in430.h 等其他内容的序列等)。 我的大部分这件事都是由渗透引起的、我想知道我是否错过了其他东西、或者对影响一无所知。 我找到的最接近的是 MSP430 GCC 用户指南、其中介绍了 GCC 用于加载处理器特定定义(通过 MSP430.h)的机制。

    感谢你的所有帮助。 另一项不忽略警告的投票!

    Andrew

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

    尊敬的 Andrew:

    [引用用户="Andrew McLaren "]

    出于兴趣、是否有任何指定符合 CCS、GCC 环境所需的 C 结构的内容(例如对 MSP430.h 的要求、其相对于诸如 in430.h 等其他内容的序列等)。 我的大部分这件事都是由渗透引起的、我想知道我是否错过了其他东西、或者对影响一无所知。 我找到的最接近的是 MSP430 GCC 用户指南、其中介绍了 GCC 用于加载处理器特定定义(通过 MSP430.h)的机制。

    感谢你的所有帮助。 另一项不忽略警告的投票!

    [/报价]

    我想我们已经介绍了这里的问题的程度;我不会担心其他问题。 只需坚持在每个源文件中包含"msp430.h"、避免手动包含任何其他头文件。

    编译器和 MSP430-gcc-support-files 的特定于器件的行为被设置为有点黑框。 从这个意义上讲、您只需使用"-mmcu"指定 MCU、并在源文件顶部包含"msp430.h"、其余的将在后台处理。 即、它将引入所需的所有特定于器件的定义、选择要使用的链接器脚本、并为器件设置硬件乘法和 ISA 支持。

    同样、这可以在用户指南中更好地记录下来、因此我们将寻求改进。

    很高兴为您提供帮助、