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.

[参考译文] VFP–AM243X:"警告:调用函数可能会阻塞寄存器's MCU-PLUS-SDK 寄存器;考虑使用`interruptsave_save_fp`属性来防止此行为[-Wextra]"

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1571887/mcu-plus-sdk-am243x-warning-call-to-function-could-clobber-interruptee-s-vfp-registers-consider-using-the-interrupt_save_fp-attribute-to-prevent-this-behavior--wextra

器件型号: AM243X - MCU-PLUS-SDK

工具/软件:

您好:  

我们目前正在更新工业通信 SDK 11。 过去、我们只是覆盖了 SDK 的中止处理程序。 现在、结构改变了一个位、我们可以在用户中止处理程序中获得更多信息。
我们只需更新覆盖实施、就能采用旧解决方案。 因此、修改仅限于我们从中止处理程序进行回调、最终将复位器件。  

因此我们无论如何都会收到错误“警告:调用函数可能会中断 VFP 寄存器;考虑使用`interrupt_save_fp`属性来防止出现此行为[-Wextra]“。

但有趣的是、我们也针对大多数 TI 代码获得了它。 即使调用诸如 get_SPSR() 和例如 Hwip_getFIQVecAddr() 之类的函数 、也会产生此消息。 我添加了也在 SDK 的 make 脚本中设置的编译选项、但这没有帮助。  

是否有可能消除这些警告? 我的意思是、它们似乎不是一个小问题、因为阻塞 VFP 寄存器可能会影响中断行为。

此致

Felix

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

    您好 Felix:

    我们已将其分配给我们的 MCU Plus SDK 团队、我们会内部审核并回复您。

    此致

    Karan

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

    您好 Felix:

    为避免出现此警告、建议使用  interrupt_save_fp 定义可以从中断处理程序调用并使用浮点运算的函数时的属性。 这可确保 VFP 寄存器正确保存和恢复、从而防止潜在问题。

    语法定义如下。

    Syntax - 
    __attribute__((interrupt_save_fp)) <return type> symbol (<arguments>) { … }
    __attribute__((interrupt_save_fp[(”interrupt-type”)])) void symbol () { … }

    请参阅  cm-interrupt-save-fp-function-attribute 以了解更多详细信息。

    此致、

    Tushar

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

    嗨、Tushar、  
    是的,我想到了。 但我很好奇为什么 SDK 中还没有这样做、因为它抱怨 SDK 内部调用的函数、我们不打算修改这些函数。
    自 SDK 编译以来、我没有看到任何投诉、我认为可能是我做错了吗? 当然、我们将覆盖部分编译为 c++-files、将 SDK 编译为 c 文件、因此这种问题是否有区别?

    此致

    Felix

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

    您好 Felix:

    您可能在 ISR 回调中执行浮点运算。 具有“Interrupt"属性“属性的函数不会自动保留 FPU 寄存器。

    请参阅下图。

    此致、

    Tushar

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

    不、我们不是这样做的。  
    如前所述、出现此警告时、如果我根本不更改代码、只需将源文件 HwiP_armv7r_handers_freertos.c 复制到我们的代码库中、即可覆盖 SDK 实现。 例如、它也使用 c++-linking 进行编译、但 extern “C"在“在这里可以完成它的工作。  

    因此,在没有修改代码的情况下,它将抱怨调用  get_SPSR (),这是我在入口文章中提到的。 这是 SDK 提供的一个函数。 我们不进行浮点运算或任何其他操作。  

    我想知道我是否出错、因为 SDK 的编译不会生成这些警告、但在我们的代码库中编译的完全相同的 TI 代码会生成这些警告、即使它根本不使用我们的代码库也是如此。  

    我不想修改 SDK 并将此属性添加到函数  get_SPSR () 等中,因为这意味着我们每次更新都需要修改它。 这不是我们的目标。  

    那么、SDK 中是否存在问题、或者我是否错过了这里的某些内容?

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

    您好 Felix:

    of cours, e 它也是用 c++-linking 编译的,但 extern “C"在“在这里做它的工作

    我们尚未使用 C++链接测试我们的 SDK、所有库都是使用 C 语言构建的。请参阅下图。

    删除 C++链接时、您是否会看到上述警告?

    此外、您在编译过程中使用了所有 C++标志吗?

    此致、

    Tushar

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

    所以我也尝试只是复制.c 文件、因此应该可以通过 C 链接获得。 但发出了相同的警告。  
    我们使用的标志为:

    -Wno-gnu-variable-sized-type-not-at-end
    -mcpu=cortex-r5
    -mfloat-abi=hard
    -mfpu=vfpv3-d16
    -Wno-error=ti-macros
    -Wno-unused-function
    -Wno-invalid-command-line-argument
    -fno-rtti
    -ffunction-sections
    -fdata-sections
    -mno-unaligned-access
    -Werror=return-type
    -Wall
    -Wextra
    -Og
    -g
    -fdiagnostics-color=always
    -mlittle-endian
    -Wno-c99-designator
    -Wno-extern-c-compat
    -Wno-c++11-narrowing
    -Wno-reorder-init-list
    -Wno-register
    -Wno-writable-strings
    -Wno-enum-compare
    -Wno-reserved-user-defined-literal
    -Wno-unused-const-variable
    -Wno-vla-cxx-extension
    -std=c++14

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

    从构建过程中删除以下标志后、您可以尝试一次吗?

    -mfloat-abi=hard
    -mfpu=vfpv3-d16

    删除上述内容后、将重新构建库和示例。 请告诉我们这是否有效。

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

    已尝试、但仍会出现这些消息。 仅举一个示例:


    hwiP_armv7r_handers_nortos.cpp:156:28:警告:调用函数可能会中断 vFP 寄存器;考虑使用`interrupt_save_fp`属性来防止这种行为[-Wextra]
    156 |      uint32_t isPulse = HwiP_isPulse (intNum);
    hwiP_armv7r_vim.h:143:37:注意:此处声明了“HwiP_isPulse"</s>“
    143 |静态内联 uint32_t HWI_section HwiP_isPulse (uint32_t intNum)  

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

    您能否提供在我们这边重现同样行为的步骤?

    当前解决方案是在函数定义中使用属性“interruptsave_fp"来“来避免警告。

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

    您好 Felix:

    对延迟深表歉意。 我能够使用上述建议的方法重现此问题。

    我检查了工程和 SDK、工程和 SDK 的所有编译器选项和标志都相同、但问题仍然存在。

    我仍在调试、  这里已经提到了当前的权变措施。  

    此致、

    Tushar

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

    您好 Felix:

    我想知道我是否出错、因为 SDK 的编译不会产生这些警告、但在我们的代码库中编译的完全相同的 TI 代码确实会产生这些警告、即使它根本不使用我们的代码库。  [/报价]

    因为、在编译 SDK 文件时不会生成警告 -wno-extra 标志用于 SDK 的 makefile。 如果删除该标志、您也会在 SDK 中看到编译问题(由于-Werror 标志)。

    有关更多详细信息、请参阅   
    ARM-CGT-CLANG:警告:调用函数可能会中断 VFP 寄存器;考虑使用`interrupt_save_fp`属性来防止出现此行为[-Wextra] 
    此致、

    Tushar