FreeRTOS原理,在STM32下完成一个基于FreeRTOS的多任务程序

限时加码!20+主流AI编程工具免费用 购周边加赠Coding Plan Lite,Claude Code、Cursor等即刻畅享,学习进阶更高效! 阅读详情

一、学习FreeROTS

1.Free 即免费的,RTOS 全称是 Real Time Operating System,中文就是实时操作系统。注意,RTOS 不是指某一个确定的系统,而是指一类系统。比如 uC/OS,FreeRTOS,RTX,RT-Thread 等这些都是 RTOS 类操作系统。
2.操作系统允许多个任务同时运行,这个叫做多任务。实际上,一个处理器核心在某一时刻只能运行一个任务。操作系统中任务调度器的责任就是决定在某一时刻究竟运行哪个任务。任务调度在各个任务之间的切换非常快,就给人们造成了同一时刻有多个任务同时运行的错觉。
3.某些操作系统给每个任务分配同样的运行时间,时间到了就轮到下一个任务,比如Unix 操作系统。 FreeRTOS 操作系统则是由用户给每个任务分配一个任务优先级,任务调度器就可以根据此优先级来决定下一刻应该运行哪个任务。
4.FreeRTOS 是 RTOS 系统的一种,FreeRTOS 十分的小巧,可以在资源有限的微控制器中运行,当然,FreeRTOS 不仅局限于在微控制器中使用。但从文件数量上来看 FreeRTOS 要比uC/OSII 和 uC/OSIII 小的多。

二、完成实验

实验内容如下:
执行3个周期性task,具体任务不限,但建议如下:task1,每间隔500ms闪烁(变化)一次LED;task2,每间隔2000ms,向串口发送一次指令数据“helloworld!";task3,每间隔5000ms,从AHT20采集一次温湿度数据(不考虑硬件情况,仅写出整个多任务框架模拟代码)。
实验代码获取:
链接:https://pan.baidu.com/s/1_eiuzxIz8QHoDoZXzWW1Qg
提取码:izjs

将main.c的代码替换为

/* FreeRTOS头文件 */
#include "FreeRTOS.h"
#include "task.h"
/* 开发板硬件bsp头文件 */
#include "bsp_led.h"
#include "bsp_usart.h"


 /* 创建任务句柄 */
static TaskHandle_t AppTaskCreate_Handle = NULL;
/* LED1任务句柄 */
static TaskHandle_t LED1_Task_Handle = NULL;
/* LED2任务句柄 */
static TaskHandle_t LED2_Task_Handle = NULL;
/* USART1任务句柄 */
static TaskHandle_t USART1_Task_Handle = NULL;
/* AHT20任务句柄 */
static TaskHandle_t AHT20_Task_Handle = NULL;





/*************************************************************************
                             函数声明
*************************************************************************/

static void AppTaskCreate(void);/* 用于创建任务 */
static void LED1_Task(void* pvParameters);/* LED1_Task任务实现 */
static void LED2_Task(void* pvParameters);/* LED2_Task任务实现 */
static void USART1_Task(void* pvParameters);/* USART1_Task任务实现 */
static void AHT20_Task(void* pvParameters);/* AHT20_Task任务实现 */
static void BSP_Init(void);/* 用于初始化板载相关资源 */



int main(void)
{	
  /* 定义一个创建信息返回值,默认为pdPASS */
  BaseType_t xReturn = pdPASS;

  /* 开发板硬件初始化 */
  BSP_Init();
  printf("这是一个STM32基于FreeRTOS实现多任务程序的实验!\r\n");
   /* 创建AppTaskCreate任务 */
  xReturn = xTaskCreate((TaskFunction_t )AppTaskCreate,  /* 任务入口函数 */
                        (const char*    )"AppTaskCreate",/* 任务名字 */
                        (uint16_t       )512,  /* 任务栈大小 */
                        (void*          )NULL,/* 任务入口函数参数 */
                        (UBaseType_t    )1, /* 任务的优先级 */
                        (TaskHandle_t*  )&AppTaskCreate_Handle);/* 任务控制块指针 */ 
  /* 启动任务调度 */           
  if(pdPASS == xReturn)
    vTaskStartScheduler();   /* 启动任务,开启调度 */
  else
    return -1;  
  
  while(1);   /* 正常不会执行到这里 */    
}



