嵌入式软件设计.ppt

上传人:本田雅阁 文档编号:2605978 上传时间:2019-04-16 格式:PPT 页数:60 大小:2.28MB
返回 下载 相关 举报
嵌入式软件设计.ppt_第1页
第1页 / 共60页
嵌入式软件设计.ppt_第2页
第2页 / 共60页
嵌入式软件设计.ppt_第3页
第3页 / 共60页
亲,该文档总共60页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《嵌入式软件设计.ppt》由会员分享,可在线阅读,更多相关《嵌入式软件设计.ppt(60页珍藏版)》请在三一文库上搜索。

1、嵌入式软件开发,嵌入式软件系统特点(一),实时:允许的反应时间平均在1秒以内 稳定:必须能够长时间稳定运行(可靠性) 简单的内存写覆盖保护 内存定期回收能力 系统异常监控 热插拔、热备份 自恢复:系统异常具备重新运行的能力 软件狗 启动快,嵌入式软件系统特点(二),提供调试和监控手段(可维护性) Debug信息 系统参数监控 系统轨迹跟踪 DUMP功能 系统异常告警和异常现场记录 系统资源相对比较少 数据流程和控制流程分离,VxWorks的任务,优先级:0255(高低) 调度方式:抢占与非抢占 HOOK:创建前,切换,删除后 栈: 从低到高增长 一般不用太大,40K足够 不允许在函数中定义大的

2、数组,非抢占式下任务的特点,任务一旦获得CPU,将独占CPU,除了中断,其他系统任务在该任务没有释放CPU的情况下,将无法获得CPU的控制权 任务优先级表示任务重新调度时获得CPU的权力大小,非抢占式下任务的优缺点,优点: 任务独占CPU,任务间极少存在临界区,编程需要考虑保护的地方较少,可直接函数调用,对开发人员技术要求低 缺点: 独占性造成系统的实时性稍差,因此设计的时候需要任务采用在适当时间释放CPU的方式来增强系统的实时性,需要设计人员很有经验,对系统非常熟悉 系统出现异常的时候很难监测,非抢占式下任务的注意事项,绝对避免大循环和死循环的情况产生,要注意释放CPU,尤其是在处理的数据收

3、发的任务和路由任务中要更加注意,通常是在处理一定时间后delay一段时间 系统中可增加在中断中对任务占有时间的统计和监控,抢占式下任务的特点,高优先级任务可以抢占的优先级任务的CPU控制权,任务优先级表示任务抢占CPU的能力大小,抢占式下任务的优缺点,优点: 系统的实时性很好 监控比较方便 缺点: 系统的临界区很多,编程的时候要考虑保护,对开发人员的经验和技术要求比较高 设计不好,容易造成系统死锁或责系统颠簸,对设计人员的要求也比较高 问题查找不方便,抢占式下任务的注意事项,注意保护临界区,可采用的办法有任务锁,信号量,引用计数,消息,关中断 任务间的接口函数中不要直接使用指针进行操作,只能够

4、当成标识来使用 对数据结构的维护操作应该集中在一个任务中进行,最好是集中在低优先级的任务中,这样需要增加的保护可以很少 死循环也是不允许的,任务间共享区的保护,任务锁 信号量 引用计数 消息 关中断,任务锁,最简单,可用于对某一段代码的保护,几乎可以适用于所有的保护的地方,但是用于保护用时很长的操作过程的时候与系统的实时性会产生冲突 当前的系统中对任务锁不支持嵌套,因此在锁任务的程序中不要调用系统的输出、延迟等功能,信号量,用于保护系统的某段程序或者某一个数据结构的资源的独占性 使用比较方便,应用范围广泛,适用于对代码和整个数据结构的保护 占有系统资源比较大,不适于用在需要长时间锁定整表的地方

5、,但是如果用于表项的保护则会存在数量的限制(表项少可以,表项多不太合适) 使用不好可能造成系统死锁,最好不要在有互相调用关系的任务中使用信号量 出问题时查找问题比使用任务锁困难,引用计数,使用引用计数时必须使用原子操作 引用计数占有系统空间少,可用于保护表项和长时间占用的地方,可弥补信号量的缺陷 编程的时候比较复杂,需要增加相应的判断和处理 对表项的引用计数操作的地方越多,一旦出问题的时候查找起来就越困难,因此最好只用于必须使用的地方,并且简化引用关系,三个以内的地方操作引用计数是比较合适的,消息,其他任务对数据结构的操作过程都转换成消息发给一个模块进行处理,自然不存在共享区的问题 可以解决绝

