《Part4 嵌入式操作系统及驱动设计.pdf》由会员分享,可在线阅读,更多相关《Part4 嵌入式操作系统及驱动设计.pdf(79页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、嵌入式系统原理与设计嵌入式(实时)操作系统及驱动设计2011.03覃海峰 RTOS内容提要RTOS定义主要功能及实现方法简介RTOS中的驱动BSP一般外设1、嵌入式系统中OS的引入 软硬件分开 方便移植 硬件设计与应用软件设计并行(simulator)方便建立多进程的复杂软件系统 统一高效的任务管理和通信 高效的使用硬件操作系统OS的主要功能 为应用程序提供访问硬件的接口 如何使用硬件 资源管理 何时/由何应用来使用某资源 提供工具集 简化开发OS实现对硬件的管理 应用程序设计者不需要关注硬件细节 硬件如何使用由OS管理 不同硬件平台上OS提供相同接口,甚至可以用软件模拟接口应用程序应用程序实
2、用工具实用工具/协议栈协议栈操作系统操作系统硬件硬件OS-多进程的处理 简单应用可以由单段程序来实现 例如大部分单片机程序(主循环+中断)复杂的应用难以用单个程序来实现及管理 例如手机:1.后台播放音乐 2.通话 3.查找电话本 4.按键输入 5.显示 操作系统是控制应用程序运行的程序OS的功能 基本功能 处理器资源管理(主要为中断管理)内存管理 进程管理(调度/通信)设备驱动 高级功能 文件系统 各种协议栈(专家库)安全功能嵌入式操作系统EOS(Embedded Operating System)体积小(足够精简以存储在ROM等介质中)可靠性高(长期不间断运行)功耗低(很多设备用电池供电)可
3、配置性 扩充性 新的硬件/新的服务EOS-体积小 内核足够小/可配置 单内核或宏内核(monolithic kernel,Macro kernel)宏内核内部可被分为若干模块,运行时是一个独立的二进制大映像。模块间通过函数调用实现 微内核micro kernel 微内核是一个消息转发站,把系统调用转发给相应的模块。内核本身不提供操作系统的相关服务,而是提供实现这些服务的机制(地址空间管理,进程调度及通信)(分层)单内核与微内核EOS-可靠性 安全可靠的编码 详尽的测试/认证 应用软件具有与操作系统同样的可靠性 存储:ROM/备份 恢复/看门狗EOS-内核裁剪 裁剪 预编译命令 模块注册 运行时
4、配置 不同内核实现的缺点 单内核不容易作出修改 微内核效率不高*均可改进EOS-功耗 电源管理模块 在不需要的时候关闭/休眠硬件 让CPU空闲时进入低功耗状态 定时关闭时钟*功耗降低需要应用程序配合 优化的代码设计,快速完成任务 通知OS关闭不需要的硬件eOS-扩充性 静态扩展 重新编译/需要源码/良好的模块性 动态扩展 微内核 内核加载/LKM 操作系统经常性的变化对它的设计提出一定的要求。一个非常明确的观点是,在构造系统时应该采用模块化的结构,清楚地定义模块间的接口,并备有说明文档。对于像现代操作系统这样的大型程序,简单的模块化是不够的。实时操作系统RTOS(real time OS)系统
5、能够在限定的响应时间内提供所需水平的服务(POSIX 1003.b)POSIX Portable Operationg System Interface(for UNIX),IEEE制定的OS标准接口(类UNIX的OS,以及WindowNT均适用)实时性 快速响应外部事件 快速切换资源的使用(实时任务调度)确保任务按时完成实时系统 实时计算:系统的正确性取决于计算的逻辑结果及产生结果的时间。硬实时 硬实时任务必须满足最后期限的限制,否则会给系统带来不可接受的破坏或致命错误。软实时 软实时任务期望满足最后期限的要求;但即使操作最后期限,完成这个任务仍然是有意义的。周期性实时任务 每隔周期T一次的
6、任务 如果系统中均为周期性实时任务,则实时要求容易达到RTOS的要求 可确定性 中断发生到响应中断的延迟 可响应性 处理中断的时间 用户控制 用户完成非常详细的设计(优先级/存储等)可靠性和故障弱化RTOS-可确定性 按照固定的、预先确定的时间或时间间隔执行操作。几乎没有完全可确定的系统 因为外部事件不是可以完全预先确定的 中断发生开始处理中断的延迟 非实时:几十到几百ms 实时:几到几百usRTOS-可响应性 从最初处理中断到中断处理完成的时间 ISR是否需要进程切换 Interrupt Service Routine.中断服务例程 执行ISR所需要的时间 是否可能被其它中断打断 快速的任务
7、(进程/线程)切换*中断响应时间 包括中断发生到开始处理的延迟 处理中断的时间RTOS-用户控制 非实时OS:不控制或者简单控制任务调度 实时OS:仔细区分每个任务的优先级 制定调度方式(例如是否可抢占)内存的使用方式,进程的权限等RTOS-可靠性及故障弱化 尽可能详尽的设计和测试 预留充足的资源 出问题时能改进或降低影响 重启进程 备份机制 性能不足时首先满足最重要的任务完成 关机/重启/异常关闭时 保证数据的完整通用OS/eRTOS简单比较通用OSeRTOS一般用户系统开发人员/弱交互体积一般较大体积小/可裁剪实时性要求不高实时性可靠性要求不高可靠性要求高(标准)总结:RTOS的典型功能/
8、特点 体积小 高效的中断管理 高效的内存管理 高效的进程管理/通信/调度2、RTOS主要功能及实现简介OS的通用功能中断管理内存管理进程管理嵌入式及实时的要求小体积、灵活配置高效-实时RTOS-中断管理 中断类别 硬件中断 软件中断 中断向量表建立 中断的使能 中断与实时处理RTOS-中断 中断响应时间 RTOS中关闭中断的时间尽可能短 中断时的上下文切换 中断响应过程 中断函数-进程 中断嵌套 时钟中断 一般作为RTOS的时间片 时间片短/中断次数多 时间片长/中断次数少RTOS-内存管理 物理内存-虚拟内存 应用程序使用的内存地址需要经过翻译,转换成最终的硬件地址 转换由OS和硬件共同完成
9、 MMU 硬件提供的内存管理单元,通常由OS进行配置 内核空间与用户空间 OS应保护核心数据只能由OS自身访问 缓存 提高存储器的访问速度RTOS-进程 串行处理与并行处理(单)处理器某个时刻只能完成一个任务 并行处理是宏观特性 进程控制块 标志符/状态/优先级/程序计数器/内存指针(堆栈等)/上下文(CPU寄存器)/IO状态信息(设备/文件等)进程的状态及状态转换 新建/就绪就绪/运行运行/阻塞阻塞/退出 进程与线程 进程:资源;线程:调度/执行;RTOS-进程管理 互斥 并发进程竞争使用同一个资源 禁止中断/降低实时性;多处理器不可用 原子操作 死锁/饥饿 同步 多个进程通过共享资源交互
10、机制:信号量RTOS-进程调度 进程调度 优先级抢占 每个进程一个优先级 优先级预先分配/是否可改变 抢占:高优先级的进程打断低优先级进程的执行 时间片轮转 按固定时间间隔调度任务 时间片是否固定(定长时间片/变长时间片)何时调度/切换进程 时钟中断/IO中断/系统调用RTOS-调度 RTOS一般采用时间片轮转+优先级抢占 优先级最高的进程先执行 同一优先级的进程按时间片轮转执行 抢占方式:当前任务结束/非实时 在抢占点抢占/实时性不好 立即抢占优先级逆转 抢占式操作系统 资源的竞争 高优先级任务需要的资源,正被低优先级任务占用 著名的探路者号任务 解决方案:优先级继承(在高优先级任务需要资源
11、时,更改低优先级任务的优先级)时间限定的进程调度-RMS 速率单调调度 rate monotonic scheduling 周期性任务 周期最短的任务优先级最高 周期T 执行时间C 处理器使用率 U=C/T U1+Un=n(21/n 1)(极限0.69)实例 20/100 40/150 100/350 0.75312 1.2510.779 时间限定的进程调度-EDF 截止时间最近者优先调度 Earliest Deadline First 动态优先级 截止时限最近的进程拥有最高优先级RTOS-进程间通信 小数据量的通信 信号 事件 大数据量的通信 消息队列 共享内存 管道主流eRTOS及特点 L
12、inux VxWorks WinCE uCOS Nucleus Plus嵌入式Linux简介 应用最广 开源/资源丰富 单内核+微内核(可加载内核模块)分支:普通Linux裁剪 精简内核 实时性差(10ms,2.4内核不可抢占)RTLinux 添加实时内核模块 ucLinux 不支持MMU Monta Vista LinuxVxWorks简介 高实时性/高可靠性 专用行业 特点:优先级抢占+时间片轮转(可关闭)uS级的响应时间 完备的工具/协议栈 标准接口,通过多项测试WinCE简介 调度:可抢占+时间片轮转(默认100ms)优先级 0-256 0-96 高于Driver 97-152 Dri
13、ver 153-247 低于Driver 248-255 普通应用 中断:不可嵌套/降低实时性 ISR(中断服务例程)+IST(中断服务线程)丰富的接口/工具及方便的变成方式 WIN32API .NET3、RTOS中的基本驱动/BSP 驱动的作用 让RTOS能正常的运行 让应用程序能使用硬件设备 驱动设计的基本目标 屏蔽硬件的实现细节,提供方便的接口方式驱动分类按功能 系统核心驱动 处理器控制 中断控制器驱动 存储器件配置 外设 网络设备驱动 总线驱动 输入输出设备驱动 其他专用设备驱动OS与硬件的关系 层次图应用程序应用程序实用工具实用工具/协议栈协议栈操作系统操作系统硬件硬件驱动驱动板级支
14、持包BSP 建立让OS运行的最基本环境 初始化CPU内部寄存器 设定RAM工作时序 时钟驱动及中断控制器驱动*串口驱动(简单有效的调试手段)完善OS运行的环境 CACHE/MMU ROM 完善中断管理 系统总线驱动一般启动流程 复位 从指定位置开始运行程序(ROM)与CPU相关 初始化CPU寄存器/关中断/配置时钟/RAM 初始化OS内核 开中断/开MMU 启动用户进程系统启动II ROM-RAM BootLoader 开发阶段的启动/最终发布阶段的启动RTOS的基本系统硬件接口 CPU 地址空间/寄存器 外部存储器BSP-CPU 初始化 让CPU处于最精简的可控状态 关中断(屏蔽其他硬件的干
15、扰)关缓存,关闭MMU 设置时钟频率(由硬件设置配合完成)设置CPU关键寄存器(清零某些寄存器,设置堆栈等寄存器)正常运行 中断相关寄存器处理 模式转换 进程切换(PC及堆栈切换)CPU的模式 CPU硬件设计至少两种模式(特权模式和用户模式),由CPU内特殊寄存器来指示。OS的内核态和用户态和CPU硬件的模式对应 特权模式能访问所有资源 用户模式只能访问有限资源(超出范围则会触发中断)BSP-地址空间 OS在内核态下能访问所有资源 所有寄存器 所有地址空间(典型4G)OS在用户态下只能访问有限资源 部分寄存器(CPU决定)有限地址空间(典型0-3G,CPU及MMU决定)BSP-地址空间 只工作
16、在内核态(管理态)的RTOS OS系统代码和应用程序具有同等权限 程序编写简单,用户程序可直接访问硬件资源 可靠性差:OS系统代码及硬件寄存器不受保护 区分内核态和用户态的RTOS 用户应用代码均运行在用户态 无法直接访问大部分硬件资源(需要操作系统配合)可靠性好BSP-OS状态切换 内核态用户态 直接完成 用户态内核态 中断外部中断/内部中断(实现系统调用)BSP-存储器 DRAM 需要配置特定的时序才能正常读写 是否启用Burst模式、工作时钟 ROM 普通EEPROM/NOR FLASH直接可读 存储数据需要特殊命令序列来实现如何入手BSP编写 透彻的了解硬件结构 熟悉相关的硬件文档是基
17、础 方便易用的开发环境 调试器/开发软件 交叉编译 参考代码 熟悉好的参考代码能达到事半功倍的效果BSP的开发及调试 硬件调试器 JTAG直接控制CPU内部寄存器 LED指示 最直观/快速/简单的调试手段 使用最简单的设备(GPIO)串口信息 方便的输出调试信息BSP开发一般步骤1 验证硬件 硬件准备(上电后的电压电流)连接调试器 读写CPU内部寄存器 控制处理器的输出端口(GPIO)观察输出 配置CPU 关中断/关CACHE/Endian 设置时钟BSP开发配置RAM 初始化RAM 填写与RAM相关的CPU内寄存器 时序/时钟/访问方式:片选 刷新时序/等待时序/读写时序 通过调试器逐个寄存
18、器填写 部分调试器支持存储,一次性填写多个寄存器 部分调试软件支持配置文件,一次性填写多个寄存器 测试RAM 单元测试 单地址读写测试 整体测试整块读写测试 噪声测试读写测试数据(特殊数据,如逐位置1/置0)BSP开发-阶段验证 确保CPU和RAM工作正常 编写初始化代码(一般是汇编代码)屏蔽CPU中断 设置栈指针 关闭CACHE 设置DRAM访问时序/片选 编写简单程序验证(C代码)如编写一段简单的代码,用软件延迟周期性去点亮和关闭某一个LED C代码运行正常,则操作系统的入口可以被调用BSP开发:ROM-RAM COPY必要的数据到RAM CODE 解压 跳转 DATA 验证 编写代码验证
19、DATA是否copy正确BSP开发 内存管理 规划内存的使用方式 多少内存供OS使用 是否使用MMU 外设的内存映射 配置外设的地址空间/片选/位宽/时序 MMU 设置虚拟地址到物理地址的转换方式 块映射 段映射 页映射BSP开发中断处理 中断类型 直接连接到CPU的中断 通过中断控制器连接到CPU 中断向量表 为每个中断源的编写简单处理代码(一般是计算出一个中断向量)将每个中断源和OS的中断处理入口连接 汇编代码直接连接 使用OS提供的连接函数BSP开发集成OS 确保前述基本硬件工作正常 按照OS的要求编写接口API 比照参考代码进行整合BSP开发集成OS 添加ROM驱动 最终系统需要烧写到
20、ROM中 系统启动方式 Bootloader/Rom-Ram的copy 添加串口驱动 方便调试 Cache和MMU 打开Cache和MMU时,可能会出现问题(调试变得困难)多核 AMP与SMP4、RTOS的驱动设计 定义 OS(或应用程序)与硬件设备的接口 功能 控制 数据传输驱动的接口 专用接口 按照应用设计的接口 必要时可绕过OS,由应用直接控制硬件设备 简单/效率较好 通用接口 按照OS所要求的通用接口来设计 一般是类文件操作的接口 标准化的注册、初始化、卸载驱动的主要接口 注册及卸载 设备打开和关闭 设备读写 设备控制 中断服务函数典型设备-分类及例子 字符设备 类文件接口 例如键盘
21、块设备 类文件接口例如SD卡 seek 网络设备 其他 各种总线 IIC USB PCI Timer*每种操作系统均有自己的分类驱动-设备控制 通用控制方式 内存映射:设备被映射到一段内存空间 基本操作:寄存器的读写 各种总线接口:总线的控制最终由寄存器实现 操作系统提供的接口 端口读写 中断控制 打开/关闭/连接 总线配置驱动:查询和中断 查询 由OS或应用发起查询/实时性差 中断 硬件设备在必要时,以硬件中断通知CPU 结构相对复杂 实时性好驱动:中断 确认系统的中断处理流程 安装中断服务程序 配置OS的中断相关寄存器/打开设备对应中断 确认OS中对应设备的中断向量 安装中断服务程序到对应
22、的中断向量 编写中断服务程序 划分中断的任务/部分操作交给上层处理 注意编程限制/不能使用的功能、函数 只做尽量少且必要的操作驱动:数据传输 通用读写 通过IO端口逐个数据读写(效率低)DMA 设备和内存(设备和设备)之间直接传输数据,CPU只需发起传输即可。效率高,数据传输不占用CPU资源。驱动:内核态和用户态 设备所分配的地址一般只能在内核态访问 内核态 可用资源多 驱动只能使用有限的函数 用户态 用户态的驱动代码,需要通过OS的系统接口才能访问设备(MMAP,特权用户)方便调试 不能使用中断 特殊设备类型不能实现(网络/块设备)安全和效率驱动的效率 尽量多使用设备的缓存 单次搬移大量数据
23、的效率更高 大数据的传输尽量减少内存copy 设计好的数据存储机制,通过指针传递数据 尽量采用DMA方式驱动的实时性要求 采用中断方式 事务划分 中断处理代码尽量只处理最基本的事务 中断时不会有进程调度,并且有时会关闭中断 由进程处理更多事务驱动-其他 多任务 可重入/同步/互斥 阻塞与非阻塞 出错处理 自恢复 错误报告 记录到内存 直接输出/串口或网口 多核驱动-一般开发流程 文档准备 硬件文档/系统及设备 OS的驱动接口 参考代码 硬件验证 调试器或简单代码/验证硬件的可访问性 完成驱动子功能及测试 划分事务/分层完成 完善代码及测试 兼容性/可读性/配置 OS接口其他 用预处理命令包含各种不同配置 驱动中的调试接口 可移植性考虑练习参考 Operating Systems Internals and Design Principles,Fifth Edition William Stallings Linux设备驱动程序 WinCE设备驱动程序开发指南 VxWorks BSP Developers Guide VxWorks Device Drivers Guide