在之前的文章:FreeRTOS全解析-2.源码结构与移植 中我们已经讲解过FreeRTOS移植的方法,并且给出了一个在ARM9上移植的例子,今天再来看一个例子:板子的芯片为STM32F407,架构为ARM_CM4F,IDE为keil。
1.随便找一个STM32F4例程
拿了正点原子LCD实验例程,先编译下载程序看看能不能正常运行
非常正常。
2.将FreeRTOS相关代码放到keil工程目录
如图整个复制过去
然后删减一下,portable文件夹里只保留,MemMang和RVDS两个文件夹,其他全删了。
再删减一下RVDS中的文件,因为我们的芯片是STM32F407,架构是ARM_CM4F,所以其他全删除。
在官方demo里找一个和我们架构相似的FreeRTOSConfig.h,复制进我们keil工程的USER文件夹
3.在keil中添加FreeRTOS代码
把必要的文件添加进去
别忘了设置头文件路径。
4.编译
写两个简单的任务,任务1:led循环亮灭,任务2:屏幕循环黑白切换
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "lcd.h"
#include "FreeRTOS.h"
#include "task.h"
void vTask1( void *pvParameters )
{
for( ;; ) {
LED0=0;
delay_ms(5000);
LED0=1;
delay_ms(5000);
}
}
void vTask2( void *pvParameters )
{
for( ;; ) {
LCD_Clear(BLACK);
delay_ms(5000);
LCD_Clear(WHITE);
delay_ms(5000);
}
}
static void prvSetupHardware( void )
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);
delay_init(168);
uart_init(115200);
LED_Init();
LCD_Init();
}
int main(void)
{
prvSetupHardware();
xTaskCreate(vTask1, "Task 1", 1000, NULL, 1, NULL);
xTaskCreate(vTask2, "Task 2", 1000, NULL, 1, NULL);
vTaskStartScheduler();
}
然后编译,有一个未定义错误。
将FreeRTOSConfig.h中的条件编译
#ifdef __ICCARM__
修改为
#if defined(__ICCARM__)||defined(__CC_ARM)||defined(__GNU__)
再编译
又提示port.o与stm32f4xx_it.o有重复定义
注释掉stm32f4xx_it.c中的SVC_Handler()、PendSV_Handler() SysTick_Handler()
再编译,又提示几个函数未定义,这是因为FreeRTOSConfig.h中配置了相关的功能,我们把相关配置关掉,就是置0。
#define configUSE_IDLE_HOOK 0
#define configUSE_TICK_HOOK 0
#define configCHECK_FOR_STACK_OVERFLOW 0
#define configUSE_MALLOC_FAILED_HOOK 0
编译成功,效果:
两个任务都在运行,说明我们的移植已经成功了。
参考文章: