将部分代码作为应用程序中的任务独立执行可以简化大型复杂问题的设计。 当有多个 CPU 时,任务支持还允许选定的功能并行运行。 本文将调查 Arduino 框架对 ESP32 系列设备的 FreeRTOS 任务支持。 除了少数例外,本材料适用于您可能遇到的其他使用 FreeRTOS 的硬件平台。

抢占式调度

在单核 MCU(微控制器单元)中,任何时刻只能执行一项任务。 正在执行的任务会一直运行,直到硬件计时器指示时间片已过期。 超时时,FreeRTOS 调度程序通过保存其寄存器来保存当前任务的状态。 据说当前任务已被计时器抢占。

然后调度程序选择另一个准备运行的任务。 准备好运行的最高优先级任务的状态在它停止的地方恢复和恢复。 时间片的持续时间足够小,MCU 每秒可以运行多个任务。 这称为并发处理。

硬件计时器对于并发处理至关重要,因为它可以防止一项任务独占 CPU。 陷入永无止境循环的任务不会阻止其他任务的执行。 最后,抢占式调度允许编写任务函数,就好像它是系统中唯一的程序一样。 程序员的意外之喜!

由于增加了 CPU,双核 ESP32 可以同时执行两个任务。 这可能完成两倍的工作。 然而,乐鑫芯片的命名约定可能会令人困惑。 ESP32 可以是单核或双核芯片。 还有ESP32-S,可能还是双核的。 最后,新的 ESP32-S2 是单核 CPU。 表 1 按标识符列出了一些常用的 ESP 芯片。

很多时候,双核程序可以适用于在单核处理器上运行,但看门狗定时器等复杂因素通常需要额外的措施。

Arduino启动

在我们回顾任务创建和控制之前,让我们检查一下您在程序开始时继承的 Arduino 环境。 您的程序是否在任务中启动? 确实如此! 除了您的任务之外,其他 FreeRTOS 任务也在后台执行。 其中一些任务提供服务,如定时器、WiFi、TCP/IP,蓝牙等。

表 2 说明了调用函数 setup() 和 loop() 时运行的 FreeRTOS 任务。 名为 loopTask 的任务是主要的 Arduino 任务,它调用函数 setup() 和 loop()。

标记为 Stack 的列表示未使用的堆栈字节(每个任务都需要自己的堆栈)。 此表按任务编号按时间倒序排序。 loopTask 是最后一个创建的任务。 缺少任务编号意味着其他任务已创建并在其工作完成时结束。 优先级列说明了分配的任务优先级,零代表最低执行优先级。

最后,双核 ESP32 上的任务在 CPU 0 和 CPU 1 之间分配。乐鑫将支持任务放在 CPU 0 中,而应用程序任务在 CPU 1 上运行。这样可以保持 WiFi、TCP/IP 和蓝牙等服务运行 无需特别考虑您的应用程序。 尽管有这个约定,您仍然可以在任一 CPU 中创建任务。自然,当使用单 CPU 平台时,一切都在 CPU 0 中运行。

从这个例子中,我们可以注意到一些有趣的点:

  • 请注意,这是一个 C 启动(由于 app_main() 的 extern “C” 声明)。

  • Arduino 初始化由 initArduino()执行。

  • 通过调用 xTaskCreatePinnedToCore() 创建和运行 loopTask

详情参阅 - 亚图跨际