static void AppTaskCreate(void)
{
  BaseType_t xReturn = pdPASS;
  
  taskENTER_CRITICAL();
  
  /* 创建LED1_Task任务 */
  xReturn = xTaskCreate((TaskFunction_t )LED1_Task,
                        (const char*    )"LED1_Task",
                        (uint16_t       )512,
                        (void*          )NULL,
                        (UBaseType_t    )2,
                        (TaskHandle_t*  )&LED1_Task_Handle);
  if(pdPASS == xReturn)
    printf("创建LED1_Task任务成功!\r\n");
  
	/* 创建LED2_Task任务 */
  xReturn = xTaskCreate((TaskFunction_t )LED2_Task,
                        (const char*    )"LED2_Task",
                        (uint16_t       )512,
                        (void*          )NULL,
                        (UBaseType_t    )3,
                        (TaskHandle_t*  )&LED2_Task_Handle);
  if(pdPASS == xReturn)
    printf("创建LED2_Task任务成功!\r\n");
  
  /* 创建USART1_Task任务 */
  xReturn = xTaskCreate((TaskFunction_t)USART1_Task,
						(const char*   )"USART1_Task",
						(uint16_t	   )512,
						(void*		   )NULL,
						(UBaseType_t   )3,
						(TaskHandle_t* )&USART1_Task_Handle);
  if(pdPASS == xReturn)
	  printf("创建USART1_Task任务成功!\r\n");
  
  /* 创建AHT20_Task任务 */
  xReturn = xTaskCreate((TaskFunction_t)AHT20_Task,
						(const char*   )"AHT20_Task",
						(uint16_t	   )512,
						(void*		   )NULL,
						(UBaseType_t   )4,
						(TaskHandle_t* )&AHT20_Task_Handle);
  if(pdPASS == xReturn)
	  printf("创建AHT20_Task任务成功!\r\n");
  
  vTaskDelete(AppTaskCreate_Handle); //删除AppTaskCreate任务
  
  taskEXIT_CRITICAL();            //退出临界区
}



/**********************************************************************
						LED1_Task任务
  ********************************************************************/
static void LED1_Task(void* parameter)
{	
    while (1)
    {
        LED1_ON;
        vTaskDelay(500);   /* 延时500个tick */
        printf("LED1_Task Running,LED1_ON\r\n");
        
        LED1_OFF;     
        vTaskDelay(500);   /* 延时500个tick */		 		
        printf("LED1_Task Running,LED1_OFF\r\n");
    }
}


/**********************************************************************
						LED2_Task任务
  ********************************************************************/
static void LED2_Task(void* parameter)
{	
    while (1)
    {
        LED2_ON;
        vTaskDelay(500);   /* 延时500个tick */
        printf("LED2_Task Running,LED2_ON\r\n");
        
        LED2_OFF;     
        vTaskDelay(500);   /* 延时500个tick */		 		
        printf("LED2_Task Running,LED2_OFF\r\n");
    }
}


/**********************************************************************
						USART1_Task任务
  ********************************************************************/
static void USART1_Task(void* parameter)
{
	while(1)
	{
		vTaskDelay(2000);
		printf("helloworld!\r\n");
	}
}


/**********************************************************************
						AHT20_Task任务
  ********************************************************************/
static void AHT20_Task(void* parameter)
{
	while(1)
	{
		vTaskDelay(5000);
		printf("温湿度采集!\r\n");
		/* 由于还没有AHT20温湿度传感器,所以这是实现过程先留着 */
	}
}


/***********************************************************************
		板级外设初始化,所有板子上的初始化均可放在这个函数里面
  *********************************************************************/
static void BSP_Init(void)
{
	/*
	 * STM32中断优先级分组为4,即4bit都用来表示抢占优先级,范围为:0~15
	 * 优先级分组只需要分组一次即可,以后如果有其他的任务需要用到中断,
	 * 都统一用这个优先级分组,千万不要再分组,切忌。
	 */
	NVIC_PriorityGroupConfig( NVIC_PriorityGroup_4 );
	
	/* LED 初始化 */
	LED_GPIO_Config();

	/* 串口初始化	*/
	USART_Config();
}

若代码运行没有问题,则连接设备(我使用的是野火F103-MINI)
开始烧录程序若烧录成功会显示如下结果
在这里插入图片描述
打开野火串口调试助手

然后打开设备管理器查看CH340驱动端口(COM6)
在这里插入图片描述
打开串口结果如下在这里插入图片描述
参考:https://blog.csdn.net/xwmrqqq/article/details/110502013
在这里插入图片描述

FreeRTOS入门——STM32完成一个基于FreeRTOS多任务程序 文章目录一、 什么是FreeRTOS二、裸机系统与多任务系统1、裸机系统2、多任务系统3、系统之间的对比三、实验要求四、实验准备五、在KEIL新建 FreeRTOS 工程1、新建本地工程文件夹2、使用 KEIL 新建工程3、在 KEIL 工程里面新建文件组4、在 KEIL 工程里面添加文件六、移植FreeRTOSSTM321、获取 STM32 的裸机工程模板2、下载 FreeRTOS V9.0.0 源码3、往裸机工程添加 FreeRTOS 源码4、添加 FreeRTOS 源码到工程组文件夹七、实现多任务 阅读详情

相关推荐

