0. 前言
FreeRTOS,全称Free Real Time Operating System,即免费的实时操作系统。相比于计算机中用到的Windows,MacOS,Linux等操作系统,实时操作系统(RTOS)是一种轻量级的操作系统,适用于嵌入式硬件中,用于解决单片机类裸机轮询方式在处理多个任务时的实时性不高的问题。
开发环境:Keil_v5
操作系统:Windows10专业版
1. 移植准备
1.1 获取FreeRTOS源码
进入到 FreeRTOS官网 下载FreeRTOS源码
下载最新的即可:
1.2 新建工程
懒得自己建立工程,刚好有正点原子的空工程,直接拿来用了
直接在工程位置新建FreeRTOS文件夹:
然后新建以下文件夹,其中:
- inc用于存放相关头文件
- src用于存放源码
- port存放移植相关文件
2. 工程移植
现在进入第一步下载的FreeRTOS源码文件夹中,进入以下路径:
FreeRTOSv202212.01\FreeRTOS\Source\portable\MemMang
heap1-5是存放内存管理文件的,对于STM32F103C8T6而言使用head4即可,但是我们将除Readme文件全部复制进工程的port文件夹中:
现在回到源码,进入FreeRTOSv202212.01\FreeRTOS\Source\RVDS\ARM_CM3文件夹,复制其所有文件到port文件夹中:
继续返回源码,进入FreeRTOSv202212.01\FreeRTOS\Source文件夹,复制以下文件夹进工程中新建的src文件夹:
返回源码进入Source的include文件夹,复制除readme文件外的所有文件进新建的inc文件夹
返回源码,进入FreeRTOSv202212.01\FreeRTOS\Demo\CORTEX_STM32F103_Keil文件夹,复制这个配置文件:
放在工程的这个地方:
至此,文件移植操作结束,现在我们进入工程中将其添加至组。
注意!!!port只需要添加port.c和Head4.c
至此移植结束。编译一下工程,没有发生报错:
3. 修改编译项
FreeRTOS已经实现了以下函数,所以我们注释掉它:
添加以下宏定义:
要添加在 #endif 之前,注意这几个不能搞错了
#define xPortPendSVHandler PendSV_Handler
#define vPortSVCHandler SVC_Handler
#define xPortSysTickHandler SysTick_Handler
4. 点灯代码
将以下代码烧录进去就可以完成点灯了
#include "stm32f10x.h"
#include "freertos.h"
#include "task.h"
TaskHandle_t TaskHandler_LED;
void LED_INIT(){
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); //使能PC端口时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13; //PB13 端口配置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出模式
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
GPIO_Init(GPIOC, &GPIO_InitStructure); //初始化GPIOB.5
GPIO_SetBits(GPIOC,GPIO_Pin_13); //PC13 输出高
}
void Task_LED(void *arg){
while(1)
{
GPIO_ResetBits(GPIOC,GPIO_Pin_13); //PC13 输出高
vTaskDelay(500);//延时1000ms=1s,使系统执行其他任务
GPIO_SetBits(GPIOC,GPIO_Pin_13); //PC13 输出高
vTaskDelay(500);//延时1000ms=1s,使系统执行其他任务
}
}
int main(void)
{
LED_INIT();
xTaskCreate(Task_LED,"Task_LED",1024,NULL,2,&TaskHandler_LED);//创建任务函数
/*
xTaskCreate(TaskFun,TaskName,StackSize,Param,Priority,*Task)
1:TaskFun 任务函数
2:TaskName 任务名字
3:StackSize 任务堆栈大小
4:Param 任务传入参数
5:Priority 任务优先级,最低优先级为0=空闲任务,可以设置0-31
6:Task 任务句柄任务创建成功后会返回这个句柄,其他api任务接口可调用这个句柄
*/
vTaskStartScheduler();//开启任务调度
}