上一文链接:FreeRTOS笔记(一)概念
01 - 下载FreeRTOS
进入官网中下载,小白选择的是V9.0.0,作为学习而言其实版本差别不大,选择这个版本的原因是小白看的书是这个版本的。
运行exe文件,得到解压包,源码就在FreeRTOS\Source目录下。FreeRTOS-Plus是一些扩展功能,暂时不需要理会。
02 - 移植STM32F407
在keil5下新建一个标准库工程,工程文件中新建FreeRTOS文件夹,把FreeRTOS\Source目录下的所有文件都复制到工程中的FreeRTOS。
FreeRTOS的运行之前需要一些系统配置,配置文件可以自己创建,但是官方给出了例程,直接在例程中复制,因为是移植到STMF4,所以在Demo中找对应的架构,把FreeRTOS\Demo\CORTEX_M4F_STM32F407ZG-SK\FreeRTOSConfig.h文件,复制新建工程的FreeRTOS/include中,这个头文件暂时不需要修改。
keil5工程中新建两个组FreeRTOS_CORE(存放核心源代码 )和FreeRTOS_PRETABLE(存放内存管理文件和硬件相关配置文件)
- Group
-
FreeRTOS_CORE:FreeRTOS\Source下的c和h文件,include和 portable文件夹除外
-
FreeRTOS_PRETABLE:FreeRTOS\Source\portable\MemMang\heap_4.c和FreeRTOS\Source\portable\RVDS\ARM_CM4F\port.c
然后编译,0 error,0 warning,工程准备成功。
03 - LED灯闪烁实验
验证移植是否成功,做一个最简单的LED灯闪烁实验,只有一个任务start,任务开始后就闪烁LED灯。
新建test.h和test.c文件,把LED灯实验源代码复制到工程中,根据FreeRTOS\Demo\CORTEX_STM32F103_Keil的范例,能够知道任务是如何创建、运行的。于是test.h代码如下:
#ifndef _TASK_TEST_H_
#define _TASK_TEST_H_
#include "FreeRTOS.h"
#include "task.h"
/* Start 任务 */
#define START_TASK_PRIO 1 //优先级
#define STATR_STACK_SIZE 128 //堆栈大小
extern TaskHandle_t StartTask_Handler; //任务句柄
void start_task(void *pParam); //任务函数
#endif
而test.c中定义句柄并定义函数
#include "led.h"
#include "FreeRTOS.h"
#include "task.h"
#include "task_test.h"
TaskHandle_t StartTask_Handler; //任务句柄
/* Start 任务 */
void start_task(void *pParam)
{
for(;;)
{
GPIO_SetBits(GPIOF,GPIO_Pin_10);
vTaskDelay(200);
GPIO_ResetBits(GPIOF,GPIO_Pin_10);
vTaskDelay(200);
}
}
main函数则创建任务,开启调度器。
#include "stm32f4xx.h"
#include "FreeRTOS.h"
#include "task.h"
#include "task_test.h"
int main(void)
{
NVIC_PriorityGroupConfig( NVIC_PriorityGroup_4 );
LED_Init();
xTaskCreate( (TaskFunction_t)start_task,
(const char*)"start_task",
(uint16_t)STATR_STACK_SIZE,
(void*)NULL,
(UBaseType_t)START_TASK_PRIO,
(TaskHandle_t*)&StartTask_Handler
);
vTaskStartScheduler();
while(1);
}
编译下载,LED灯闪烁,移植成功。
04 - 总结
- FreeRTOS是一个开源又免费的嵌入式实时操作系统
- FreeRTOS已经被移植到各个重要平台比如ARM、Linux、Window等等
- FreeRTOS官方有非常多的Demo提供移植参考