FreeRTOS学习笔记(一)——将FreeRTOS移植到STM32

本文详细介绍了如何将FreeRTOS V9.0.0移植到STM32f103c8t6芯片的Keil工程中。步骤包括下载FreeRTOS,解压并组织文件结构,将必要的源文件和头文件添加到工程,以及修改配置文件FreeRTOSConfig.h和中断处理函数。最后,在main.c中创建两个动态任务并进行测试。
摘要由CSDN通过智能技术生成

FreeRTOS下载

FreeRTOS下载地址
在这里插入图片描述

选择V9.0.0版本

在这里插入图片描述

点击FreeRTOSv9.0.0.zip下载


FreeRTOS移植

将下载到的资料进行解压得到一个名为FreeRTOS的文件夹,里面包含了两个文件夹FreeRTOSFreeRTOS-Plus
在这里插入图片描述

1.我们需要在一个Keil工程上移植FreeRTOS,以这个工程为例新建一个名为FreeRTOS的文件夹

我们需要在一个Keil工程上移植我们的FreeRTOS,以下以这个工程为例新建一个名为FreeRTOS的文件夹

在这里插入图片描述

2.在FreeRTOS文件夹里面再新建三个文件夹srcportinclude

在这里插入图片描述

3.将下载解压的FreeRTOS\Source中的.c文件复制到新建的FreeRTOS\src文件夹下

在这里插入图片描述

4.将FreeRTOS\Source\portable中的MemMangRVDS文件复制到新建的FreeRTOS\port文件夹下

在这里插入图片描述

5.将FreeRTOS\Source\include中的所有文件复制到新建的FreeRTOS\include文件夹中

在这里插入图片描述

6.我使用的是STM32f103c8t6的芯片,这里则选择了FreeRTOSv9.0.0\FreeRTOS\Demo目录下的CORTEX_STM32F103_Keil文件夹,将其中的FreeRTOSConfig.h移植到我们的工程文件夹中,这里移植到了工程中的apps文件夹

在这里插入图片描述

7.打开工程中的组文件夹管理,新建FreeRTOS/port组,添加的FreeRTOS\port\RVDS\ARM_CM3下的port.c文件和FreeRTOS\port\MemMang下的heap_4.c文件

在这里插入图片描述

8.新建FreeRTOS/src组,添加的FreeRTOS\src下的.c文件

在这里插入图片描述

9.还需要将头文件路径引用进来


FreeRTOS测试

在这里插入图片描述

1.修改FreeRTOSConfig.h文件,添加相应的头文件(UART.h为自己编写的文件,里面进行了USART1的初始化配置重写了fputc函数用于打印串口信息进行调试)和添加
#define vPortSVCHandler SVC_Handler
#define xPortPendSVHandler PendSV_Handler

在创建任务进行调试的过程中,若不添加这两个宏定义,可能会时vTaskStartScheduler()函数无法执行

extern void xPortSysTickHandler(void);

void SysTick_Handler(void)
{
	#if (INCLUDE_xTaskGetSchedulerState  == 1 )
      if (xTaskGetSchedulerState() != taskSCHEDULER_NOT_STARTED)
      {
    #endif  /* INCLUDE_xTaskGetSchedulerState */  
        xPortSysTickHandler();
    #if (INCLUDE_xTaskGetSchedulerState  == 1 )
      }
    #endif

}

2.修改 stm32f10x_it.c文件,将其中的SVC_Handler(void)和PendSV_Handler(void)函数注释掉,然后实现SysTick_Handler(void)函数

main.c

#include "FreeRTOS.h"
#include "UART.h"
#include "Task.h"
void Task1Funtion(void* param);
void Task2Funtion(void* param);
int main(void)
{	
	USART_Init_Config(115200);
	TaskHandle_t xHandleTask1;
	TaskHandle_t xHandleTask2;
	
	xTaskCreate(Task1Funtion,"Task1", 100, NULL, 1, &xHandleTask1);
	xTaskCreate(Task2Funtion,"Task2", 100, NULL, 1, &xHandleTask2);
	vTaskStartScheduler();
	
	
	
	return 0;
}

void Task1Funtion(void* param)
{
	while(1)
	{
		printf("1");
	}
	
}

void Task2Funtion(void* param)
{
	while(1)
	{
		printf("2");
	}
}

创建两个动态任务Task1和Task2,选择使用模拟器进行调试,调试结果如下

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值