上学期嵌入式实时操作系统对PPT上的知识点的一个汇总
最后真就一个都没考
嵌入式系统体系结构回顾
基本概念
DSP:数字信号处理处理器 可以进行累乘累加,区别于普通的CPU,一般的CPU的运算器是无法直接进行累乘操作的
CPU包括:运算器、控制器、寄存器。
NOC和SOC:分别是片上网络和片上系统
三大总线: 地址总线、数据总线、控制总线
PC: 程序计数器。系统复位后指向某一点区域,然后取值、译码、执行。然后PC寄存器内容会增加一个单位指向下条指令
CPU的架构有
- 冯诺依曼架构,cpu通过三大总线和同时存储了数据和指令的存储联系
- 哈佛结构,六个总线,三个负责指令,三个负责数据,指令数据分开存放,取址就不会受到数据的干扰
- 改进的哈佛结构,总线分开,数据和指令分区域存放。
FPU:浮点数单元
MPU:内存保护单元,监控在CPU和主存之的事务,并且在检测到访问违规时发出警报。主要目的是防止程序访问为分配给它的内存。
MMU:翻译虚拟地址到主存中的物理地址
Microprocessor Unit(MPU):微处理器单元。有很多种类,除了CPU外,FPU、MMU、cache都是可选项。为什么不要cache,因为cache可能会影响干扰RTOS的实时性,所以嵌入式RTOS一般会关掉cache,以保证系统的确定性。
Microcontroller Unit(MCU):微控制器单元。其中FPU、MPU为可选项。由于没有MMU,所以无法跑大型OS
GPU(Graphics Processing Unit): 图形处理单元。有很多core
NPU/TPU:用来加速神经网络运算
FPGA:现场可编程门阵列。一种可编程硬件
NVIC:嵌套式向量中断控制器。确定中断优先级、提高MCU或CPU性能并减少中断延迟的方法。
时钟振荡器:一种物理器件,又名晶振。可以作为频率源,产生时钟信号
锁相环(phase locked loop):利用相位同步产生的电压,去调谐压控振荡器以产生目标频率的负反馈控制系统。作用是使得电路上的时钟和某一外部时钟的相位同步。
RAM(Random access memory):常用的时SRAM和DRAM。前者更快动态功率更少,但是成本更高。一般而言,SRAM多作为CPU的缓存,DRAM作为内存
SRAM:有一定数据持久能力,但依然在断电后会最终丢失
DRAM:需要外部存储器刷新电路,定期重写电容器中的数据。这是一种易失性存储器,断电后会迅速丢失数据
SDRAM:同步动态随机存取存储器,外部引脚接口的操作由外部提供的时钟信号协调,DDR3 DDR4···都是这种
SGRAM&HBM:超级计算器、高性能图形加速器、网络设备使用的高性能RAM
ROM:只读内存 。一种非易失性存储器,一般无法进行电子修改,一般用于存储很少更改的软件,即固件
EEPROM:代表电可擦除可编程只读存储器,一种非易失性存储器,允许单个字节被擦除或重新编程
嵌入式实时操作系统基础概念
任务
拥有CPU资源(寄存器 堆栈)正在执行的简单程序,类似于进程的概念,可以申请资源,一般是周期性的,是一个无限循环,拥有就绪、运行、挂起三种状态。
- 就绪状态指任务获得执行优先级,等待OS安排开始执行(还没进入死循环)
- 运行状态指任务执行过程(正在死循环)
- 挂起状态指任务结束(跳出死循环,释放资源)
任务的拥有动态性(拥有生命周期)、并发性(单核交替——逻辑并发,中断服务例程辅助,假并发;多核同时)、独立性(任务是资源分配的基本单位,MCU上多使用栈资源,因为有的RTOS没有堆,这一块应该是是为了防止复杂的内存分配算法降低实时性)、异步性(任务按异步方式运行)
任务上下文
任务上下文就是指一个未运行任务的状态,包括堆栈指针、计数器、内存字段和通用寄存器。
tips:某些编译器会和OS、CPU配合将某些寄存器定为专门存放中间值,那么就不需要在任务切换时进行内存交换,这是一种运行时的优化
调度
调度即决定任务运行次序的机制。主要有抢占式、非抢占式。
多数实时内核的调度实际上是基于优先级调度的多种方法的复合。
其中抢占与否和实时画不上等号,非抢占式调度的划分时间片法,如果能很好地划分时间片,那么对于整个系统来说抖动也很小,也是可以接受的实时调度。
基本的调度算法
先来先服务、最短周期优先、优先级法、轮转法、多级队列法、多级反馈队列
- 优先级法是最常用最有效的调度方法(FreeRTOS和ucos都采用的这种调度方法),分为抢占式和非抢占式
- 先来先服务法简单易行,性能较差,cpu会先运行处于就绪队列之首的任务。这种方法下可以想到我们的任务不再是while死循环,而是不断再创建一次
- 轮转法多用在windows和Linux中,每次从有序队列头部选出一任务,并分配定长时间片。时间片内未处理完的任务会在时间片用尽后重新送到队列尾部。凡新到达的任务会被放在队列尾部。
- 最短周期优先:谁执行周期最短先执行谁(可能会产生进程饥饿)
- 多级反馈队列:设置多个就绪队列,每个队列对应一种优先级。CPU先执行高优先级队列中的任务。各就绪队列中的 进程运行时间片不同,高优先级队列时间片小,低优先级队列时间片大(可以理解为对其抢占到cpu的概率小的补偿),UNIX和windowsNT采用的就是这种方法。
一般而言,桌面系统,多采用时间片分片的调度,RTOS多采用抢占式调度。
调度延迟
调度延迟,指当一个事件从引起更高优先级任务就绪到开始运行之间的时间。表示的是系统的反应能力。
一般会存在三种调度延迟
- 直接创建新任务并执行——这种事调度延迟最小的。
- 触发中断,由中断服务例程直接创建并执行新任务
- 触发中断,由中断服务例程创建任务,回到原任务后执行新任务。——这种是调度延迟最长的。
优先级
优先级即表示任务的轻重缓急,每个任务会有自己的优先级。
优先级分为静态优先级和动态优先级,区别在于是否可变
基于优先级的系统会出现优先级倒置的问题, 这实际上是资源占用导致的。
优先级倒置
当一个任务等待比它优先级低的任务释放资源而被阻塞时,就发生了优先级倒置。
解决方法是优先级继承
优先级继承
优先级继承强制命令低优先级的任务继承与之共享资源而被挂起的任意高优先级任务的优先等级,使较低优先级任务尽快执行,尽快释放高优先级所需要的资源。
代码临界区
不可分割的一段代码。一旦执行不能被中断
实现方法有两种:
- 屏蔽中断,代码执行前关中断,执行后开中断,只能用于单核情形。但如果过于频繁开关中断,也会影响性能
- 通过信号量实现。
信号量
多任务环境常用的协调各个任务来使用公共资源的指示标志。查询信号量来确定公共资源的使用情况,符合要求可以使用,不然就要等待。使用资源的任务在使用完毕后要释放信号量。
任务间通信
多任务系统中,任务之间存在相互制约的关系,任务之间需要交换信息,这就是任务间通信
有两种任务间通信
- 控制信息传送
- 批量数据传送
任务间通信方式有信号量、消息邮箱(消息队列)、管道、共享内存、套接字等。
任务间通信在微内核操作系统中非常常见,各内核会构建自己的容器,进行互相通信。
未来发布订阅机制在这方面可能会有更进一步的应用,比如分布式系统的DDS,不过是是分布式系统一般通过网络、外部总线进行任务间通信,无法实现0拷贝。
信箱
信箱在两个任务之间,使用步骤是首先创建信箱,然后任务一向信箱发送消息,任务二会查询信箱状态,从而从信箱二中接收消息
队列
队列是一种非阻塞式同步,过程跟信箱类似,但是具有强序列关系。
一般数据队列用于数据缓存,可以用来平衡速率不同的两个部件,使快速部件不需要等待慢速部件
互斥
控制多任务对共享数据顺序访问的同步机制。方法主要有开关中断、使用硬件指令、使用信号量。
目前处理器主要有主从通信、总线通信、内存通信
未来处理器可能会靠网络通信、点对点通信
抢占
当前执行任务可被另外任务打断的任务调度机制。
FreeRTOS
代码主要负责三个区块——任务、通讯、硬件接口,代码量比为5:4:0.6
任务
任务函数返回值为void且不允许返回,不允许有一条return语句
FreeRTOS的任务调度 通过对任务设置优先级进行优先级抢占式调度,拥有下述特性
- 每个任务都赋予了一个优先级
- 每个任务都可以存在一个或多个状态
- 在任何时候都只有一个任务可以处于运行状态
- 调度器总是在所有处于就绪态的任务中具有最高优先级的任务来执行。
一般FreeRTOS会存在一个任务在其他所有任务都处于阻塞态时运行,也就是空闲任务,一个非常短小的循环,它拥有最低优先级(优先级0),就不会妨碍更高优先级的任务进入运行态。空闲任务会通过钩子函数,直接在空闲任务中添加应用程序相关功能。空闲任务钩子函数有很多功能,比如在没有应用能力需要处理的时候,将系统配置为省电模式。空闲任务钩子函数绝对不能阻塞或挂起,且一定要能尽快返回,因为空闲函数负责回收内核资源,不尽快返回无法进行回收工作。
FreeRTOS对于相同优先级的任务,会划分时间片轮流执行。
FreeRTOS任务有运行、阻塞、挂起、就绪四个状态。
队列
FreeRTOS通过队列来解决通信与同步机制,队列是具有自己独立权限的内核对象,不属于任何任务
FreeRTOS中队列有两套函数,分别用于普通情况和中断服务。不可混用。
队列可以通过yeild(taskYIELD())立即进行任务切换不必等到时间片耗尽.
延迟中断处理
在嵌入式实时领域,一般都不会让中断服务程序运行时间过长,否则会大大降低系统的实时性。我们可以让中断服务程序作为触发者,触发其他函数(被称为延迟处理任务)执行任务,这样就增强了实时性,一般这种手段通过二值信号量的手段来实现。
延迟处理任务会对一个信号量执行take调用,进入阻塞态等待中断发生,中断发生后,ISR(中断服务例程)会对该信号量进行give操作,当ISR退出后,该延迟处理任务就会由阻塞态转为运行态,进行相应处理,处理完后会再次尝试获取信号量,从而进入阻塞态,等待下次中断发生。
计数信号量
二值信号量会在中断多次触发时,存在丢失后面的中断事件的可能,所以引入计数信号量,计数信号量代替二值信号量,有事件计数和资源管理两种用法。
共享资源的处理
多任务系统当一个任务在使用某个资源时,如果没完全结束对资源的访问,就被切除运行态,就会使得资源处于非一致,不完整的状态,此时其他任务或中断访问资源,就会出现数据损坏或者其他错误。
函数重入
一个函数可以安全地被多个任务调用,或者在任务和中断中均可调用,那么该函数是可重入的。
每个任务单独维护自己的的栈空间和自身在的内存寄存器组的值,如果一个函数除了访问自己栈空间上分配的数据或内核寄存器中的数据外,不会访问其他任何数据,则这个函数是可重入的。
互斥
FreeRTOS有临界区(必须只具有很短的时间,否则会反过来影响中断响应)、挂起(锁定)调度器(只防止任务打断,中断是使能的)、互斥量(特殊的二值信号量,互斥的信号量必须归还,同步的信号量同步后丢弃)、守护任务(对某资源具备唯一所有权,其他任务要访问该资源只能间接通过守护任务提供的服务进行访问,这可以避免优先级反转和死锁问题)
内存管理
任务、队列或信号量被创建时,内核需要进行动态内存分配。一般内存分配调用的是malloc()函数和free()函数,面临的问题有下述六条
- 小型嵌入式系统不支持这两个函数
- 两个函数实现需要的代码空间很大
- 两个函数不具备线程安全特性
- 两个函数具有不确定性,每次调用时间开销不同
- 会产生内存碎片
- 链接器配置会复杂
FreeRTOS有自己的内存分配算法,有多种实现范例,现在已经从heap1~heap4。PPT上只介绍了三种。heap1没有free,面向不需要删除任务、队列、信号量的应用程序,其确定性最强。heap2允许内存释放,但是不会把相邻空闲块合并,所以会产生内存碎片,因此适用于重复创建和删除具有相同栈空间人物的应用程序。heap3调用了标准的malloc和free,但是通过挂起调度器保证了线程安全。
RTOS网络通讯
LwIP
用于嵌入式系统的开源TCP/IP协议栈。轻型IP协议,实现重点在保持TCP协议主要功能基础上减少对RAM的占用,非常适用于小型嵌入式系统
OSI标准模型
七层模型:应用层、表示层、会话层、传输层、网络层、数据链路层、物理层
LwIP的软件体系结构
LwIP是以4层TCP/IP模型(从下至上分别是网络接口层、网际层、运输层和应用层)为参照实现TCP/IP协议簇的,,同时提供几个函数作为协议的入口点。没有严格按照OSI分层方式实现协议簇。
一种比较松散的通讯机制,通过共享内存实现应用层与底层协议族之间的通信。
- 拥有独特的缓冲机制,可以更加有效利用缓冲区。尽量避免内存复制,减少性能损失
- 模块化设计实现
LwIP的进程模型
TCP/IP协议族的进程模型指的是采用何种方法把系统分成不同进程。
常见的进程模型有两种:
- 每个协议作为一个独立进程
- 该模型必须符合协议的每一层,协议层之间通过指定的方式进行通讯。
- 优点是每一种协议可以独立参与系统运行,且实现简单,便于理解和调试
- 缺点是跨层传递必须产生进程切换和内存复制。这一缺点极大影响整体性能,为嵌入式系统不能接受。
- 协议栈作为一个内核,只占据一个进程
- 协议栈在操作系统内核中,应用程序通过系统调用与协议栈通讯。
- 缺点是层次不清,不好理解
LwIP的进程模型比较灵活,可以所有协议驻留在一个进程,以便独立于内核之外,也可以根据协议层次结构创建多个进程,但是各个进程之间只传送尽可能少的必要信息,没有引入额外的内存复制。
LWIP的函数调用关系
为了避免内存复制,LwIP采用基于回调函数的设计方法 。
- 优点时提高了整体性能
- 缺点是使整个软件体系显得略微复杂
回调函数是一种异步的设计方法,是事件驱动式的。
协议层的调用
TCP/IP协议栈是按功能层组织的,每一层都为上一层提供服务,并使用下一层提供的服务。在4层TCP/IP模型中,从下至上依次是网络接口层、网际层、运输层和应用层
- 网络接口层
- 较高协议与局域网接口的地方。
- 收到数据帧时,该层负责判断数据帧的协议类型(IP还是ARP),
- 如果是ARP协议(地址解析协议,将ip地址转换为MAC地址),则本层可以自行应答
- 如果是IP协议,则传递给上层网际层
- 发送数据帧时,该层会调用netif->output,完成真正的数据发送
- 网际层
- 负责网间寻址、数据封装、路由选择、错误处理和诊断等。典型协议有IP协议和ICMP协议
- 从下层网络接口层接收到IP数据报,仅从处理。根据IP数据报中的协议字段,决定是否传给上层
- 如果是ICMP协议,本层的函数会被调用
- 其他大多应该传给上层
- 当有数据需要从网际层发送出去,会先找到合适的网络接口(ip_route)再发送出去(ip_outpu_if)
- 传输层
- 负责在网际设备之间传输数据,有可靠或者不可靠两种方式,也就是TCP、UDP传输
- 当下层网际层传上来数据时,根据类型不同(TCP、UDP)调用不同函数进行处理。处理后提交给上层应用层。
- 当上层发送数据时,选择调用函数进行数据处理,然后再调用其他函数将数据交给下层。
- 应用层
- 用户的应用所运行的地方。
- 用户发送数据时,LwIP根据类型调用下层运输层的发送函数
- 用户接受数据同样由LwIP调用下层接收函数送达。
典型模块的跨层调用
一般对于某一个协议来说,只隶属于某一个层次(ARP除外)。但也会有其他层次调用该协议的有关函数。该协议一般也会主动调用其他层次的有关函数。
- IP模块:实现了大部分基本功能,能够发送、接收以及转发信息包
- ICMP模块:由ip_input函数收到,转交给icmp_input解码
- UDP模块
- TCP模块 TCP数据的发送过程一般是由应用层发起的,接受过程由网络接口层发起
IwIP的pbuf
pbuf时LwIP信息包的内部表示,pbuf结构既支持动态内存分配以保存信息报内容,又支持让信息包数据驻留在静态存储区。
pbuf由四种类型:PBUF_RAM、PBUF_ROM、PBUF_REF、PBUF_POOL。
- PBUF_RAM:在实现划分好的内存堆栈中分配,用于存放应用程序动态产生的数据
- PBUF_ROM: PBUF_ROM类型的pbuf的payload指针指向不由协议栈管理的外部存储区,如应用程序管理的存储器为用户数据分配的缓存。同时由于应用程序交付的数据不能改动,所以动态分配一个PBUF_RAM来装载协议首部,添加到PBUF_ROM的前面
- PBUF_REF:和PBUF_ROM非常类似,都可以实现数据的零拷贝。当发送数据需要排队时,针对REF类型的pbuf,LwIP会在数据分组排队时为pbuf分配缓存,并将引用的应用程序的数据拷贝到分配的缓存中,这样应用程序被引用数据的存储区域能被释放。
- PBUF_POOL: 固定容量的pbuf,由宏定义指定。主要用于网络设备驱动层,因为分配操作可以快速完成。
一般来说,收到的pbuf是PBUF_POOL类型,发送出的pbuf是PBUF_ROM或者PBUF_RAM类型。
IwIP的内存管理(这块太多了,其实就是在讲四种pbuf的内存管理相关的函数啥的,感觉也考不到这么细,不写了)
LwIP的内存区域主要用于装载待接收和发送的网络数据分组。分组交付或发送完毕后,协议栈会对缓存进行回收利用。
协议栈分配的缓存必须能容纳各种大小的报文。
PBUF_RAM
LwIP协议栈会首先从系统内存中开辟一块连续的静态存储区域,用于PBUF_RAM,同时协议栈还定义了一个比较小的结构体mem,放在内存分配块顶层保存内存分配记录。
啊吧啊吧啊吧(这块太多了,其实就是在讲四种pbuf的内存管理相关的函数啥的,感觉也考不到这么细,不写了)·······
LwIP移植
啊吧啊吧啊吧(同样讲的是LwIP在ucosII的具体移植,代码相关,不介绍了)
EtherCAT实时以太网路
背景
现场总线技术:全数字通信代替模拟传播。目前存在的不足有下述几点
- 无统一标准
- 不同总线不兼容,无法实现透明信息互访、信息无缝集成
- 专用实时通信网络,成本较高
- 速度较低,支持应用有限,不便于和因特网信息集成
以太网技术:通用性号、低成本、高效率、高可靠性、稳定性好。用于工业领域的以太网称为工业以太网。
普通以太网采用的是CSMA/CD(载波侦听多路访问/冲突检测)访问控制技术。网上节点通过竞争获得发送信息的权力,显然因为竞争,以及发生碰撞要推出重发等级制,会导致无法预见的延迟特性,就破坏了我们的确定性。以及以太网无法及时发现故障节点所以可能导致故障节点独占总线,其他节点无法传输,工控实时性很难保证。
实时工业以太网
一般有三种实现,分别是基于TCP/IP实现(应用层)的改造、基于以太网(主要是网络层和传输层)实现的改造以及基于修改的以太网(主要在以太网的数据链路层)实现的改造。
基于TCP/IP的实现
应用层做修改,仍使用TCP/IP协议,通过应用层过滤不确定因素。改造方法有调度法、优先级机制、交换式以太网等。代表是Modbus/TCP和Ethernet/IP。仅适用于对实时性要求不高的工控环境
基于以太网的实现
网络层和传输层做修改。基于标准的ISO/IEC802.3中物理层和数据链路层协议,工控相关的过程数据不通过TCP/IP协议传输。常用手段时间片机制。代表是Ethernet powerlink、EPA、profinet RT等
基于修改以太网实现
数据链路层做修改。一般采用专用硬件处理数据,使用专用帧类型提高工控数据帧的优先级,简化通信处理过程,避免报文冲突,代表为EtherCAT、SERCOS III和profinet IRT。可以获得响应事件小于1ms的硬实时。
tips:以太网帧的数据有1500个字节左右
第三类工业以太网协议性能对比
- EtherCAT,全双工(可以同时在两个方向上收发消息),拓扑结构支持星型、线型、环型、树型和总线型。同步精度最高 100ns。实时特性最好
- SERCOS III,全双工,拓扑结构支持线型、环型
- PROFINET IRT,半双工(可以双向传输,但不能同时传输),拓扑结构支持星型和线型。
EtherCAT——基于以太网的开发构架的实时工业现场总线通讯协议
特点:高性能、拓扑结构灵活、应用容易、低成本、高精度设备同步、可选线缆冗余、功能性安全协议、热插拔
需要注意的是EtherCAT中数据交换完全基于纯粹的硬件设备,利用逻辑环网结构和全双工快速以太网。时钟抖动小,非常精确。
逻辑环网是一种可以完全避免消息碰撞的技术。
主要可以用于短指令的简单控制系统,可以充分利用以太网的payload空间,存放多条指令,防止浪费。
后面的不总结了,看看就完事了,老师好像都没怎么讲印象里。
原文链接: https://zijian.wang/2018/06/30/嵌入式RTOS复习/
版权声明: 转载请注明出处.