一、操作系统的概念

        操作系统(英语:Operating System,缩写:OS)是一组主管并控制计算机操作、运用和运行硬件、软件资源和提供公共服务来组织用户交互的相互关联的系统软件程序。根据运行的环境,操作系统可以分为桌面操作系统,手机操作系统,服务器操作系统,嵌入式操作系统等。

二、操作系统的分类

        操作系统(英语:Operating System,缩写:OS)是一组主管并控制计算机操作、运用和运行硬件、软件资源和提供公共服务来组织用户交互的相互关联的系统软件程序。根据运行的环境,操作系统可以分为桌面操作系统,手机操作系统,服务器操作系统,嵌入式操作系统等。根据服务场景和技术特性,主要分为以下三类:

  1. 批处理操作系统
    指将用户提交的多个作业(任务)按批次自动连续处理的系统。其核心是通过 “多道程序技术” 让内存同时存放多个作业,CPU 在作业间切换以提高资源利用率,用户无需干预作业执行,仅在完成后获取结果。分为单道批处理(内存仅一道作业)和多道批处理(内存多道作业并行调度)。

  2. 分时操作系统
    采用 “时间片轮转” 机制,将 CPU 时间分割为多个短时间片,多个用户通过终端轮流占用 CPU,实现 “同时” 交互操作。用户可实时输入命令并获取响应,具有多路性(多用户共享)、交互性(实时反馈)、独立性(用户互不干扰)和及时性(短响应时间)的特征。

  3. 实时操作系统
    能在严格时间约束内响应外部事件并完成处理的系统,核心目标是 “时效性” 和 “可靠性”。根据时间约束严格程度,分为硬实时系统(必须在绝对时限内完成,如导弹制导)和软实时系统(允许偶尔超时,如视频播放)。

  1. 批处理操作系统:工厂流水线
    像食品加工厂的流水线 —— 工人把一堆原料(作业)放进生产线,机器自动按顺序清洗、加工、包装,全程无需人工干预,最后批量产出成品。优点是效率高,适合重复、无需修改的任务;缺点是一旦启动,中途不能停下改配方(用户无法交互)。

  2. 分时操作系统:咖啡厅服务员
    好比咖啡厅里的服务员,同时照顾多位客人(用户):给 A 点单、给 B 送咖啡、帮 C 续水,每次只服务一个人一小会儿(时间片),但切换速度极快,客人感觉自己被 “专属服务”。核心是 “随叫随到”(交互性),适合需要随时调整需求的场景(如办公、聊天)。

  3. 实时操作系统:急诊室医生
    类似医院急诊室 —— 病人(外部事件)来了必须立刻处理,且有严格时间限制:心脏骤停的病人需在 4 分钟内除颤(硬实时),轻微外伤可稍等片刻(软实时)。医生(系统)的首要任务是 “不超时”,可靠性远高于效率。

对比维度批处理操作系统分时操作系统实时操作系统
核心目标提高资源利用率、增加吞吐量支持多用户实时交互满足严格时间约束,保证可靠性
用户交互无(提交后等待结果)强(实时输入 / 反馈)有限(多为预设事件响应)
CPU 调度方式多道程序交替运行(无固定时间片)时间片轮转(固定短时间片)优先级调度(紧急任务优先)
典型应用银行对账、大数据批量处理个人电脑、服务器终端自动驾驶、工业控制、医疗设备
时间约束无严格限制响应时间较短(如秒级)严格时限(如毫秒 / 微秒级)
资源利用率高(CPU / 内存持续占用)中等(切换任务有开销)按需分配(优先保障关键任务)

三、为什么需要使用系统

        当我们进入嵌入式这个领域的时候, 往往首先接触的都是单片机编程, 单片机编程又首选 51 单片机 来入门。 这里面说的单片机编程通常都是指裸机编程,即不加入任何 RTOSReal Time Operation System 实时操作系统) 的程序。 常用的 RTOS 有国外的 FreeRTOSμC/OS RTX 和国内的 RT-Thread、 Huawei LiteOS AliOS-Things 等, 其中尤以国外开源且免费的 FreeRTOS 的市场占有率 最高。

        在裸机系统中,所有的程序基本都是自己写的, 所有的操作都是在一个无限的大循环里面实现。现实 生活中的很多中小型的电子产品用的都是裸机系统, 而且也能够满足需求。但是为什么还要学习 RTOS 编程,偏偏还要整个操作系统进来。一是项目需要,随着产品要实现的功能越来越多,单纯的 裸机系统已经不能够完美地解决问题,反而会使编程变得更加复杂,如果想降低编程的难度, 我们可以考虑引入 RTOS 实现多线程管理, 这是使用RTOS 的最大优势。二是学习的需要,必须学习更高级 的东西,实现更好的职业规划,为将来走向人生巅峰迎娶白富美做准备!

