我试图让我的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中的启动文件替换为它。所以它可能会破坏堆栈,但我不确定这一点。任何人有关于此的想法?
试着评论'DebugPrintf'调用,看看你是否得到相同的错误。但我的猜测是堆栈肯定被'DebugPrintf'调用破坏了。您也可以尝试调整堆栈大小。 – Adi 2013-02-25 08:53:35
我用来编译代码的工具链不支持libc,因此FreeRTOS无法访问memset和memcmp等函数。这个问题在我实现这些功能后解决了。访问Richard提供的链接以获得进一步参考。 – 2013-02-25 13:50:05