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



评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IoT_H2

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值