四、移植RT_thread操作系统

1.源码的获取步骤

访问 RT-Thread 官方网站

打开浏览器,在地址栏输入 RT-Thread 官方网站的网址:https://www.rt-thread.org/ ,然后按下回车键进入官网首页。

进入下载页面

 在官网页面,点击资源,在最下面找到下载。进入下载界面后点击源代码。

选择合适的版本

在下载页面,会展示不同版本的 RT-Thread 源码。可能会有稳定版、开发版等,根据自己的需求进行选择。比如,如果是用于生产项目,建议选择稳定版;如果是进行新功能测试或开发,可以选择开发版 。

下载源码

  • 通过 Git 获取(适合熟悉 Git 工具的开发者)
    在下载页面找到 Git 仓库地址(例如,RT-Thread 的 Gitee 仓库地址为https://gitee.com/rtthread/rt-thread ,GitHub 仓库地址为https://github.com/RT-Thread/rt-thread )。
    打开命令行工具(在 Windows 系统中可以使用 Git Bash,在 Linux 或 macOS 系统中使用自带的终端),使用git clone命令克隆仓库。例如,要克隆 Gitee 上的仓库,可以在命令行输入git clone https://gitee.com/rtthread/rt-thread.git,然后回车,等待源码下载到本地指定目录。
  • 通过压缩包下载
    在下载页面中,一般会提供源码压缩包下载选项(常见格式有.zip 或.tar.gz)。点击对应的下载链接,浏览器会开始下载压缩包文件。下载完成后,在下载目录找到压缩包,使用解压工具(如 Windows 系统的 WinRAR、7-Zip,Linux 系统的tar命令等)解压到指定目录。

2. 文件介绍

        获取到的源码解压后如下:

文件夹

  • bsp(Board Support Package,板级支持包)
    • 作用:包含针对不同硬件开发板的配置文件和驱动程序。它负责初始化硬件设备,如时钟、GPIO、串口、SPI 等,使得 RT - Thread 操作系统能够在特定的硬件平台上运行。
    • 举例:在 STM32 开发板上,bsp 文件夹下会有 STM32 芯片初始化代码、时钟配置代码,以及各个外设的驱动代码。开发者可以根据自己使用的具体开发板型号,在该文件夹中找到对应的配置,也可以对其进行修改和扩展以适配自己的硬件设计。
  • components(组件)
    • 作用:存放 RT - Thread 丰富的软件组件,这些组件为系统增加了各种功能,如文件系统(FinSH 命令行、FatFS 等)、网络协议栈(LwIP 等)、图形界面(LittlevGL 等) 。
    • 举例:当需要在 RT - Thread 系统中实现文件管理功能时,就可以使用 components 文件夹中的 FatFS 文件系统组件;如果要开发具有网络通信功能的设备,就可以使用 LwIP 网络协议栈组件。
  • include(头文件)
    • 作用:包含 RT - Thread 操作系统及各个组件的头文件。这些头文件定义了各种数据结构、函数原型、宏定义等,方便开发者在自己的应用程序中引用,以调用 RT - Thread 提供的功能。
    • 举例:在编写 RT - Thread 应用程序时,要使用线程相关的函数,就需要包含 rtthread.h 头文件,该头文件位于 include 文件夹下,它定义了线程控制块、线程创建函数等相关的内容。
  • libcpu(CPU 相关库)
    • 作用:主要存放与 CPU 架构相关的代码,如中断处理、任务切换、CPU 寄存器操作等底层代码。它实现了 RT - Thread 操作系统在不同 CPU 架构上的移植接口。
    • 举例:对于 ARM Cortex - M 系列 CPU,libcpu 文件夹下会有针对该系列 CPU 的中断向量表定义、任务切换汇编代码等,使得 RT - Thread 能够在 ARM Cortex - M 芯片上高效运行。
  • src(操作系统核心源码)
    • 作用:存放 RT - Thread 操作系统的核心源代码,包括线程管理、内存管理、信号量、消息队列、事件集等内核对象的实现代码。
    • 举例:线程管理的实现代码负责线程的创建、删除、挂起、恢复等操作;内存管理代码实现了 RT - Thread 系统的内存分配和释放机制,如静态内存池和动态内存堆的管理。

文件

  • AUTHORS
    • 作用:记录参与 RT - Thread 开发的作者信息,包括姓名、邮箱等。
    • 举例:当开发者想要了解 RT - Thread 的开发团队,或者在使用过程中遇到问题需要联系特定作者时,可以查看该文件获取相关信息。
  • COPYING
    • 作用:主要包含 RT - Thread 的版权声明和许可协议,明确了该开源软件的使用、分发、修改等相关法律条款。
    • 举例:开发者在基于 RT - Thread 进行商业开发或者开源项目分发时,需要遵循 COPYING 文件中规定的许可协议,以确保合法合规。
  • License
    • 作用:和 COPYING 文件类似,进一步明确 RT - Thread 的开源许可证信息,如开源协议类型(通常是 Apache 2.0 等)。
    • 举例:通过查看 License 文件,开发者可以清楚地知道自己在使用 RT - Thread 时的权利和义务,避免因版权问题产生纠纷。
  • README
    • 作用:是对 RT - Thread 源码的简要说明文档,通常会介绍 RT - Thread 的基本特性、目录结构、编译方法、使用说明等重要信息。
    • 举例:对于初次接触 RT - Thread 的开发者,通过阅读 README 文件,可以快速了解 RT - Thread 的基本情况,以及如何开始搭建开发环境和进行代码编译。
  • rt - thread.rttthread.pdsc
    • 作用:这是 RT - Thread 的软件包描述文件,用于描述 RT - Thread 软件包的属性,如名称、版本、依赖关系等信息,在使用 RT - Thread Studio 等开发工具进行软件包管理时会用到。
    • 举例:当使用 RT - Thread Studio 创建项目并添加 RT - Thread 软件包时,工具会读取该文件来获取软件包的相关信息,以便正确地配置和管理项目中的软件包。

3. 移植

        将下载的源码文件夹复制到项目中。

        将源码文件夹的bsp文件夹中的下面两个文件复制到工程文件夹的user下:

        点击keil,打开工程:

        按照下面的步骤添加文件:

        全选src的所有文件并添加:(当第4步Add点击之后,左边5会出现)

         然后再向rtt_port添加,右边的路径在源码下的libcpu下的arm下的cortex-m3,文件类型选择全部,并添加以下两个文件:

        点击ok之后,工程之中新出现两个分组:

         将rt_thread的只读属性去掉(把下图中的只读选项去掉)

       添加board:

               右键USER添加并选择上面步骤复制的board.c并去掉只读属性。

        添加头文件:

         选择finish:

         选择include:

         选择libc库:

        点击ok:

         点击编译,左侧文件出现加号说明添加成功,下一步就是修改出现的报错:

        以下是错误的修改步骤:

错误一:

..\USER\rtconfig.h(6): error:  #5: cannot open source input file "RTE_Components.h": No such file or directory#include "RTE_Components.h"
..\rt_thread\src\clock.c: 0 warnings, 1 error

        解决方案:注释掉此头文件


错误二:重定义

.\Objects\STM32F103ZET6.axf: Error: L6200E: Symbol HardFault_Handler multiply defined (by context_rvds.o and stm32f10x_it.o).
.\Objects\STM32F103ZET6.axf: Error: L6200E: Symbol PendSV_Handler multiply defined (by context_rvds.o and stm32f10x_it.o).
.\Objects\STM32F103ZET6.axf: Error: L6200E: Symbol SysTick_Handler multiply defined (by board.o and stm32f10x_it.o).

        由于RTOS操作系统内部自带定时器,所以可以把裸机中使用的定时器函数注释掉:

        至此为止,编译通过。

        将rtconfig.h中的RT_THREAD_PRIORITY_MAX值从8改为32:

          将RT_TICK_PER_SECOND从100改为1000:

        将RT_MAIN_THREAD_STACK_SIZE从256改为512:

        取消注释RT_USING_HEAP:

         将board.c中的下面这部分的代码注释掉:

         同时也注释掉下面这部分:

         自定义的驱动程序初始化都在这里:

        并在当前board.c文件添加这些包含这些驱动函数的头文件board.h,具体间自己的目录结构,以下为我的:

         再次编译,没有错误了。

4. 验证工程的可用性

使用rt_thread_create和rt_thread_startup创建线程,线程的执行函数自定义,下面只是示例代码:

main.c:

#include "stm32f10x.h"#include "board.h"
#include "rtthread.h"
#include "string.h"uint8_t key_key0_state = KEY_DOWN;
uint8_t key_key1_state = KEY_DOWN;
uint8_t key_wkup_state = KEY_DOWN;void led1_thread(void *parg);
rt_thread_t led1_ret;int main(void) {led1_ret=rt_thread_create("led1",led1_thread,RT_NULL,512,7,20);if(led1_ret!=RT_NULL){rt_thread_startup(led1_ret);}while(1){}//return 0;
}void led1_thread(void *parg)
{while(1){LED1ON();rt_thread_delay(1000);rt_kprintf("LED1ON\r\n");LED1OFF();     rt_thread_delay(1000);   /* 延时500个tick */		 		rt_kprintf("LED1OFF\r\n");}
}

        然后将编译好的代码烧写进单片机中,然后就会发现led灯交替亮灭。至此为止,我们就辛辛苦苦用RTOS点亮了一盏灯!!!

        虽然感觉有点亏吧,但是这仅仅是刚刚开始,随着我们的项目越来越丰富,RTOS的作用也就越来越大。

0voice · GitHub

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

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

相关文章

基于单片机倾角测量仪/角度测量/水平仪

传送门 👉👉👉👉其他作品题目速选一览表 👉👉👉👉其他作品题目功能速览 概述 本设计实现了一种基于单片机的高精度数字倾角测量仪。系统核心由倾角传感器(ADXL345倾…

深度学习 -- 初步认识Torch

深度学习 – 初步认识Torch 文章目录深度学习 -- 初步认识Torch一,认识人工智能1.1 人工智能的本质1.2 人工智能的实现过程二,认识Torch2.1简介2.2 概述2.3 Tensor的创建2.3.1 torch.tensor2.3.2 torch.Tensor三,创建线性和随机张量3.1创建线…

BGP的“聪明选路”遇上了TCP的“路径洁癖”,需人工调和

在路由器R1上有两条外网,WAN1和WAN2。R1上做了域名分流功能,全局网址分到WAN1,指定域名分到WAN2(优先级更高)。症状是用户反馈部分网页无法打开。于是各种检查尝试...... 2天过去了......最终结论是:即使S…

ACWing算法笔记 | 二分

🔍 C 二分查找双模板详解:左闭右开 vs 左闭右闭(二分笔记)二分查找(Binary Search)是一类高效的搜索算法,在 O(log n) 的时间复杂度下查找答案,适用于单调性问题。C STL 的 lower_bo…

centos 新加磁盘分区动态扩容

你不能直接将一个分区分配给/dev/mapper/centos-root,因为这是一个逻辑卷(属于 LVM 系统)。不过,你可以通过以下步骤将/dev/sda3添加到现有卷组或创建新的逻辑卷: 确认磁盘和分区信息 首先检查分区是否已格式化以及是否…

python学智能算法(二十六)|SVM-拉格朗日函数构造

【1】引言 前序学习进程中,已经了解了拉格朗日乘数法求极值的基本原理,也了解了寻找最佳超平面就是寻找最佳分隔距离。 这篇文章的学习目标是:使用拉格朗日乘数法获取最佳的分隔距离。 【2】构造拉格朗日函数 目标函数 首先是目标函数f&a…

智能制造——48页毕马威:汽车营销与研发数字化研究【附全文阅读】

涵盖了汽车行业数字化转型、汽车营销业务能力建设(以会员管理为例)以及汽车研发与创新能力建设等议题。毕马威认为,软件定义汽车已成为汽车行业中的核心议题,并围绕此议题提供了相关方案。在市场观点方面,毕马威与多家…

嵌入式学习-PyTorch(8)-day24

torch.optim 优化器torch.optim 是 PyTorch 中用于优化神经网络参数的模块,里面实现了一系列常用的优化算法,比如 SGD、Adam、RMSprop 等,主要负责根据梯度更新模型的参数。🏗️ 核心组成1. 常用优化器优化器作用典型参数torch.op…

PostgreSQL实战:高效SQL技巧

PostgreSQL PG 在不同领域可能有不同的含义,以下是几种常见的解释: PostgreSQL PostgreSQL(简称 PG)是一种开源的关系型数据库管理系统(RDBMS),支持 SQL 标准并提供了丰富的扩展功能。它广泛应用于企业级应用、Web 服务和数据分析等领域。 PostgreSQL 的详细介绍 Po…

3-大语言模型—理论基础:生成式预训练语言模型GPT(代码“活起来”)

目录 1、GPT的模型结构如图所示 2、介绍GPT自监督预训练、有监督下游任务微调及预训练语言模型 2.1、GPT 自监督预训练 2.1.1、 输入编码:词向量与位置向量的融合 2.1.1.1、 输入序列与词表映射 2.1.1.2、 词向量矩阵与查表操作 3. 位置向量矩阵 4. 词向量与…

【Redis 】看门狗:分布式锁的自动续期

在分布式系统的开发中,保证数据的一致性和避免并发冲突是至关重要的任务。Redis 作为一种广泛使用的内存数据库,提供了实现分布式锁的有效手段。然而,传统的 Redis 分布式锁在设置了过期时间后,如果任务执行时间超过了锁的有效期&…

MYSQL--快照读和当前读及并发 UPDATE 的锁阻塞

快照读和当前读在 MySQL 中,数据读取方式主要分为 快照读 和 当前读,二者的核心区别在于是否依赖 MVCC(多版本并发控制)的历史版本、是否加锁,以及读取的数据版本是否为最新。以下是详细说明:一、快照读&am…

css样式中的选择器和盒子模型

目录 一、行内样式二、内部样式三、外部样式四、结合选择器五、属性选择器六、包含选择器七、子选择器八、兄弟选择器九、选择器组合十、伪元素选择器十一、伪类选择器十二、盒子模型 相关文章 学习标签、属性、选择器和外部加样式积累CSS样式属性:padding、marg…

关于基于lvgl库做的注册登录功能的代码步骤:

以下是完整的文件拆分和代码存放说明,按功能模块化划分,方便工程管理:一、需要创建的文件清单 文件名 作用 类型 main.c 程序入口,初始化硬件和LVGL 源文件 ui.h 声明界面相关函数 头文件 ui.c 实现登录、注册、主页面的UI 源文…

RAII机制以及在ROS的NodeHandler中的实现

好的,这是一个非常核心且优秀的设计问题。我们来分两步详细解析:先彻底搞懂什么是 RAII,然后再看 ros::NodeHandle 是如何巧妙地运用这一机制的。1. 什么是 RAII 机制? RAII 是 “Resource Acquisition Is Initialization” 的缩写…

Linux LVS集群技术

LVS集群概述1、集群概念1.1、介绍集群是指多台服务器集中在一起,实现同一业务,可以视为一台计算机。多台服务器组成的一组计算机,作为一个整体存在,向用户提供一组网络资源,这些单个的服务器就是集群的节点。特点&…

spring-ai-alibaba如何上传文件并解析

问题引出 在我们日常使用大模型时,有一类典型的应用场景,就是将文件发送给大模型,然后由大模型进行解析,提炼总结等,这一类功能在官方app中较为常见,但是在很多模型的api中都不支持,那如何使用…

「双容器嵌套布局法」:打造清晰层级的网页架构设计

一、命名与核心概念 “双容器嵌套布局法”,核心是通过两层容器嵌套构建网页结构:外层容器负责控制布局的“宏观约束”(如页面最大宽度、背景色等),内层容器聚焦“微观排版”(内容居中、内边距调整、红色内容…

基于深度学习的自然语言处理:构建情感分析模型

前言 自然语言处理(NLP)是人工智能领域中一个非常活跃的研究方向,它致力于使计算机能够理解和生成人类语言。情感分析(Sentiment Analysis)是NLP中的一个重要应用,其目标是从文本中识别和提取情感倾向&…

JWT原理及利用手法

JWT 原理 JSON Web Token (JWT) 是一种开放的行业标准,用于在系统之间以 JSON 对象的形式安全地传输信息。这些信息经过数字签名,因此可以被验证和信任。其常用于身份验证、会话管理和访问控制机制中传递用户信息。 与传统的会话令牌相比,JWT…