6、大部分问题,但是编程复杂,并且对流程的冲击比较大,效率低,适用于: 时间要求不敏感,并且可以进行挂起或异步处理的地方:命令行、网管、任务监控等 任务本身对时间要求敏感,并且不要求回应结果的地方:定时器,中断,通讯任务等,任务的划分原则,任务是处理事务的单元,可以是多个功能的集合,是模块在系统中的体现。在任务的划分中,要体现数据流与控制流分离。任务要么完成控制功能,要么完成控制和数据转发功能,对后一种任务,需要提供两个入口将其两个流程分开,例如两个队列。注意Agent的处理应该是控制流。 在任务中,控制优先,必须先完成控制再处理转发 每一个任务必须要有一个逻辑实体用于对任务进行管理,通常是任务的

7、主函数,任务的优先级分配原则,系统中任务按功能特点可以分成 操作系统及定时器任务(030) 监控任务和设备管理任务等不经常执行的任务 协议和报文处理任务(120以上) 后台处理,日志等非紧急的任务 如果一个任务处理的事务包含了多个优先级,那么他应该划分成多个任务 可能长时间连续工作的任务应该优先级较低或定期释放CPU 如受外界攻击的任务会连续执行,要特别注意处理CPU占用问题。,抢占式下任务调度的灵活使用,优先级依赖:生产者P-消费者C C高于P: 优点:避免在P-C的队列中出现积压 缺点:C会立刻抢占,导致每个消息触发一次任务切换。 对控制消息OK,对报文处理不好。 P高于C: 反之 P=C

8、: 通常可行 互斥等候: 如果P可以挂起,则可在队列满时挂起,等候C将队列读出一部分。 动态调整: 如果系统本身要求P尽量快速响应,可以通过队列长度对任务优先级做动态调整。队列将满,就把P相对降低优先级。队列将空,恢复P的优先级。,任务的删除,系统的任务应该尽量做到不需要删除 如果确实需要进行任务删除操作,则必须再任务释放所有占有的相关资源后再进行删除,系统的层次划分,在当前的系统中,依照不同的功能实现,我们可以将系统的软件体系分成5个平面: 系统支撑平面:操作系统,设备管理 系统配置平面:命令行,SNMP 系统控制平面:系统的监控任务 系统数据转发平面:协议栈,路由,二层功能 系统业务平面:

9、接入业务,MPLS 当前的系统是一个立体的概念,不是平面的概念,模块的设计原则,数据与控制分离 松耦合,高内聚 简单(复杂的问题简单化) 高效 资源占用少 必要的冗余,模块间的关联,由于功能性质不同,不同层面的模块之间的关联是不一样的: 系统支撑和系统配置平面的模块可能与系统内各个模块都存在接口,但之间的接口不一定存在 系统数据转发和业务平面各自的内部接口比较多,与各个平面的接口也都存在。 系统监控模块用于监控系统的运行状况,不同的功能模块只与对应的模块产生接口,之间的接口很少,模块的平台化,系统中的所有模块,硬件相关性最大的是系统支撑平面的模块,然后是数据转发平面的模块,其他平面的模块基本上

10、不与硬件相关。实际上,通过设计,硬件相关性可以做到只与设备管理,二层模块,三层的一部分相关,其他的模块可以做到很少的硬件相关 平台化决定了各个模块之间必须是松耦合,高内聚的设计思想,模块间的接口不能有模块相关的情况 平台化也决定了系统是与操作系统无关的,因此对操作系统的调用要进行封装,使用自己的操作系统函数接口 平台化会造成模块产生一定的冗余代码,模块间的接口设计,不同的层次的决定了接口设计需要考虑的方面不同: 支撑平面与配置平面需要考虑接口的标准化和通用性,考虑与模块无关 设备管理,二层与硬件,三层与二层之间需要考虑将接口的抽象化,标准化。将动作归纳为读写和控制这几个接口,借鉴设备的思想 其

11、他模块之间必须考虑接口的模块无关性,不能在接口当中直接操作其他模块的指针和数据结构,模块间的数据结构封装,松耦合决定了模块不能之间操作其他模块的数据,只能够通过标识来进行间接操作 模块对模块内的数据结构的操作使用宏或者函数封装,对外则只提供标识,其他模块通过提供的标识和函数来间接操作这个数据结构,模块的需要完成的例行功能,模块的命令的处理(包括show run) 模块的网管功能处理 模块的Debug信息 模块的重要数据结构的DUMP功能 模块的热插拔处理 模块的热备份处理 模块的IPC处理 模块的初始化(要求每一个模块都必须使用函数初始化所有模块的全局变量),模块的内部处理顺序,模块的一般处理

