EDN首页   博客首页

2

关于投票
Cyclone III配置芯片选择参考
     Cyclone III以下配置文件大小是原始文件大小,未经压缩的。压缩比例一般在33%-50%左右。  
       EP3C5---2.8Mbits
       EP3C10--2.8Mbits
       EP3C16--3.9Mbits
       EP3C25--5.5Mbits
       EP3C40--9.1Mbits
       EP3C55--14.2Mbits
       EP3C80--19.0Mbits
       EP3C120--27.2Mbits
系统分类: CPLD/FPGA
用户分类: FPGA
标签: 无标签
来源: 原创
发表评论 阅读全文(248) | 回复(0)

2

关于投票
ARP协议分析

 

ARP(AddressResolutionProtocol)地址解析协议用于将计算机的网络地址(IP地址32位)转化为物理地址(MAC地址48位)[RFC826]。ARP协议是属于链路层的协议,在以太网中的数据帧从一个主机到达网内的另一台主机是根据48位的以太网地址(硬件地址)来确定接口的,而不是根据32位的IP地址。内核(如驱动)必须知道目的端的硬件地址才能发送数据。当然,点对点的连接是不需要ARP协议的。

ARP协议的数据结构:
typedefstructarphdr
{
unsignedshortarp_hrd;/*硬件类型*/
unsignedshortarp_pro;/*协议类型*/
unsignedchararp_hln;/*硬件地址长度*/
unsignedchararp_pln;/*协议地址长度*/
unsignedshortarp_op;/*ARP操作类型*/

unsignedchararp_sha[6];/*发送者的硬件地址*/
unsignedlongarp_spa;/*发送者的协议地址*/
unsignedchararp_tha[6];/*目标的硬件地址*/
unsignedlongarp_tpa;/*目标的协议地址*/
}ARPHDR,*PARPHDR;

为了解释ARP协议的作用,就必须理解数据在网络上的传输过程。这里举一个简单的PING例子。
假设我们的计算机IP地址是192.168.1.1,要执行这个命令:ping192.168.1.2。该命令会通过ICMP协议发送ICMP数据包。该过程需要经过下面的步骤:
1、应用程序构造数据包,该示例是产生ICMP包,被提交给内核(网络驱动程序);
2、内核检查是否能够转化该IP地址为MAC地址,也就是在本地的ARP缓存中查看IP-MAC对应表;
3、如果存在该IP-MAC对应关系,那么跳到步骤9;如果不存在该IP-MAC对应关系,那么接续下面的步骤;
4、内核进行ARP广播,目的地的MAC地址是FF-FF-FF-FF-FF-FF,ARP命令类型为REQUEST(1),其中包含有自己的MAC地址;
5、当192.168.1.2主机接收到该ARP请求后,就发送一个ARP的REPLY(2)命令,其中包含自己的MAC地址;
6、本地获得192.168.1.2主机的IP-MAC地址对应关系,并保存到ARP缓存中;
7、内核将把IP转化为MAC地址,然后封装在以太网头结构中,再把数据发送出去;

使用arp-a命令就可以查看本地的ARP缓存内容,所以,执行一个本地的PING命令后,ARP缓存就会存在一个目的IP的记录了。当然,如果你的数据包是发送到不同网段的目的地,那么就一定存在一条网关的IP-MAC地址对应的记录。

知道了ARP协议的作用,就能够很清楚地知道,数据包的向外传输很依靠ARP协议,当然,也就是依赖ARP缓存。要知道,ARP协议的所有操作都是内核自动完成的,同其他的应用程序没有任何关系。同时需要注意的是,ARP协议只使用于本网络。

ARP协议的利用和相关原理介绍。

一、交换网络的嗅探

ARP协议并不只在发送了ARP请求才接收ARP应答。当计算机接收到ARP应答数据包的时候,就会对本地的ARP缓存进行更新,将应答中的IP和MAC地址存储在ARP缓存中。因此,在上面的假设网络中,B向A发送一个自己伪造的ARP应答,而这个应答中的数据为发送方IP地址是192.168.10.3(C的IP地址),MAC地址是DD-DD-DD-DD-DD-DD(C的MAC地址本来应该是CC-CC-CC-CC-CC-CC,这里被伪造了)。当A接收到B伪造的ARP应答,就会更新本地的ARP缓存,将本地的IP-MAC对应表更换为接收到的数据格式,由于这一切都是A的系统内核自动完成的,A可不知道被伪造了。

ARP欺骗的主要用途就是进行在交换网络中的嗅探。有关交换网络的嗅探不是本文的讨论内容。

