当前位置:   article > 正文

STM32下完成一个基于FreeRTOS的多任务程序_stm32f1 freertos 多任务

stm32f1 freertos 多任务

一、 FreeRTOS简介

FreeRTOS是一个迷你的实时操作系统内核。作为一个轻量级的操作系统,功能包括:任务管理、时间管理、信号量、消息队列、内存管理、记录功能、软件定时器、协程等,可基本满足较小系统的需要。FreeRTOS-百度百科
FreeRTOS是一款 “开源免费”的实时操作系统,遵循的是GPLv2+的许可协议。

二、 MDK下移植FreeRTOS

2.1 资料获取

FreeRTOS的源码和相应的官方书籍均可从官网FreeRTOS获得。
本实践源码版本是v9.0.0。
百度网盘:FreeRTOSv9.0.0提取码:yv8r

MemMang:里面存放的是FreeRTOS自带的内存管理方案的源文件
FreeRTOS的源码核心部分tasks.clist.c

2.2资料整理并导入STM32工程中

具体步骤请参考FreeRTOS移植到STM32F103步骤与注意事项

PS:其中有IAR和MDK版,请在导入工程时仔细看清要求。
下面我将按照上面博客进行再次配置文件。

  1. 整理文件
    在这里插入图片描述
    按照以上博客删除到如上目录树即可。
  2. 在正点原子提供的串口实验库函数的源代码基础上进行添加FreeRTOS工程。如下:

在这里插入图片描述

FreeRTOS\tasks.c
FreeRTOS\list.c
FreeRTOS\portable\Keil\ARM_CM3\port.c
FreeRTOS\portable\MemMang\heap_4.c
具体导入就是以上文件。

  1. 添加头文件
    在这里插入图片描述
    在这里插入图片描述
  2. 定义系统底层相关的函数
    对startup_stm32f10x.hd.s进行以下更改
    在这里插入图片描述

用英文 ; 进行相关注释。

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

由于FreeRTOS对这几个中断的名称做了自己的定义,因此必须要重定义这几个函数才能正常进入中断,但这么做又会跟ST提供的stm32f10x_it.c文件当中定义的中断相冲突,因此必须将stm32f10x_it.c下对应的几个中断服务函数屏蔽掉,否则编译会提示函数重定义。

参考资料freertos移植stm32 步骤分析
参考资料FreeRTOS移植到STM32上的移植过程

2.4 主要代码

任务要求:
在STM32下完成一个基于FreeRTOS的多任务程序,执行3个周期性task,具体任务不限,但建议如下:

  • task1,每间隔500ms闪烁(变化)一次LED;

  • task2,每间隔2000ms,向串口发送一次指令数据“helloworld!";

  • task3,每间隔5000ms,从AHT20采集一次温湿度数据(不考虑硬件情况,仅写出整个多任务框架模拟代码)。

  • main.c

void LedTask1(void* pvParameters)   //任务一:每间隔500ms闪烁(变化)一次LED
{
	while(1)
	{
		LED0=0;
		printf("灯亮!\r\n");
		vTaskDelay(500);
		LED0=1;
		printf("灯灭!\r\n");
		vTaskDelay(500);
	}
}
void USART_printfTask2(void* pvParameters)		//任务二:每间隔2000ms,向串口发送一次指令数据“helloworld!"
{
	while(1)
	{
		vTaskDelay(1000);
		printf("Hello Windows!\r\n");
	}
}


void AHT20Task3(void* pvParameters)			//任务三:每间隔5000ms,从AHT20采集一次温湿度数据
{
 /*     由于没有硬件,以后更新            */
}
 int main(void)
 {	
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
	GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);

	LED_Init();				//LED初始化
	 uart_init(115200);		//UART初始化并设置波特率115200
	//任务一:每间隔500ms闪烁(变化)一次LED 
	xTaskCreate(LedTask1,	//任务函数指针
				"LedTask1",	//任务名称
				40,			//堆栈深度(字)
				NULL,		//任务参数为空
				1,			//任务优先级
				NULL);		//任务句柄为空
	 //任务二:每间隔2000ms,向串口发送一次指令数据“helloworld!"
	 xTaskCreate(USART_printfTask2,
				"LedTask1",
				40,
				NULL,
				2,
				NULL);
	 //任务三:每间隔5000ms,从AHT20采集一次温湿度数据
/*	 xTaskCreate(AHT20Task3,
				"AHT20Task3",
				40,
				NULL,
				3, 
				NULL);*/
	vTaskStartScheduler();	//启动任务调度器(操作系统开始运行〕
		
	 
	while(1)
	{
		
	}
 }
 

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65

在这里插入图片描述
编译成功之后就可以进行烧录至STM32中并进行串口调试了。

三、 实现效果

在这里插入图片描述
在这里插入图片描述
以上就是LED闪烁和串口输出“Hello Windows!”实现效果。

四、 总结

通过此次实践学习,我初识了FreeRTOS多任务系统,并基本掌握了FreeRTOS的多任务的创建和实践。此次试验中我遇到了不少问题,特别感谢我的老师和同学对我的帮助,以及网上大佬们的资料。

五、 参考资料

[1]野火官方书籍《FreeRTOS内核实现与应用开发实战》
[2]FreeRTOS移植到STM32F103步骤与注意事项
[3]freertos移植stm32 步骤分析
[4]FreeRTOS移植到STM32上的移植过程

本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/825872
推荐阅读
相关标签
  

闽ICP备14008679号