当前位置: 首页 > news >正文

嵌入式学习笔记--MCU阶段--DAY12实时操作系统rt_thread1

1.操作系统相关概念

操作系统概念

帮助使用人员,控制计算机的软硬件

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

操作系统就是一个软件,此软件是帮助使用人员,管理计算机的资源。

计算机如果没有操作系统,可以使用吗???可以的,但是计算机的效率肯定会降低

裸机开发:目前对于我们来说,就是前几天的单片机开发过程,就是裸机--不安装操作系统,直接操作硬件设备

添加操作系统:

操作系统的分类

批处理操作系统

批处理(Batch Processing)操作系统的工作方式是:用户将作业交给系统操作员,系统操作员将许多用户的作业组成一批作业,之后输入到计算机中,在系统中形成一个自动转接的连续的作业流,然后启动操作系统,系统自动、依次执行每个作业。最后由操作员将作业结果交给用户。

批处理操作系统又分为单道批处理系统和多道批处理系统

  1. 单道批处理系统

系统对作业的处理是成批进行的,但内存中始终保持一道作业(任务)。该系统是在解决人机矛盾和CPU与I/O设备速率不匹配的矛盾中形成的。

单道批处理系统的主要特征如下:

顺序性:磁带上的各道作业是顺序地进入内存,各道作业的完成顺序与它们进入内存的顺序,在正常情况下应完全相同,亦即先调入内存的作业先完成。

单道性:内存中仅有一道程序运行,即监督程序每次从磁带上只调入一道程序进入内存运行,当该程序完成或发生异常情况时,才换入其后继程序进入内存运行。

自动性:在顺利的情况下,在磁带上的一批作业能自动地逐个依次运行,而无需人工干预。

此时面临的问题是:每次主机内存中仅存放一道作业,每当它运行期间(注意这里是“运行时”,并不是“完成后”)发出输入/输出请求后,高速的CPU便处于等待低速的I/O完成状态。为了进一步提高资源的利用率和系统的吞吐量,引入了多道程序技术。

       2.多道批处理系统

多道程序设计技术允许多个程序同时进入内存并运行。即同时把多个程序放入内存,并允许它们交替在CPU中运行,它们共享系统中的各种硬、软件资源。当一道程序因I/O请求(LED beep)而暂停运行时,CPU便立即转去运行另一道程序。它没有用某些机制提高某一技术方面的瓶颈问题,而是让系统的各个组成部分都尽量去“忙”,花费很少时间去切换任务,达到了系统各部件之间的并行工作,使其整体在单位时间内的效率翻倍。

多道程序设计的特点有:

多道:计算机内存中同时存放多道相互独立的程序。

宏观上并行:同时进入系统的多道程序都处于运行过程中,即它们先后开始了各自的运行,但都未运行完毕。

微观上串行:内存中的多道程序轮流占有CPU,交替执行。

多道程序设计技术的实现需要解决下列问题:

如何分配处理器。

多道程序的内存分配问题。

I/O设备如何分配。

如何组织和存放大量的程序和数据,以便于用户使用和保证其安全性与一致性。---链表

在批处理系统中釆用多道程序设计技术,就形成了多道批处理操作系统。该系统把用户提交的作业成批地送入计算机内存,然后由作业调度程序自动地选择作业运行。

10任务执行顺序????优先级

当同一个优先级中有多个任务??时间片

优点

资源利用率高,多道程序共享计算机资源,从而使各种资源得到充分利用;

系统吞吐量大,CPU和其他资源保持“忙碌”状态。缺点是用户响应的时间较长。

不提供人机交互能力,用户既不能了解自己程序的运行情况,也不能控制计算机。

批处理操作系统的特点是:多道和成批处理。

分时操作系统

分时(Time Sharing)操作系统的工作方式是:

一台主机连接了若干个终端,每个终端有一个用户在使用。用户交互式地向系统提出命令请求,系统接受每个用户的命令,采用时间片轮转方式处理服务请求,并通过交互方式在终端上向用户显示结果。用户根据上步结果发出下道命。分时操作系统将CPU的时间划分成若干个片段,称为时间片。操作系统以时间片为单位,轮流为每个终端用户服务。每个用户轮流使用一个时间片而使每个用户并不感到有别的用户存在。分时系统具有多路性、交互性、“独占”性和及时性的特征。多路性指,伺时有多个用户使用一台计算机,宏观上看是多个人同时使用一个CPU,微观上是多个人在不同时刻轮流使用CPU。交互性是指,用户根据系统响应结果进一步提出新请求(用户直接干预每一步)。“独占”性是指,用户感觉不到计算机为其他人服务,就像整个系统为他所独占。及时性指,系统对用户提出的请求及时响应。