二、IP地址冲突

我们知道,如果网络中存在相同IP地址的主机的时候,就会报告出IP地址冲突的警告。这是怎么产生的呢?

比如某主机B规定IP地址为192.168.0.1,如果它处于开机状态,那么其他机器A更
改IP地址为192.168.0.1就会造成IP地址冲突。其原理就是:主机A在连接网络(或更改IP地址)的时候就会向网络发送ARP包广播自己的IP地址,也就是freearp。如果网络中存在相同IP地址的主机B,那么B就会通过ARP来reply该地址,当A接收到这个reply后,A就会跳出IP地址冲突的警告,当然B也会有警告。

因此用ARP欺骗可以来伪造这个ARPreply,从而使目标一直遭受IP地址冲突警告的困扰。

三、阻止目标的数据包通过网关

比如在一个局域网内通过网关上网,那么连接外部的计算机上的ARP缓存中就存在网关IP-MAC对应记录。如果,该记录被更改,那么该计算机向外发送的数据包总是发送到了错误的网关硬件地址上,这样,该计算机就不能够上网了。

这里也主要是通过ARP欺骗进行的。有两种办法达到这样的目的。

1、向目标发送伪造的ARP应答数据包,其中发送方的IP地址为网关的地址,而MAC地址则为一个伪造的地址。当目标接收到该ARP包,那么就更新自身的ARP缓存。如果该欺骗一直持续下去,那么目标的网关缓存一直是一个被伪造的错误记录。当然,如果有些了解的人查看ARP-a,就知道问题所在了。

2、这种方法非常狠,欺骗网关。向网关发送伪造的ARP应答数据包,其中发送方的IP地址为目标的IP地址,而MAC地址则为一个伪造的地址。这样,网关上的目标ARP记录就是一个错误的,网关发送给目标的数据报都是使用了错误的MAC地址。这种情况下,目标能够发送数据到网关,却不能接收到网关的任何数据。同时,目标自己查看ARP-a却看不出任何问题来。

四、通过ARP检测混杂模式节点

在混杂模式中,网卡进行包过滤不同于普通模式。本来在普通模式下,只有本地地址的数据包或者广播(多播等)才会被网卡提交给系统核心,否则的话,这些数据包就直接被网卡抛弃。现在,混合模式让所有经过的数据包都传递给系统核心,然后被sniffer等程序利用。
通过特殊设计的ARP请求可以用来在一定程度上检测处于混杂模式的节点,比如对网络中的每个节点都发送MAC地址为FF-FF-FF-FF-FF-FE的ARP请求。对于网卡来说这不是一个广播地址(FF-FF-FF-FF-FF-FF),所以处于普通模式的节点就会直接抛弃该数据包,但是多数操作系统核心都认为这是一个广播地址,如果有一般的sniffer程序存在,并设置网卡为混杂模式,那么系统核心就会作出应答,这样就可以判断这些节点是否存在嗅探器了。

可以查看,很多基于ARP的攻击都是通过ARP欺骗实现的。至于ARP欺骗的防范,还是尽可能使用静态的ARP。对于WIN,使用arp-s来进行静态ARP的设置。当然,如果能够完全使用静态的IP+MAC对应,就更好了,因为静态的ARP缓存只是相对的。

当然,可以有一些方法来实现ARP欺骗的检测。设置一个ARP的嗅探器,其中维护着一个本地网络的IP-MAC地址的静态对应表,查看所有经过的ARP数据,并检查其中的IP-MAC对应关系,如果捕获的IP-MAC对应关系和维护的静态对应关系对应不上,那么就表明是一个欺骗的ARP数据包了。

一个ARP数据包发送程序源代码和编译好的EXE程序可以参考ARPSender程序。注意:需要先安装WinPcap。
系统分类: 通信网络
用户分类: 自动控制
标签: 无标签
来源: 转贴
发表评论 阅读全文(192) | 回复(0)

2

关于投票
VoIP协议标准浅析
1、H.323协议

  H.323协议是目前在VoIP网络中被用得最广泛的一种信令协议,其作用范围如图1所示。这一体系结构包括了H.323终端、网关、关守及多点控制单元(MCU)。H.323的总体目标实现H.323端点之间媒体流交换。



