ESP32 Arduino教程:使用FreeRTOS函数
引言
本文主要介绍ESP32平台上FreeRTOS(https://www.freertos.org/)的一些基本概念。
首先,使用Arduino IDE在ESP32平台上编写代码时,有一点非常重要,那就是我们可以使用FreeRTOS库中的众多函数。库里提供的这个例子: (使用信号量和互斥量)就很清楚地说明了这一点。
FreeRTOS库可由GitHub仓库访问:https://github.com/espressif/arduino-esp32/tree/3c071e1d899707bc4d63aed63de4772f62d5be53/tools/sdk/include/freertos/freertos 。
所以,FreeRTOS函数为我们提供了非常强大的工具组合,使我们能够获得Arduino内生支持之外的更强功能。
话虽如此,使用Arduino函数其实也能实现同样的功能,我们将在后续帖子中对此进行说明。举例来说,我们将使用常规的Serial.begin和Serial.print将消息输出到串口。
要解释清楚操作系统中的任务和多任务概念,对于一篇入门级帖子来说无疑过于复杂。但是,在网上有许多很好的资料都对这些概念进行了解释。而且FreeRTOS也提供了非常细致的说明。
因此,我会在以后的帖子里提供一些背景材料,当然有些内容仍然不会涉及。但是我会在相关内容中提供一些链接,以帮助您更好地学习和理解。
接下来,我会先简要解释一下什么是FreeRTOS以及什么是任务。
什么是FreeRTOS?
FreeRTOS是运行在微控制器上的一种实时操作系统。鉴于微控制器资源有限,其上所运行的操作系统当然也需要进行精心设计。
不管怎样,正如上文所说,FreeRTOS是一款实时操作系统-一种比较特殊的操作系统。为了理解什么是实时操作系统,我们需要先看一下平常所使用的普通操作系统。
举例来说,在我们使用Windows或Linux时,我们可以同时打开多个进程和应用程序,而且它们看起来都是同时运行的。对最终用户来说,这一点显而易见。
但是,对于单核计算机来说(多核系统会更复杂,但是我们还是以简单的例子来进行说明),一次只能执行一个进程。所以,计算机其实是在多个任务之间非常快速地进行切换,以至于用户感觉好像一切都在同时进行。
进程的切换通常依赖于不同的算法(https://www.studytonight.com/operating-system/cpu-scheduling.php),但是都能保证每个进程获得足够的CPU执行时间。当然,具体细节取决于实际的操作系统。一般来说,我们无法预测多个进程的执行过程,因为这个过程并非确定不变。
另一方面,实时操作系统内置的调度程序具有确定的执行方式,以满足应用程序的实时需求(http://scitechconnect.elsevier.com/real-time-embedded-systems/)。需要注意的是,实时执行只是意味着满足确定的执行时限要求,并不一定能实现更快的速度。
因此,就以Arduino环境下为例,我们就可以实现并行运行,而无需像之前那样顺序地执行每个任务。最重要的是,我们可以根据优先级预测具体的执行过程,从而对所有任务都有更多的掌控。
什么是任务?
任务是实时操作系统的基本模块。它们在自己的上下文中执行,调度程序负责决定单核CPU在某个时刻应该执行哪个任务。
尽管如此,如前文所述,我们可以并行运行多个任务(每次只执行一个任务,但是可以有更多的实例),因此代码编写就会更加简单。
在FreeRTOS中,任务通常需要使用符合预定义原型要求的C函数实现,如下文所述。
void taskImplementingFunction( void * parameter )
因此,任务是一个非常重要的概念,我们将在今后的教程中详细分析。
注:本文作者是Nuno Santos,他是一位和蔼可亲的电子和计算机工程师,住在葡萄牙里斯本 (Lisbon)。他写了200多篇有关ESP32、ESP8266的有用的教程和项目。
查看更多ESP32/ESP8266教程和项目:中文版教程 : ESP32教程 合集英文版教程 : ESP32 tutorial 合集
页:
[1]