分时操作系统是多个用户通过终端同时共享一台主机,这些终端连接在主机上,用户可以同时与主机进行交互操作而互不干扰。所以,实现分时系统最关键的问题是如何使用户能与自己的作业进行交互,即当用户在自己的终端上键入命令时,系统应能及时接收并及时处理该命令,再将结果返回用户。分时系统也是支持多道程序设计的系统,但它不同于多道批处理系统。

多道批处理是实现作业自动控制而无需人工干预的系统,而分时系统是实现人机交互的系统,这使得分时系统具有与批处理系统不同的特征,其主要特征如下:

同时性。同时性也称多路性,指允许多个终端用户同时使用一台计算机,即一台计算机与若干台终端相连接,终端上的这些用户可以同时或基本同时使用计算机。

交互性。用户能够方便地与系统进行人-机对话,即用户通过终端釆用人4^1对话的方式直接控制程序运行,与同程序进行交互。

独立性。系统中多个用户可以彼此独立地进行操作,互不干扰,单个用户感觉不到别人也在使用这台计算机,好像只有自己单独使用这台计算机一样。

及时性。用户请求能在很短时间内获得响应。分时系统釆用时间片轮转方式使一台计算机同时为多个终端服务,使用户能够对系统的及时响应感到满意。

虽然分时操作系统比较好地解决了人机交互问题,但是在一些应用场合,需要系统能对外部的信息在规定的时间(比时间片的时间还短)内作出处理(比如飞机订票系统或导弹制导系统)。因此,实时系统应运而生。

实时操作系统(RT_thread,FreeRtos)

实时操作系统,内核源码都比较的精简,主要就是为了操作系统的实时性考虑,

在正确的时间内,做出正确的响应

如果做出了正确的响应,但是时间溢出了,那么这也是一个错误事件

实时操作系统(RealTimeOperatingSystem,RTOS)是指使计算机能及时响应外部事件的请求在规定的严格时间内完成对该事件的处理,并控制所有实时设备和实时任务协调一致地工作的操作系统。实时操作系统要追求的目标是:对外部请求在严格时间范围内做出反应,有高可靠性和完整性。

为了能在某个时间限制内完成某些紧急任务而不需时间片排队,诞生了实时操作系统。这里的时间限制可以分为两种情况:如果某个动作必须绝对地在规定的时刻(或规定的时间范围)发生,则称为硬实时系统。例如,飞行器的飞行自动控制系统,这类系统必须提供绝对保证,让某个特定的动作在规定的时间内完成。如果能够接受偶尔违反时间规定,并且不会引起任何永久性的损害,则称为软实时系统,如飞机订票系统、银行管理系统。

在实时操作系统的控制下,计算机系统接收到外部信号后及时进行处理,并且要在严格的时限内处理完接收的事件。实时橾作系统的主要特点是及时性和可靠性。

当前没有任何一款操作系统是实时操作,实时操作系统都是相对的,整体来说,就是比半实时操作系统的运行速度更快,本质上指的是对外部请求在严格时间范围内做出反应,有高可靠性和完整性,都可以称为实时操作系统

嵌入式系统

嵌入式系统在宏观上指的是一个应用方向--软硬结合,可裁剪

嵌入式系统在微观上指的是一个产品--涉及到硬件和软件开发,电路板

嵌入式即嵌入式系统,IEEE(美国电气和电子工程师协会)对其定义:

用于控制、监视或者辅助操作机器和设备的装置,是一种专用的计算机系统;

国内普遍认同的嵌入式系统定义是以应用为中心,以现代计算机技术为基础,软硬件可裁剪,适应应用系统对功能、可靠性、成本、体积、功耗等严格要求的专用计算机系统;

从应用对象上加以定义来说,嵌入式系统是软件和硬件的综合体,还可以涵盖机械等附属装置。

嵌入式操作系统

嵌入式操作系统--指的就是一个系统软件,应用于嵌入式领域的操作系统