STM32F103移植FreeRTOS

今天学习了一下freeROTS操作系统,俗话说工艺善其器,必先利其器。所以今天我学了一下freeRTOS操作系统的移植。提示以下是本篇文章正文内容,下面案例可供参考移植其实很简单,慢慢来别急躁。他时若遂凌云志,敢笑黄巢不丈夫。httpshttpshttpshttpshttpshttpshttpshttpshttpshttpshttpshttpshttpshttpshttps。.........

sinat_58149788的博客 1959

FreeRots任务创建过程详细分拆

FreeRtos的学习视频(FreeRots任务创建过程详细分拆)。对于学习FreeRtos的很有用。FreeRtos是当前物联网引用最多的操作系统

FreeRTOS简介

Free 和 RTOS,Free 就是免费的、自由的、不受约束的意思,RTOS 全称是 Real Time Operating System,中文名就是实时操作系统。可以看出 FreeROTS 就是一个免费的 RTOS 类系统,FreeRTOS 是 RTOS 系统的一种,FreeRTOS 十分的小巧,可以在资源有限的微控制器中运行,当然了,FreeRTOS 不仅局限于在微控制器中使用。但从文件数量上来看 FreeRTOS 要比UCOSII 和 UCOSIII 小的多。

Yin_w的博客 4510

RTOS之Freertos的操作系统原理

关于freertos操作系统使用原理的一些内容

路过的熊的博客 4575

FreeROTS开发实战_FreeRTOS概述

FreeRTOS一个迷你的实时操作系统内核。作为一个轻量级的操作系统,功能包括:任务管理、时间管理、信号量、消息队列、内存管理、记录功能、软件定时器、协程等,可基本满足较小系统的需要。  由于RTOS需占用一定的系统资源(尤其是RAM资源),只有μC/OS-II、embOS、salvo、FreeRTOS等少数实时操作系统能在小RAM单片机上运行。相对μC/OS-II、embOS等商业操作系统,

putiancaijunyu的专栏 5543

学习FreeRTOS原理,在STM32完成一个基于FreeRTOS多任务程序

学习FreeRTOS原理,在STM32完成一个基于FreeRTOS多任务程序,执行3个周期性task,具体任务不限. FreeRTOS的源码核心部分是tasks.c和list.c,其余的几个文件功能都是可选的,例如软件定时器、队列、协程等等,小灯就不介绍了,有兴趣的话可以到官网上看介绍。 FreeROTS实践 打开工程,本次实验用到的是野火的源代码 此时的FreeROTS环境已经配置完成,我们只需要关注代码即可。 我们需要做的有3个任务,如下: /* 创建任务句柄 */ static TaskHand

CSDNzgnb的博客 335

基于在STM32完成FreeRTOS多任务程序开发,多任务串口以及AHT20封装库,原理图,PCB图以及AHT20(实际用到的是LMT70)及采集一次温度数据的模块实战

基于在STM32完成FreeRTOS多任务程序开发 序 言 二.项目说明三.实战过程 1)实验器材 2)开始实战 3)任务实现 4)效果展示四. 结语 序 言 (一)FreeRTOS简介 --------- FreeRTOS一个迷你的实时操作系统内核。作为一个轻量级的操作系统,功能包括:任务管理、时间管理、信号量、消息队列、内存管理、记录功能、软件定时器、协程等,可基本满足较小系统的需要。 (二)FreeRTOS基本原理 ---------任务调度机制是嵌入式实时操作系统的

nsnsnbabsb的博客 1367

嵌入式实验(一):基于FreeRTOS多任务程序

嵌入式实验(一)0 实验要求1 RTOS2 实验3 总结 0 实验要求 学习FreeRTOS原理,在STM32完成一个基于FreeRTOS多任务程序,执行3个周期性task,具体任务不限,但建议如下: task1,每间隔500ms闪烁(变化)一次LED; task2,每间隔2000ms,向串口发送一次指令数据“helloworld!"; task3,每间隔5000ms,从AHT20采集一次温湿度数据(不考虑硬件情况,仅写出整个多任务框架模拟代码)。 1 RTOS RTOS(Real Time

qq_44701643的博客 1886

上机实验——FreeRTOS入门

文章目录实验要求一、安装使用二、改写程序三、编译运行四、运行结果 实验要求 学习FreeRTOS原理,在STM32完成一个基于FreeRTOS多任务程序,执行3个周期性task,具体任务不限,但建议如下: 1、task1,每间隔500ms闪烁(变化)一次LED; 2、task2,每间隔2000ms,向串口发送一次指令数据“helloworld!"; 3、task3,每间隔5000ms,从AHT20采集一次温湿度数据(不考虑硬件情况,仅写出整个多任务框架模拟代码)。 一、安装使用 1、下载野火资料盘 野

q_q2020的博客 380

