STM32F4移植FreeRTOS

在之前的文章: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

编译成功,效果:

两个任务都在运行,说明我们的移植已经成功了。

参考文章:

STM32F4移植FreeRTOS

猜你喜欢

转载自blog.csdn.net/freestep96/article/details/129844798