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.

[参考译文] ARM-CGT-CLANG:警告:调用函数可能会中断's VFP 寄存器;考虑使用`interrupt_save_fp`属性来防止此行为[-Wextra]

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

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/1618065/arm-cgt-clang-warning-call-to-function-could-clobber-interruptee-s-vfp-registers-consider-using-the-interrupt_save_fp-attribute-to-prevent-this-behavior--wextra

部件号:ARM-CGT-CLANG

以下是上述生成警告的编译器测试用例。

PP 文件 HwiP_armv7r_handlers_nortos.o.txt

Compiler 选项 -“C:/ti/ti-arm-clang/ti-cgt-armllvm_4.0.3.LTS/bin/tiarmclang.exe /Users/a0502728/Downloads/ReferencePrj/MBN-V3.1.2T/hello_world_am243x-evm_r5fss0-0_nortos_ti-arm-clang/Debug/syscfg -c -mcpu=cortex-r5 -mfloat-abi=hard -mfpu=vfpv3-D16 -mlittle-endian -i“C:/ti/ti-arm-clang/ti-cgt-armllvm_4.0.3.LTS/include/c -i“C:AM24“-i“C:/ti/MCU_SDK/AM243x/mcu_plus_sdk/source -DSOC_AM243X -Dos_debug_=1 -save-temps -g -thumb -i“-wir.wall_nortos  

编译器版本 - ti-cgt-armllvm_4.0.3.LTS