12、顺序是: 前一次未完成的工作 控制消息队列 数据队列 其他 一般控制消息队列建议建立多个优先级队列,针对不同模块来的控制信息进行优先级分类处理,效率优化,对于数据转发流程,一定要考虑效率 对于大数据量操作的流程和模块,也一定要考虑效率: 定时器队列操作 表项查找 嵌入式系统的启动速度越快越好,因此处于启动流程中的模块功能也需要考虑效率 高效与简单是对立的,与资源占用也是对立的,需要综合考虑 常用的提高效率的办法: Hash Hash链表 减少报文的拷贝,模块的资源占有,嵌入式系统相对资源比较少 模块的资源评估是必须的 评估模块达到设计目标时占用的资源大小,有助于我们确定模块的实现方案,综合考虑

13、模块的效率和资源占用情况的方案才是比较合适的方案,系统的特殊部件,中断 定时器 软件狗 IDLE任务,中断,与中断的接口程序中必须关中断 中断是系统中优先级最高的任务 大量的中断对CPU的占用是很可怕的,要控制中断的数目 关中断的时间不能很长,中断中对太长的用户操作应该发消息将操作转移到其他任务中做 对接口中断最好使用轮讯机制来替代,避免线路不稳造成中断过多,定时器,定时器任务应该是系统中除中断外优先级最高的任务 完成对系统的定时器功能 定时器内部不能存在太长的用户操作,太长的用户操作应该发消息将操作转移到其他任务中做 定时器与其他模块之间最好采用消息接口,以保证系统的实时性和任务优先级的权威

14、性,软件狗,系统中必须存在软件狗,以保证在故障的时候能够使设备继续工作,系统异常启动时最好能够不进行系统的启动信息输出,IDLE任务,用于完成对系统的空闲计数,可用于进行CPU效率的统 计,可靠性设计,硬件的可靠性设计 电源冗余备份 风扇冗余备份 支持热备份 支持热插拔 软件的可靠性设计 简单的内存覆盖保护 内存回收 松耦合 系统定期状态同步 异常攻击保护 多队列设计 宏,热备份,系统可以存在多个主控制单元,当一个控制单元失效,其他单元可以主动获得系统的控制权,保证系统的持续运行 硬件需要提供对热备份支持 各个主控单元之间要进行定期的通讯检测 软件系统需要提供相应的支持,热备份实现方案(一),

15、系统的两个主控之间只进行配置的同步,其他的运行状态不同步 相当与系统重新启动,但是速度更快 业务板上的系统如果与主控关联小,尽量做到切换时不重启 工作量最小,只需要命令行和热备份模块参与,系统的延续性不够,我们称为冷备份,系统的两个主控之间进行配置同步和简单的状态同步。模块产生的动作被同步到另一块上同样执行一遍 系统的延续性比较好,基本上是切换的检测时间,业务板应该要做到切换时不重启 协议栈四层以下的模块容易做到状态同步,对模块的设计有一定的要求,热备份模块只是提供通道功能,有一定的工作量,我们可以称为温备份 四层以上的模块完全同步几乎不可能,设计很复杂,没有必要考虑,因此没有完全的热备份,热

16、备份实现方案(二),热插拔,系统能够在运行时支持单板的插入拔出功能,并完成该板对应的配置恢复 热插拔有利于系统的升级 系统的整体稳定性可以得到提高 热插拔的实现困难在于单板相关的配置恢复,热插拔实现方案(一),系统的各个模块自身保留对应的单板控制实体和相关配置,但是对外不可见,单板插入的时候通知配置恢复。 系统启动的时候配置恢复困难 关联的模块很多,并且对各个模块原有的流程冲击很大 模块配置恢复的时候需要判断配置存在的前提环境是否依旧存在 重要的参与模块:命令行和设备管理,热插拔实现方案(二),系统的各个模块在单板拔出时将配置重新build,反馈回命令行,然后删除对应的实体和配置 命令行对每一

