STM32F103C8T6移植FreeRTOS

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\portable\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();//开启任务调度
}



相关推荐

最近更新

  1. TCP协议是安全的吗?

    2024-04-14 08:18:03       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-04-14 08:18:03       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-04-14 08:18:03       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-04-14 08:18:03       20 阅读

热门阅读

  1. 【软件设计师知识点】七、面向对象技术

    2024-04-14 08:18:03       14 阅读
  2. 【软考】极限编程

    2024-04-14 08:18:03       14 阅读
  3. QCustomPlot移植android后实现曲线放大缩小

    2024-04-14 08:18:03       16 阅读
  4. 【若依前后端分离】登录页面背景加入轮播视频

    2024-04-14 08:18:03       13 阅读
  5. 【应急响应篇】钓鱼邮件应急响应指南

    2024-04-14 08:18:03       18 阅读
  6. 24、Lua 学习笔记之二(进阶话题)

    2024-04-14 08:18:03       21 阅读