图1 H.323的范围及H.323终端的交互

  其中,H.323终端是与其他H.323端点进行实时通信的端点;网关是在H.323网络和其他类型网络之间提供转换服务的H.323端点,网关两侧信令协议及媒体格式之间的转换在网关内部进行;关守在H.323网络中,是一个可选实体,存在时,可以控制(指对来自一个或多个端点的访问进行授权,并可允许或拒绝端点发来的任何呼叫)许多H.323终端、网关和多点控制器;多点控制器(MC)是一个管理多个终端和/或网关之间多点会议的H.323端点。MC指出可被各个实体共享的媒体,还可以改变资源的配置。MC的位置,可以被安置在一个独立的MCU中,也可以与网关、关守或H.323终端等实体结合在一起。

  H.323协议是一个庞大的协议族,包括许多相关的协议,形成了一个协议栈,如图2所示。媒体交换是通过运行在UDP上的RTP来实现的,只要有RTP则RTCP是不可少的。RTP协议为音频、视频等实时数据提供端到端的传递服务,可以向接收端点传送恢复实时信号必需的定时和顺序信息,RTCP协议能向收发双方和网络运营者提供QoS的监测手段。



图2 H.323协议栈

  实际中在H.323端点之间交换的消息是由H.225.0和H.245这两个协议定义。H.225.0协议包括两个部分,一部分是IUT-T Q.931建议的变体,用于在H.323端点之间建立以及拆除连接,被称作呼叫信令或是Q.931信令。另一部分被称作登录、许可和状态(RSA)信令,用于端点和关守之间,使关守用该信令来许可或是拒绝端点对网络资源的访问。H.245是用于两个或多个端点之间的控制协议,它可以确保一个实体只发送能够被另一个实体接收和理解的媒体,其运行在端点之间的一条或多条逻辑信道上。

  上述这三个信令协议——RAS,Q.931和H.245,可用来建立呼叫、维持呼叫和拆除呼叫。不同协议消息的传递是交替进行的,图3简单描述了一个呼叫的建立过程以及呼叫过程中各相关协议的控制作用。可以这样理解:当一个端点想要与另一个端点建立呼叫时,首先,源端点使用RAS信令来从一个关守那里获得许可;然后,源端点用Q.931信令来建立与目的端点的通信;最后,源端点使用H.245控制信令与目的端点协商媒体参数并建立媒体传送。



图3 呼叫过程与协议控制

2、SIP协议

  SIP是由IETF开发的一种信令协议,用来处理多媒体会话的建立、更改、拆卸,与其他协议比较,SIP描述了潜在的会话参与者的会话特征。SIP中定义了两类基本的网络实体,客户机和服务器。客户机是指为了向服务器发送请求而与服务器建立连接的应用程序,服务器是用于向客户机发出的请求提供服务并回送应答的应用程序。共有四种不同类型的服务器:

  (1)用户代理服务器:当接到SIP请求时它联系用户,并代表用户返回响应。

  (2)代理服务器:代表其他客户机发起请求,既充当服务器又充当客户机的媒介程序。在转发请求之前,它可以改写原请求消息中的内容。

  (3)重定向服务器:它接收SIP请求,并把请求中的原地址映射成零个或多个新地址,返回给客户机。

  (4)注册服务器:它接收客户机的注册请求,完成用户地址的注册。

  SIP网络实体之间的沟通是由SIP消息来完成,其语法构成是基于文本的,可以分为两类消息类型,即请求消息和回应消息。

  每个消息都是由一个起始行,零个或多个首部和任意的消息体组成。对于请求消息,起始行为请求行,规定了所提交请求的类型,语法结构为:request-line=method SP Request URI SP SIP-Version CRLF,其中定义了7种方法,名称和描述如表1所示。对于回应消息,起始行为状态行,指出某个请求是成功还是失败,语法结构为status-line=SIP version SP status code DP reason-phrase CRLF,基中定义了状态代码,它的值在100和699之间,第一个数字表示回应的级别,不同级别的说明如表2所示。消息首部提供了关于请求或回应的更多信息以及用来承载额外信息的方式。消息体通常描述将要建立的会话类型,但SIP并不定义消息体的结构或内容,它是由另一个不同的协议来描述,最常见的为SDP(会话描述协议)。

表1 SIP请求方法描述

方法   说明
INVITE   用来回应呼叫用户的一个请求
ACK   用来初始化一个会话
BYE   结束一个已连接的呼叫
CANCLE   用于取消一个已发出但未连接的呼叫
REGISTER   用于向注册服务器注册客户端的相关信息
OPTI0N   用于查询服务器的相关信息和功能
INF0   用来送出通信中的资讯但并不改变任何通信的状态


表2 SIP请求方法描述