基于STM32的开源手表设计——应用FreeRTOS实现

应用FreeRTOS,制作STM32的小手表,任务调度的方式较裸机逻辑上更简单,可扩展性也更高

m0_59201432的博客 3万+

STM32完成一个基于FreeRTOS多任务程序

文章目录一、FreeRTOS原理二、在STM32完成一个基于FreeRTOS多任务程序1.任务要求2.编写程序 一、FreeRTOS原理 FreeRTOSFreeRTOS一个源码公开的免费的嵌入式实时操作系统,通过研究其内核可以更好地理解嵌入式操作系统的实现原理.本文主要阐述FreeRTOS系统中的任务调度机制、时间管理机制、任务管理机制以及内存分配策略的实现原理,并指出FreeRTOS在应用中的优缺点。 在嵌入式领域中,嵌入式实时操作系统正得到越来越广泛的应用。采用嵌入式实时操作系统(RTOS

aiwr_的博客 836

FreeRTOSFreeRTOS移植stm32详细步骤介绍

我在查找FreeRTOS移植的相关教程特别少,所以想非常详细的介绍FreeRTOS移植stm32详细步骤,包括源码的下载,源码介绍,系统移植,代码验证等,每一步都有对应的介绍和解释,希望可以帮助到你们。

Goforyouqp的博客 2万+

FreeRTOS入门——STM32下基于FreeRTOS多任务程序

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录一、FreeRTOS简介1.1FreeRTOS 特点1.2相关资料二、任务要求三、多任务程序实现3.1通过keil 5打开可移植FreeRTOS的工程3.2修改main.c函数完成多任务程序3.3烧录程序3.4打开野火多功能调试助手观察结果参考资料: 提示:以下是本篇文章正文内容,下面案例可供参考 一、FreeRTOS简介 RTOS全称是Real Time Operating System,中文名为实时操作系统。FreeRTOS

metanoiah的博客 925

一文了解 | FreeRTOS移植到stm32流程

1、RTOS 简介实时操作系统(RTOS)是一种专为实时应用程序设计的操作系统,它能够确保任务在特定的时间约束内完成,并提供可预测的响应时间。RTOS 通常用于嵌入式系统,其中任务的时间敏感性非常重要。实时操作系统分为硬实时和软实时两种类型,硬实时要求任务必须在规定的时间内完成,而软实时则允许偶尔的任务延迟。通过上述步骤之后,便可以使用实时操作系统(FreeRTOS)实现多任务运行,下面代码适用于实现LED灯循环执行的两个任务,可以将程序烧录到开发板查看效果。

一伦明悦的博客 1916

STM32下,基于FreeRTOS多任务程序

STM32下,基于FreeRTOS多任务程序一、FreeRTOS多任务原理二、实验要求三、实验基础四、实验前准备(一)软件安装(二)程序准备五、开始实验(一)程序调试(二)烧录六、实验结果 一、FreeRTOS多任务原理 内核是操作系统的核心部分,操作系统例如Linux通过内核使用户看似同时的访问电脑,多个用户看似同时的执行多个任务。每一个执行的程序是操作系统控制的一个任务,如果一个操作系统可以执行多个任务,则被称为多任务操作系统。 多任务操作系统可以简化复杂的软件应用。一个常规的处理器只能在某

Scorpio_L_的博客 898

基于FreeRTOSSTM32多功能手表

这是我第一篇关于FreeRTOS项目的博客,在这之前,我写了十几篇关于FreeRTOS的博客,从应用到底层原理都有讲解,如果复刻我这个项目的同学,遇到不会的话,可以跳转到我之前写的关于FreeRTOS博客。深入了解FreeRTOS:实时操作系统的核心概念和应用这就是这七个任务的具体代码,我讲每个任务的主要流程给读者列举了出来,具体如何实现,需要读者细细揣摩,多看几遍就读懂了。

m0_74676415的博客 8810

FreeRTOS基于STM32单片机

FreeRTOS,操作系统。

m0_69225476的博客 2767

FreeRTOS中断管理 基于STM32

FreeRTOS中断管理 基于STM32的中断使用

qq_61672347的博客 3万+

FreeRTOS入门——STM32完成一个基于FreeRTOS多任务程序和AHT20电路绘制

目录2. 2. 任务要求: 学习FreeRTOS原理,在STM32完成一个基于FreeRTOS多任务程序,执行3个周期性task task1,每间隔500ms闪烁(变化)一次LED; task2,每间隔2000ms,向串口发送一次指令数据“helloworld!"; task3,每间隔5000ms,从AHT20采集一次温湿度数据(不考虑硬件情况,仅写出整个多任务框架模拟代码) ...

m0_51039112的博客 583
上一篇: STM32串口通信
下一篇: Socket编程实战
RSpcc
博客等级 码龄6年 8粉丝 35原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值