FreeRTOS下的“Hello World”

什么是实时操作系统(RTOS)

实时操作系统(RTOS)是一种专为实时应用程序设计的操作系统。实时应用程序需要在特定时间内做出预测的响应,因此RTOS专注于提供对时间约束的强调,以确保系统能够满足实时性能要求。

1. 实时性能:

  • 硬实时和软实时: RTOS可以根据实时性能的要求分为硬实时和软实时。硬实时系统对任务的响应时间有极严格的要求,任何未能在规定时间内完成的任务都会被认为是失败。软实时系统也有时间要求,但相对灵活,任务未能在规定时间内完成并不会导致系统失败。

2. 任务调度:

  • 实时调度算法: RTOS使用实时调度算法来确定哪个任务将在处理器上运行。这些算法考虑任务的优先级、截止期限和其他实时要求。
  • 时间片轮转: 在一些情况下,RTOS可能使用时间片轮转调度,确保每个任务都有机会运行,以防止某个任务长时间独占处理器。

3. 任务管理:

  • 任务创建与删除: RTOS允许创建和删除任务。任务可以是独立运行的单元,执行特定的功能。
  • 任务同步和通信: 提供机制使任务能够同步和通信,如信号量、互斥锁、消息队列等。

4. 内存管理:

  • 动态内存分配: 一些RTOS支持动态内存分配,允许在运行时分配和释放内存。
  • 静态内存分配: 为了提高可预测性,一些RTOS可能支持静态内存分配,即在编译时为任务分配内存。

5. 中断处理:

  • 中断服务例程(ISR): RTOS允许开发人员编写中断服务例程,以处理硬件中断事件。
  • 中断优先级: 中断服务例程可以具有不同的优先级,RTOS确保高优先级的中断可以中断低优先级的中断或任务。

6. 实时时钟和定时器:

  • 实时时钟: 提供对实时时钟的支持,以便任务能够基于实际时间进行调度和同步。
  • 定时器: 允许设置和管理定时器,以在指定时间触发任务或事件。

7. 错误处理:

  • 错误检测与处理: RTOS通常提供错误检测和处理机制,以确保系统在出现错误时能够采取适当的措施。

8. RTOS应用领域:

  • 嵌入式系统: RTOS广泛应用于嵌入式系统,如汽车控制单元、医疗设备、工业自动化等。
  • 通信系统: 在通信系统中,RTOS用于管理网络设备、路由器和交换机等。

9. 示例RTOS:

  • FreeRTOS: 一个开源的实时操作系统,广泛用于嵌入式系统。
  • VxWorks: 用于嵌入式实时系统的商业RTOS。
  • RTOS-32: 针对Windows平台的实时操作系统。

10. RTOS与通用操作系统的区别:

  • 实时性能: RTOS关注实时性能,而通用操作系统通常更注重吞吐量和响应时间。
  • 内核大小: RTOS通常具有更小、更精简的内核,以确保快速启动和响应。
  • 任务调度: RTOS使用实时调度算法,以确保任务在规定时间内完成。

实时操作系统在对实时性能有严格要求的应用中发挥着关键作用。通过提供对任务调度、同步、通信和实时时钟的支持,RTOS使得开发者能够设计和实现对时间要求极高的系统。在嵌入式系统和实时控制领域,RTOS成为了不可或缺的工具。

FreeRTOS

FreeRTOS是一个开源的实时操作系统,广泛用于嵌入式系统。FreeRTOS提供了对任务调度、同步、通信和实时时钟的支持,使得开发者能够设计和实现对时间要求极高的系统。FreeRTOS 通过 MIT 开源许可免费分发,包括一个内核和一组不断丰富的 IoT 库,适用于所有行业领域。FreeRTOS 的构建突出可靠性和易用性。

FreeRTOS 的开发活动已从 SVN 迁移到 GitHub,现在可以直接在FreeRTOS的 Github页面上找到。 从 GitHub 下载 FreeRTOS早期版本的标准 zip (.zip) 文件或自解压 zip 文件 (.exe) 。解压缩 源代码,同时确保不改动文件夹结构。

