嵌入式实时操作系统1——初识嵌入式实时操作系统

在这里插入图片描述

嵌入式实时操作系统是什么
嵌入式实时操作系统是一个特殊的程序,是一个支持多任务的运行环境。嵌入式实时操作系统最大的特点就是“实时性”,如果有一个任务需要执行,实时操作系统会立即执行该任务,不会有较长的延时。典型的实时操作系统有uCOS ,RT-Thread,FreeRTOS ,VxWorks,WinCE等。
在这里插入图片描述
嵌入式实时操作系统是一个特殊的程序(通常称为内核),它可以创建,销毁,控制所有任务。嵌入式实时操作系统除了包含一个内核以外,还提供其他服务,如文件系统,协议栈,图形用户界面等。本文的重点在于了解嵌入式实时操作系统内核的工作原理和结构,因此文中提到的实时操作系统通常指的是操作系统内核。实时操作系统内核通常要占用5%左右的CPU运行时间,另外内核是一个软件代码,需要额外占用ROM空间和RAM空间

实时性
实时性可以定义为:触发条件产生后系统的反应能力。通俗的描述就是“天下武功唯快不破”,能达到所需要的“快”就是实时,在不同的场合需要达到us级、ns级。实时系统不仅仅只表现在“快”上,更主要的是实时系统需要对触发事件在限定时间内做出反应,这个限定时间是根据实际需要来定,例如自动驾驶控制系统的规定时间要求很短,需要在极短时间内做出动作;一些农业温度控制系统的规定时间要求比较长,需要温度控制平滑稳定。
在这里插入图片描述
响应时间
实时性越强,其响应时间越短。响应时间是指系统识别到一个事件到开始做出响应的时间。举一个简单的例子:一个工控设备有一个急停按键开关,用户希望按下急停开关的时候系统立即将停止所有的动作,假设用户在第1.001秒时按下了急停开关,软件系统在第1.011秒时执行了停止指令,工控设备相应的机械部件在1.211秒停止动作,此时软件系统响应时间为0.01秒,设备系统响应时间为0.21秒,设备系统的响应时间和软件系统的响应时间有一定区别,通常情况下设备系统的响应时间>软件系统的响应时间。本文中提到的响应时间指的是软件系统的响应时间
在这里插入图片描述
再举一个通俗的例子:你在玩王者荣耀,突然发现对面打野从草丛中跑出准备gank你,从你眼睛看到,到手指点击闪现,然后到你的人物闪现到塔下。这就是响应时间,高端职业玩家可能只需要100ms即可完成整套动作,而菜鸟玩家可能需要1000ms来完成整个动作。

普通的嵌入式软件架构
普通的嵌入式软件系统通常设计成前后台结构,这个结构包含一个死循环和若干中断服务程序:应用程序是一个无限循环的代码块,循环中调用相应的函数完成相应的操作(后 台),中断程序用于处理系统的异步事件(前台)。前台称做中断级,后台称做任务级。下面是一个典型的前后台结构的代码:
在这里插入图片描述
上图中的代码的执行流程是:
1、判断按键标志位,若标志位为1就执行按键处理操作。
2、判断通讯标志位,若标志位为1就执行通讯处理操作。
3、执行LCD显示操作
4、判断传感器标志位,若标志位为1就执行传感器处理操作。
此代码中有3个中断函数:
1、GPIO外部中断,当按键按下后产生一个中断,中断函数中将键标志位置1。
2、串口空闲中断,当串口总线空闲时产生一个中断,中断函数中将通讯标志位置1。
3、定时器中断,每500ms周期性产生一个中断,中断函数中将传感器标志位置1。

代码执行如图所示:
在这里插入图片描述
分析运行图:
1、程序判断按键标志位,标志位为0,不执行按键处理函数。
2、程序判断通讯标志位,标志位为0,不执行通讯处理函数。
3、程序执行显示处理函数,此时用户按下了按键,系统进入按键中断程序将按键标志位置1,中断完成后返回显示处理函数继续运行。
4、显示处理函数运行过程中,此时串口接收完一包数据产生了一个空闲中断,系统进入串口空闲中断程序将通讯标志位置1,中断完成后返回显示处理函数继续运行。
5、显示处理函数运行过程中,定时器产生中断,系统进入定时器中断程序将传感器标志位置1。
6、显示处理函数执行完毕,程序判断传感器标志位,标志位为1,执行通讯处理函数。
7、程序判断按键标志位,标志位为1,执行按键处理函数。
8、程序判断通讯标志位,标志位为1,执行通讯处理函数。
9、无限循环…

由上述例子可知,按键标志位和通讯标志位就绪后,程序还需要等待显示函数,传感器函数执行完毕。即使是按键处理函数的紧急性再高,也需要等待其他函数执行完毕。因此就产生了响应延迟,响应延迟的时间随机的不确定的,有的时候时几毫秒的时间,有的时候是几百毫秒甚至更长(如执行传感器读取),因此需要提高系统的实时性。