嵌入式操作系统(Embedded Operating System,简称:EOS)是指用于嵌入式系统的操作系统。嵌入式操作系统是一种用途广泛的系统软件,通常包括与硬件相关的底层驱动软件、系统内核、设备驱动接口、通信协议、图形界面、标准化浏览器等。嵌入式操作系统负责嵌入式系统的全部软、硬件资源的分配、任务调度,控制、协调并发活动。它必须体现其所在系统的特征,能够通过装卸某些模块来达到系统所要求的功能。在嵌入式领域广泛使用的操作系统有:

嵌入式实时操作系统µC/OS-II(µC/OS-III--半实时操作系统)、Windows Embedded、VxWorks、Intewell操作系统  等,以及应用在智能手机和平板电脑的Android、iOS、华为鸿蒙等。

为什么要使用操作系统

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

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

RT_thread系统概述

RT-Thread 版权属于上海睿赛德电子科技有限公司,于 2006 年 1 月首次发布,初始版本号为 0.1.0, 经过 10 来年的发展,如今主版本号已经升级到 3.0,累计开发者达到数百万,在各行各业产品中装机量达到了惊人的 2000 多万,占据国产 RTOS 的鳌头

RT-Thread 是一款 “开源免费” 的实时操作系统,遵循的是 GPLv2+的许可协议。 这里说到的开源,指的是你可以免费得获取到 RT-Thread 的源代码,且当你的产品使用了 RT-Thread且没有修改 RT-Thread 内核源码的时候,你的产品的全部代码都可以闭源,不用开源,但是当你修改了 RT-Thread 内核源码的时候,就必须将修改的这部分开源, 反馈给社区, 其它应用部分不用开源。免费的意思是无论你是个人还是公司,都可以免费地使用,不需要掏一分钱

官方文档:

RT-Thread 文档中心

源码下载:

rt-thread.org/download.html

我们接下来需要重点学习的文档:

RT-Thread 简介

重点参考的API文档:

RT-Thread API参考手册: RT-Thread 简介

RT_thread介绍

RT-Thread,全称是 Real Time-Thread,顾名思义,它是一个嵌入式实时多线程操作系统,基本属性之一是支持多任务,但允许多个任务同时运行并不意味着处理器在同一时刻真的执行了多个任务。事实上,一个处理器核心在某一时刻只能运行一个任务,由于每次对一个任务的执行时间很短、任务与任务之间通过任务调度器进行非常快速地切换(调度器根据优先级决定此刻该执行的任务),所以给人造成多个任务在一个时刻同时运行的错觉。在 RT-Thread 系统中,任务是通过线程实现的,RT-Thread 中的线程调度器也就是以上提到的任务调度器。

RT-Thread 主要采用 C 语言编写,浅显易懂,方便移植。它把面向对象的设计方法应用到实时系统设计中,使得代码风格优雅、架构清晰、系统模块化并且可裁剪性非常好。针对资源受限的微控制器(MCU)系统,可通过方便易用的工具,裁剪出仅需要 3KB Flash、1.2KB RAM 内存资源的 NANO 版本(NANO 是 RT-Thread 官方于 2017 年 7 月份发布的一个极简版内核);而对于资源丰富的物联网设备,RT-Thread 又能使用在线的软件包管理工具,配合系统配置工具实现直观快速地模块化裁剪,无缝地导入丰富的软件功能包,实现类似 Android 的图形界面及触摸滑动效果、智能语音交互效果等复杂功能。

相较于 Linux 操作系统,RT-Thread 体积小,成本低,功耗低、启动快速,除此以外 RT-Thread 还具有实时性高、占用资源小等特点,非常适用于各种资源受限(如成本、功耗限制等)的场合。虽然 32 位 MCU 是它的主要运行平台,实际上很多带有 MMU、基于 ARM9、ARM11 甚至 Cortex-A 系列级别 CPU 的应用处理器在特定应用场合也适合使用 RT-Thread。

适用于需要使用 RT-Thread 的丰富功能,如各类外设、物联网组件、软件包等的场景

RT_thread的移植

准备工作:

1.准备一个工程(LED灯,按键,USART,系统定时器等驱动)

2.准备RT_thread的源码

解压过后的源码:

bsp--文件保存的板级支持包,支持不同的芯片

components--包含了一些组件信息 finsh--用于调试打印,在终端上显示调试信息(使用到底层的串口资源)

include--包含的都是头文件

libcpu--和底层硬件相关的库函数