FreeRTOS官方下载页有两个版本的下载包,一个是最新版,一个是长期支持(LTS)版。最新版下载包包含最新 FreeRTOS 内核、 FreeRTOS-Plus 库 和 AWS IoT 库,以及示例项目。长期支持版下载包则包含FreeRTOS LTS 库,其中包括 FreeRTOS 内核和 IoT 库,但没有示例项目。可以根据自己需要选择下载。

因为手上正好有ESP32-C3小飞控板,所以接下来的playground就以这个小板子为例了。而ESP-IDF中已经集成了FreeRTOS,所以我们可以直接使用ESP-IDF来开发FreeRTOS应用。

Hello World

配置好ESP-IDF开发环境后,按照以下步骤配置实现本示例项目:

步骤 1: 安装 ESP-IDF

确保你已经安装了 ESP-IDF。你可以按照 Espressif 的官方文档 ESP-IDF 安装指南 进行安装。

步骤 2: 创建新项目

  1. 打开终端或命令提示符窗口,切换到你希望创建项目的目录。

  2. 运行以下命令来创建一个新的 ESP-IDF 项目:

idf.py create-project hello_world

这将创建一个包含默认项目结构的新目录。

步骤 3: 进入项目目录

cd <project-name>

步骤 4: 配置项目

  1. 运行以下命令配置项目:
idf.py menuconfig

这将打开一个菜单配置界面,你可以在其中配置项目的各种选项,包括串口设置、Wi-Fi 配置、组件选项等。配置完成后,保存并退出。

  1. (可选) 如果你想使用 VSCode 或其他 IDE 进行开发,可以运行以下命令生成 IDE 项目文件:
idf.py vscode

这将生成与 Visual Studio Code 兼容的配置文件。

步骤 5: 编译和烧录

main目录下找到hello_world_main.c文件,写入以下内容:

#include <stdio.h>
#include <inttypes.h>
#include "sdkconfig.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_chip_info.h"
#include "esp_flash.h"void app_main(void)
{printf("Hello world!\n");/* Print chip information */esp_chip_info_t chip_info;uint32_t flash_size;esp_chip_info(&chip_info);printf("This is %s chip with %d CPU core(s), %s%s%s%s, ",CONFIG_IDF_TARGET,chip_info.cores,(chip_info.features & CHIP_FEATURE_WIFI_BGN) ? "WiFi/" : "",(chip_info.features & CHIP_FEATURE_BT) ? "BT" : "",(chip_info.features & CHIP_FEATURE_BLE) ? "BLE" : "",(chip_info.features & CHIP_FEATURE_IEEE802154) ? ", 802.15.4 (Zigbee/Thread)" : "");unsigned major_rev = chip_info.revision / 100;unsigned minor_rev = chip_info.revision % 100;printf("silicon revision v%d.%d, ", major_rev, minor_rev);if(esp_flash_get_size(NULL, &flash_size) != ESP_OK) {printf("Get flash size failed");return;}printf("%" PRIu32 "MB %s flash\n", flash_size / (uint32_t)(1024 * 1024),(chip_info.features & CHIP_FEATURE_EMB_FLASH) ? "embedded" : "external");printf("Minimum free heap size: %" PRIu32 " bytes\n", esp_get_minimum_free_heap_size());for (int i = 10; i >= 0; i--) {printf("Restarting in %d seconds...\n", i);vTaskDelay(1000 / portTICK_PERIOD_MS);}printf("Restarting now.\n");fflush(stdout);esp_restart();
}

这段代码将输出"Hello World!",并打印一些芯片基本信息。

  1. 使用以下命令编译项目:
idf.py build
  1. 使用以下命令烧录固件到 ESP32:
idf.py -p <PORT> flash

其中 <PORT> 是你的 ESP32 开发板连接到计算机的端口。你可以使用 ls /dev/tty*(在 Linux/macOS)或 mode 命令(在 Windows)来查找端口。

步骤 6: 监视串口输出

  1. 使用以下命令启动监视串口输出:
idf.py -p <PORT> monitor

这将打开一个窗口,显示 ESP32 的串口输出。你可以看到程序的调试信息和日志。

  1. 如果你修改了代码并重新编译,可以使用以下命令重新烧录并启动监视:
idf.py -p <PORT> flash monitor

运行成功的话,应该会在控制台输出类似以下内容:

Hello world!
This is esp32c3 chip with 1 CPU core(s), WiFi/BLE, silicon revision v0.4, 2MB external flash
Minimum free heap size: 330392 bytes
Restarting in 10 seconds...
Restarting in 9 seconds...
Restarting in 8 seconds...
Restarting in 7 seconds...
Restarting in 6 seconds...
Restarting in 5 seconds...
Restarting in 4 seconds...
Restarting in 3 seconds...
Restarting in 2 seconds...
Restarting in 1 seconds...
Restarting in 0 seconds...
Restarting now.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/198496.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

web前端开发HTML/css用户登录界面

代码&#xff1a; <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns"http://www.w3.org/1999/xhtml"> <head> <meta http-equi…

react学习--Redux的使用

Redux 的核心思想是通过一个单一的状态树来管理应用的状态&#xff0c;状态的修改通过纯函数&#xff08;reducers&#xff09;来进行&#xff0c;从而使状态变化可追踪和可预测。 1、安装 Redux&#xff1a; 在项目中安装 Redux 库和 React-Redux&#xff08;用于 React 绑定…

神经网络常用归一化和正则化方法解析(一)

&#x1f380;个人主页&#xff1a; https://zhangxiaoshu.blog.csdn.net &#x1f4e2;欢迎大家&#xff1a;关注&#x1f50d;点赞&#x1f44d;评论&#x1f4dd;收藏⭐️&#xff0c;如有错误敬请指正! &#x1f495;未来很长&#xff0c;值得我们全力奔赴更美好的生活&…

Diary11-Word文字

Word文字 一.标尺与标记 1.标尺 1.1标尺的打开方式 标尺&#xff1a;视图->标尺(选中即可) 1.2标尺的相关操作 左边的倒三角&#xff1a;【首行缩进】->第一行与左边的间距 左边的正三角&#xff1a;【悬挂缩进】->除了第一行之外的行与左边的间距 右边的正三角…

Win环境中安装Jenkins指南

目录 安装Java环境 下载并安装Jenkins Jenkins版本 启动Jenkins 如何删除Jenkins 安装Java环境 访问 Oracle官方网站 下载并安装JDK 安装完成后&#xff0c;设置系统环境变量 JAVA_HOME 到你的 JDK 安装路径&#xff0c;并将 %JAVA_HOME%\bin 添加到系统 PATH 中。 下载…

Apollo新版本Beta技术沙龙参会感受:未来的自动驾驶之旅

Apollo新版本Beta技术沙龙参会感受&#xff1a;未来的自动驾驶之旅 &#x1f697;&#x1f4a1; 文章目录 Apollo新版本Beta技术沙龙参会感受&#xff1a;未来的自动驾驶之旅 &#x1f697;&#x1f4a1;摘要引言正文&#x1f4cd; 参会流程介绍&#x1f31f; 参会收获&#x1…

「Verilog学习笔记」任意小数分频

专栏前言 本专栏的内容主要是记录本人学习Verilog过程中的一些知识点&#xff0c;刷题网站用的是牛客网 timescale 1ns/1nsmodule div_M_N(input wire clk_in,input wire rst,output wire clk_out );parameter M_N 8d87; parameter c89 8d24; // 8/9时钟切换点parameter di…

封装时间轴组件 timeline

要求时间轴的点展示进度百分比&#xff0c;线也根据进度不同展示不同长度的颜色 实现效果&#xff1a; 使用的组件库是vant的circle 子组件&#xff1a; <template><div class"m-timeline-area" :style"width: ${width}px"><div class&qu…

python读取txt,csv, 等不同格式的文件——(待完善)

python 读取txt文件 1.python读取txt文件&#xff08;多种方法&#xff09;

#名词区别篇:事件流事件委托addEventListener白屏时间首屏时间

事件流 事件捕获 —从外到内 到达目标 事件冒泡—从内到外 事件委托 定义&#xff1a;当有大量子元素触发事件时&#xff0c;将事件监听器绑定在父元素进行监听&#xff0c;此时数百个事件监听器变成一个监听器。 e.currentTarget 与 e.target 有何区别 Event 接口的只读…

前端利用JS获取最近1、3、5、n年的开始时间和结束时间

