2014-09-23 28 views
1

你好,我需要計算在我的STM32對數。我使用arm-none-eabi-gcc。當我在我的Makefile單片機中添加-L/opt/tools/Sourcery_G++_Lite/arm-none-eabi/lib/停止工作。不幸的是,我無法調試我的程序,因爲我的設備上沒有debag引腳,我通過bootloader將程序加載到閃存。我不使用庫中的任何數學函數 - 我只是將庫路徑添加到Makefile。 這裏是我的完整的makefile:STM32臂無 - EABI - 海合會鏈接庫

OUTPUTDIR = $(BUILDDIR)/../../output 

DEPDIR = $(BUILDDIR)/.dep 
PWD = $(shell pwd) 

COMMONFLAGS = -mcpu=cortex-m3 -mthumb -ggdb3 
CFLAGS += $(COMMONFLAGS) -Os $(INCLUDES) -I. 
CFLAGS += -std=c99 -Wall -Wextra -static -fdata-sections -ffunction-sections -fno-hosted -fno-builtin 
CFLAGS += -nostdlib -nodefaultlibs 
CFLAGS += -mapcs-frame -msoft-float 
CFLAGS += -MD -MP -MF $(DEPDIR)/$(@F).d 
LDFLAGS = $(COMMONFLAGS) -static 
LDFLAGS += -fno-exceptions -ffunction-sections -fdata-sections 
LDFLAGS += -static -Xlinker --gc-sections 
#LDFLAGS += -L/opt/tools/dima/Sourcery_G++_Lite/arm-none-eabi/lib/ 
ASFLAGS = $(COMMONFLAGS) 

CFLAGS += -DUSE_STDPERIPH_DRIVER 

CROSS = /opt/tools/Sourcery_G++_Lite/bin/arm-none-eabi 
GCC = $(CROSS)-gcc 
AS = $(CROSS)-as 
SIZE = $(CROSS)-size 
OBJCOPY = $(CROSS)-objcopy 
OBJDUMP = $(CROSS)-objdump 
NM = $(CROSS)-nm 

COBJ = $(addprefix $(BUILDDIR)/, $(CSRC:.c=.c.o)) 
ASMOBJ = $(addprefix $(BUILDDIR)/, $(ASMSRC:.s=.s.o)) 
OBJ = $(COBJ) $(ASMOBJ) 

V = $(if $(VERBOSE), , @) 


all: prebuild $(BUILDDIR)/$(TARGET).elf $(LDSCRIPT) 
    @$(SIZE) $(BUILDDIR)/$(TARGET).elf 
    @$(OBJCOPY) -O binary $(BUILDDIR)/$(TARGET).elf $(BUILDDIR)/$(TARGET).bin 
    @$(OBJCOPY) -O ihex $(BUILDDIR)/$(TARGET).elf $(BUILDDIR)/$(TARGET).hex 
    @$(OBJDUMP) -h -S -z $(BUILDDIR)/$(TARGET).elf > $(BUILDDIR)/$(TARGET).lss 
    @$(NM) -n $(BUILDDIR)/$(TARGET).elf > $(BUILDDIR)/$(TARGET).sym 
    @mkdir -p $(OUTPUTDIR) 
    @cp $(BUILDDIR)/$(TARGET).bin $(OUTPUTDIR) 
    @echo ======================================================================= 


$(BUILDDIR)/$(TARGET).elf: $(OBJ) 
    @echo Linking [email protected] 
    $(GCC) $(LDFLAGS) -T $(PWD)/$(LDSCRIPT) -o [email protected] $(OBJ) -lm 

$(COBJ): $(BUILDDIR)/%.c.o : %.c 
    @echo Compiling $< 
    @-mkdir -p $(@D) 
    $(GCC) $(CFLAGS) -c $< -o [email protected] 

$(ASMOBJ): $(BUILDDIR)/%.s.o : %.s 
    @echo Assembling $< 
    @-mkdir -p $(@D) 
    $(V)$(AS) $(ASFLAGS) -c ./$< -o [email protected] 


-include $(shell mkdir -p $(DEPDIR) 2>/dev/null) $(wildcard $(DEPDIR)/*) 

.PHONY: clean output 

clean: 
    rm -rf $(BUILDDIR) 

我做錯了什麼?謝謝。

回答

2

蒙山這個庫目錄,你會簡單地鏈接防錯集multilib的文件,並最終與ARM代碼鏈接,而你的MCU只能執行Thumb代碼。正確的文件集應位於Cortex M3μC的thumb2子目錄中。

請注意,使用arm-none-eabi-gcc進行鏈接時,Sourcery G ++ lite將自動奇蹟般地添加正確的庫目錄,您的Makefile似乎已經完成了該鏈接。

+0

它的工作!非常感謝你!當我使用以下庫路徑時:'LDFLAGS + = -L/opt/tools/dima/Sourcery_G ++ _ Lite/arm-none-eabi/lib/thumb2 /'微控制器可以運行程序。 – user3583807 2014-09-24 07:16:17

1

你真的不應該手動鏈接libm.a和你真的不應該硬編碼庫路徑手動......這一切都被自動完成的(正確)如果你使用臂無 - EABI - 海合會(或-g ++ )鏈接並給出正確的標誌(-mcpu和-mthumb)。因此,只需放下所有這些路徑和「-lm」即可使用。你可以嘗試一下我的ARM微控制器示例項目 - makefile(和鏈接器腳本)中的設置使所有這些工作都很好 - 無需用戶干預。 http://www.freddiechopin.info/en/download/category/6-examples

而且 - 我認爲問題的一部分可能是在這些標誌使用:-fno託管-fno-內置-nostdlib -nodefaultlibs - 最後一個特別防止libm.a.的這種自動鏈接

+0

你有沒有使用數學庫中的任何函數的任何stm32項目?如果我打電話,我的程序崩潰,例如,sqrt()。 – user3583807 2014-09-29 09:03:46

+0

在這些例子中你可以使用任何功能,它完美的作品......包括,調用任何功能,它工作得很好......也許你有過小堆或中斷使用功能(在我的例子中斷堆棧被禁用默認情況下 - 檢查鏈接腳本的細節)?你確定你的堆棧總是對齊到8個字節嗎?這需要使用雙精度型的許多功能,但通常只有在堆棧傳遞這樣的變量時,...嘗試stm32_blink_led(或任何其他STM32版本 - CL或F4)的例子 - 它必須在那裏工作。 – 2014-09-29 09:28:58