实时操作系统
实时操作系可以随时剥夺正在运行任务的CPU使用权,并将CPU使用权交给进入就绪状态的最高优先级任务,使用操作系统后的运行图如下:
在这里插入图片描述
分析运行图:
1、低优先级的显示任务正在运行,此时用户按下了按键,系统进入按键中断程序给按键任务发送一个信号,此时按键任务进入就绪状态,中断返回时切换到按键处理任务中运行。
2、按键处理任务正在运行,此时串口接收完一包数据产生了一个空闲中断,系统进入串口空闲中断程序并给通讯处理任务发送一个信号,通讯处理任务进入就绪状态,中断返回时切换到通讯处理任务。
3、通讯处理任务执行完毕,放弃CPU使用权限,此时切换到按键处理任务。
4、按键处理任务执行完毕,放弃CPU使用权限,此时切换到显示处理任务。

由此可见,当触发产生后实时操作系将立即中断当前的任务并执行相应的任务。使用实时操作系可以极大的提高软件系统的实时性。

实时操作系统组成
实时操作系由以下3个子系统组成(以uCOS和FreeRTOS为参考对象):
1、任务调度子系统
2、任务通信子系统
3、内存管理子系统
在这里插入图片描述
任务调度子系统主要是维护两个链表:就绪表和等待表。切换任务时从就绪表中取出最高优先级任务;任务需要延时等待时,内核将任务中就绪表中移动到等待表中;时钟节拍任务会周期性的更新等待表,并将等待时间完成的任务从等待表中移动到就绪表中。

任务通讯子系统主要是维护一个链表:挂起表。任务需要等待信号时,内核将任务移动到挂起表中,当内核收到信号时,内核将任务从挂起表中移动到就绪表中。

内存管理子系统,内核提供了几种动态申请内存的方式,防止出现内存碎片。

未完待续…
实时操作系统系列将持续更新。

未完待续…
实时操作系统系列将持续更新
创作不易希望朋友们点赞,转发,评论,关注。
您的点赞,转发,评论,关注将是我持续更新的动力
作者:李巍
Github:liyinuoman2017

  • 32
    点赞
  • 78
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 21
    评论
