zwc112233 2022-05-09 16:54 采纳率: 100%
浏览 61
已结题

关于STM32F103用Makefile编译时,同个.c文件中的函数嵌套编译不成功问题

工程文件链接如下:链接: https://pan.baidu.com/s/14KkjnKtBzukm6LSwO7CGvQ 提取码: qc63

目的:延时点亮LED灯

工作条件:
1、在Linux系统中,Makefile文件使用stmcubeMX软件导出的模板,只修改.c文件路径和.h文件路径这2部分;
2、移植使用官方的stm32固件库。

碰到的问题:
使用stmcubeMX软件导出的Makefile文件编译链接后,在在led.c文件中,Delay()函数中无法调用test()函数。led.c文件中相关代码如下:


void test(void)
{
  for(int i=0;i<9333333;i++);
}

void Delay(void)
{
  LedG14(ON);
  test();
  LedG14(OFF);
  test();
}

在调试时,发现程序在执行 完 LedG14(ON);这条程序后,就跳过了 test();这条程序,直接执行 LedG14(OFF);了,下面的同样。
在链接的led.lst文件中,发现被调用的test()函数没有展开,led.lst文件的相关代码如下:

  24:./User/led/led.c **** void Delay(void)
  25:./User/led/led.c **** {
 156                      .loc 1 25 1 is_stmt 1 view -0
 157                      .cfi_startproc
 158                      @ args = 0, pretend = 0, frame = 0
 159                      @ frame_needed = 0, uses_anonymous_args = 0
 160 0000 10B5             push    {r4, lr}
 161                  .LCFI3:
 162                      .cfi_def_cfa_offset 8
 163                      .cfi_offset 4, -8
 164                      .cfi_offset 14, -4
  26:./User/led/led.c ****   LedG14(ON);
 165                      .loc 1 26 3 view .LVU28
 166 0002 074C             ldr    r4, .L12
 167 0004 0022             movs    r2, #0
 168 0006 4FF48041         mov    r1, #16384
 169 000a 2046             mov    r0, r4
 170 000c FFF7FEFF         bl    GPIO_WriteBit
 171                  .LVL8:
  27:./User/led/led.c ****  ** test();**
 172                      .loc 1 27 3 view .LVU29
  28:./User/led/led.c ****   LedG14(OFF);
 173                      .loc 1 28 3 view .LVU30
 174 0010 0122             movs    r2, #1
 175 0012 4FF48041         mov    r1, #16384
 176 0016 2046             mov    r0, r4
 177 0018 FFF7FEFF         bl    GPIO_WriteBit
 178                  .LVL9:
  29:./User/led/led.c ****  ** test();**
 179                      .loc 1 29 3 view .LVU31
  30:./User/led/led.c **** }

但是,使用stmcubeIDE软件移植固件库时,led.c不做修改,编译链接后,Delay()函数是可以调用test()函数的。

结论猜测:
通过对比stmcubeMX和stmcubeIDE这2个软件导出的Makefile文件分析,可以知道问题出现在stmcubeMX软件导出的Makefile文件哪里。但是,现在的问题是我不知道是什么原因导致这种问题的,问什么其它的函数可以调用展开,偏偏test()函数就不行呢?

相关文件程序如下:
main.c文件

#include "stm32f10x.h"
#include "led.h"

int main(void)
{
  LedInit();
 
  while (1)
  {
   LedD13(ON);
   LedG14(OFF);
   Delay();
   LedD13(OFF);
   Delay();
  }
  
    return 0;
   }

led.c文件

#include "led.h"

void LedInit(void)
{
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOG,ENABLE);
  GPIO_InitTypeDef   gpio_init_struct;
  gpio_init_struct.GPIO_Pin=GPIO_Pin_13;
  gpio_init_struct.GPIO_Speed=GPIO_Speed_50MHz;
  gpio_init_struct.GPIO_Mode=GPIO_Mode_Out_PP;
  GPIO_Init(GPIOD,&gpio_init_struct);
  
  gpio_init_struct.GPIO_Pin=GPIO_Pin_14;
  GPIO_Init(GPIOG,&gpio_init_struct);

  GPIO_WriteBit(GPIOD,GPIO_Pin_13,Bit_RESET);  
  GPIO_WriteBit(GPIOG,GPIO_Pin_14,Bit_RESET); 
}

void test(void)
{
  for(int i=0;i<9333333;i++);
}

void Delay(void)
{
  LedG14(ON);
  test();
  LedG14(OFF);
  test();
}

Makefile文件

######################################
# target
######################################
TARGET = stm32f103rbt6

######################################
# building variables
######################################
# debug build?
DEBUG = 1
# optimization
OPT = -Og

#######################################
# paths
#######################################
# Build path
BUILD_DIR = build

######################################
# source
######################################
# C sources

C_SOURCES =  \
User/main.c \
User/stm32f10x_it.c \
User/led/led.c \
Libraries/CMSIS/CM3/CoreSupport/core_cm3.c \
Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/system_stm32f10x.c \
Libraries/STM32F10x_StdPeriph_Driver/src/misc.c \
Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_gpio.c \
Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_rcc.c

# ASM sources
ASM_SOURCES =  \
startup_stm32f103xb.s