17、单板提供一个配置命令缓冲区,当单板插入时使用该缓冲区的命令恢复配置 各个模块对现有的流程冲击比较少,命令行和设备管理增加复杂度,设备管理需要提供虚设备的功能,简单的内存写覆盖保护,系统自身进行内存的管理和分配机制 系统分配出去的内存前后进行空间预留,长度不超过此空间预留的覆盖可以做到保护 可以实现内存写覆盖告警,内存回收,系统自身管理内存 对分配的内存打上时间标签,系统进行时间设定,超过此预设时间的内存进行回收 简单:系统回收前不进行确认 复杂:系统回收前根据ModuleID进行确认,各个模块需要提供确认接口,报文占用的空间在模块间传递前需要修改ModuleID,系统定期状态同步,系统的运行中

18、,不同模块间的相同状态可能产生不同步 分布式系统中的主控板和业务板之间 端口的UPDOWN状态 各个硬件表与Shadow表之间 两个主控板之间 定期同步可以避免不同步加剧,异常攻击保护,系统对可能产生大流量数据和控制消息的地方都需要考虑强壮性 半连接攻击 特定报文流量攻击 ARP扫描攻击 DOS攻击 考虑方法: 队列优先级,流控 关中断 任务优先级调整 资源限制 屏蔽不需要处理的报文:IPX,未知单播,多队列设计,针对消息优先级和报文优先级设置多个队列,避免丢失最重要的信息 系统内部产生的消息都需要可控,平滑 SNMP可能产生大规模的查询消息,SNMP必须将消息串行化,并控制每秒的消息处理条数

19、 定时器的消息一定不能丢失,定时器消息一定要精简 消息队列大小一定要估算好,消息队列的冗余是允许的,宏,宏尤其是常量宏的使用将有助于减少环境变量改变带来的错误,并且可以增加模块的适应性,系统异常跟踪调试手段,越丰富越好 DUMP ASSERT Syslog信息 系统轨迹跟踪 系统例外信息保存 堆栈反向查找 Debug信息 MMU CPU占用率 集成Shell,系统轨迹跟踪,任务切换轨迹 消息转发轨迹 信号量的使用轨迹 内存使用轨迹,Debug信息,每一个模块都必须产生Debug信息 状态迁移 报文接收和处理转发 异常处理 信息过多,需要提供 字符串过滤功能 端口级的Debug,操作硬件,对硬件

20、的操作尽可能得少,如果存在软件表就不要去读硬件表 对芯片的响应尽可能快 对可能造成芯片死锁的情况要严格避免,芯片控制表的维护,尽可能做到Shadow表和硬件表的同步,不同步需要评估影响 表项要做到自恢复 某些地方可能需要增加复杂度,提高处理智能:路由表,其他,系统初始化 命令风格统一和输出正确的信息 编程规范 兼容与扩展 静态数组 RFC,系统初始化,各个模块必须进行使用函数初始化所有的全局变量 与初始化相关的流程必须提高效率 异常启动时不要输出启动信息 完成配置恢复 硬件Enable操作必须在启动的最后一项进行,命令风格统一和输出正确的信息,产品系列的命令统一可以提高产品形象 命令统一 命令

21、注解统一 输出的信息要检查单词和语法的正确性 平台化 多交流 定期检查,编程规范,好的编程风格可以减少低级错误的发生,越难查的问题产生问题的原因越简单 强调: 指针只有在初始化后才可以使用 申请空间后必须判断申请是否成功 如果一个指针需要循环使用,那么它在使用Free函数后必须置NULL 局部指针申请的空间在退出函数前要释放 变量用于做数组的下标前必须保证变量值在下标范围内,兼容与扩展,系统的设计要考虑兼容以前在市场上应用的硬件,如果确实不能兼容,必须明确切换时间,提供版本配套表 对类似Client和Server这种模式的模块,重新设计的时候一定要考虑向前兼容 802.1x与客户端 H.link SNMP 自定义的报文格式一定要考虑扩展: 长度扩展 操作码扩展:2byte 基本类型 1byte 扩展类型 1byte,静态数组,对重要的,固定的数据结构,可以考虑使用静态数组 VLAN Port 设备管理的实体 硬件Shadow表,RFC,RFC非常松散,常用should be、suggest,而极少Must be 建议可省的一定有人省,我们不能对可省项严格检查 建议可以这么做的一定有人做,我们一定要考虑兼容 对内容没什么建议的我们一定不要检查内容 标明可扩展的我们最好能够设计命令可配 对可有可无的返回信息一定要设置开发进行控制 RFC至少要看三遍:编码前,自测时,联调时,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1