谢谢

 

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

    参考项目 —  hello_world_am243x-evm_r5fss0-0_nortos_ti-arm-clang.zip

    上述工程是使用 MCU+SDK v11.02.00.24 构建的、该器件为 AM243x。

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

    编译器发出诊断是正确的。  因为这些编译器选项...

    [报价 userid=“16414" url="“ url="~“~/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/1618065/arm-cgt-clang-warning-call-to-function-could-clobber-interruptee-s-vfp-registers-consider-using-the-interrupt_save_fp-attribute-to-prevent-this-behavior--wextra ]-mfloat-abi=hard -mfpu=vfpv3-D16

    ...编译器知道 VFP 寄存器存在于 CPU 中。  许多函数都会用到 __attribute__((中断)) 进行函数调用。  编译器被迫假设被调用函数会覆盖每个寄存器、包括 VFP 寄存器。  因为 __attribute__((interruptsave_save_fp)) 不会 编译器生成的代码就会使用 不会 保留 VFP 寄存器。  因此、VFP 寄存器中的内容可能会突然变化。   

    先更改为 __attribute__((interruptsave_save_fp)) 、则可以避免这种不安全的行为。  但代价是增加指令和周期来保留 VFP 寄存器。

    可以了 不会 建议使用该选项  -wno-extra 禁用诊断。  但这是受支持的。

    有关更多信息、请观看标题为  tiarmclang 视频系列的中断期间保留浮点寄存器的视频。

    谢谢。此致、

    -乔治

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

    您好、George、

    如果更改为 __attribute__((interruptsave_save_fp)) 、则可以避免这种不安全的行为。

    感谢您的答复。 我们建议客户使用 INTERRUPT_SAVE_FP 属性可避免警告、但客户不想使用该属性

    在我们的 MCU+SDK 中、我们将构建使用的库 相同的源文件 (hwip_armv7r_handlers_nortos.c)、未使用 interrupt_save_fp 属性、其编译时不会出现警告。

    以下是用于构建库的 makefile 内容。

    export MCU_PLUS_SDK_PATH?=$(abspath ../../..)
    include $(MCU_PLUS_SDK_PATH)/imports.mak
    
    CG_TOOL_ROOT=$(CGT_TI_ARM_CLANG_PATH)
    
    CC=$(CGT_TI_ARM_CLANG_PATH)/bin/tiarmclang
    AR=$(CGT_TI_ARM_CLANG_PATH)/bin/tiarmar
    
    PROFILE?=release
    ConfigName:=$(PROFILE)
    
    LIBNAME:=nortos.am243x.r5f.ti-arm-clang.$(PROFILE).lib
    
    FILES_common := \
        boot_armv7r.c \
        DebugP_shmLogWriter.c \
        DebugP_shmLogReader.c \
        DebugP_uartLogWriter.c \
        DebugP_uartScanf.c \
        DebugP_memTraceLogWriter.c \
        DebugP_log.c \
        DebugP_nortos.c \
        SemaphoreP_nortos.c \
        ClockP_nortos.c \
        ClockP_nortos_r5.c \
        EventP_nortos.c \
        HeapP_nortos.c \
        TimerP.c \
        TaskP_nortos.c \
        HwiP_armv7r_vim.c \
        HwiP_armv7r_handlers_nortos.c \
        MpuP_armv7r.c \
        CacheP_armv7r.c \
        CpuId_armv7r.c \
        HeapP_internal.c \
        printf.c \
        AddrTranslateP.c \
        PmuP_armv7r.c \
        QueueP_nortos.c \
    
    ASMFILES_common := \
        HwiP_armv7r_handlers_nortos_asm.S \
        HwiP_armv7r_vectors_nortos_asm.S \
        HwiP_armv7r_vectors_nortos_sbl_asm.S \
        boot_armv7r_asm.S \
        HwiP_armv7r_asm.S \
        MpuP_armv7r_asm.S \
        CacheP_armv7r_asm.S \
        CpuId_armv7r_asm.S \
        PmuP_armv7r_asm.S \
        Mutex_armv7r_asm.S \
    
    FILES_PATH_common = \
        dpl/r5 \
        dpl/common \
    
    INCLUDES_common := \
        -I${CG_TOOL_ROOT}/include/c \
        -I${MCU_PLUS_SDK_PATH}/source \
    
    DEFINES_common := \
        -DSOC_AM243X \
        -DOS_NORTOS \
    
    CFLAGS_common := \
        -mcpu=cortex-r5 \
        -mfloat-abi=hard \
        -mfpu=vfpv3-d16 \
        -mthumb \
        -Wall \
        -Werror \
        -g \
        -Wno-gnu-variable-sized-type-not-at-end \
        -Wno-unused-function \
        -Wno-extra \
    
    CFLAGS_cpp_common := \
        -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 \
        -x c++ \
    
    CFLAGS_debug := \
        -D_DEBUG_=1 \
    
    CFLAGS_release := \
        -Os \
    
    ARFLAGS_common := \
        rc \
    
    FILES := $(FILES_common) $(FILES_$(PROFILE))
    ASMFILES := $(ASMFILES_common) $(ASMFILES_$(PROFILE))
    FILES_PATH := $(FILES_PATH_common) $(FILES_PATH_$(PROFILE))
    CFLAGS := $(CFLAGS_common) $(CFLAGS_$(PROFILE))
    ASMFLAGS := $(CFLAGS_common) $(CFLAGS_$(PROFILE))
    ifeq ($(INSTRUMENTATION_MODE), yes)
    CFLAGS += -fprofile-instr-generate -fcoverage-mapping
    endif
    ifeq ($(CPLUSPLUS_BUILD), yes)
    CFLAGS += $(CFLAGS_cpp_common)
    endif
    DEFINES := $(DEFINES_common) $(DEFINES_$(PROFILE))
    INCLUDES := $(INCLUDES_common) $(INCLUDE_$(PROFILE))
    ARFLAGS := $(ARFLAGS_common) $(ARFLAGS_$(PROFILE))
    
    LIBDIR := lib
    OBJDIR := obj/am243x/ti-arm-clang/$(PROFILE)/r5f/nortos/nortos/
    OBJS := $(FILES:%.c=%.obj)
    OBJS += $(ASMFILES:%.S=%.obj)
    DEPS := $(FILES:%.c=%.d)
    
    vpath %.obj $(OBJDIR)
    vpath %.c $(FILES_PATH)
    vpath %.S $(FILES_PATH)
    
    $(OBJDIR)/%.obj %.obj: %.c
    	@echo  Compiling: $(LIBNAME): $<
    	$(CC) -c $(CFLAGS) $(INCLUDES) $(DEFINES) -MMD -o $(OBJDIR)/$@ $<
    
    $(OBJDIR)/%.obj %.obj: %.S
    	@echo  Compiling: $(LIBNAME): $<
    	$(CC) -c $(ASMFLAGS) $(INCLUDES) $(DEFINES) -o $(OBJDIR)/$@ $<
    
    all: $(LIBDIR)/$(LIBNAME)
    
    $(LIBDIR)/$(LIBNAME): $(OBJS) | $(LIBDIR)
    	@echo  .
    	@echo  Archiving: $(LIBNAME) to $@ ...
    	$(AR) $(ARFLAGS) $@ $(addprefix $(OBJDIR), $(OBJS))
    	@echo  Archiving: $(LIBNAME) Done !!!
    	@echo  .
    
    clean:
    	@echo  Cleaning: $(LIBNAME) ...
    	$(RMDIR) $(OBJDIR)
    	$(RM) $(LIBDIR)/$(LIBNAME)
    
    scrub:
    	@echo  Scrubing: $(LIBNAME) ...
    	-$(RMDIR) obj/
    	-$(RMDIR) lib/
    
    $(OBJS): | $(OBJDIR)
    
    $(LIBDIR) $(OBJDIR):
    	$(MKDIR) $@
    
    -include $(addprefix $(OBJDIR)/, $(DEPS))
    

    客户想知道为什么在编译应用程序时生成库 v/s 警告时不会生成警告?

    此致、

    Tushar

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我们正在构建使用的库 相同的源文件 (hwip_armv7r_handlers_nortos.c)、未使用 interrupt_save_fp 属性、其编译时不会出现警告。 [/报价]

    您没有看到由于编译器选项而出现的警告  -wno-extra (makefile 中的第 75 行)。  虽然这是支持的、但我不建议这样做。  只有直接或间接从 ISR 调用的所有函数始终不修改任何 VFP 寄存器时、这才是安全的。  要查看必须检查哪些函数、请在没有检查的情况下构建 -wno-extra

    谢谢。此致、

    -乔治