FreeRTOS_Stm32F103系列单片机标准库移植

目录标题

  • 1、下载FreeRTOS源码
    • 1.1github仓库下载
    • 1.2官网下载
    • 1.3百度网盘下载
  • 2、FreeRTOS移植
    • 2.1首先需要有一个可运行的标准库工程
    • 2.2在工程内创建一个FreeRTOS文件夹,然后在FreeRTOS文件夹中再新建port、include、src三个文件夹。
    • 2.3 port文件夹移植
    • 2.4 include文件夹移植
    • 2.5 src文件夹移植
    • 2.6 移植FreeRTOSConfig.h配置文件
    • 2.7 在keil中添加文件路径
    • 2.8 打开组文件夹管理,新建FreeRTOS组
    • 2.9 添加freeRTOS源文件
    • 2.10 修改FreeRTOSConfig.h配置文件
    • 2.10注释掉stm32f10x_it.c中的三个中断处理空函数
    • 2.11此时编译链接无报错
  • 3、调试测试
  • 4.移植完成的工程
  • 5、注意

1、下载FreeRTOS源码

1.1github仓库下载

链接:FreeRTOS

下面的教程是基于从github下载压缩包进行的,最好下载这个或者直接看3.1,从我百度网盘下载。如果是别的下载源也问题不大,大同小异。

此时我们需要下载以下两个仓库,
FreeRTOS_Stm32F103系列单片机标准库移植_第1张图片
点进去按下面的步骤下载就行了,另一个也是这样下。
FreeRTOS_Stm32F103系列单片机标准库移植_第2张图片

1.2官网下载

链接: FreeRTOS官网

打开链接我们可以看到有两个下载选项,我们下载第一个就行。
下载速度较慢。
FreeRTOS_Stm32F103系列单片机标准库移植_第3张图片

1.3百度网盘下载

链接:https://pan.baidu.com/s/1x00zgnJfCae75DpJ1W4RIg?pwd=1233
提取码:1233

若上述都不行可以直接私信。

2、FreeRTOS移植

2.1首先需要有一个可运行的标准库工程

我这里拿一个跟江科大创建的标准库工程为例:
FreeRTOS_Stm32F103系列单片机标准库移植_第4张图片

2.2在工程内创建一个FreeRTOS文件夹,然后在FreeRTOS文件夹中再新建port、include、src三个文件夹。

  • port文件夹存放移植平台的相关文件
  • include文件夹存放FreeRTOS相关的头文件
  • src文件夹用来存放FreeRTOS相关的源码

FreeRTOS_Stm32F103系列单片机标准库移植_第5张图片

2.3 port文件夹移植

  • 将下载的源码:FreeRTOS源码\FreeRTOS-Kernel-dc09a3dd5144c4033607565c71b9919900f95cff\portable\MemMang路径下的heap_4.c文件复制到自己创建的port文件夹中
  • 将FreeRTOS源码\FreeRTOS-Kernel-dc09a3dd5144c4033607565c71b9919900f95cff\portable\RVDS\ARM_CM3路径下的port.cportmacro.h文件复制到自己创建的port文件夹中
    FreeRTOS_Stm32F103系列单片机标准库移植_第6张图片

2.4 include文件夹移植

  • 将下载源码:FreeRTOS源码\FreeRTOS-Kernel-dc09a3dd5144c4033607565c71b9919900f95cff\include路径下的所有头文件复制到自己创建的include文件夹中。
    FreeRTOS_Stm32F103系列单片机标准库移植_第7张图片

2.5 src文件夹移植

  • 将FreeRTOS源码\FreeRTOS-Kernel-dc09a3dd5144c4033607565c71b9919900f95cff文件夹中的所有FreeRTOS相关.c文件复制到自己创建的src文件夹中
    FreeRTOS_Stm32F103系列单片机标准库移植_第8张图片
    FreeRTOS_Stm32F103系列单片机标准库移植_第9张图片