资源大于15MB分2次上传。 清晰度一般。加到11章 第12,13章没有。 第1章 嵌入式系统基础. 1.1 嵌入式系统简介 1.1.1 嵌入式系统定义 1.1.2 嵌入式系统与PC 1.1.3 嵌入式系统的特点 1.2 嵌入式系统的发展 1.2.1 嵌入式系统现状 1.2.2 嵌入式系统发展趋势 1.3 嵌入式操作系统与实时操作系统 1.3.1 Linux 1.3.2 uC/OS 1.3.3 Windows CE 1.3.4 VxWorks 1.3.5 Palm OS 1.3.6 QNX 1.4 嵌入式系统选型 第2章 基于ARM9处理器的硬件开发平台 2.1 ARM处理器简介 2.1.1 ARM公司简介 2.1.2 ARM微处理器核 .2.2 ARM9微处理器简介 2.2.1 与ARM7处理器的比较 2.2.2 三星S3C2410X处理器详解 2.3 FS2410开发平台 第3章 创建嵌入式系统开发环境 3.1 嵌入式Linux的开发环境 3.2 Cygwin 3.3 虚拟机 3.4 交叉编译的预备知识 3.4.1 Make命令和Makefile文件 3.4.2 binutils工具包 3.4.3 gcc编译器 3.4.4 Glibc库 3.4.5 GDB 3.5 交叉编译 3.5.1 创建编译环境 3.5.2 编译binutils 3.5.3 编译bootstrap_gcc 3.5.4 编译Glibc 3.5.5 编译完整的gcc 3.5.6 编译GDB 3.5.7 成果 3.5.8 其他交叉编译方法 3.6 通过二进制软件包创建交叉编译环境 3.7 开发套件 第4章 调试嵌入式系统程序 4.1 嵌入式系统调试方法 4.1.1 实时在线仿真 4.1.2 模拟调试 4.1.3 软件调试 4.1.4 BDM/JTAG调试 4.2 ARM仿真器 4.2.1 techorICE ARM仿真器 4.2.2 ARM仿真器工作原理 4.2.3 ARM仿真器的系统功能层次 4.2.4 使用仿真器和ADS Debugger调试ARM开发板 4.3 JTAG接口 4.3.1 JTAG引脚定义 4.3.2 通过JTAG烧写Flash 4.3.3 烧写Flash技术内幕 第5章 Bootloader 5.1 嵌入式系统的引导代码 5.1.1 初识Bootloader 5.1.2 Bootloader的启动流程 5.2 Bootloader之vivi 5.2.1 vivi简介 5.2.2 vivi的配置与编译 5.2.3 vivi代码导读 5.3 Bootloader之U-Boot 5.3.1 U-Boot代码结构分析 5.3.2 编译U-Boot代码 5.3.3 U-Boot代码导读 5.3.4 U-Boot命令 5.4 FS2410的Bootloader 第6章 Linux系统在ARM平台的移植 6.1 移植的概念 6.2 Linux内核结构 6.3 Linux-2.4内核向ARM平台的移植 6.3.1 根目录 6.3.2 arch目录 6.3.3 arch/arm/boot目录 6.3.4 arch/arm/def-configs目录 6.3.5 arch/arm/kernel目录 6.3.6 arch/arm/mm目录 6.3.7 arch/arm/mach-s3c2410目录 6.4 Linux-2.6内核向ARM平台的移植 6.4.1 定义平台和编译器 6.4.2 arch/arm/mach-s3c2410/devs.c 6.4.3 arch/arm/mach-s3c2410/mach-fs2410.c 6.4.4 串口输出 6.5 编译Linux内核 6.5.1 代码成熟等级选项 6.5.2 通用的一些选项 6.5.3 和模块相关的选项 6.5.4 和块相关的选项 6.5.5 和系统类型相关的选项 6.5.6 和总线相关的选项 6.5.7 和内核特性相关的选项 6.5.8 和系统启动相关的选项 6.5.9 和浮点运算相关的选项 6.5.10 用户空间使用的二进制文件格式的选项 6.5.11 和电源管理相关的选项 6.5.12 和网络协议相关的选项 6.5.13 和设备驱动程序相关的选项 6.5.14 和文件系统相关的选项 6.5.15 和程序性能分析相关的选项 6.5.16 和内核调试相关的选项 6.5.17 和安全相关的选项 6.5.18 和加密算法相关的选项 6.5.19 库选项 6.5.20 保存内核配置 第7章 Linux设备驱动程序开发 7.1 设备驱动概述 7.1.1 设备驱动和文件系统的关系 7.1.2 设备类型分类 7.1.3 内核空间和用户空间.. 7.2 设备驱动基础 7.2.1 设备驱动中关键数据结构 7.2.2 字符设备驱动开发 第8章 网络设备驱动程序开发 8.1 网络设备驱动程序简介 8.1.1 device数据结构 8.1.2 sk_buff数据结构 8.1.3 内核的驱动程序接口 8.2 以太网控制器CS8900A 8.2.1 特性 8.2.2 工作原理 8.2.3 电路连接 8.2.4 引脚 8.2.5 操作模式 8.3 网络设备驱动程序实例 8.3.1 初始化函数 8.3.2 打开函数 8.3.3 关闭函数 8.3.4 发送函数 8.3.5 接收函数 8.3.6 中断处理函数 第9章 USB驱动程序开发 9.1 USB驱动程序简介 9.1.1 USB背景知识 9.1.2 Linux内核对USB规范的支持 9.1.3 OHCI简介 9.2 Linux下USB系统文件结点 9.3 USB主机驱动结构 9.3.1 USB数据传输时序 9.3.2 USB设备连接/断开时序 9.4 主要数据结构及接口函数 9.4.1 数据传输管道 9.4.2 统一的USB数据传输块 9.4.3 USBD数据描述 9.4.4 USBD与HCD驱动程序接口 9.4.5 USBD层的设备管理 9.4.6 设备类驱动与USBD接口 9.5 USBD文件系统接口 9.5.1 设备驱动程序访问 9.5.2 设备拓扑访问 9.5.3 设备信息访问 9.6 设备类驱动与文件系统接口 9.7 USB HUB驱动程序 9.7.1 HUB驱动初始化 9.7.2 HUB Probe相关函数 9.8 OHCI HCD实现 9.8.1 OHCI驱动初始化 9.8.2 与USBD连接 9.8.3 OHCI根HUB 9.9 扫描仪设备驱动程序 9.9.1 USBD接口 9.9.2 文件系统接口 9.10 USB主机驱动在S3C2410X平台的实现 9.10.1 USB主机控制器简介 9.10.2 驱动程序的移植 第10章 图形用户接口 10.1 嵌入式系统中的GUI简介 10.1.1 MicroWindows 10.1.2 MiniGUI 10.1.3 Qt/Embedded 10.2 MiniGUI编程 10.2.1 MiniGUI移植 10.2.2 MiniGUI编程 10.3 初识Qt/Embedded 10.3.1 Qt介绍 10.3.2 系统要求 10.3.3 Qt的架构 10.4 Qt/Embedded嵌入式图形开发基础 10.4.1 建立Qt/Embedded 开发环境 10.4.2 认识Qt/Embedded开发环境 10.4.3 窗体 10.4.4 对话框 10.4.5 外形与感觉 10.4.6 国际化 10.5 Qt/Embedded实战演练 10.5.1 安装Qt/Embedded工具开发包 10.5.2 交叉编译Qt/Embedded库 10.5.3 Hello,World 10.5.4 发布Qt/Embedded程序到目标板 10.5.5 添加一个Qt/Embedded应用到QPE 第11章 Java虚拟机的移植 11.1 Java虚拟机概述 11.1.1 Java虚拟机的概念 11.1.2 J2ME 11.1.3 KVM 11.2 Java虚拟机的移植 11.2.1 获得源码 11.2.2 编译环境的建立 11.2.3 JDK的安装 11.2.4 KVM的移植及编译 11.2.5 KVM的测试 11.3 其他可选的虚拟机 11.4 性能优化
评论 21
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

liyinuo2017

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值