状态码  描述
1XX   通知
2XX   成功
3XX    重定向
4XX   请求失败
5XX   服务器错误
6XX   全局性错误


  SIP协议支持三种呼叫方式,用户代理客户机向用户代理服务器直接呼叫,用户代理客户机在重定向服务器辅助下重定向呼叫,由代理服务器代表用户客户机向被叫发起呼叫。以应用代理服务器为例,说明一个简单呼叫的建立过程,如图4所示。



图4 代理服务器建立呼叫过程

3、H.323协议与SIP协议的比较

  (1)两种协议的编码机制不同,H.323是使用二进制编码方式,实现比较复杂,而SIP是基于文本的协议,实现简单。

  (2)SIP会话请求过程和媒体协商过程等是一起进行的,因此呼叫建立时间短,而在H.323中呼叫建立过程和进行媒体参数等协商的信令控制过程是分开进行的。

  (3)H.323中定义了专门的协议用于补充业务,而SIP只要充分利用已定义的头域,必要时对头域进行简单扩展就能很方便地支持补充业务或智能业务,可扩展性强。

  (4)H.323进行集中,层次式控制,而SIP类似于其他的Internet协议,设计上就为分布式的呼叫模型服务的,具有分布的组播功能。

  总之,H.323沿用的是传统的电话信令模式,符合通信领域传统的设计思想,已被广泛接受,应用比较成熟。而SIP协议借鉴了互联网的标准和协议的设计思想,简单、灵活等特点正吸引着越来越多的设备厂商关注和支持,并逐渐成为未来发展的方向,但还不够成熟。目前,这两种协议都在积极的寻求改进,很长时间内将在VoIP服务中共存。
系统分类: 通信网络
用户分类: ARM
标签: 无标签
来源: 转贴
发表评论 阅读全文(148) | 回复(0)

1

关于投票
RTP协议
        RTP:实时传输协议
       
(RTP:Real Time Transport Protocol)

  实时传输协议 RTP 为数据提供了具有实时特征的终端对终端传送服务,如在组播或单播网络服务下的交互式式视频音频或仿真数据。应用程序在 UDP 上执行 RTP 以便使用其多路技术和检验和服务;还有传输协议函数的协议捐助部分。但是 RTP 可以与其它适合的底层网络或传输协议共同使用。如果底层网络提供组播分配,那么 RTP 可以使用该组播分配支持多路目标文件的数据传输。

  RTP 本身并没有为及时传送提供任何机制或其它质量服务 QoS 保证,但它依赖于低层服务去实现这一过程。RTP 并不能保证传送过程或防止无序传送,也不能确定底层网络的可靠性。RTP 实行有序传送,RTP 中的序列号允许接收方重建发送方的包序列,同时序列号也能用于决定适当的包位置,例如在视频译码中,不需要顺次解码。

  RTP 由两个相近链接部分组成:

  • RTP:传送具有实时属性的数据;
  • RTP 控制协议 RTCP:监控服务质量并传送正在进行的会话参与者的相关信息。RTCP 第二方面的功能应用于松散受控会话是足够的,也就是说,在没有明确的控制成员和组织的情况下,它并不用来支持一个应用程序的所有控制通信请求。

协议结构

1 2 3 8 9 16bit
V P X CSRC Count M Payload Type
Sequence number Timestamp
SSRC CSRC (variable 0 – 15 items 32bits each)

  • V ― 版本。识别 RTP 版本。
  • P ― 间隙(Padding)。设置时,数据包包含一个或多个附加间隙位组,其中这部分不属于有效载荷。
  • X ― 扩展位。设置时,在固定头后面,根据指定格式设置一个扩展头。
  • CSRC Count ― 包含 CSRC 标识符(在固定头后)的编号。
  • M ― 标记。标记的解释由 Profile 文件定义。允许重要事件如帧边界在数据包流中进行标记。
  • Payload Type ― 识别 RTP 有效载荷的格式,并通过应用程序决定其解释。Profile 文件规定了从 Payload 编码到 Payload 格式的缺省静态映射。另外的 Payload Type 编码可能通过非 RTP 方法实现动态定义。
  • Sequence Number ― 每发送一个 RTP 数据包,序列号增加1。接收方可以依次检测数据包的丢失并恢复数据包序列。
  • Timestamp ― 反映 RTP 数据包中的第一个八位组的采样时间。采样时间必须通过时钟及时提供线性无变化增量获取,以支持同步和抖动计算。
  • SSRC ― 同步源。该标识符随机选择,旨在确保在同一个 RTP 会话中不存在两个同步源具有相同的 SSRC 标识符。

系统分类: 通信网络
用户分类: 无分类
标签: 无标签
来源: 转贴
发表评论 阅读全文(149) | 回复(0)

2