ESP32实践FreeRTOS相关推荐

  1. 【ESP32】arduino中的ESP32实时系统FreeRTOS使用教程(一)

    ESP32 FreeRTOS 任务的状态 任务的优先级 创建任务 传递给任务函数的参数 结构体多参数传递 互斥量Mutex ESP32的双核心 固定频率运行任务 软件定时器 简单的本节略过,详细的可以 ...

  2. arduino环境esp32跑freertos系统实现触摸检测及wifi控制

    这个程序内容是通过touch0,touch4,touch5(由于使用touch1,touch2测试发现经常出现误触发)触摸传感器检测是否有触摸事件,有的话则向串口发送对应数据,wifi 工作在客户端模 ...

  3. ESP32使用freeRTOS的消息队列

    零. 声明 本专栏文章我们会以连载的方式持续更新,本专栏计划更新内容如下: 第一篇:ESP-IDF基本介绍,主要会涉及模组,芯片,开发板的介绍,环境搭建,程序编译下载,启动流程等一些基本的操作,让你对 ...

  4. esp32例子初始化流程

    esp32之freertos 既然用了操作系统,那很明显就是多线程(多任务)啦,而BLE来说,最少需要两个线程 controller层与host层两个线程处理,所以在主线程中会把这两个给初始化了.由于 ...

  5. 【与GPT对话】杂记

    对话ai-1 freertos的信号量实现机制 freertos实现外部资源函数受保护的响应10个事件 freertos写一个监听特定时间序列的不能被其他线程中断红外函数并将数据中的5个状态码解出来产 ...

  6. stm32项目平衡车详解(stm32F407)下

    stm32项目平衡车详解(stm32F407)下 本文章学习借鉴于创客学院团队,以表感谢.教学视频 B站学习地址 HC-SRO4 超声波测距避障功能开发 TSL1401 CCD摄像头实现小车巡线功能 ...

  7. 个人作品——桌面精灵(1)

    个人作品--桌面精灵(1) ​ 基于STM32单片机以STM32F103C8T6为核心控制配备ESP32运行FreeRtos,搭载LD3322,以实现通过WiFi协议技术实现HTTP协议制作网页界面和 ...

  8. 从另一个角度去解读Blinker,剖析精简源码,学习开源精神,菜鸟哥还是忍不住对它下手了

    文章目录 1.解读起因 2.解读点 2.1 解读硬性要求 3.解读过程 3.1 解读理念 3.1.1 官方说明 3.2 解读组合方式 3.2.1 绿色 -- 必选宏 BLINKER_BLE -- bl ...

  9. 【ESP32+freeRTOS学习笔记-开篇前言】

    目录 前言的前言 RTOS的选择 开发与实践环境 参考资料 笔记的形式 专题文章的链接(持续更新中......) 前言的前言 单片机的开发,也有两年多了,之前一直是做一些简单应用,因此以裸机开发的方式 ...

  10. micro-ROS之esp32与ros2资料(freertos)

    重中之重:micro.ros.org/docs/tutorials/core/overview/ 所有案例都是流畅稳定运行的. 比arduino+esp32+ros2稳定性好很多哦. eps32复位重 ...

最新文章

  1. javascript的string对象
  2. discard connection丢失数据_python kafka 生产者发送数据的三种方式
  3. git clone的时候报error: RPC failed; result=18错误
  4. 十二月份找工作好找吗_淘宝美工前景怎么样?好找工作吗?
  5. 数学--数论--四大定理之威尔逊定理
  6. 回答嵌入式初学者的一些问题
  7. linux awk搜索文本最后个字符串,[转载]linux下的文本处理命令sedawkgrep
  8. 【每日算法Day 101】字节跳动 AI Lab 精选面试编程题
  9. centos下安装teamview
  10. 徐思201771010132《面向对象程序设计(java)》第九周学习总结
  11. horizon2206+A6000显卡 vGPU桌面经验分享
  12. wps for linux显示系统缺失字体解决办法
  13. European software vendors ranking 2012 (zz)
  14. 来来来,一起去看临泉王冲林岗的红枫叶
  15. Ubuntu18.04下配置Nooploop UWB LinkTrack
  16. 图片灯箱插件——lightBox
  17. python中如何调取wind数据_python实现从wind导入数据
  18. Windows 7 的系统文件修复:sfc /scannow
  19. Fidder汉化版使用
  20. Java实现基于国密SM2、SM4生成证书密钥进行字串的加解密

热门文章

  1. 2021年深圳市坪山区贴息贴保资助申请条件及材料,补贴100万元
  2. 10bit灰阶测试图_我可能买的是一块假10bit显示器以及一块假8bit显示器?
  3. import * as用法
  4. TortoiseSVN 打Tags
  5. 我的开源.NET函数式编程类库——VBF 1.0 BETA1发布
  6. android mcc 模拟,Android 读取MCC, MNC
  7. Resilient Distributed Datasets: A Fault-Tolerant Abstraction for In-Memory Cluster Computing
  8. 第13章WEB13-JSP模式JDBC高级篇
  9. C语言实现系统日历查询系统
  10. xp系统远程桌面关闭计算机,Windows XP 使用远程桌面时的关机/重新启动方法