ESP32爬坑之旅②——初识FreeRTOS

1.前言

  在学习esp32官方源码的时候,发现了有这么一个函数:

xTaskCreate(esp_mesh_p2p_tx_main, "MPTX", 3072, NULL, 5, NULL);

  从单片机学过来的朋友应该知道,一般都是在主函数中添加while循环,然后实现相应的功能。而这里却见不到执行程序的while函数,是怎么回事呢?别着急,我们先从FreeRTOS说起。

2.FreeRTOS

  那什么是FreeRTOS呢?在网上查阅相应资料,如下:

  FreeRTOS是一种设计用于在微控制器上运行的实时操作系统。当然,由于微控制器受资源限制,因此需要对其上运行的任何操作系统进行充分设计。
然而,如上所述,FreeRTOS是一种实时操作系统,是一种特殊类型的操作系统。要了解实时操作系统是什么,我们需要查看我们习惯的常规操作系统。
  例如,当我们使用Windows或Linux时,我们可以同时打开多个进程和应用程序,并且它们似乎都在同一时间运行。
  然而,对于具有单核的计算机(事实是在多核系统中有所改变,但让我们坚持一个简单的例子),只有一个进程可以同时执行。因此,计算机所做的是非常快速地改变任务之间的执行,因此最终用户感觉事情正在同时发生。
  当然,这些过程的变化可能因不同的算法
而发生,但通常它确保每个过程获得一定数量的CPU来执行。具体情况取决于所涉及的操作系统。但通常情况下,人们无法预测多个任务的执行流程,这些流程不是确定性的。
  另一方面,实时操作系统中的调度程序构建为具有确定性执行模式,这对于具有实时要求的应用程序是必需的。请注意,实时执行意味着满足每个定义的截止时间,它并不一定意味着快速执行。
  因此,我们可以具有多任务性,因此我们不需要按顺序执行每个任务。最重要的是,我们可以大量控制这些任务进行,因为我们可以根据优先级预测执行流程。

  从上面我们可以看出,使用FreeRTOS是为了任务的并发进行,从而提高程序的运行效率。那么可能有些小伙伴又有疑惑了,什么是任务呢?

3. 任务(task)

  任务通常是实时操作系统的构建块。它们在自己的上下文中执行,调度程序负责决定在单个核心中的给定时刻正在执行哪个任务。
  然而,如前所述,我们可以并行运行多个任务(每次只执行一个,但是可能实例化了很多),因此我们的程序更容易编写。
  在FreeRTOS中,任务被实现为C函数并遵循预定义的原型,如下所示:

void taskImplementingFunction( void * parameter )

因此,任务将是一个非常重要的概念,我们会在之后继续分析。

4.使用xTaskCreate()函数创建任务

xTaskCreate()的函数定义如下:

int xTaskCreate((*TaskCode)(void *), const char * const TaskName, const unsigned int StackDepth, void * const Parameter, unsigned int Priority, void * const TaskHandle);

具体参数含义如下表所示:

参数 含义
TaskCode 一个指向将实现任务的函数的指针
TaskName 字符串中任务的名称
StackDepth 任务堆栈的大小
Parameter 指向任务功能可以接收的参数的指针
Priority 任务的优先级
TaskHandle 返回一个句柄,可以在调用函数时用于后面的任务引用

我们将会在下一节,从源码入手,继续分析xTaskCreate()函数是如何创建任务的。

你可能感兴趣的:(EPS32)