2013-02-19 60 views
3

我試圖讓我的stm32f4discovery板上運行FreeRTOS。我已經安裝了summon-arm-toolchain並創建了一個Makefile來編譯我的代碼。這裏是Makefile中:FreeBSD與STM32F4堆棧腐敗gcc

TOOLCHAIN_PATH:=/usr/local/sat/bin 
TOOLCHAIN_PREFIX:=arm-none-eabi 
OPTLVL:=0 
FREERTOS:=.. 
STARTUP:=$(CURDIR)/startup 
LINKER_SCRIPT:=$(FREERTOS)/Utilities/stm32_flash.ld 
INCLUDE=-I$(CURDIR) 
# Setting other include path... 
BUILD_DIR = $(CURDIR)/build 
BIN_DIR = $(CURDIR)/binary 
vpath %.c $(CURDIR) 
# Setting other vpath... 
vpath %.s $(STARTUP) 
ASRC=startup_stm32f4xx.s 
# Project Source Files 
SRC+=stm32f4xx_it.c 
SRC+=system_stm32f4xx.c 
SRC+=main.c 
# FreeRTOS Source Files 
SRC+=port.c 
SRC+=list.c 
SRC+=queue.c 
SRC+=tasks.c 
SRC+=timers.c 
SRC+=heap_2.c 
SRC+=syscalls.c 
SRC+=stm32f4xx_usart.c 
# Other peripheral source files... 
CDEFS=-DUSE_STDPERIPH_DRIVER 
CDEFS+=-DSTM32F4XX 
CDEFS+=-DHSE_VALUE=8000000 
MCUFLAGS=-mcpu=cortex-m4 -mthumb -mfpu=fpv4-sp-d16 -mfloat-abi=softfp 
COMMONFLAGS=-O$(OPTLVL) -g -Wall 
CFLAGS=$(COMMONFLAGS) $(MCUFLAGS) $(INCLUDE) $(CDEFS) 
LDLIBS= 
LDFLAGS=$(COMMONFLAGS) -fno-exceptions -ffunction-sections -fdata-sections -nostartfiles -Wl,--gc-sections,-T$(LINKER_SCRIPT) 
OBJ = $(SRC:%.c=$(BUILD_DIR)/%.o) 
CC=$(TOOLCHAIN_PATH)/$(TOOLCHAIN_PREFIX)-gcc 
LD=$(TOOLCHAIN_PATH)/$(TOOLCHAIN_PREFIX)-gcc 
OBJCOPY=$(TOOLCHAIN_PATH)/$(TOOLCHAIN_PREFIX)-objcopy 
AS=$(TOOLCHAIN_PATH)/$(TOOLCHAIN_PREFIX)-as 
AR=$(TOOLCHAIN_PATH)/$(TOOLCHAIN_PREFIX)-ar 
GDB=$(TOOLCHAIN_PATH)/$(TOOLCHAIN_PREFIX)-gdb 

$(BUILD_DIR)/%.o: %.c 
    $(CC) $(CFLAGS) $< -c -o [email protected] 

all: $(OBJ) 
    $(AS) -o $(ASRC:%.s=$(BUILD_DIR)/%.o) $(STARTUP)/$(ASRC) 
    $(CC) -o $(BIN_DIR)/$(TARGET).elf $(LDFLAGS) $(OBJ) $(ASRC:%.s=$(BUILD_DIR)/%.o) $(LDLIBS) 
    $(OBJCOPY) -O ihex $(BIN_DIR)/$(TARGET).elf $(BIN_DIR)/$(TARGET).hex 
    $(OBJCOPY) -O binary $(BIN_DIR)/$(TARGET).elf $(BIN_DIR)/$(TARGET).bin 

我在FreeRTOS操作系統示範項目的文件夾CORTEX_M4F_STM32F407ZG-SK改性工程(拆除現有的任務和創建我自己的)。這裏的主要功能是:

int main(void) { 
    int ret; 
    prvSetupHardware(); 
    DebugPrintf("FreeRTOS v7.3.0 starting\n"); 
    ret = xTaskCreate(SampleTask0, (signed char *) "T0", configMINIMAL_STACK_SIZE, NULL, 2, NULL); 
    if (ret == pdTRUE) { 
     DebugPrintf("Task %x creared successfully:%d.\n", SampleTask0, ret); 
    } else { 
     DebugPrintf("Task 0 created failed.\n"); 
    } 
    ret = xTaskCreate(SampleTask1, (signed char *) "T1", configMINIMAL_STACK_SIZE, NULL, 1, NULL); 
    if (ret == pdTRUE) { 
     DebugPrintf("Task %x creared successfully:%d.\n", SampleTask1, ret); 
    } else { 
     DebugPrintf("Task 1 created failed.\n"); 
    } 
    DebugPrintf("Starting scheduler...\n"); 
    vTaskStartScheduler(); 
    for (;;); 
} 

我在FreeRTOSConfig.h中配置configMINIMAL_STACK_SIZE爲4096,代碼順利的任務計劃程序啓動並調用我的SampleTask0功能。以下是任務代碼:

void SampleTask0(void *pvParameters) { 
    (void) pvParameters; 
    uint16_t delay; 
    for (;;) { 
     delay = 10000; 
     DebugPrintf("Task 0 running\n"); 
     while(delay) {delay--;} 
    } 
    vTaskDelete(NULL); 
} 

除了打印不同的信息外,任務1功能幾乎與任務0相同。 這些代碼編譯後,我寫二進制文件到我的主板,SampleTask0不能按預期工作。通過USART3發送字符的DebugPrintf函數僅打印「Tas」,然後一切都停止。我用gdb跟蹤了代碼並執行了代碼,一步一步地執行了「任務0運行」,但是當它返回任務函數時(在「while(delay){delay--;}」之前)發生了錯誤:

在地址0xa5a5a5a5不能訪問內存

SampleTask0(pvParameters =爲0x0)在main.c中......

據FreeRTOS的documents,每個任務的堆棧充滿了創作時0xA5的字節。我認爲堆棧可能有問題。我已經將configCHECK_FOR_STACK_OVERFLOW設置爲2來啓用堆棧溢出檢測,但是當發生這種情況時,我的hook函數還沒有被調用。

CORTEX_M4F_STM32F407ZG-SK中的startup_stm32f4xx.s是爲EWARM工具鏈創建的,我將其從ST網站下載的STM32F4-Discovery_FW_V1.1.0中的啓動文件替換爲它。所以它可能會破壞堆棧,但我不確定這一點。任何人有關於此的想法?

+0

試着評論'DebugPrintf'調用,看看你是否得到相同的錯誤。但我的猜測是堆棧肯定被'DebugPrintf'調用破壞了。您也可以嘗試調整堆棧大小。 – Adi 2013-02-25 08:53:35

+0

我用來編譯代碼的工具鏈不支持libc,因此FreeRTOS無法訪問memset和memcmp等函數。這個問題在我實現這些功能後解決了。訪問Richard提供的鏈接以獲得進一步參考。 – 2013-02-25 13:50:05

回答

0

存檔在這個頂端的線程在這裏:自上次存檔快照以來的任何其他信息可以在FreeRTOS支持論壇上找到。 http://www.freertos.org/FreeRTOS_Support_Forum_Archive/February_2013/freertos_FreeRTOS_stack_corruption_on_STM32F4_with_gcc_6772412.html

+0

我在FreeRTOS論壇上也問過同樣的答案。這個問題現在已經解決了。 – 2013-02-25 13:54:32

+0

@王燁:請在這裏提供解決方案! – eDeviser 2017-06-30 07:37:20