src--内核源码

1.将压缩包中的内容全部复制到工程中

复制到如下位置:

修改名字3.0.3为rt_thread

复制如下文件到工程中的user目录中:

打开工程添加分组:

rtt_src添加的的是系统中SRC文件中的内容:

添加rtt_port分组,:

添加头文件:

编译代码,编译完成之后,修改错误:

..\User\rtconfig.h(6): error:  #5: cannot open source input file "RTE_Components.h": 
No such file or directory

注释掉此头文件(如果不能修改,查看文件属性,进行修改)

重复定义:

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

SysTick_Handler:

rtconfig.h文件的修改:

修改优先级和系统定时器

打开信号量和事件、互斥

使能堆区:

修改board.c文件

此文件中操作系统和底层硬件的链接部分,比如系统定时器

首先我们先来看内核中的系统定时器地址:

core_cm3.h

SysTick_BASE 地址--0xe000e010

再看OS中的,定时器地址:

void rt_hw_board_init()

包含了我们底层设备的驱动信息

修改:注释掉或者删除

添加初始化内容:

添加一个board.h

路径和Board.c一样

验证工程可用性

#include <rtthread.h>
#include <rthw.h>
#include "board.h"
void LED1_Pthread(void *para);
rt_thread_t led1_thread;
int main(void)
{//创建线程--LED
led1_thread=rt_thread_create("led1",LED1_Pthread,NULL,128,5,20);if(led1_thread !=RT_NULL){rt_thread_startup(led1_thread);}while(1){}return 0;
}void LED1_Pthread(void *para)
{while(1){LED1ON();rt_thread_delay(500);rt_kprintf("led1 running!!\r\n");//将打印信息输出到我们的串口助手中LED1OFF();rt_thread_delay(500);}
}

finsh组件:

FinSH 是 RT-Thread 的命令行组件,提供一套供用户在命令行调用的操作接口,主要用于调试或查看系统信息。它可以使用串口 / 以太网 / USB 等与 PC 机进行通信。

用户在控制终端输入命令,控制终端通过串口、USB、网络等方式将命令传给设备里的 FinSH,FinSH 会读取设备输入命令,解析并自动扫描内部函数表,寻找对应函数名,执行函数后输出回应,回应通过原路返回,将结果显示在控制终端上。

rt_kprintf--修改此函数的打印方向:

http://www.dtcms.com/a/331596.html

相关文章:

  • Cypher注入详解:原理、类型与测试方法
  • 使用免费API开发口播数字人
  • 数智化与全球化,双轮驱动艾芬达持续引领行业变革
  • 嵌入式 - Linux软件编程:进程
  • PIDGenRc函数中lpstrRpc的由来和InitializePidVariables函数的关系
  • 什么是期权ETF分仓的意思呢?
  • 安全加固4(K8S最小化微服务安全)
  • java-JVM详解
  • 如何安装 scikit-learn Python 库
  • Azure微软云内网接入问题
  • 大规模调用淘宝商品详情 API 的分布式请求调度实践
  • ant design vue pro 1.7.8 自定义渲染菜单,多页签,keep-alive 详细教程 vue2.x版
  • day33-LNMP
  • PostgreSQL——视图
  • 六十五、【Linux数据库】MySQL表结构 、 MySQL键值
  • 重学JS-003 --- JavaScript算法与数据结构(三)JavaScript 基础调试方法
  • Codeforces 1042 Div3(ABCDEFG)
  • 【科研日常】使用tensorflow实现自注意力机制和交叉注意力机制
  • Java中Record的应用
  • Flink Stream API 源码走读 - socketTextStream
  • Spark Shuffle机制原理
  • STM32HAL 快速入门(七):GPIO 输入之光敏传感器控制蜂鸣器
  • 深入理解管道(下):括号命令 `()`、`-ExpandProperty` 与 AD/CSV 实战
  • Java 大视界 -- Java 大数据在智能家居能耗监测与节能优化中的应用探索(396)
  • 【漏洞复现】WinRAR 目录穿越漏洞(CVE-2025-8088)
  • JavaScript 解构赋值语法详解
  • iOS Sqlite3
  • Playwright初学指南 (3):深入解析交互操作
  • 【完整源码+数据集+部署教程】肾脏病变实例分割系统源码和数据集:改进yolo11-CARAFE
  • 基于机器学习的文本情感极性分析系统设计与实现