#######################################
# binaries
#######################################
PREFIX = arm-none-eabi-
# The gcc compiler bin path can be either defined in make command via GCC_PATH variable (> make GCC_PATH=xxx)
# either it can be added to the PATH environment variable.
ifdef GCC_PATH
CC = $(GCC_PATH)/$(PREFIX)gcc
AS = $(GCC_PATH)/$(PREFIX)gcc -x assembler-with-cpp
CP = $(GCC_PATH)/$(PREFIX)objcopy
SZ = $(GCC_PATH)/$(PREFIX)size
else
CC = $(PREFIX)gcc
AS = $(PREFIX)gcc -x assembler-with-cpp
CP = $(PREFIX)objcopy
SZ = $(PREFIX)size
endif
HEX = $(CP) -O ihex
BIN = $(CP) -O binary -S
 
#######################################
# CFLAGS
#######################################
# cpu
CPU = -mcpu=cortex-m3

# fpu
# NONE for Cortex-M0/M0+/M3

# float-abi

# mcu
MCU = $(CPU) -mthumb $(FPU) $(FLOAT-ABI)

# macros for gcc
# AS defines
AS_DEFS = 

# C defines
C_DEFS =  \
-DUSE_STDPERIPH_DRIVER \
-DSTM32F10X_HD

# AS includes
AS_INCLUDES = 

# C includes
C_INCLUDES =  \
-ILibraries/CMSIS/CM3/CoreSupport \
-ILibraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x \
-ILibraries/STM32F10x_StdPeriph_Driver/inc \
-IUser/ \
-IUser/led

# compile gcc flags
ASFLAGS = $(MCU) $(AS_DEFS) $(AS_INCLUDES) $(OPT) -Wall -fdata-sections -ffunction-sections

CFLAGS += $(MCU) $(C_DEFS) $(C_INCLUDES) $(OPT) -Wall -fdata-sections -ffunction-sections

ifeq ($(DEBUG), 1)
CFLAGS += -g -gdwarf-2
endif

# Generate dependency information
CFLAGS += -MMD -MP -MF"$(@:%.o=%.d)"

#######################################
# LDFLAGS
#######################################
# link script
LDSCRIPT = STM32F103RBTx_FLASH.ld

# libraries
LIBS = -lc -lm -lnosys 
LIBDIR = 
LDFLAGS = $(MCU) -specs=nano.specs -T$(LDSCRIPT) $(LIBDIR) $(LIBS) -Wl,-Map=$(BUILD_DIR)/$(TARGET).map,--cref -Wl,--gc-sections

# default action: build all
all: $(BUILD_DIR)/$(TARGET).elf $(BUILD_DIR)/$(TARGET).hex $(BUILD_DIR)/$(TARGET).bin

#######################################
# build the application
#######################################
# list of objects
OBJECTS = $(addprefix $(BUILD_DIR)/,$(notdir $(C_SOURCES:.c=.o)))
vpath %.c $(sort $(dir $(C_SOURCES)))
# list of ASM program objects
OBJECTS += $(addprefix $(BUILD_DIR)/,$(notdir $(ASM_SOURCES:.s=.o)))
vpath %.s $(sort $(dir $(ASM_SOURCES)))

$(BUILD_DIR)/%.o: %.c Makefile | $(BUILD_DIR) 
    $(CC) -c $(CFLAGS) -Wa,-a,-ad,-alms=$(BUILD_DIR)/$(notdir $(<:.c=.lst)) $< -o $@

$(BUILD_DIR)/%.o: %.s Makefile | $(BUILD_DIR)
    $(AS) -c $(CFLAGS) $< -o $@

$(BUILD_DIR)/$(TARGET).elf: $(OBJECTS) Makefile
    $(CC) $(OBJECTS) $(LDFLAGS) -o $@
    $(SZ) $@

$(BUILD_DIR)/%.hex: $(BUILD_DIR)/%.elf | $(BUILD_DIR)
    $(HEX) $< $@
    
$(BUILD_DIR)/%.bin: $(BUILD_DIR)/%.elf | $(BUILD_DIR)
    $(BIN) $< $@    
    
$(BUILD_DIR):
    mkdir $@        

#######################################
# clean up
#######################################
clean:
    -rm -fR $(BUILD_DIR)
  
#######################################
# dependencies
#######################################
-include $(wildcard $(BUILD_DIR)/*.d)

# *** EOF ***



  • 写回答

1条回答 默认 最新

  • qllaoda 2022-05-09 17:10
    关注

    我觉得是优化问题,test函数执行的操作,既没有影响到任何其它变量的值,也不会产生任何输出,所以直接被优化了。
    你可以做个测试,把test里的那个循环变量加个volatile修饰符,看会不会结果就不一样了。也可以试试修改优化等级。

    void test(void)
    {
    volatile int i;
    for(i=0;i<9333333;i++);
    }

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 5月18日
  • 已采纳回答 5月10日
  • 修改了问题 5月9日
  • 创建了问题 5月9日

悬赏问题

  • ¥15 对于这个问题的代码运行
  • ¥50 三种调度算法报错 有实例
  • ¥15 关于#python#的问题,请各位专家解答!
  • ¥200 询问:python实现大地主题正反算的程序设计,有偿
  • ¥15 smptlib使用465端口发送邮件失败
  • ¥200 总是报错,能帮助用python实现程序实现高斯正反算吗?有偿
  • ¥15 对于squad数据集的基于bert模型的微调
  • ¥15 为什么我运行这个网络会出现以下报错?CRNN神经网络
  • ¥20 steam下载游戏占用内存
  • ¥15 CST保存项目时失败