(电机与电器专业论文)基于嵌入式实时内核的远程测控终端的研究.pdf_第1页
(电机与电器专业论文)基于嵌入式实时内核的远程测控终端的研究.pdf_第2页
(电机与电器专业论文)基于嵌入式实时内核的远程测控终端的研究.pdf_第3页
(电机与电器专业论文)基于嵌入式实时内核的远程测控终端的研究.pdf_第4页
(电机与电器专业论文)基于嵌入式实时内核的远程测控终端的研究.pdf_第5页
已阅读5页,还剩89页未读 继续免费阅读

(电机与电器专业论文)基于嵌入式实时内核的远程测控终端的研究.pdf.pdf 免费下载

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

i 摘要摘要 基于嵌入式实时内核的远程测控终端是以铁路供水系统为背景的 根据嵌入式系统 设计原理构建的现场控制系统 本文提出了远程测控终端设计方案对远程测控终端各部分的功能做了描述详细 介绍了远程测控终端的 cpuw77e58 单片机和键盘显示数据采集开关量输出串 行接口等外围电路通过对实时内核c/os-ii 源代码的分析和研究结合该系统使用的 cpu 提出了具体的移植方案在此基础上详细讨论了远程测控终端的外部输入/输出 设备驱动程序的编写以及在c/os-ii 实时内核下的实现方法 本文还分析了远程测控终端远程通信方式 利用 rs485/以太网转换器实现远程测控 终端与监控中心的通信功能 该远程测控终端不仅可以用于铁路供水系统还可以应用于电力水利石油化 工市政等行业中用于地理环境恶劣无人值守的环境下进行远程监控具有普遍的 意义和实用价值 关键词关键词:远程测控终端嵌入式实时内核单片机c/os-ii输入输出驱动远程通信 ii abstract the remote measuring and controlling terminal based on embedded real-time operating system (rtos) discussed in this paper is a field control terminal system with the background of the railroad supply water system, and according to the embedded system design principle. in this paper the design scheme of the remote measuring and controlling terminal is presented, and its functions of all parts are described in detail, which uses winbonds w77e58 as its mcu. the peripheral circuits of the terminaldisplay, keyboard, data collection, switch output, serial interface, are introduced. the real-time kernel of c/os-ii, which is a kind of real-time operating system, is introduced. through analysis and research of source codes of c/os-ii, the kernel is known well. and the transplant plan is given based on w77e58 mcu. on these bases, the i/o devices are discussed in detail. to every device, we discuss their realization based on c/os-ii. additionally, the communication method of the remote measuring and controlling terminal is introduced in this paper. making use of the rs485/ ethernet converter, the terminal realizes long-range measure and control communication function. it may be applied not only in the railroad supply water system, but also in the electric power, water conservancy, petroleum, chemical engineering, etc. it is used in the bad geography environment and unmanned guard remote control system. it has widespread application and practical value. keywords: remote measuring 手动方式 时远程测控终端的所有工作参数都可以现场查询和修改一般来说手动方式只是在 现场调试检修和系统通信长时间中断的情况下采用无论是工作在自动方式还是手动 方式工作参数一经设置远程测控终端就会自动按照规定的流程和模式进行数据采集 和处理现场控制以及通信响应 远程测控终端的主要配置有 cpu 板键盘显示板i/o 板串行通信接口单元以 及通信设备电源机箱等cpu 板一般采用单片机作为控制核心cpu 板所固化的 程序决定了远程测控终端的全部工作流程包括现场的数据采集及处理方法控制模式 及功能故障处理方式远程通信协议及其实现等更新程序就可以使远程测控终端满 足多种现场流程的要求键盘显示板用于实现远程测控终端的人机对话功能支持对远 程测控终端的现场操作控制以保证远程测控终端在系统通信中断时能够继续监控工 作为适应恶劣的现场环境状况显示器件可以选择采用 led 数码管实现i/o 板上的 i/o 通道是远程测控终端与现场信号的接口在符合工业标准的基础上还应该具有多 种结构形式以适应不同的现场信号类型如开关量 i/o 通道模拟量 i/o 通道电参 数采集通道等 远程测控终端串行通信接口单元一般至少要有两个通信端口以支持远程测控终端 与监控中心远程测控终端与下级设备之间的通信远程测控终端的通信介质根据现场 环境及对象的要求选择 rs-485 总线远程测控终端支持的通信方式有监控中心触发 的通信和远程测控终端触发的通信 郑州轻工业学院硕士学位论文 9 监控中心触发的通信包括 站点查询监控中心周期性的以一定的时间间隔在一定的时限内对所有的 远程测控终端依次下达查询命令收集各站点的现场数据和信息 站点控制由监控中心定时或随机地向所有远程测控终端群控或某个远程测 控终端单控下传工作参数或控制命令如远程测控终端工作参数设置现场设备的 开/关控制等 远程测控终端触发的通信包括 响应监控中心的命令根据监控中心的命令格式上传现场参数和信息或接收监 控中心下传的工作参数和命令并执行相应的控制操作 故障报警当现场工作出现异常或故障时由远程测控终端主动呼叫监控中心 上传现场状态信息和故障信息对于监控中心来说对远程测控终端的故障报警应优先 响应 响应下级设备或远程测控终端的呼叫接收它们的上传信息并进行处理 对下级设备或远程测控终端下传参数或命令 下面结合远程测控终端在远程供水自动监控系统中的应用详细介绍它的硬件实 现 2.2.2 远程供水测控终端的结构 2.2.2 远程供水测控终端的结构 铁路供水自动监控系统是微型计算机和单片机组成的主从式测控网络本着实用 安全以及整个系统的成本供水测控终端采用传统的单片机系统系统中以单片机为 核心的测控终端分布在各个分控站点测控终端整体结构框图如图 2-1 所示 w77e58 8279 键盘 显示 外部存储器 掉电保护 开关量输入 开关量输出 模拟量输入 电量采集 8255 ad574 max485max485 图 2-1 测控终端的整体框图 郑州轻工业学院硕士学位论文 10 远程供水测控终端用于现场采集各项参数以及实现现场设备控制 供水测控终端的 硬件设计采用 winbond 公司的 w77e58 单片机作为主芯片配置相应的外围电路其 中数据采集电路采集现场各种模拟量开关量等数据开关量输出电路用于控制现场的 电机等设备的开停 eeprom 电路完成掉电保护功能通过串行口连接的 rs485/以太 网通信模块完成供水测控终端和监控中心间的通信数据采集的内容包括水井水塔的 水位泵出口压力泵出口流量等模拟量参数电机三相电压三相电流等数据以及多种 开关量参数同时如果远程供水测控终端接收到监控中心的读数据命令还要把这些 相应的数据发送到监控中心另外监控中心还可以通过以太网向远程供水测控终端发 送控制设备的命令 以及发送安全监控上下限参数 这些参数数据可以存储在 eeprom 中用于掉电保护 2.1.3 远程供水测控终端的性能指标 2.1.3 远程供水测控终端的性能指标 本系统设计的远程测控终端是根据新乡水电段提供的给水集中远程监控系统技 术要求而完成的远程供水测控终端系统的主要功能如下 现场采集并显示水位高低泵出口压力泵出口流量等参数 现场采集并显示电机三相电压三相电流电度量数据 现场采集并用 led 指示电机运行状态 自动/手动切换状态 泵房有无人状态等 上传水位高低泵出口压力泵出口流量等参数 上传电机三相电压三相电流电度量数据 上传电机运行状态自动/手动切换状态泵房有无人状态 上传安全监控上下限参数如井水位塔水位电压电流等参数的上下限 值 远程控制电机的开停 远程修改安全监控上下限参数如井水位塔水位电压电流等参数的上 下限值 2.2 w77e58 单片机概述 2.2 w77e58 单片机概述 w77e58 单片机是 winbond 的具有 51 内核的增强型微控制器w77e58 与 8052 的引脚和指令集完全兼容它包括标准 8052 所具有的 4 个 8 位 i/o 端口3 个 16 位 定时/计数器全双工串口和中断源 w77e58 的内核在 8052 的基础上重新设计它省去了多余的时钟和存储周期从 郑州轻工业学院硕士学位论文 11 而使速度更快性能更优这种性能的提升不是通过提高运行频率来实现的而是通过 将大部分指令的执行从标准 8052 的 12 个时钟周期缩减到 4 个时钟周期这样平均下 来性能就能够提升 1.53 倍 w77e58 还提供双数据指针dptr使数据存储传输的速度更快它还能够调整 movx 指令的执行时间访问片外数据存储区可以选择 2 个机器周期或 9 个机器周 期这种灵活性使 w77e58 在访问快速和慢速 ram 时都能够与外部设备高效运行另 外 w77e58 包含 1k 片上 movx sram它的地址在 0000h 到 03ffh 之间它只能 由 movx 指令访问这种片上 sram 可由软件选择 w77e58 与 8052 兼容 8052 的原有特性它都能提供只是速度更快功耗更低它 与 8051 家族的指令集基本相同 只是多了一个 dec dptr 操作码 a5h dptr 减 1 原来的 8051 家族都是每个机器周期包括 12 个时钟周期而 w77e58 每个机器周期只 有 4 个时钟周期这自然增加了指令的执行速度 因此即使使用同样的晶振 w77e58 比原来的 8052 速度更快因为 w77e58 的 cmos 是完全静态的所以它可以在更低的 晶振下工作指令执行的吞吐量相同而功耗更小 w77e58 的每个机器周期包含 4 个时钟周期的特点使它的执行速度提高了 3 倍 w77e58 具有 8052 的所有标准特性和某些额外的外设特性 i/o 口 w77e58 有四个 8 位端口和一个 4 位端口当外部程序运行或 movc 或 movx 指令访问外部存储区/设备时 端口 0 可用作地址/数据总线这时它又强上拉和下拉 能力不需要任何外部上拉否则它可作为带有开漏电路的普通 i/o 口端口 2 主要 在端口 0 用作地址/数据总线时用作高 8 位地址总线它也有强上拉和下拉能力端口 1 和端口 3 带有一些可选功能端口 4 只在 plcc/qfp 封装时才有它和端口 1 和端口 3 一样是通用的 i/o 口p4.0 有一个可选功能 wait它是等待状态控制信号当等待 状态信号使能时p4.0 只作为输入信号 串口 w77e58 有两个增强型串口 它的功能与原来 8052 家族的串口相似 但是 w77e58 可以工作在不同模式下注意串口 0 可以使用定时器 1 和定时器 2 作为波特率发生器 而串口 2 只能使用定时器 1 作为波特率发生器 串口具有自动地址识别和帧错误检测的 特性 定时器 w77e58 有三个 16 位定时器它们和 8052 家族的定时器功能相似当用作定时器 郑州轻工业学院硕士学位论文 12 时每次计数可以选成 4 时钟或 12 个时钟这样可以选择和原来 8052 的定时相同 w77e58 有一个附加的看门狗定时器可用作系统监测或长时间定时 中断 w77e58 的中断指令和标准 8052 略有不同由于存在一些附加特性和外围设备 中断源和中断向量的数量都增加了w77e58 提供了 12 个中断源2 个优先级别包括 6 个外部中断4 个定时器中断和 2 个串口中断 数据指针 原来的 8052 只有一个 16 位数据指针dpldphw77e58 还有一个数据指针 dpl1dph1这个新的数据指针使用两个原来 8052 位用的 sfr 地址另外还加了 一条指令dec dptr操作码 a5h使用户编程更加灵活 电源管理 与标准的 80c52 相似w77e58 也有 idle 和 power down 模式w77e58 还提 供了一个 economy 模式它可以使用户在时钟频率除以 464 或 1024在 idle 模式 下cpu 内核的时钟停止但定时器串口和中断时钟继续在 power down 模式 下所有的时钟和芯片操作都完全停止这是最低功耗状态详细介绍见参考文献31 2 23 远程测控终端的硬件设计 3 远程测控终端的硬件设计 2.3.1 键盘显示电路设计 2.3.1 键盘显示电路设计 键盘显示电路是嵌入式应用系统中重要的外部设备 它是应用系统与操作人员间交 互的窗口是系统与外界联系的纽带各种参数的设定状态的显示以及它运行的控制 (采集转换存贮等)都是通过人机接口进行的它包括键盘数码管显示等部分 在较复杂多功能的智能仪器和自动化检测系统中不但采用的按键较多而且要 显示的数据位数也多用软件扫描键盘要占用大量的 cpu 时间多位显示器的接口电 路也比较复杂在这种情况下可以选用专用多口键盘/显示接口器件8279 是可编程的 键盘显示接口芯片它能自动完成键盘的扫描输入和 led 扫描显示输出 键盘显示电路采用传统的 8279 接法系统采用 16 个44键输入其中 09 为数字键a 为模式选择键a1循环显示采集数据a2输入各参量限值a3显 示各参量限值b 为退格键c 为电量设定参量数输入d 为非电量设定参量数输入 e 为保留健f 为确认键数码管显示 8 位数据具体的键盘显示接口电路设计不再详 述 郑州轻工业学院硕士学位论文 13 2.3.2 数据采集电路设计2.3.2 数据采集电路设计 根据要求系统的数据采集包含三个部分分别是水位泵出口压力等模拟量采 集电机运行状态手动/自动开关等各开关量采集电机三相电压三相电流电度 量等电量参数采集下面分别介绍数据采集电路各部分的硬件设计 水位等模拟量采集电路 非电量的采集是指现场的井液位塔水位泵出口压力和出口流量这四个模拟量的 采集这中间需要通过多路复用芯片 cd4067b 和模数转换器 ad574a 的转换再将采集 的数据给 w77e58 处理其芯片连接如图 2-2 所示 cd4607b a0 a1 a2 a3 10 11 14 13 15 inh xcom +5vvdd vss 24 12 1 接 74ls373 去ad转换 0x 1x 2x 3x 4x 5x 6x 7x 8x 9x 10x 11x 12x 13x 14x 15x 2k 250 + 10 f 5.1v 模拟量 图 2-2 水位等模拟量采集接口结构图 具体采集过程为 首先通过锁存器 74ls373 w77e58 的 p0 口将地址和使能信号送 给多路复用芯片 cd4067b启动 cd4067b以选通所要采集的数据的通道cd4067b 接到地址和使能信号后就将模拟量由 xcom 端输入到 ad574a这时就可以启动 ad574a 进行模数转换非电量的采集中依次采集井液位塔液位泵出口压力和流 量由于 ad574a 的 sts 端口与 w77e58 的外部中断管脚 int1 相连所以每次转换都 要产生中断然后 w77e58 通过读取 ad574a 的输出口就可获得转换后的数字量 开关量状态采集电路 8255 接口芯片与光电隔离芯片 tlp521 一起实现开关量的采集 开关输入量包括接 触器状态红外开关信号储液箱液位信号手动/自动控制切换信号等开关量信号的 采集时通过扩展的串行口即 8255 芯片来完成的其具体采集过程为首先由 w77e58 单片机向 8255 的命令字端口写入命令字 以确定 8255 的 pa pb pc 三口的工作方式 然后读取 pa 口的前七位的状态就得到了经 过 光 电 隔 离 后 的 开 关 量 状 态 信 号 郑州轻工业学院硕士学位论文 14 pa0pa6 表示的开关量状态依次为泵运行状态自动/手动切换状态泵房有无人状 态等pa 剩余的端口和 pb 端口用作以后系统的扩展开关量状态采集接口电路如图 2-3 所示 图 2-3 开关量状态采集电路 电量参数采集电路 电量参数采集是指电机的三相电压三相电流和电度量等的采集在系统中使用 多功能智能电表进行电量的数据采集 多功能电表采集电量数据后 经过 rs485 通讯接 口 再传送给 w77e58 的串行口 1 接口设计电路如图 2-4 所示 图中 max485 为 rs-485 接口芯片实现与多功能电度表通讯接口实时读取水泵电机(15kw)三相电流三相 电压有功功率及消耗的电度量动态监视水泵电机的运转状况 gnd a b vcc ro re de di +5v rxd1 dr1 txd1 max485 多功能 电度表 1 2 3 4 a b 680 680 tvs1 tvs2 120 200 200 1 2 3 45 6 8 7 图 2-4 max485 和多功能电表连接的结构图 2.3.3 开关量输出电路设计 2.3.3 开关量输出电路设计 在远程供水测控系统中水塔中水位的控制由水泵的开停决定实际上控制水泵 郑州轻工业学院硕士学位论文 15 电机的开停是由开关量控制的开关量输出还包括注液控制信号报警灯控制信号以及 报警铃控制信号等开关量输出的硬件电路连接如图 2-5 所示在开关量输出电路的设 计中和开关量采集电路一样通过同一片 8255 对 i/o 口扩展 8255 的 pa 口pb 口 作为输入口用于采集各开关量开关量的输出使用的是 pcpc 口经 uln2803 与外 部的继电器等连接控制电机报警装置等 uln2803 1 2 3 4 5 9 接8255pc口 i1 i2 i3 i4 i5 i6 i7 i8 gnd 6 7 8 o1 o2 o3 o4 o5 o6 o7 o8 com +5v 100k +5v do0 do1 do2 do3 do4 do5 do6 do7 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 接继电器 图 2-5 电机控制电路连接图 2.3.4 掉电保护电路设计 2.3.4 掉电保护电路设计 本系统中远程供水测控终端长期工作于水井水塔现场而且无人职守一旦电源 线路出现故障造成断电ram 中的所有数据将丢失其中也包括一些重要数据如 井水位塔水位电压电流泵压力等参数的上下限值上电复位后这些参数的上 下限值无法及时得到致使该下位机无法正常工作因此在本系统中设计采用了掉电保 护电路将一些重要数据及时保存在 eeprom 中上电复位后通过程序将这些重要 参数读入 ram 中确保下位机能继续正常工作当系统需要对各模拟量数据的上下限 参数进行修改时也要同时对 eeprom 进行修改 本设计中选用支持 i 2 c 总线传送协议的 eeprom 芯片 24lc32单片机作为主器 件24lc32 作为从器件由于 w77e58 单片机不存在 i 2 c 串行总线口所以要用单片 机的 i/o 总线模拟 i 2 c 总线单片机在对 eeprom 进行数据读写时首先发送一个信 号启动数据传送过程然后发送 eeprom 的地址地址的高四位固定为 1010最低位 是读写控制位中间三位通过 24lc32 上的 a0a1a2 确定图 2-6 是 eeprom 的 电路设计图 郑州轻工业学院硕士学位论文 16 接接 w77e58i/o口 10k 10k 口 10k 10k 图 2-6 eeprom 电路连接图 2.3.5 通信接口电路设计2.3.5 通信接口电路设计 远程测控终端采用华信电子工程研究所设计的以太测控网关 网络通一种 rs485/以太网转换器作为测控终端与远程监控中心的通信接口网络通是一种廉 价的方便的小巧的测控等设备以太网接口模块把网络通嵌入到测控终端中 测控设备就方便的接入以太网因特网就可以方便地实现远程测控图2-7是远程 测控终端的通信接口具体电路网络通的具体应用在第五章将详细介绍 gnd a b vccro re de di +5v rxd dr0 txd max485 1 2 3 4 5 6 8 7 网络通 rs 485 接 口 rj 45 图2-7 通信接口电路 郑州轻工业学院硕士学位论文 17 第三章 第三章 c/os-ii 嵌入式实时操作系统 c/os-ii 嵌入式实时操作系统 3.1 3.1 c/os-ii 的选择 c/os-ii 的选择 传统的单片机系统在程序设计上一般采用的是前后台方式或超循环方式 super-loop如图 3-1 所示应用程序是一个无限的循环在循环中调用相应的函数 完成相应的操作这部分可以看成后台行为(background)而中断服务程序负责处理异 步事件这部分可以看成前台行为(foreground)后台也可以称为任务级前台也叫中 断级时间相关性很强的关键操作(critical operation)是靠中断服务程序保证的因为中 断服务程序提供的信息一直要等到后台程序走到该处理这个信息这一步时才能得到处 理所以这种系统在处理信息的及时性上比实际可以做到的要差 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? isr(中断服务子程序) isr isr 后台 执行代码 前台 时间 图 3-1 前后台系统 对于简单的应用这种前后台方式是可以满足需求的但是随着应用的复杂化 系统可能要同时监测/控制多个外部设备要求较高的实时性有多个任务要处理如 果在系统软件设计上仍然采用上述的传统方式就会出现两个比较突出的问题一是中 郑州轻工业学院硕士学位论文 18 断响应 一般为了保证某一项重要任务的实时性 就必须在 isr 中进行较为复杂的处理 这样一来就要考虑代码重入系统硬件堆栈溢出等问题二是任务多要考虑的各种可 能性也多各种资源调度不当就会造成共享数据的不一致降低系统的可靠性同时程 序量也加大 解决这些问题的最好方法就是使用嵌入式实时操作系统 rtos 使用 rtos 可以有效的对多个任务进行调度 对各任务赋予不同的优先级可以保证紧急任务得到及 时响应 rtos 也体现了一种新的应用程序设计思想和开放的框架降低了程序的复杂度和 开发周期现在市场己经出现了不少的嵌入式实时操作系统如 vxworks, psos,nucleus plus, vrtxsa 等等但这些操作系统大多对系统硬件配置有较高的要求如要有运行 速度快的32位处理器 处理器内部要有内存管理单元(mmu) 较大容量的rom和ram 空间等同时操作系统自身和相应配套的开发调试工具价格较高而且许多 rtos 厂商 要求用户在批量生产时要按产品数量交纳版税 所以对于中小型系统特别是采用 8 位微 处理器的系统来说这些操作系统都是不适合的 免费型的实时操作系统在价格方面具有 优势目前主要有 linux 和c/os-ii 其中由美国 jean j.labrosse 先生设计和编写的c/os 到现在的c/os-ii特别是 c/os-ii 自 1992 年以来已经有很多成功的商业应用实践证明该内核具有较高的实用 性稳定性且具有良好的移植性可以适应从 x86 到具有 51 内核的各种不同类型不 同规模的嵌入式系统 c/os-ii 的主要特点如下 4 公开源代码 它的内核是完全免费的用户不需支付任何费用有利于降低系统开发成本它的 源代码是公开的可以从有关出版物上找到详尽的源代码讲解和注释 可移植性 c/os-ii 绝大部分的源代码是用移植性很强的 ansi c 编写的和微处理器硬件相 关的那部分是用汇编语言写的汇编语言写的部分已经压到最底限度使得c/os-ii 内 核对处理器以及 rom ram 资源的要求不高有利于在 8 位处理器上的移植 可固化 c/os-ii 是嵌入式应用而设计的这就意味着只需要固化手段(c 编译器连接 下载和固化)c/os-ii 可以嵌入到产品中成为产品的一部分 可裁减 源代码的开放可以使得用户根据实际要求对源代码进行取舍 去掉不必要的变量和 郑州轻工业学院硕士学位论文 19 不使用的函数提高系统性能另外由于对系统内核有源代码级的了解用户可以添 加自己的模块与原有系统内核兼容使得系统具有可扩展性这样可以减少产品的 c/os-ii 所需的存储空间(ram 和 rom)这种可裁减性是靠条件编译来实现的只要 在用户的应用程序中(#define constant 语句)定义那些c/os-ii 中的功能是应用程序需要 的就可以了 占先式内核 c/os-ii 完全是占先式的实时内核 这意味着c/os-ii 总是运行就绪条件下优先级 最高的任务 多任务 c/os-ii 可以管理 64 个任务然而目前这一版本保留 8 个给系统应用程序最 多可以有 56 个任务赋予每个任务的优先级必须是不相同的这意味着c/os-ii 不支 持时间片轮转调度法该调度法使用于调度优先级平等的任务 可确定性 全部c/os-ii 的函数调用与服务的执行时间具有可确定性 也就是说 全部c/os-ii 的函数调用与服务的执行时间是可知的进而言之c/os-ii 系统服务的执行时间不依 赖于应用程序任务的多少 任务栈 每个任务有自己的单独的栈c/os-ii 允许每个任务有不同的栈空间以便降低应 用程序对 ram 的要求使用c/os-ii 的栈空间校验函数可以确定每个任务到底需要 多少栈空间 c/os-ii 提供很多系统服务例如邮箱消息队列信号量块大小固定的内存 的申请与释放时间相关的函数等 中断管理 中断可以使正在执行的任务暂时挂起如果优先级更高的任务被该中断唤醒则高 优先级的任务在中断嵌套全部退出后立即执行中断嵌套层数可达 255 层 稳定性和可靠性 从最老版本的c/os到最新版本的c/os-ii该实时内核己经走过了近 10 年的历 程 10 年来 世界上己有数千人在各个领域使用了该实时内核 如医疗器械 网络设备 自动提款机工业机器人等等这些应用的实践是该内核实用性无误性的最好证据 3.2 3.2 c/os-ii 的移植c/os-ii 的移植 郑州轻工业学院硕士学位论文 20 3.2.1 3.2.1 c/os-ii 的移植条件 c/os-ii 的移植条件 移植c/os-需要一个 c 编译器并且是针对用户用的 cpu 的因为c/os-是 一个可剥夺型内核用户只有通过 c 编译器来产生可重入代码c 编译器还要支持汇编 语言程序绝大部分的 c 编译器都是为嵌入式系统设计的它包括汇编器连接器和定 位器连接器用来将不同的模块编译过和汇编过的文件连接成目标文件定位器则 允许用户将代码和数据放置在目标处理器的指定内存映射空间中 所用的 c 编译器还必 须提供一个机制来从 c 中打开和关闭中断一些编译器允许用户在 c 源代码中插入汇 编语言这就使得插入合适的处理器指令来允许和禁止中断变得非常容易了还有一些 编译器实际上包括了语言扩展功能可以直接从 c 中允许和禁止中断 keil c51 vision2 集成开发环境是 keil software.inc 开发的基于 mcs-51 内核的 微处理器软件开发平台内嵌多种符合当前工业标准的开发工具可以完成从工程建 立管理软件编译链接到目标代码的生成软件的仿真和硬件仿真等完整的开 发流程 尤其 c 编译工具在产生代码的准确性和效率方面达到了较高的水平 keil c51 集成开发环境的主要功能有如下几点 c51 交叉编译器从 c 源代码产生可重定位的目标的代码 a51 宏汇编器从 8051 汇编源代码产生可重定位的目标代码 bl51 链接器/定位器组合由 c51 和 a51 产生的可重定位的目标模块生成绝 对的目标模块 lib51 库管理器从目标模块生成链接器可以使用的库文件 可以看出keil c51 编译器能产生可重入代码支持 c 语言和汇编语言混合编程 等功能keil c51 编译器能满足移植c/os-需要的条件由此可见c/os-ii 可移植 到 mcs-51 中 3.2.2 keil c51 编译器的特殊性3.2.2 keil c51 编译器的特殊性 6 基于执行效率的考虑尽管 keil c51 与ansi c 的语法一致仅增加一些语言扩 展但keil c51并不是ansi c的标准实现其与ansi c不兼容的地方主要在局部变 量自动变量的分配上ansi c把局部变量分配到用户堆栈中动态分配而keil c51将局部变量分配到寄存器或内存固定地址静态分配并通过变量覆盖分析的方 法使多个函数的局部变量使用相同的内存地址以减少内存占用因为8051内部堆栈空 间的限制c51没有像ansi c那样使用调用堆栈ansi c中调用过程时会把过程的 参数和过程中使用的局部变量入栈为了提高效率c51没有提供这种堆栈而是提供 郑州轻工业学院硕士学位论文 21 一种压缩栈每个过程被给定一个空间用于存放局部变量 过程中的每个变量都存放在 这个空间的固定位置当递归调用这个过程时会导致变量被覆盖这样做可以提高 c51函数的执行效率 但造成keil c51的局部变量使用内存时相当于ansi c的全局变量 这对编写可重入函数不利 在某些实时应用中非再入函数是不可取的一个函数要被多个任务和或中断 调用时就必须是可重入的而驱动程序一般要求被多个任务和或中断同时调用 就需要可重入所以c51允许将需要多个任务和或中断调用的函数定义成再入函数 再入函数可被递归调用和多重调用而不用担心变量被覆盖因为每次函数调用时的局 部变量都会被单独保存因为这些堆栈是模拟的再入函数一般都比较大运行起来也 比较慢 3.2.3 3.2.3 c/os-ii 的体系结构 c/os-ii 的体系结构 图 3-2 c/os-ii 硬件/软件体系结构 郑州轻工业学院硕士学位论文 22 将c/os-ii 移植到一个新的硬件平台上去 用户应该了解c/os-ii 操作系统的总体 结构图 3-2 示意c/os-ii 系统的总体结构以及与硬件的关系 图中的软件系统可分为 4 个部分其中与 cpu 相关的代码部分包含了对各种类型 的 cpu 的支持当用户在异种 cpu 平台上移植c/os-ii 操作系统时一般需对这一部 分代码进行移植 与 cpu 无关的代码部分包含了c/os-ii 的系统函数在进行系统移植时一般不需 要对这部分进行移植但是由于各种 cpu 的 c 编译器的特殊性有时也需要对其做 极少量的移植在后面针对 keil c51 编译器的移植中可以看到有时这种小修小改的必 要性 由于同一芯片系列中各个型号的性能的差异在具有 51 内核的单片机中甚至有 些型号在运行速度代码空间和片上资源方面差异十分显著用户可以通过移植与应用 系统硬件相关的代码部分根据所选用的芯片的参数来确定不同的应用配置以达到 最佳的运用性能 3.2.4 3.2.4 c/os-ii的移植细节 c/os-ii的移植细节 从图3-2显示的c/os-ii的结构及与硬件系统的关系中 可以清楚看出移植的具体工 作包括以下几个内容 在os_cpu.h中用#define设置一个常量的值 在os_cpu.h中声明10个数据类型 在os_cpu.h中用#define声明3个宏 在os_cpu_c.c中用c语言编写六个函数 在os_cpu_a.asm中编写四个汇编语言函数 下面是我们在c/os-ii 移植到w77e58单片机中对以上所要移植文件的详细阐 述 os_cpu.h文件的移植 os_cpu.h中包括了用#define定义的与处理器相关的常量数据类型和宏定义这 里只对要移植部分做详细说明 移植1 w77e58单片机系统硬件堆栈的单元宽度为8比特 所以移植os_stk声明为 typedef unsigned char os_stk 移植2 和所有的实时内核一样 且c/os-ii 需要先禁止中断再访问代码的临界区 并且在访问完毕后重新允许中断这样就使得c/os-ii能够保护临界区代码免受多任务 郑州轻工业学院硕士学位论文 23 或中断服务程序isr的破坏针对w77e58单片机结合keil c51编译器可以通过指 令直接开关中断来实现 #define os_enter_critical() ea=0 /关中断 #define os_exit_critical() ea=1 /开中断 移植3绝大多数的微处理器的硬件堆栈的增长方向是从上往下但是w77e58单片 机的硬件堆栈恰恰相反是从下往上增长所以通过设置os_ stk_growth的值为0告 知c/os-ii内核 #define os_ stk_growth 0 /0=向上1=向下 移植4c/os-ii的原型是在intel 80 x86处理器上用borlandc/c+编译器的大模式 开发出来的原型中的任务级的任务切换os_task_sw()是通过软中断来实现但是 w77e58单片机不提供类似的软中断指令所以在移植中采用程序调用代替两者的堆 栈格式相同 #define os_task_sw() osctxsw() os_cpu_a.asm文件的移植 c/os-ii 的移植要求用户重新编写四个汇编函数 osstarthighrdy() osctxsw() osintctxsw()ostickisr()由于前三个函数的具体实现都依赖于任务堆栈和硬件堆栈 的结构所以下面先介绍在移植中针对 w77e58 单片机所设计的两种堆栈 keil c51编译器在缺省的条件下产生的代码是不可重入了 可以通过关键字reentrant 产生可重入代码但是为了使函数可重入函数的形参和局部变量必须保存在堆栈里 由于w77e58单片机的系统硬件堆栈太小 keil c51将根据不同的编译模式在相应的数据 空间中形成仿真堆栈 仿真堆栈的增长方向由上向下 与硬件堆栈的增长方向相反 keil c51针对大中小三种编译模式可以混合使用3种仿真堆栈 我们在设计中为了提高效率简化设计采用了keil c51的大模式编译在大模式 编译下 函数的返回地址保存在系统硬件堆栈里 形参和局部变量则存放在仿真堆栈中 仿真堆栈占用的是系统的外部数据空间通过变量?c_xbp实现寻址任务堆栈和系统 硬件堆栈的结构如图3-3 由图可知 任务堆栈中保存的仿真堆栈与系统硬件堆栈相向生长 中间为空闲间隔 显然c/os-ii内核中提供的堆栈检测函数ostaskstrchk()将失效这里使用了统一的固 定大小的任务堆栈空间尽管c/os-ii的原作者把不同任务使用不同大小的任务堆栈空 间看成优点但为了在51内核的单片机上有效的实现函数重入设计中并没有使用这个 优点任务堆栈空间的大小是可以精确计算出来的任务堆栈空间=系统硬件堆栈空间+ 郑州轻工业学院硕士学位论文 24 仿真堆栈空间系统硬件堆栈占用内部ram内部ram执行效率高如果空间过大 会影响keil c51编译的程序性能如果堆栈空间过小在中断嵌套和程序调用时会造成 系统崩溃综合考虑把系统硬件堆栈空间大小定成了64字节也可以根据实际情况自 行设定其它值 仿真堆栈大小取决于函数形参和局部变量的类型及数量 可以精确算出 因为所有任务堆栈使用相同大小的空间 所以占用空间最大的任务函数的空间大小为仿 真堆栈的空间大小这样用户堆栈空间大小就唯一确定了这里将任务堆栈空间大小用 宏定义在os_cfg.h文件中名为maxstksize可以根据实际情况移植 不关心 系统硬件堆栈用户堆栈 -1 低地址 0 1 osstkstart osstack sp 长 度 ?c_xbp高 ?c_xbp低 空闲间隔 每个任务一 个仿真堆栈 keil自动处 理 用户栈最高地址 ?c_xbp ostcbcur ostcbcur-ostcbstkptr 长 度 低地址 图3-3 系统硬件堆栈和任务堆栈结构图 移植5 osstarthighrdy()函数 该函数是由操作系统启动函数osstart()调用的功能是使系统能及时地运行优先级 最高的就绪任务由于指针ostcbhighrdy始终指向的是就绪任务中优先级最高的任务 控制块os_tcb使得osstarthighrdy()可方便的通过它获得最高优先级任务的栈顶指 针 再将保存在此任务堆栈中的寄存器值恢复到处理器寄存器中 使得该任务得以运行 实现多任务的启动对w77e58而言函数osstarthighrdy()的处理过程如下 void osstarthighrdy(void) 调用用户可自定义的函数ostaskswhook() 获取任务堆栈指针任务堆栈指针=ostcbhighrdy-ostcbstkptr 郑州轻工业学院硕士学位论文 25 要恢复内容的长度=任务堆栈起始地址中存放的内容 根据长度值 通过字节拷贝的方式将存放在系统xdata空间的任务堆栈的内容复 制到系统idata空间中的硬件堆栈内 恢复硬件堆栈指针sp和仿真堆栈?c_xbp的值 osrunning = true 对硬件堆栈执行自定义的宏操作popall恢复寄存器r0r7dphdpl bacc和psw 执行中断返回指令reti 移植6osctxsw()函数 该函数完成的是任务级的任务切换工作 其目的是为了保证处理器永远运行就绪表 中优先级最高的任务这跟osstarthighrdy()类似然而后者是由osstart()调用的 只是执行启动多任务的功能而osctxsw()是在任务调度函数ossched()中通过宏定义 os_task_sw()调用的执行的是多任务的调度功能不仅要使得高优先级任务得以恢 复运行还得将待切换出去的任务保存起来两者的差别也可以从程序的处理过程比较 出来 void osctxsw(void) 通过自定义的宏操作pushall将寄存器r0r7dphdplbacc和 psw保存到硬件堆栈中 获得硬件堆栈的长度=sp#osstkstart 根据获得的长度值将硬件堆栈中从地址osstack开始的内容通过字节拷贝 的方式复制到当前的任务堆栈中同时将仿真堆栈指针?c_xbp的值也复制到 任务堆栈中

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论