2.6 移植FreeRTOSConfig.h配置文件

  • 在下载源码:FreeRTOS源码\FreeRTOS-main\FreeRTOS\Demo\CORTEX_STM32F103_Keil路径下将FreeRTOSConfig.h文件复制到自己创建的FreeRTOS文件夹中
    FreeRTOS_Stm32F103系列单片机标准库移植_第10张图片

2.7 在keil中添加文件路径

在keil中点击魔术棒,进入“C/C++”,在Include Paths中添加FreeRTO、src、inc、port路径。
FreeRTOS_Stm32F103系列单片机标准库移植_第11张图片
FreeRTOS_Stm32F103系列单片机标准库移植_第12张图片

2.8 打开组文件夹管理,新建FreeRTOS组

FreeRTOS_Stm32F103系列单片机标准库移植_第13张图片

2.9 添加freeRTOS源文件

按下面的操作分别添加src文件夹和port文件夹下的所有.c文件
FreeRTOS_Stm32F103系列单片机标准库移植_第14张图片

2.10 修改FreeRTOSConfig.h配置文件

  • 1.先编译链接下工程
  • 2.根据下面图操作打开FreeRTOSConfig.h文件
    FreeRTOS_Stm32F103系列单片机标准库移植_第15张图片
  • 3.添加以下几条宏定义
#define xPortPendSVHandler PendSV_Handler
#define vPortSVCHandler SVC_Handler
#define xPortSysTickHandler SysTick_Handler

FreeRTOS_Stm32F103系列单片机标准库移植_第16张图片

2.10注释掉stm32f10x_it.c中的三个中断处理空函数

注释掉以下几个函数

void SVC_Handler(void);
void PendSV_Handler(void);
void SysTick_Handler(void);

FreeRTOS_Stm32F103系列单片机标准库移植_第17张图片

2.11此时编译链接无报错

3、调试测试

我们简单写一个让STM32F103C8T6最小系统板上led灯闪烁的程序测试下。

  • 1.首先添加几个有关FreeRTOS基本操作的头文件
#include "freertos.h"
#include "task.h"
#include "timers.h"
  • 2.简单写一个led灯对应GPIO初始化的函数
void Led_Init(void)
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
	
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOC,&GPIO_InitStructure);
}
  • 3.简单写一个led闪烁的任务
void Led_Task(void *pvParams)
{
	Led_Init();
	while(1)
	{
		GPIO_ResetBits(GPIOC,GPIO_Pin_13);
		vTaskDelay(500);
		GPIO_SetBits(GPIOC,GPIO_Pin_13);
		vTaskDelay(500);
	}
}
  • 4.创建任务并启动调度
int main(void)
{
	xTaskCreate(Led_Task,"ledtask",128,NULL,12,NULL);
	vTaskStartScheduler();
}
  • 5.下载到开发板上进行测试,效果很好。

main文件中的全部代码为

#include "stm32f10x.h"                  // Device header

#include "freertos.h"
#include "task.h"
#include "timers.h"

void Led_Init(void)
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOC,&GPIO_InitStructure);
}

void Led_Task(void *pvParams)
{
	Led_Init();
	while(1)
	{
		GPIO_ResetBits(GPIOC,GPIO_Pin_13);
		vTaskDelay(500);
		GPIO_SetBits(GPIOC,GPIO_Pin_13);
		vTaskDelay(500);
	}
}

int main(void)
{
	xTaskCreate(Led_Task,"ledtask",128,NULL,12,NULL);
	vTaskStartScheduler();
}

4.移植完成的工程

链接:https://pan.baidu.com/s/1E_bi4nIzayskaVl3YrLBGA?pwd=1233
提取码:1233

5、注意

需要注意的是Stm32F103C8T6的SRAM仅有20KB,而我们移植的FreeRTOS默认占用了17KB来作为自己的堆,所以我们写不了多少程序就会出现内存超出无法编译的情况。
FreeRTOS_Stm32F103系列单片机标准库移植_第18张图片
故我们需要手动将configTOTAL_HEAP_SIZE调小些。如:
#define configTOTAL_HEAP_SIZE ( ( size_t ) ( 8 * 1024 ) )

你可能感兴趣的:(FreeRTOS,STM32,单片机,stm32,嵌入式硬件)