1. 新建完整的可以点亮LED灯的工程
2.添加FreeRTOS源码
- 2.1 .将FreeRTOS的源码拷贝到新建工程的FreeRTOS的文件加下
- 2.2.Protable文件下只保留Keil、MemMang、RVDS三个文件夹,其余的全部删除
- 2.3.在keil工程新建FreeRTOS_CORE、FreeRTOS_PORTABLE两个分组,分别添加如下图所示的文件
- 2.4.添加头文件路径,如下图所示
- 添加头文件FreeRTOSConfig.h,在…\FreeRTOSv10.4.1\FreeRTOS\Demo\CORTEX_M4F_STM32F407ZG-SK路径下把FreeRTOSConfig.h拷贝到工程中,位置自定义,本文将其移植到… \FreeRTOS\User路径下。
到此为止,我们已经将FreeRTOS的源码添加完毕,接下来我们开始编译修改
3.修改文件编译
- 3.1.将FreeRTOSConfig.h中
#ifdef __ICCARM__
#include <stdint.h>
extern uint32_t SystemCoreClock;
#endif
修改为:
#if defined(__ICCARM__)||defined(__CC_ARM) ||defined(__GNUC__)
#include <stdint.h>
extern uint32_t SystemCoreClock;
#endif
- 3.2.将stm32f4xx_it.c中的void SVC_Handler(void)、void PendSV_Handler(void)、void SysTick_Handler(void)三个函数屏蔽,因为在port.c中也定义了这三个函数;
- 3.3.将FreeRTOSConfig.h中的configUSE_IDLE_HOOK、configUSE_TICK_HOOK、configCHECK_FOR_STACK_OVERFLOW、configUSE_MALLOC_FAILED_HOOK四个钩子函数启用的宏定义为0,至此编译应该为0 Error(s), 0 Warning(s),如有错误在仔细检查
4.新建实验任务,验证移植情况
//任务优先级
#define START_TASK_PRIO 1
//任务堆栈大小
#define START_STK_SIZE 128
//任务句柄
TaskHandle_t StartTask_Handler;
//任务函数
void start_task(void *pvParameters);
//任务优先级
#define LED0_TASK_PRIO 2
//任务堆栈大小
#define LED0_STK_SIZE 50
//任务句柄
TaskHandle_t LED0Task_Handler;
//任务函数
void led0_task(void *pvParameters);
//任务优先级
#define LED1_TASK_PRIO 3
//任务堆栈大小
#define LED1_STK_SIZE 50
//任务句柄
TaskHandle_t LED1Task_Handler;
//任务函数
void led1_task(void *pvParameters);
//开始任务任务函数
void start_task(void *pvParameters)
{
taskENTER_CRITICAL(); //进入临界区
//创建LED0任务
xTaskCreate((TaskFunction_t )led0_task,
(const char* )"led0_task",
(uint16_t )LED0_STK_SIZE,
(void* )NULL,
(UBaseType_t )LED0_TASK_PRIO,
(TaskHandle_t* )&LED0Task_Handler);
//创建LED1任务
xTaskCreate((TaskFunction_t )led1_task,
(const char* )"led1_task",
(uint16_t )LED1_STK_SIZE,
(void* )NULL,
(UBaseType_t )LED1_TASK_PRIO,
(TaskHandle_t* )&LED1Task_Handler);
vTaskDelete(StartTask_Handler); //删除开始任务
taskEXIT_CRITICAL(); //退出临界区
}
//LED0任务函数
void led0_task(void *pvParameters)
{
while(1)
{
Led_State_Set(LED_Gren,LED_ON);
vTaskDelay(500);
Led_State_Set(LED_Gren,LED_OFF);
vTaskDelay(500);
}
}
//LED1任务函数
void led1_task(void *pvParameters)
{
while(1)
{
vTaskDelay(200);
Led_State_Set(LED_Blue,LED_ON);
vTaskDelay(800);
Led_State_Set(LED_Blue,LED_OFF);
}
}
/**
* @brief The application entry point.
* @param None
* @retval int
*/
int main(void)
{
/* Reset of all peripherals, Initializes the Flash interface and the Systick*/
HAL_Init();
/* Configure the system clock */
SystemClock_Config();
Led_Port_Init();
//创建开始任务
xTaskCreate((TaskFunction_t )start_task, //任务函数
(const char* )"start_task", //任务名称
(uint16_t )START_STK_SIZE, //任务堆栈大小
(void* )NULL, //传递给任务函数的参数
(UBaseType_t )START_TASK_PRIO, //任务优先级
(TaskHandle_t* )&StartTask_Handler); //任务句柄
vTaskStartScheduler(); //开启任务调度
}