ESP32_FreeRTOS_Arduino_1_创建任务

关于FreeRTOS 在arduino环境下的应用

一、关于FreeRTOS

1、什么是FreeRTOS

FreeRTOS是运行在微控制器上的一种实时操作系统,可以有效的管理任务,合理的分配硬件资源。

举例来说,当我们在使用Windows或者Linux时,可以打开多个进程和应用程序,看起来是同时运行的。但是对于单核计算机来讲,一次只能执行一个进程。所以计算机其实是在多个任务间非常快速的进行切换,以致于使用者感觉好一切都是在同时运行。

而操作系统就是为我们提供了合理的任务调度程序机制,并且对这些任务所需要使用的资源进行管理,来满足每个线程都可以得到正确的执行,并且满足其的资源需求。

这里我们有了一个新的概念。任务调度机制,调度的机制先不看,先来看任务。

2、什么是任务

任务是实时操作系统的基本模块,它们在自己的上下文中执行(这部分概念,有需要可以参考我针对操作系统的一些文章)。

PS: 任务的切换涉及到上下文的切换,在我的操作系统专栏多线程部分略有涉及。

而调度机制,是负责决定CPU在某个时刻应该执行哪个任务。如果多个任务的并发执行,没有调度机制的话,会很糟糕很糟糕,这里有具体的示例。

3、建议

关于操作系统的知识,我会专门进行总结,有需求的可以学习一下,建议初学,可以从Arduino的FreeRTOS中先学习体会,然后再去系统的学习操作系统的概念。

二、创建FreeRTOS任务

我们先来看在Arduino中FreeRTOS的简单应用,本例中将先创建两个打印"hello world"消息的任务,然后将它们删除。

1、xTaskCreate任务创建函数

API参数

  • pvTaskCode
    • 一个函数指针,用来传递负责任务实现的函数
  • pcName
    • 任务的名称
  • usStackDepth
    • 任务堆栈大小,以字节数表示,通常会使用一个足够大的数值
  • pvParameters
    • 指针,指向任务函数所接收的参数,其类型必须为(void *)
  • uxPriority
    • 任务的优先级
  • TaskHandle_t
    • 返回一个句柄,用于以后函数调用时对任务的引用
#if( configSUPPORT_DYNAMIC_ALLOCATION == 1 )

	static inline IRAM_ATTR BaseType_t xTaskCreate(
			TaskFunction_t pvTaskCode,
			const char * const pcName,
			const uint32_t usStackDepth,
			void * const pvParameters,
			UBaseType_t uxPriority,
			TaskHandle_t * const pvCreatedTask)
	{
		return xTaskCreatePinnedToCore( pvTaskCode, pcName, usStackDepth, pvParameters, uxPriority, pvCreatedTask, tskNO_AFFINITY );
	}

#endif

2、setup函数 和 循环代码

串口设置

首先我们需要在Setup函数中,打开一个串行连接,用于输出测试程序的运行结果。

Serial.begin(115200);
delay(1000);

创建任务示例

#include<Arduino.h>

#include<FreeRTOS.h>

void taskOne( void * parameter )
{
  for( int i = 0;i<10;i++ ){
    Serial.println("Hello from task 1");
    delay(1000);
  }
  Serial.println("Ending task 1");
  vTaskDelete( NULL );
}

void taskTwo( void * parameter)
{
  for( int i = 0;i<10;i++ ){
    Serial.println("Hello from task 2");
    delay(1000);
  }
  Serial.println("Ending task 2");
  vTaskDelete( NULL );
}

void setup() {
  Serial.begin(112500);
  delay(1000);

  xTaskCreate(
    taskOne,          /* Task function. */
    "TaskOne",        /* String with name of task. */
    10000,            /* Stack size in bytes. */
    NULL,             /* Parameter passed as input of the task */
     1,                /* Priority of the task. */
    NULL);            /* Task handle. */

  xTaskCreate(
    taskTwo,          /* Task function. */
    "TaskTwo",        /* String with name of task. */
    10000,            /* Stack size in bytes. */
    NULL,             /* Parameter passed as input of the task */
    1,                /* Priority of the task. */
     NULL);            /* Task handle. */
}

void loop() {
  delay(1000);
}

程序执行结果

在这里插入图片描述

版权声明:本文为CSDN博主「多彩的2022」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_54357381/article/details/122914999

生成海报
点赞 0

多彩的2022

我还没有学会写个人说明!

暂无评论

发表评论

相关推荐

Arduino与Proteus仿真实例-DHT11温度湿度传感器驱动仿真

DHT11温度湿度传感器驱动仿真 DHT11 是一款基本的超低成本数字温度和湿度传感器。 它使用电容式湿度传感器和热敏电阻来测量周围的空气,并在数据引脚上吐出数字信号(不需要模拟输入引脚)。 它使用起来相当简单,但需要仔细定时来抓取数据。