微波EDA网,见证研发工程师的成长! 2025婵犵數濮烽弫鍛婃叏閹绢喗鍎夊鑸靛姇缁狙囧箹鐎涙ɑ灏ù婊呭亾娣囧﹪濡堕崟顓炲闂佸憡鐟ョ换姗€寮婚敐澶婄闁挎繂妫Λ鍕磼閻愵剙鍔ゆ繛纭风節瀵鎮㈤崨濠勭Ф闂佸憡鎸嗛崨顔筋啅缂傚倸鍊烽懗鑸靛垔椤撱垹鍨傞柛顐f礀閽冪喖鏌曟繛鐐珕闁稿妫濋弻娑氫沪閸撗€妲堝銈呴獜閹凤拷04闂傚倸鍊搁崐鎼佸磹閹间礁纾归柟闂寸绾剧懓顪冪€n亝鎹i柣顓炴閵嗘帒顫濋敐鍛婵°倗濮烽崑鐐烘偋閻樻眹鈧線寮撮姀鈩冩珕闂佽姤锚椤︻喚绱旈弴銏♀拻濞达綀娅g敮娑㈡煕閺冣偓濞茬喖鐛弽顓ф晝闁靛牆娲g粭澶婎渻閵堝棛澧遍柛瀣仱閹繝濡烽埡鍌滃幗闂佸搫娲ㄩ崑娑㈠焵椤掆偓濠€閬嶅焵椤掍胶鍟查柟鍑ゆ嫹06闂傚倸鍊搁崐鎼佸磹閹间礁纾归柟闂寸绾剧懓顪冪€n亝鎹i柣顓炴閵嗘帒顫濋敐鍛婵°倗濮烽崑鐐烘偋閻樻眹鈧線寮撮姀鈩冩珖闂侀€炲苯澧扮紒顕嗙到铻栧ù锝堟椤旀洟姊洪悷鎵憼闁荤喆鍎甸幃姗€鍩¢崘顏嗭紲闂佺粯鐟㈤崑鎾绘煕閵娿儳鍩g€殿喖顭锋俊鎼佸煛閸屾矮绨介梻浣呵归張顒傜矙閹达富鏁傞柨鐕傛嫹 闂傚倸鍊搁崐鎼佸磹閹间礁纾归柟闂寸绾剧懓顪冪€n亝鎹i柣顓炴閵嗘帒顫濋敐鍛婵°倗濮烽崑鐐烘偋閻樻眹鈧線寮撮姀鐘栄囨煕鐏炲墽鐓瑙勬礀閳规垿顢欑紒鎾剁窗闂佸憡顭嗛崘锝嗙€洪悗骞垮劚濞茬娀宕戦幘鑸靛枂闁告洦鍓涢敍娑㈡⒑閸涘⿴娈曞┑鐐诧躬閹即顢氶埀顒€鐣烽崼鏇ㄦ晢濠㈣泛顑嗗▍灞解攽閻樺灚鏆╁┑顔芥尦楠炲﹥寰勯幇顒傦紱闂佽宕橀褔鏌ㄩ妶鍡曠箚闁靛牆瀚崗宀勬煕濞嗗繑顥㈡慨濠呮缁辨帒螣閼姐値妲梻浣呵归敃銈咃耿闁秴鐒垫い鎺嶈兌閸熸煡鏌熼崙銈嗗闂傚倸鍊搁崐鎼佸磹閹间礁纾归柟闂寸绾剧懓顪冪€n亝鎹i柣顓炴閵嗘帒顫濋敐鍛婵°倗濮烽崑鐐烘偋閻樻眹鈧線寮撮姀鈩冩珖闂侀€炲苯澧扮紒顕嗙到铻栧ù锝堟椤旀洟姊洪悷鎵憼闁荤喆鍎甸幃姗€鍩¢崘顏嗭紲闂佺粯鐟㈤崑鎾绘煕閵娿儳鍩g€殿喖顭锋俊鎼佸煛閸屾矮绨介梻浣呵归張顒傜矙閹达富鏁傞柨鐕傛嫹
首页 > 硬件设计 > 嵌入式设计 > VxWorks下的多重定时器设计

VxWorks下的多重定时器设计