1.获取最近1年的开始时间和结束时间 function getLastYearStartAndEnd() {const currentDate new Date();const currentYear currentDate.getFullYear();const currentMonth currentDate.getMonth() 1;const lastYearStart new Date(currentYear - 1, currentMonth, 1);c…

聊聊 Jetpack Compose 的 “状态订阅自动刷新” -- 你真的了解重组吗?

Jekpack Compose “状态订阅&自动刷新” 系列&#xff1a; 【 聊聊 Jetpack Compose 的 “状态订阅&自动刷新” - - MutableState/mutableStateOf 】 【 聊聊 Jetpack Compose 的 “状态订阅&自动刷新” - - remember 和重组作用域 】 【 聊聊 Jetpack Compose 的 …

Spring Cloud 配置 Druid(二)

不废话&#xff0c;直接上代码&#xff0c; Nacos搭建的微服务&#xff0c;可以看Spring Cloud 配置 Nacos&#xff08;一&#xff09;-CSDN博客 一&#xff0c;pom文件 spring-cloud-starter-alibaba-nacos-discovery 和 spring-cloud-starter-openfeign 都是基于spring-cl…

Apollo新版本Beta技术沙龙的参会感受

Apollo新版本Beta技术沙龙的参会感受 Apollo新版本Beta技术沙龙的参会感受摘要 &#x1f697;&#x1f310;参会流程 &#x1f5d3;️展厅参观/展厅讲解 &#x1f3e2;进入百度Apollo未来驾驶汽车5G云代驾的神奇签到 &#x1f4dd;Apollo新版本Beta整体介绍 &#x1f680;技术分…

C语言:用递归的方法求斐波那契数列:1,1,2,3,5,8,……的前40个数

分析&#xff1a; 首先&#xff0c;在代码的起始部分&#xff0c;包含<stdio.h>头文件&#xff0c;这个头文件提供了输入和输出的函数。 然后&#xff0c;定义了四个变量&#xff1a;f、f1、f2和i。f1和f2是斐波那契数列的前两个数字&#xff0c;初始化为1。f是当前计…

qt使用wimlib-imagex,做windows系统备份还原

wimlib-imagex是个第三方工具&#xff0c;可对系统映像进行操作&#xff0c;下载地址&#xff1a; https://wimlib.net/downloads/index.html 程序主要用到以下这两个文件&#xff1a;libwim-15.dll和wimlib-imagex.exe wimlib-imagex.exe的调用命令参数&#xff0c;可以通过…

【Docker】资源配额及私有镜像仓库

资源配额及私有镜像仓库 一、Docker资源配额1.1、控制cpu1.1.1、cpu份额控制1.1.2、core核心控制1.1.3、配额控制参数的混合使用 1.2、控制内存1.3、控制IO1.4、资源释放 二、Docker私有镜像仓库Harbor2.1、Harbor简介2.2、为Harbor自签发证书【1】生成ca证书【2】生成域名的证…

输出完全二叉树中某个结点的双亲和所有子孙。假设完全二叉树的顺序存储在一维数组A[n]中。

思路&#xff1a; 首先定义两个函数&#xff0c;getParent函数用于获取指定结点的双亲结点的索引&#xff0c;printDescendants函数用于输出指定结点的所有子孙。然后在main函数中&#xff0c;创建表示完全二叉树的数组A&#xff0c;并针对指定结点索引进行相关操作&#xf…

HOST文件被挟持,无法上网,如何解决。

问题&#xff1a; 晚上开机&#xff0c;突然发现无法联网&#xff0c;提示网络异常 解决&#xff1a; 首先网络诊断&#xff0c;host文件被劫持&#xff0c;修复后&#xff0c;仍然不行。 然后测试手机热点&#xff0c;发现仍然无法联网 尝试用火绒修复&#xff0c;无果。 所有…

Python 解析JSON实现主机管理

JSON&#xff08;JavaScript Object Notation&#xff09;是一种轻量级的数据交换格式&#xff0c;它以易于阅读和编写的文本形式表示数据。JSON 是一种独立于编程语言的数据格式&#xff0c;因此在不同的编程语言中都有对应的解析器和生成器。JSON 格式的设计目标是易于理解、…