基于STM32F103移植FreeRTOS

本文介绍基于STM32F103的移植,其它系列MCU类似。
硬件平台:STM32F103ZET6,
软件平台:MDK529
FreeTROS版本:FreeRTOSv10.2.1
准备材料:
1.STM32F103基础工程
2.FreeRTOS源码
移植过程:
1.在工程目录下新建FreeRTOS文件夹,该文件夹用于存放FreeRTOS相关的文件
在这里插入图片描述
2.在FreeRTOSv10.2.1\FreeRTOS\Source路径下找到FreeRTOS的源码,将其拷贝到工程中的FreeRTOS文件夹中

在这里插入图片描述
其中头文件和源码源文件是全部要用到的,不做任何删除。
portable文件夹是和硬件平台,软件开发环境相关的文件。FreeRTOS为了让用户移植简单,帮用户做了很多工作。打开portable文件夹如下
在这里插入图片描述
可以看到FreeRTOS官方帮助用户基于GCC,IAR,MDK等平台做了很多工作,我这里是基于MDK开发环境,所以保留内存管理文件和MDK平台需要的文件。红色箭头所指文件夹保留,其他文件夹可以删除。如果用其他平台开发则保留其他平台需要的文件。不删除也可以,就是占硬盘空间而已。
3.打开工程,在工程中添加一个专用来存放FreeRTOS的Group
在这里插入图片描述将FreeRTOS的源文件,内存黄管理文件,硬件接口文件统统添加到这个FreeRTOS这个Group中
在这里插入图片描述
内存管理文件在FreeRTOS\portable\MemMang文件夹下,FreeRTOS提供了五种内存管理方案,对于移植来说,随便选一种方案就行,我这里选择了方案4,方案4有合并内存碎片的功能(这里不对比各个内存管理方案)。

port.c文件在FreeRTOS\portable\RVDS路径下找到自己使用MCU内核的文件夹,
在这里插入图片描述
我使用的是M3单片机所以在ARM_CM3文件夹下找到对应的port.c
到此文件添加完毕,开始添加头文件路径,需要添加两个路径。
在这里插入图片描述
第一个是FreeRTOS源码需要的头文件路径,第二个是硬件接口的头文件路径。
4.编译一把,看看什么情况
在这里插入图片描述
提示打不开FreeRTOSConfig.h这个文件。
FreeRTOS源码中并没有提供这个文件。我们有两种办法:第一自己写一个,第二找别人要一个。第一种办法显然不可取,见都没见过肯定不会写。看来还使用是第二种办法吧。其实官方在很多平台下都移植了FreeRTOS。那我们去官方的demo中找。
FreeRTOSv10.2.1\FreeRTOS\Demo路径下存放的全是官方移植的demo。在此路径下找到CORTEX_STM32F103_Keil文件夹,此文件夹是官方基于STM32F103和MDK平台移植的demo。在此文件夹下找到FreeRTOSConfig.h文件。
在这里插入图片描述
将其拷贝到源码的头文件中。再编译一把,看下什么情况。
在这里插入图片描述
经过搜索发现该函数是条件编译函数,在FreeRTOSConfig.h文件中将宏INCLUDE_xTaskGetCurrentTaskHandle定义为1,使能该函数,在编译一把。
终于不报错了,那就写一个小demo感受一下FreeRTOS吧
上代码

#include "stm32f10x.h"
#include "led.h"
#include "FreeRTOS.h"
#include "task.h"

#define START_STK_DEPTH						128
#define START_TASK_PRIO						1
TaskHandle_t start_task_handler;
void start_task(void * pvParameters);

#define LED2_STK_DEPTH						128
#define LED2_TASK_PRIO						2
TaskHandle_t led2_task_handler;
void led2_task(char * pvParameters);

#define LED3_STK_DEPTH						128
#define LED3_TASK_PRIO						3
TaskHandle_t led3_task_handler;
void led3_task(char * pvParameters);

int main(void)
{
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);
	LED_Config();
	xTaskCreate((TaskFunction_t) start_task,		//创建开始任务
							(const char *  ) "start_task",
							(uint16_t      ) START_STK_DEPTH,
							(void *        ) NULL,
							(UBaseType_t   ) START_TASK_PRIO,
							(TaskHandle_t *) &start_task_handler);
	vTaskStartScheduler();  //开启任务调度器			
}