关于投票
μC/OS—II下中断服务程序和外设驱动的开发(2)
3 串口通信模块的设计

每个串行端口有两个环状队列缓冲区,同时有两个信号量:一个用来指示接收字节,另一个用来指示发送字节。每个环状缓冲区有以下四个要素:
    ◇存储数据(INT8U数组);
    ◇包含环状缓冲区字节数的计数器;
    ◇环状缓冲区中指向将被放置的下一字节的指针;
    ◇环状缓冲区中指向被取出的下一字节的指针。

图3是接收数据软件模块的流程图。SerialGetehar()用来获取接收到的数据,如果缓冲区已空时将任务挂起,接收到字节时,任务将被唤醒,同时从串行口接收字节。SerialPutRxChar()用来将接收的字节放到缓冲区中,如果接收缓冲区已满,则该字节被丢弃。当字节插入到缓冲区中,SerialPutRxChar()通知数据接收信号量,使之将数据己到的消息传达给所有等待的任务。为防止挂起应用任务,可以通过调用SceiallsEmPty()去发现环状队列中是否有字节。

图4是发送数据模块的流程图。当需要发送数据给串行端口时,SerialPurChar()等待信号量在初始化发送信号量时应该初始为缓冲区的大小。因此,当缓冲区中没有更多空间时,SerialPutChar()就挂起任务,只要UART再次发送字节,挂起任务就将恢复。SerialGctChar()被中断服务程序调用,如果发送缓冲区至少还有一个字节,Seri-a1GetChar()就返回一个从缓冲区发送的字节。如果缓冲区己空,则SerialGetChar()返回Null,这将使调用停止进一步的发送中断,一直到有数据发送为止。

4 异步串行通信的接口函数

应用任务可以通过如下的几个函数来控制和访问UART:SerialCfgPort()、SerialGetChar()、SerialInit()、SerialIsEmpty()、SerialIsFull()和SerialPutChar()。

SerialCfgPort()用于建立串行端口的特征,在为指定端口调用其他服务前,必须先调用该函数,包括确定波特率、比特数、奇偶校验和停止位等。

SerialGetChar()使应用程序从接收数据的环状缓冲区中取出数据。

SerialInit()用于初始化整个串口软件模块,且必须在该模块提供的其他任何服务前调用。SeriallInit()将环状缓冲区计数器的字节数清零,并初始化每个环状缓冲区的IN和OUT指针,指向数据存储区的开始处。数据接收信号量初始化为0,表示在环状缓冲区无数据。用传送缓冲区大小初始化数据传送信号量,表示缓冲区已空。

SerialIsEmpty()允许应用程序确定是否有字节从串口接收进来。本函数允许在无数据时避免将任务挂起。

SerialIsFull()允许应用程序确定传送环状缓冲区的状态,本函数可以在缓冲区已满时避免将任务挂起。

SerialPutChar()允许应用程序向一个串行端口发送数据。

结 语

该串口通信模块充分利用了实时内核的任务调度功能和信号量机制,系统软件模块化,可读性增强,便于修改和移植,其设计思路和方法可以很好的应用在多种情况下的测控系统中,系统的扩展方便,具有一定的借鉴作用。该串口通信模块已作为某铁路供水远程控制终端的一部分,运行稳定,提高了整个系统的运行效率和实时性。

------------

关于μC/OS-II系列软件版权的说明  

Micrium 公司产品包括μC/OS-II,μC/GUI,uC/FS,μC/TCP-IP,μC/USB等。Micrium 公司提供嵌入式系统应用方面的产品,并对其软件拥有知识产权。Micrium花费了大量的时间和财力为嵌入式领域提供高质量的软件产品。所有上述产品都以源代码的形式提供给客户,具有极大的适用性。产品不是免费软件,也不是开放源码的软件,因此,不能免费使用,需要清楚的阐明μC/OS-II和系列的软件不是开放源码的免费软件,这是和Linux完全不一样的。  

开发和研究者可以通过购买Micrium公司的Jean先生的μC/OS-II的书籍,而得到μC/OS-II源代码,但是仅可以作为个人和学校学习使用,所有和μC/OS-II直接和间接相关的商业目的行为,必须购买使用μC/OS-II及系列产品的商业授权,包括芯片/单板/系统厂家的任何参考设计,教学设备和最终的产品,如果没有得到Micrium公司Jean先生签字的合法授权都是不合法的使用, 这在μC/OS-II的书籍Micrium公司(www.micrium.com)和中国代理商-北京麦克泰软件公司网站(www.bmrtech.com)上面中有明确规定。  

