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);
}
程序执行结果

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值