MDK下移植FreeRTOS到stm32并简单应用

一、FreeRTOS简单介绍

FreeRTOS是一款 “开源免费”的实时操作系统,遵循的是 GPLv2+的许可协议,由美国的 Richard Barry 于 2003 年发布,Richard Barry 是FreeRTOS 的拥有 者和维护者,在过去的十多年中FreeRTOS历经了 9 个版本,与众多半导体厂商合作密切, 累计开发者数百万,是目前市场占有率最高的 RTOS。
FreeRTOS于 2018 年被亚马逊收购,改名为 AWS FreeRTOS,版本号升级为 V10,且 开源协议也由原来的 GPLv2+修改为 MIT,与 GPLv2+相比,MIT 更加开放,你完全可以理解为是为所欲为的免费。V9 以前的版本还是维持原样,V10 版本相比于 V9 就是加入了一 些物联网相关的组件,内核基本不变。亚马逊收购FreeRTOS也是为了进军眼下炒的火热 的物联网和人工智能。

  • 随着产品要实现的功能越来越多,单纯的裸机系统已经不能够完美地解决问题,反而会使编程变得更加复杂,如果想降低编程的难度,我们可以考虑引入RTOS 实现多任务管理,这是使用RTOS 的最大优势。

二、移植准备

在这里插入图片描述

  • FreeRTOS的源码核心部分是tasks.c和list.c,其余的几个文件功能都是可选的,例如软件定时器、队列、协程等等。include文件夹里面的文件是操作系统相关的头文件,portable文件夹里的文件与平台相关
  • 进入portable文件夹,打开keil文件夹,里面只有一个文件,文件提示See-also-the-RVDS-directory,意思是参照RVDS目录下的文件,以MDK建工程时,就是拿RVDS目录下的文件来替代的,因此应该把RVDS目录下的文件拷贝到Keil目录下,我们只需要把RVDS文件夹中的ARM_CM3文件拷贝到keil中即可。
    在这里插入图片描述
    在这里插入图片描述
  • 这时portable文件夹中其他文件可以删除了,只保留keil,MemMang文件即可。

三、移植

(1)新建MDK工程

  • 首先新建一个MDK工程,这里我使用的是正点原子的库函数模板,可以在www.openedv.com的资料下载里下载。

(2)添加FreeRTOS文件

  • 点击上方
    在这里插入图片描述
  • 新建好FreeRTOS文件,将
    FreeRTOS\tasks.c
    FreeRTOS\list.c
    FreeRTOS\portable\Keil\ARM_CM3\port.c
    FreeRTOS\portable\MemMang\heap_4.c
    这四个文件添加进来
    第五个文件FreeRTOSConfig.h文件在FreeRTOS\Demo\CORTEX_STM32F103_Keil,这里我将它拷贝过来与这四个文件放在了一起,在添加的时候文件类型是默认显示.c文件的,要想看到.h文件需要选择All Files。
    在这里插入图片描述

(3)添加头文件路径

  • 点击上方
    在这里插入图片描述
  • 选择C/C++
    在这里插入图片描述
  • 点击右上角的新建,将图中的文件路径添加进来
    在这里插入图片描述

(4)修改文件

  • 修改stm32f10x_it.c文件
    在这里插入图片描述
  • 修改startup_stm32f10x_hd.s
    在这里插入图片描述

四、应用

  • 任务要求:
    task1,每间隔500ms闪烁(变化)一次LED;
    task2,每间隔2000ms,向串口发送一次指令数据“helloworld!";
    task3,每间隔5000ms,从AHT20采集一次温湿度数据

  • 主函数main.c

#include "delay.h"
#include "sys.h"
#include "usart.h"
#include "FreeRTOS.h"
#include "task.h"
#include "LED.h"


//LED周期性闪烁任务1
void LedTask1(void *parameter)
{
	while(1)
	{
		LED0=0; //点亮LED
		printf("灯亮\r\n");
		vTaskDelay(500);
		LED0=1;//熄灭LED
		printf("灯灭\r\n");
		vTaskDelay(500);
	}
}

void SendTask2(void *parameter)
{
	while(1)
	{
	printf("helloworld!\r\n");
	vTaskDelay(2000);
	}
}

void CollectTask3(void *parameter)
{
	while(1)
	{
		printf("温度采集\r\n");
		vTaskDelay(5000);
	}
}
	

int main(void)
{
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
	GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);
	
	LED_init();
	uart_init(115200);
	
	xTaskCreate(LedTask1,"LED_TASK1",40,NULL,1,NULL);
	
	xTaskCreate(SendTask2,"Send_TASK2",40,NULL,2,NULL);
	
	xTaskCreate(CollectTask3,"Collect_TASK2",40,NULL,3,NULL);
	
	vTaskStartScheduler();
	
	while(1)
	{
		
	}
}
  • 将程序烧录进核心板
  • 效果展示
    由于本人硬件不齐全,所以使用串口调试来展示效果。
    在这里插入图片描述

五、总结

通过这次移植FreeRTOS到stm32F103的实践,我对RTOS有了更深刻的了解,它能实现多任务管理,能降低编程的难度。这次实验我也是参考他人的教程进行的,但途中还是会遇到问题,结合其他人的教程才得以解决,所以我们在实践的时候可以多看看不同的教程,取长补短。

六、参考资料

1、https://blog.csdn.net/fzf1996/article/details/89035075
2、http://www.openedv.com/thread-77593-1-1.html

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值