Micrium公司其它软件如μC/GUI,μC/FS,μC/TCP-IP,μC/USB 等的销售模式与μC/OS-II不同,如果没有购买使用授权,完全不可以拥有该源代码,也不能将源代码用于产品的设计,培训,教学和生产。  

μC/OS-II, μC/GUI,μC/FS,μC/TCP-IP,μC/USB 等授权方式有:单个产品、产品线(系列)、按照CPU 划分的产品三种形式,μC/OS-KA,μC/OS-VIEW 等工具是按照使用人的数目收取费用的,相对起传统的RTOS 动辄2-3万美圆的开发费用和每块单板的使用费(根据数量从数百到几个美圆),μC/OS-II及系列产品是采用一次性的收费方式,应该只是大约相当于传统RTOS 的10-20% 的总体费用。

来源:www.edires.net
系统分类: ARM
用户分类: ARM
标签: 无标签
来源: 转贴
发表评论 阅读全文(141) | 回复(0)

2

关于投票
μC/OS—II下中断服务程序和外设驱动的开发(1)
在嵌入式应用中,使用RTOS的主要原因是为了提高系统的可靠性,其次是提高开发效率、缩短开发周期。μC/OS-II是一个占先式实时多任务内核,使用对象是嵌入式系统,对源代码适当裁减,很容易移植到8~32位不同框架的微处理器上。但μC/OS-II仅是一个实时内核,它不像其他实时操作系统(如嵌入式Linux)那样提供给用户一些API函数接口。在μC/OS-II实时内核下,对外设的访问接口没有统一完善,有很多工作需要用户自己去完成。串口通信是单片机测控系统的重要组成部分,异步串行口是一个比较简单又很具代表性的中断驱动外设。本文以单片机中的串口为例,介绍μC/OS—II下编写中断服务程序以及外设驅动程序的一般思路。

1 μC/OS-II的中断处理及51系列单片机中断系统分析

    μC/OS-II中断服务程序(ISR)一般用汇编语言编写。以下是中断服务程序的步骤。
    保存全部CPU寄存器;调用OSIntEnter()或OSIntNesting(全局变量)直接加1;
    执行用户代码做中断服务;
    调用0SIntExit();
    恢复所有CPU寄存器;
    执行中断返回指令。

μC/OS-II提供两个ISR与内核接口函数;OSIntEnter()和OSIntExit()。OSIntEnter()通知μC/OS—II核,中断服务程序开始了。事实上,此函数做的工作是把一个全局变量OSIntNesting加1,此中断嵌套计数器可以确保所有中断处理完成后再做任务调度。另一个接口函数OSIntExit()则通知内核,中断服务已结束。根据相应情况,退回被中断点(可能是一个任务或者是被嵌套的中断服务程序)或由内核作任务调度。

用户编写的ISR必须被安装到某一位置,以便中断发生后,CPU根据相应的中断号运行准确的服务程序。许多实时操作系统都提供了安装和卸载中断服务程序的API接口函数,但μC/OS—II内核没有提供类似的接口函数,需要用户在对CPU的移植中自己实现。这些接口函数与具体的硬件环境有关,接下来以51单片机下的中断处理对此详细说明。

51单片机的中断基本过程如下:CPU在每个机器周期的S5P2时刻采样中断标志,而在下一指令周期将对采样的中断进行查询。如果有中断请求,则按照优先级高低的原则进行处理。响应中断时,先置相应的优先级激活触发器于相应位,封锁同级或低级中断,然后根据中断源类别,在硬件控制下,将中断地址压入堆栈,并转向相应的中断向量入口单元。通常在入口单元处放一跳转指令,转向执行中断服务程序.当执行中断返回指令RETI时,把响应中断时所置位的优先级激活触发器清零后,从堆栈中弹出被保护的断点地址,装入程序计数器PC,CPU返回原来被中断处继续执行程序。

在移植的过程中,采用Keil C51作为编译环境。KeilC5l集成C编译和汇编器。中断子程序用汇编语言编写,放到移植μC/0S—II后的OS_CPU_A.ASM汇编文件中。下面是以串行口中断为例的移植中断服务子程序代码。
    CSEGAT0023H ;串口中断响应入口地址
    LJMPSerialISR;转移到串口中断子程序入口地址
    RSEG?PR?SeriallSR?OS_CPU_A
    SerialISR:
    USINGO
    CLR EA ;先关中断,以防中断嵌套
    PUSHALL ;已定义的压栈宏,用于将
   CPU寄存器的值压入堆栈
    LCALL_?OSIntEnter ;监视中断嵌套
    LCALL_?Serial ;串口中断服务程序
    LCALL_?OSintExlt
    SETBEA
    POPALL;已定义的出栈宏,将CPU寄存器的值出栈
    RETI