/*******开始任务函数*****/
void start_task(void * pvParameters)
{
	taskENTER_CRITICAL();
	
	xTaskCreate((TaskFunction_t) led2_task,
							(const char *  ) "led2_task",
							(uint16_t      ) LED2_STK_DEPTH,
							(void *        ) NULL,
							(UBaseType_t   ) LED2_TASK_PRIO,
							(TaskHandle_t *) &led2_task_handler); 			
							
	xTaskCreate((TaskFunction_t) led3_task,
							(const char *  ) "led3_task",
							(uint16_t      ) LED3_STK_DEPTH,
							(void *        ) NULL,
							(UBaseType_t   ) LED3_TASK_PRIO,
							(TaskHandle_t *) &led3_task_handler); 	
							
	vTaskDelete(start_task_handler);
							
  taskEXIT_CRITICAL();					
}

void led2_task(char * pvParameters)
{
	for(;;)
	{
		LED2_Toggle();
		vTaskDelay(333);
	} 
}

void led3_task(char * pvParameters)
{
	for(;;)
	{
		LED3_Toggle();
		vTaskDelay(1000);
	} 
}

程序功能是实现两个LED闪烁,编译没报错,下载程序。
尴尬了,LED灯不闪烁,debug发现进入hardfault中断了。
经过查阅资料发现,
FreeRTOS触发第一个任务是在SVC_Handler中断中进行的,
切换任务是在是在PendSV_Handler中断中进行的。
系统节拍中断是在SysTick_Handler中进行的。
可是我目前这3个函数都是空空如也,难怪不运行。其实这3个函数官方早已帮我们实现了,只是不叫这3个名字而已。官方实现的这3个函数的名字分别是vPortSVCHandler,xPortPendSVHandler,xPortSysTickHandler。弄清这些就好办了,我们在FreeRTOSConfig.h头文件中做一下宏定义就可以了。注意要将自己的原来3个空函数注释掉。

#define xPortPendSVHandler 	PendSV_Handler
#define vPortSVCHandler 	SVC_Handler
#define xPortSysTickHandler SysTick_Handler

再编译,再烧程序。小灯闪烁了。
一边移植一边写这个文档花了2个小时。
移植算是完成了。后边的文档介绍FreeRTOS的裁剪,配置和源码的分析。

  • 3
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
移植FreeRTOSSTM32F103上需要以下步骤: 1. 下载FreeRTOS的源代码 2. 在STM32F103上创建一个工程 3. 将FreeRTOS的源代码添加到工程中 4. 配置FreeRTOS的内核参数 5. 添加RTOS相关的头文件和源文件 6. 配置STM32F103的硬件参数 7. 编写应用程序 接下来,我将逐步介绍每个步骤。 1. 下载FreeRTOS的源代码 您可以从FreeRTOS官方网站(https://www.freertos.org/)下载最新版本的源代码。 2. 在STM32F103上创建一个工程 在您的编译器中创建一个新的工程,并选择适当的芯片(STM32F103),以便编译器可以正确地设置和编译程序。 3. 将FreeRTOS的源代码添加到工程中 将FreeRTOS的源代码添加到您的工程中。您可以使用FreeRTOS提供的完整源代码,也可以只使用与您的应用程序相关的部分。 4. 配置FreeRTOS的内核参数 在您的应用程序中,您需要配置FreeRTOS的内核参数,例如任务优先级和堆栈大小等。 5. 添加RTOS相关的头文件和源文件 将FreeRTOS相关的头文件和源文件添加到您的应用程序中,以便您可以使用FreeRTOS的API函数。 6. 配置STM32F103的硬件参数 在您的应用程序中,您需要配置STM32F103的硬件参数,例如时钟和外设等。您可以使用STM32F103的手册来获得有关如何配置硬件的更多信息。 7. 编写应用程序 在您的应用程序中,您需要创建和管理FreeRTOS任务,并使用FreeRTOS API函数来实现任务间的通信和同步。 以上是移植FreeRTOSSTM32F103的基本步骤。移植FreeRTOS需要一定的编程经验和对STM32F103硬件的了解。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值