时间:02-16 来源: 点击:

  VxWorks是一种嵌入式实时操作系统(RTOS),具有内核小、可裁剪、实时性强等特点。VxWorks内核(Wind)提供了共享内存、信号量、消息队列、套接字通信和定时器等多种机制。为了实现基于UDP网络的可靠通信,本文利用VxWorks的多种任务间通信机制和看门狗定时器机制,设计了一种多重定时器模型,该模型可以确保数据包的可靠传递。

  1 VxWOrks的时钟及定时器机制

  1.1 VxWorks延时函数

  VxWorks既提供了延时功能,也提供了时限约束功能。VxWorks系统有2种延时方式:一种是Wind内核提供的taskDelay()函数;另一种是POSIX函数nanosleep()。

  taskDelay()函数以tick作为延时单位,默认情况下1个tick为16.67 ms(1/60 s),可以通过调用sysClkRateSet()函数对tick进行重新设定。taskDelay()函数使调用该函数的任务在指定时间内主动放弃CPU,用于任务调度或等待某一外部事件。nanosleep()函数指定一个以s和ns为单位的睡眠或延时时间。其实,两个延时函数的精度是相同的,都是以tick为时间基准。不同之处在于,taskDelay(0)有自身意义,用于相同优先级任务间的任务调度,而nanosleep(0)是没有意义的。

  1.2 VxWorks定时器机制

  VxWorks提供一种看门狗定时器机制(watchdogtimer),可以用来处理任务的时限约束。看门狗定时器作为系统时钟中断服务程序的一部分来维护,因此,看门狗定时器的回调函数以系统时钟中断级作为中断服务程序执行。看门狗定时器回调函数受到中断服务程序的限制,不能调用可能引起阻塞的函数,比如试图获取信号量,调用malloc()和free()等创建和释放内存函数或执行I/O操作。

  POSIX定时器也可以处理任务时限。此外,VxWorks中一些函数具有时限控制的功能,semTake()、msgQSend()、msgQReceive()函数中都有设定时限控制的参数。超时参数NO_WAIT意味着立即返回,而WAIT_FOREVER意味着程序永不超时。

  2 多重定时器实现要求

  在VxWorks系统下,利用网络套接字建立基于UDP协议的客户端/服务器通信模式。由于UDP是无连接的协议,发送方并不清楚发出的数据包是否已经正确到达接收方,于是提出一种支持重传和定时等待确认的协议。

  这个协议要求发送方发送的数据包与接收方回复的确认包具有对应的序列号,发送方和接收方都可以通过序列号来判断是不是想要得到的数据包。序列号是循环的,考虑到如果序列号太小会出现折返情况产生混淆,所以序列号至少大于2。如果用1个字节来表示序列号,则可以设定序列号为256。

  发送方送出一个数据包后启动一个定时器。这时可能会有4种情况发生:

  ①发送方接收到正确序号的确认包,则发送下一序列号的数据包。

  ②发送方接收到已经接收过的重复确认包,则丢弃该确认包继续等待。如果在超时前收到了正确确认包,则发送下一序列号的数据包。

  ③定时器超时,没有收到想要的确认包,则重新发送数据包,启动下一定时器。

  ④设定的多重定时器超时后,没有收到想要确认包,则通知网络管理设备。

  接收方在收到所需序列号的数据包后,回复一个确认包给发送方。如果接收方回复的确认包后没有正确到达发送方,则会引起发送方超时,重新发送原序列号数据包。接收方收到数据包后,需要检查数据包序列号。如果是重复序列号数据包,则丢弃,但是依旧回复确认包给发送方,以免已发送确认包在发送过程中丢失。这里基于支持重传和定时等待确认协议。具体要求是,在客户端通过UDP协议发送数据包后启动一个定时器,等待接收服务器端回复的ACK(acknowl-edgement)确认包。如果成功接收,则继续发送下一序列号的数据包;如果超时后还没有收到需要的确认包,则重新传输原序列号的数据包。图1所示为数据包均按时、正确地接收的情况。

闂傚倸鍊搁崐鎼佸磹閹间礁纾归柟闂寸绾剧懓顪冪€n亝鎹i柣顓炴閵嗘帒顫濋敐鍛婵°倗濮烽崑娑⑺囬悽绋垮瀭濡わ絽鍟粻娑樏归敐鍛础缂佸鑳剁槐鎾诲磼濮橆兘鍋撻悜鑺ュ€块柨鏇氱劍閹冲矂姊绘担鍛婂暈闁荤喆鍎抽幑銏狀潨閳ь剙顕f繝姘亜缁炬媽椴搁弲顒勬⒑閹稿海绠撴繛璇х到鏁堟俊銈呮噺閸嬧剝绻濇繝鍌涘櫣妞わ絽銈搁幃浠嬵敍濞戞ɑ璇為梺璇″枟閻燂妇鎹㈠┑瀣倞闁靛ě鍐ㄥ婵犵數濮烽弫鎼佸磹椤栫偛鐒垫い鎺戝绾惧鏌熼崜褏甯涢柣鎾寸洴閹鏁愭惔鈥茬敖婵犫拃鍐粵闁逛究鍔嶇换婵嬪川椤曞懍鍝楅梻浣告贡閹虫挾鈧氨澧楁穱濠囧箹娴h倽銊╂煥閺冣偓閸庡磭绱為幒妤佲拻闁稿本鐟ㄩ崗宀勬煙閾忣偅宕岀€规洜鏁诲浠嬵敇閻愭鍞甸梻浣芥硶閸o箓骞忛敓锟�...

  一般情况下,假定启动定时器30 ms内可以完成从发送数据包到接收ACK确认包的全过程,但是由于某些原因使得30 ms内无法收到确认包,则会重传原数据包,并启动一个稍长的40 ms定时器。如果40 ms还无法收到确认,则再次重传原数据包,并启动一个考虑到最差情况的60 ms定时器。如果依旧无法收到确认则不再发送,通知网络管理设备。

  出现定时器超时情况有3种可能:发送方发送数据包过程中丢包;接收方发送确认包过程中丢包;从发送数据包到确认包到达发送方过程中,延时时间超过定时时间。造成超时有两方面原因:一是,双方终端在接收数据包时由于缓冲问题不能及时处理,使得终端出现延时接收数据包或丢包;二是,通信链路发生断链情况,导致双方无法进行通信。从图2中可以看到,如果链路没有断开,则包含3种情况的三重定时器超时情况。

3 多

灏勯涓撲笟鍩硅鏁欑▼鎺ㄨ崘

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top