2 串口驱动程序

笔者已在5l单片机上成功移植了μC/0S-II内核,移植过程在此不再讨论。这里重点分析μC/0S—II内核下串口驱动程序编写。

由于串行设备存在外设处理速度和CPU速度不匹配的问题,所以需要一个缓冲区.向串口发送数据时,只要把数据写到缓冲区中,然后由串口逐个取出往外发。从串口接收数据时,往往等收到若干个字节后才需要CPU进行处理,所以这些预收的数据可以先存于缓冲区中。实际上,单片机的异步串口中只有两个相互独立、地址相同的接收、发送缓冲寄存器SBUF。在实际应用中,需要从内存中开辟两个缓冲区,分别为接收缓冲区和发送缓冲区。这里把缓冲区定义为环形队列的数据结构。

μC/OS-II内核提供了信号量作为通信和同步的机制,引入数据接收信号量、数据发送信号量分别对缓冲区两端的操作进行同步。串口的操作模式如下:用户任务想写,但缓冲区满时,在信号量上睡眠,让CPU运行别的任务,待ISR从缓冲区读走数据后唤醒此睡眠的任务;同样,用户任务想读,但缓冲区空时,也可以在信号量上睡眠,待外部设备有数据来了再唤醒。由于μC/OS-II的信号量提供了超时等待机制,串口当然也具有超时读写能力。

图1是带缓冲区和信号量的串口接收示意图。数据接收信号量初始化为0,表示在环形缓冲区中无数据。

接收中断到来后,ISR从UART的接收缓冲器SBUF中读入接收的字节(②),放入接收缓冲区(③),然后通过接收信号量唤醒用户任务端的读操作(④、①)。在整个过程中,可以查询记录缓冲区中当前字节数的变量值,此变量表明接收缓冲区是否已满。UART收到数据并触发了接收中断,但如果此时缓冲区是满的,那么放弃收到的字符。缓冲区的大小应合理设置,降低数据丢失的可能性,又要避免存储空间的浪费。

图2为带环形缓冲区和超时信号量的串口发送示意图。发送信号量初始值设为发送缓冲区的大小,表示缓冲区已空,并且关闭发送中断。发送数据时,用户任务在信号量上等待(①)。如果发送缓冲区未满,用户任务向发送缓冲区中写入数据(②)。如果写入的是发送缓冲区中的第一个字节,则允许发送中断(②)。然后,发送ISR从发送缓冲区中取出最早写入的字节输出至UART(④),这个操作又触发了下一次的发送中断,如此循环直到发送缓冲区中最后一个字节被取走,重新关闭发送中断。在ISR向UART输出的同时,给信号量发信号(⑤),发送任务据此信号量计数值来了解发送缓冲区中是否有空间。
系统分类: ARM
用户分类: ARM
标签: 无标签
来源: 转贴
发表评论 阅读全文(216) | 回复(0)

2

关于投票
μC/OS-ll中任务调度算法的改进
作者:吴平

引  言

目前,操作系统内核的软件中,μC,0S-II称得上是小型实时操作系统。它由Jean J.Labrosse于1992年推出第l版,立刻在嵌入式系统领域引起强烈反响。μC/OS II是一个基于抢占式的实时多任务内核,可固化、可剪裁、具有高稳定性和可靠性。它最鲜明特点就是源码公开,便于移植和维护,而且对于学校研究完全免费,只有在应用于盈利项目时才需要支付少量的版权费,特别适合一般使用者的学习、研究和开发。自问世以来,其稳定性和可靠性得到了广泛的认可,现已经通过美国FAA认证。在嵌入式领域,μc/OS凭借优越特性得到了越来越广泛的应用,众多的研究开发者将其作为操作系统的样板,移植到各种硬件平台,其外围的应用也越来越多。

1 μC/0S在嵌入式产品应用中存在的问题

随着移动通信、信息家电以及工业控制等领域的快速发展,嵌入式软件产业迎来了极佳的发展时机。强劲的市场需求带来了研发的快速增长,越来越多的软件公司投入到嵌入式产品的研发中。但另一方面,大部分软件公司却缺乏嵌入式操作系统这个嵌入式产品的核心技术,无法提供给各种应用多任务等现代操作系统所必备的功能,极大地限制了产品的性能和发展。μC/OS具有源码公开,商业授权费极低等特点,成为嵌入式产品开发的一种选择。

