环境: win7, IAR8.11, STM32F407VG,标准库文件, 系统—FreeRTOSV202104.00
步骤:
1. 先用IAR中新建一个工程,串口正常打印日志信息
路径为
build
include-------------
| --Api
|--Drv
|--Mcu
source---------
| --Api
|--Drv
|--FreeRTOS
|--Main
|--Mcu
2. 其中FreeRTOS是直接从官网下载得来。其中FreeRTOSConfig.h从下载的demo中获取并放入到以下工程中。
3. 在IAR工程列表中采用以下结构:
FreeRTOS-------
|-----CORE(包含以下文件CROUTINE.C, event_group.c, list.c, queue.c, stream_buffer.c, tasks.c, timers.c)
|-----PORTTABLE(包含heap_4.c, port.c, portasm.s),注意此处的port.c采用porttable->IAR->ARM_CM4F, heap_4.c 在MemMang目录中
|----FreeRTOSConfig.h
3. 添加以上文件后需要再IAR的options中设置C/C++ compiler添加.h头文件, 由于有portasm.s汇编文件,所以需要在Assember中加入FreeRTOSConfig.h的路径,否则会报错。
4. 添加以上设置后还会报错
Error[Li006]: duplicate definitions for "PendSV_Handler"
Error[Li006]: duplicate definitions for "SVC_Handler";
Error[Li006]: duplicate definitions for "SysTick_Handler"
解决方法:由于PendSV_Handler,SVC_Handler,SysTick_Handler三个中断函数重定义,可以注释掉stm32xxxx_it.c中这三个函数。
port.c中vPortSVCHandler,xPortPendSVHandler ,xPortSysTickHandler在FreeRTOSConfig.h通过下面三个宏定义成上面那三个函数。
#define vPortSVCHandler SVC_Handler
#define xPortPendSVHandler PendSV_Handler
#define xPortSysTickHandler SysTick_Handler
5. 需要添加vApplicationStackOverflowHook( TaskHandle_t pxTask, char *pcTaskName)
{
}
6.经过以上修改后便可运行。
中途异常: 新建任务正常,开启任务正常,但是没法正常运行systick_handler导致无法切换任务,且此时会导致程序退出main函数而死机