μC/OS—II在设计时强调实时性。它采用单一的基于优先级的抢先式调度算法,有效地保证了实时性的要求。在各种嵌入式操作系统中,其任务切换带来的时延窗口很小。非常适合强实时性的任务要求,但是对于大部分周期性和实时性要求不高的任务来说,μC/O一II还存在一些不足:

①缺乏时间片调度,低优先级的任务很难得到执行。μC/OS—II不支持时间片调度,优先级高的任务如果不主动放弃CPU,低优先级任务永远都不可能运行。这对于那些分别编写,但叉可能同时运行的任务来说,只能通过任务之间的同步等动作来完成交替运行。这不但增加了编程难度,而且破坏了模块的独立性。

②任务创建和销毁的接口复杂。μC/OS—ll的上层软件开发需要关心底层具体实现,接口比较复杂。对于经验不多的程序员来说,第一,创建任务时需要用户自行指定优先级。这必然牵涉到如何管理分配优先级的问题。第二,μC/OS—II中任务的栈空间完全由用户管理,系统只是简单地要求用户创建任务时传人栈地址,而不参与栈空间的申请和释放。为了简化μC/OS的示例程序,更是简单地以静态数组作为任务栈。栈空间的放任自流在带来一定灵活性的同时也会带来问题的隐患。第三,因为μC/OS—II规定任务必须为无限循环或自销毁形式,所以其任务在结束时,需要手工调用OSTaskDel,使该任务进入睡眠态,不能简单地返回。与现在流行的大多数操作系统用法差异较大。

结合国内的产业现状,从程序员素质和应用程序的实时性分类,在数量上都呈现金字塔状;而且往往是高级程序员负责开发实时应用,普通程序员开发非实时应用。如果希望能在包括数目庞大的非实时应用的产品中利用μC/OS—II,则必须对它作出扩充,在保留实时任务支持的前提下,增添时间片调度,并对任务的接口作出简化处理。

2 μC/OS调度算法的改进

μC/OS中的每个任务具有一个任务控制块0S_TCB,任务控制块记录任务执行的环境,包括任务的优先级、任务的堆栈指针、任务的相关事件控制块指针等。内核将系统中处于就绪态的任务在就绪表中进行标注,通过就绪表中的两个变量OSRdyGrp和OSRdyTbl[]可快速查找系统中就绪的任务。在μC/OS—II中每个任务有唯一的优先级,因此任务的优先级也是任务的唯一标识。内核可用控制块优先级表OSTCBPrioTbl[]通过任务的优先级查到任务控制块的地址。μC/OS—II主要就是利用任务控制快OS_TCB、就绪表和控制块优先级表0STCBPrioTbl[]来进行任务调度。任务调度程序OSSched()首先由就绪表中找到当前系统中处于就绪态的优先级最高的任务,然后根据其优先级由控制块优先级表0STCBPrioTbl[]取得相应任务控制块的地址,由OS_TASK—SW()程序进行运行环境的切换。若在任务运行时发生中断,则转向执行中断程序,执行完毕后不是简单地返回中断调用处,而是由OSIntExit()程序进行任务调度,执行当前系统中优先级最高的就绪态任务。

本文拟在不破坏μC/OS实时性的前提下,增加时间片调度,以适于非实时性场合,并参考Windows和Linux多种通用操作系统任务调用接口函数,对μC/0S任务接口作出改进,提供通用简单的编程接口,降低应用软件开发难度,增加系统稳定性和可靠性。

2.1  时间片调度算法的设计与实现

μC/OS中共有64个任务,其中作者保留了8个任务以备将来使用,因此用户可以有多达56个应用任务。将这些任务划分为3个层次,如图l所示实时任务保留原本设计的绝对优先级调度,对系统驱动或通信等实时性要求高的场合提供支持,任务的创建接口保持不变,由高级程序员编写相应程序;在分时任务空间采用时间片调度,各种任务轮流执行,适用于事务性处理或实时性要求不高的场合,普通程序员在此区间内编写任务,并对此空间任务的创建和销毁提供了新的编程接口,使之适合普通程序员的编程习惯;后台任务是指idle任务、统计任务等在系统空闲时运行的任务,其在实时任务和分时任务都没有就绪时才有机会运行,此区间也采用绝对优先级调度。



分时任务在μC/OS原先的五种状态中添加了等待态,定义为OS_STAT_WAITSLICE,表示正在等待时间片的重新产生。增添新状态后的状态迁移如图2所示。

系统分类: ARM
用户分类: ARM
标签: 无标签
来源: 转贴
发表评论 阅读全文(124) | 回复(0)
总共 , 当前 /