VxWorks下几种定时延时方法的小结

合集下载

几种延时方法

几种延时方法

2.2 在C51中嵌套汇编程序段实现延时
在C51中通过预处理指令#pragma asm和#pragma endasm可以嵌套汇编语言语句。用户编写的汇编语言紧跟在#pragma asm之后,在#pragma endasm之前结束。
如:#pragma asm

汇编语言程序段
sbit T_point = P1^0;
void Dly1ms(void) {
unsigned int i,j;
while (1) {
T_point =3;+){
for(j=0;j<124;j++){;}
}
T_point = 0;
for(i=0;i<1;i++){
for(j=0;j<124;j++){;}
}
}
}
void main (void) {
Dly1ms();
}
void Delay10us( ) {
_NOP_( );
_NOP_( );
_NOP_( );
_NOP_( );
_NOP_( );
_NOP_( );
}
Delay10us( )函数中共用了6个_NOP_( )语句,每个语句执行时间为1 μs。主函数调用Delay10us( )时,先执行一个LCALL指令(2 μs),然后执行6个_NOP_( )语句(6 μs),最后执行了一个RET指令(2 μs),所以执行上述函数时共需要10 μs。 可以把这一函数当作基本延时函数,在其他函数中调用,即嵌套调用[4],以实现较长时间的延时;但需要注意,如在Delay40us( )中直接调用4次Delay10us( )函数,得到的延时时间将是42 μs,而不是40 μs。这是因为执行Delay40us( )时,先执行了一次LCALL指令(2 μs),然后开始执行第一个Delay10us( ),执行完最后一个Delay10us( )时,直接返回到主程序。依此类推,如果是两层嵌套调用,如在Delay80us( )中两次调用Delay40us( ),则也要先执行一次LCALL指令(2 μs),然后执行两次Delay40us( )函数(84 μs),所以,实际延时时间为86 μs。简言之,只有最内层的函数执行RET指令。该指令直接返回到上级函数或主函数。如在Delay80μs( )中直接调用8次Delay10us( ),此时的延时时间为82 μs。通过修改基本延时函数和适当的组合调用,上述方法可以实现不同时间的延时。

VxWorks系统时钟延时技术

VxWorks系统时钟延时技术

VxWorks几种常用的延时方法介绍2008-06-16 15:12:38 来源:EDN关键字:嵌入式系统;嵌入式系统中,一个任务往往需要在特定的延时之后执行一个指定的动作,比如等待外设以确保数据可靠,控制扬声器发声时间以及串口通信超时重发等。

这就需要利用定时器机制来计量特定长度的时间段。

VnWorks作为实时嵌入式系统,提供多样的定时接口函数。

下面列举一些常用的定时方式,并说明其注意事项。

1 taskDelavtaskDelay(n)使调用该函数的任务延时n个tick(内核时钟周期)。

该任务在指定的时间内主动放弃CPU,除了taskDelay(0)专用于任务调度(将CPU交给同一优先级的其他任务)外,任务延时也常用于等待某一外部事件,作为一种定时/延时机制。

在没有中断触发时,taskDelay能很方便地实现,且不影响系统整体性能。

例如写数据至EEPROM,EEPROM需要一个内部擦除时间(最大擦除时间为lOms)。

以下所提及的一个tick都假设为16.67 ms(1/60 s)。

可以简单地调用taskDelay(2)来保证数据擦写完成。

按理说taskDelay(1)就足以保证,为什么需要taskDelay(2)呢?这正是taskDelay使用的一个缺陷,使用时需要注意。

taskDelay(n)表示任务延时至第n个系统时钟到来的时刻,如图1所示。

如果在A时刻调用taskDelay(1)仅延时5 ms,则在B时刻taskDelay(1)就刚好是一个tick周期。

可见需要10 ms的延时就必须调用taskDelay(2)才能实现。

taskDelay有接近一1个tick的误差存在,taskDelay(n)实际上是延时(n-1)tick~n tick的时间。

延时精度为l/n,延时1s就是taskDelay(60)的误差极限为1.6%,而taskDelay(1)的误差极限将是100%。

使用taskDelay需注意的另外一点是:即使经过n个tick,调用延时的任务也不保证返回执行状态,可能有更高或相同优先级的任务占用了CPU。

VxWorks几种常用的延时方法

VxWorks几种常用的延时方法

VxWorks几种常用的延时方法关键字:taskDelay 函数VxWorks 基准频率实时嵌入式系统sysTimes-tampLock 串口通信skep 延时时间tick嵌入式系统中,一个任务往往需要在特定的延时之后执行一个指定的动作,比如等待外设以确保数据可靠,控制扬声器发声时间以及串口通信超时重发等。

这就需要利用定时器机制来计量特定长度的时间段。

VnWorks作为实时嵌入式系统,提供多样的定时接口函数。

下面列举一些常用的定时方式,并说明其注意事项。

1 taskDelavtaskDelay(n)使调用该函数的任务延时n个tick(内核时钟周期)。

该任务在指定的时间内主动放弃CPU,除了taskDelay(0)专用于任务调度(将CPU交给同一优先级的其他任务)外,任务延时也常用于等待某一外部事件,作为一种定时/延时机制。

在没有中断触发时,taskDelay能很方便地实现,且不影响系统整体性能。

例如写数据至EEPROM,EEPROM需要一个内部擦除时间(最大擦除时间为lOms)。

以下所提及的一个tick都假设为16.67 ms(1/60 s)。

可以简单地调用taskDelay(2)来保证数据擦写完成。

按理说taskDelay(1)就足以保证,为什么需要taskDelay(2)呢?这正是taskDelay使用的一个缺陷,使用时需要注意。

taskDelay(n)表示任务延时至第n 个系统时钟到来的时刻,如图1所示。

如果在A时刻调用taskDelay(1)仅延时5 ms,则在B 时刻taskDelay(1)就刚好是一个tick周期。

可见需要10 ms的延时就必须调用taskDelay(2)才能实现。

taskDelay有接近一1个tick的误差存在,taskDelay(n)实际上是延时(n-1)tick~n tick 的时间。

延时精度为l/n,延时1s就是taskDelay(60)的误差极限为1.6%,而taskDelay(1)的误差极限将是100%。

VxWorks中Timer机制

VxWorks中Timer机制

[摘要] Timer是实时操作系统的一个重要组成部分。

本文结合近阶段的学习和实验情况,对VxWorks中的时间函数和定时器作了一些探讨。

主要介绍了Timer的机制,相关的函数,并给出了一些具体的例子。

一. TickTick是指每秒中定时器中断的次数。

POSIX标准中,tick等于50,即每20ms 定时器中断一次。

VxWorks中,tick的缺省设置为60。

因为实时操作系统中,任务的调度和定时器密切相关,tick设置是否合理对整个系统性能的影响是很明显的。

如果tick太小,则系统实时响应能力较差;反之,如果tick太大,则会使得系统的绝大多数资源浪费在不断的任务管理和调度中。

Tick的次数在userconfig.c文件中设置,其语句为sysClkRateSet (60)。

用户可以更改这个文件,然后重新编译BSP库,也可以在应用程序中更改。

和tick相关的函数主要有:sysClkRateGet:得到每秒系统的tick数sysClkRateSet:设置系统的tick数二.看门狗时钟(Watchdog Timer)Watchdog Timer 提供了这样一种机制,它使一个C函数和一个时间延迟联系起来。

当该时间延迟到达以后,系统会调用该C函数。

Watchdog Timer采用了中断服务进程(ISR)的机理,当C函数被激活时,它是作为ISR运行的。

和Watchdog Timer相关的函数如下:wdCreate:创建Watchdog TimerwdDelete:删除Watchdog TimerwdStart:启动一个Watchdog TimerwdCancel:取消一个正在记数的Watchdog Timer Watchdog使用过程如下:首先调用wdCreate创建一个Watchdog Timer, 然后通过wdStart启动该Timer。

当tick累计到设定的数字时,和它相联系的C函数被激活作为ISR运行。

VxWorks几种常用的延时方法

VxWorks几种常用的延时方法
刻 , 图 1所 示 。如 果 在 A 时 刻 调 用 ts Dea ( ) 延 时 如 ak ly 1 仅
只执行一次 , 此对于一 些要求 周期 性执 行 的应用程 序 , 因 要 获 得 该 效 果 , 定 时 器 函 数 本 身 必 须 通 过 递 归 调 用 则
wd tr( 来 重新 启 动 定 时 器 。 Sat)




3 /i k t c


图 1 ts D l a k ea y延 时 示 意 图
些 常 用 的定 时方 式 , 说 明其 注 意 事 项 。 并 1 t s De a a k ly tsD l ( ) 调 用 该 函 数 的 任 务 延 时 个 t k 内 ak ea 使 y i ( c
ts Dea ( ) ? a k ly 2 呢
中断 级 别 上 执 行 , 不 是 在 任 务 的 上 下 文 中 。 因 此 , 门 而 看 狗 定 时 挂 接 的程 序 编 写 有 一定 的 限 制 , 个 限 制 条 件 与 中 这 断 服 务 程 序 的约 束 是 一 样 的 。 比如 , 能 使 用 获 取 信 号 量 不 的语句 , 以及 像 pi f) 样 的 I0 系 统 函数 。 r t(这 n /
过 启 动 看 门狗 的任 务 不 会 被 阻 塞 , 为 wd tr( 调 用 立 因 S at )
() 际 上 是 延 时 ( 1 t k 实 一 )i c
t k的 时 间 。 延 时 精 度 i c
为 1 n 延 时 1S就 是 ts Dea ( 0 的误 差 极 限 为 1 6 , /, ak ly 6 ) . 而 ts Dea ( ) ak ly 1 的误 差 极 限将 是 i 0 。 0

VxWorks下的多重定时器设计

VxWorks下的多重定时器设计

VxWorks下的多重定时器设计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()函数中都有设定时限控制的参数。

vxworks通用定时器设计.pdf

vxworks通用定时器设计.pdf
文给 出了定制 定时器 实现 的思想。 关键 词 看 门狗 网络 定 时器
1 概述
v o, WnR e公司开发的具有工业领导 x r 是 i ir W k dv 地位的高性能实时操作系统内核, 具有先进的网络 功能, 易于设计高效的嵌人式系统。目前已成为嵌 人式操作系统的首选, 并将其作为通信产品的软件
为简单, 其流程图如图 4 所
示。
3 结束语
本文介绍了采用 FT算法实现交流采样的原理 F 与具体实现方法。经过实际验证 , 效果 良好。
为了节 约处 理器 的运 算时间,/ A D采样在中断中 进行, 当采样结束后, 置位 采样结束标记 , 监控程序查 询该标 记 , 如果为真 , 调 则 用 FT处理子程序 (I F T 公司 提供了相应的软件包)根 , ( 上接第 4 8页)
要求的定时器。
wDle _ D ; 如果启动看门 d ) , det( wI / e g m 狗不成功, 则删除看门狗 * /
run } e r; t
rt r eu n;
2 通用定时器的基本原理
虽然在 v r 没有提供像 wnos Wo s x k i w 中的定时 d 器一样好用的定时器 , 但可以利用 v o s x r 的看门 W k
{ rt(Eoisr g i aoad rr t i rte ct pn “ r n n o n s i if a t u s e
wt t e \ ; i i r n) h m
够在看门狗的响应函数中重新启动看门狗, 那么就
可以实现以一个固定的周期循环执行的定时器。以 下是定时器的基本框架 : vi st e ( n r l o ei r t v ) d m i ie a t n t
定时肠用户

如何延时方法有哪些

如何延时方法有哪些

如何延时方法有哪些延时是在程序中用于暂停执行一段时间的方法,常用于控制程序的执行节奏和顺序。

在不同的编程语言和开发环境中,延时方法的实现方式可能有所差异。

以下是一些常见的延时方法:1. Sleep方法:Sleep方法是一种最常见的延时方法,它会使程序暂停执行指定的时间间隔。

在C#、Java等编程语言中,可以使用Thread类提供的Sleep方法来实现延时。

例如,在C#中可以使用以下代码实现延时1秒:Thread.Sleep(1000); 延时1秒2. Timer定时器:定时器是一种常用的延时方法,它可以设定一个时间间隔,每隔一段时间触发一次程序代码的执行。

在C#中,可以使用System.Timers.Timer 类来实现定时器,例如:Timer timer = new Timer();timer.Interval = 1000; 设置时间间隔为1秒timer.Elapsed += (sender, e) =>{定时触发的代码逻辑};timer.Start(); 开始定时器3. 延时函数/方法:有些编程语言或开发环境中提供了专门的延时函数或方法,用于实现延时。

例如,在Python中可以使用time模块提供的sleep函数来实现延时,例如:import timetime.sleep(1) # 延时1秒4. 循环延时:循环延时是一种常见的延时方式,它使用循环结构让程序重复执行空操作,从而实现延时效果。

在一些低级语言或单片机编程中,常常使用循环延时,例如在C语言中可以使用以下代码实现延时1秒:#include <stdio.h>#include <time.h>void delay(unsigned int ms){clock_t goal = ms + clock();while (goal > clock());}int main(){delay(1000); 延时1秒return 0;}5. 图形用户界面(GUI)中的延时方法:在一些GUI开发环境中,会提供专门的延时方法或函数,用于实现在用户界面中的延时效果。

Vxworks tick

Vxworks tick

Vxworks tick每个操作系统都有一个系统定时器timer,用于系统任务的时间管理。

CPU的指令周期,也不是晶振的频率分之一,而是指晶振经时钟发生器出来的频率。

操作系统总是基于某个时钟节拍来跑的。

这个节拍的得到往往是通过硬件时钟中断得到,一般来说这个中断的优先级就比NMI低一点点,比其他的都高。

这个中断是共给操作系统用的,操作系统用他来进行调度啊什么的各种处理。

而在vxWorks中的一个重要参数就是SYS_CLK_RATE这个参数,也就是系统时钟率。

它的含义是:系统时钟滴嗒在一秒钟之内发生多少次。

比如说,你定义为60,那么系统时钟在1s 中将发生60次中断,两次之间的时间差就是1/60s。

发生中断后,操作系统可以进行任务切换啊什么的。

也就是说,如果你有一个任务被挂起,则至少要过1/60s后被激活---其它中断除外啊。

又假如你设置为1000,那么系统时钟1秒发生1000次中断,两个时间差就是1ms。

而函数sysClkRateGet就是用来获取系统时钟率的,如果你没有调用sysClkRateSet ()函数对系统时钟率进行重新设置的话,其返回值应该是你在config.h中定义的SYS_CLK_RATE宏的值。

而函数taskDelay()是以tick数目为单位的,比如taskDelay(1)是指将调用该函数的任务延迟1个tick。

那么时间是多少呢,根据你的SYS_CLK_RATE的值,其实际时间不同,但具体时间是1/SYS_CLK_RATE。

假如SYS_CLK_RATE是1000,那么就是1ms。

如果是60那么就大约是16.67ms。

通常来讲,vxWorks手册建议不要将时钟率设得太高,否则它就由硬实时变得趋向于软实时了。

因为过高的时钟率使得内核调度频繁进入,可能导致一些低优先级的硬件中断不能得到及时响应。

当然,在x86系统中完全可以设置为1000,这样比较好使,1个tick就是1ms,跟Windows一样。

VxWorks系统时钟获取和定时功能分析

VxWorks系统时钟获取和定时功能分析

对 于 数 据 采 集 和 定 时 控 制方 面有 着 特 殊 的要 求, 如何 获取 系统 时 间 , 记录 和保 存 系 统 时 间 ,
采取 定 时手 段是 Vx r s 现实 时控 制 和采 wo k 实 集 信号 的前 提 手 段 。在 大部 分 应用 下 , 要 文 需
我们 可 以从 B O I S中读 取 当前 的时 钟 。秒 , , 分 时 , , , 的存 放 地 址 分 别 是 : x0 O0 , 天 月 年 O O ,x 2
1 66 3
Vx r s 门狗定 时 器 属 于 系 统 时 钟 中 Wok 看
断服务程序的一部分 , 一般说来看 门狗定 时器
函数运 行在系 统时钟 中断级 。看 门狗 实现 过程
如下 , 首先创建 并初 始 化看 门狗定 时器 :
W DOG I Wae Do I ;/ 建 看 门 D my th gd / 创
2 V Wok 定 时方 式 的 实 现 x rs
Vx r s 现定 时有 两种 方 式 , Wo k 实 一种 是 看
过读 取 7 1端 口来 读 取 日历 时 间 , 统 时 间 与 系 B P有 关 , Vx rs对 应 于 x6系 列 的 目 S 在 Wok 8
门狗定 时器 , 另外 一 种 为 P I 可 移 植 操 作 OSX(
Vx r s 作 系 统 由于其 具 有 的 强 实 时 wo k 操 性能, 工业 控制领域有着非常广泛的应用 。 在
标机 没有 直接 读 取 R TC( 时 时 钟 控 制 器 ) 实 的
函数 , t . 用 i h中 的 函 数 读 到 的起 始 时 间 是 me 0 0 :0 Jr 9 0 在 x 6系列 的机 器 中 , :0 O , aL 1 7 , 1 8

VxWorks信号中断和定时

VxWorks信号中断和定时
– parameter传递给程序的参数
wdStart()可以在超时时运行看门狗程序,要想周期性执行 (zhíxíng),看门狗程序必须调用wdStart()自己重新启动
共二十二页
使用(shǐyòng)看门狗定时器
使用看门狗定时器可以使一段程序周期性地执行
wdId= wdCreate();
– wdStart( wdId, DELAY_PERIOD, myWdIsr, 0); – void myWdIsr(param) – {doit(param);
调试 中断 (diào shì)
中断处理程序可以调用logMsg()向系统输出(shūchū) 诊断信息
– logMsg(“foo= %d\n”,foo,2,3,4,5,6) – 向tLogTask发送请求为我们实现printf()的功能
和printf()相似,但必须注意 –参数必须为4字节 –函数有6个入口参数 使用具有系统级调试的机制进行调试 –WDB Agent –emulator
{
routineRestore …
registerRET
}
共二十二页
设置(shèzhì)中断处理程序
VxWorks提供函数intConnect(), 它允许(yǔnxǔ)将指定的C函数与 任意中断相联系
STATUS intConnect()
{
VOIDFUNCPTR *vector;/*要联系的中断向量*/ VOIDFUNCPTR *routine; /*中断发生时要调用的函数*/ intparameter;/*传递给中断处理函数的参数*/
共二十二页
中断(zhōngduàn)和优先级
共二十二页
ISR的使用(shǐyòng)限制

基于VxWorks操作系统下的延时方法比较

基于VxWorks操作系统下的延时方法比较

0引言VxWorks操作系统是运行在目标机上的高性能、可裁剪的嵌入式实时多任务操作系统,其良好的可靠性和卓越的实时性被广泛地应用在通信、军事、航空、航天、航海等高精尖技术及实时性要求极高的领域中。

在实际的工程应用中,周期任务,需要有最大的延迟或称为等待时间。

这类任务一般会为BIT检测任务,链路检测任务,点迹查询任务等。

这段等待时间,在VxWorks操作系统中,可以通过多种延时方法实现。

1taskDelay法1.1原理taskDelay()是最简单的延时方法。

延时操作提供了一个简单的任务休眠机制。

当一个任务调用taskDelay()后,它将主动放弃CPU一段时间,进入Delay状态。

超时后,这个任务会排到Ready队列中同优先级队列的队尾等待执行。

它的单位是tick,tick是VxWorks下的时钟中断频率,可以通过sysClkRateSet()设置,一般在60-100之间。

在体系架构、CPU频率等硬件条件允许的范围内,这个值可以随意设置。

不过,设置的时候要根据实际需要,而不是每个时间片的间隔越短越好。

时间片的数量影响着内核每秒钟调度的次数,而每次内核调度都需要消耗一定的CPU资源。

如果每秒产生的时间片数量过大,内核调度所消耗的CPU资源就会过多,从而影响整机效率。

在实际工程中,一般选取每秒tick数为100。

可以通过调用taskDelay(0),将CPU交给同等优先级的任务。

由于其延时的基本单位为tick,因此,最小延时单位为10ms,延时精度不高。

一般来说,当该任务通过taskDelay()进入睡眠状态时,若这段时间内被高优先级的任务占有资源时,则一直得等高优先级的任务放弃资源时,这个任务才会获得资源。

因此,taskDelay()延时很方便,却需要有一定的风险。

实际的延时时间为预设延时时间与排队等候时间之和,这样将会导致延时不准确,也对任务的调度安排提出了一个挑战。

这样看来,时间片延时并不是很准确,其准确程度需要根据任务调度的状况来决定。

基于VxWorks操作系统下的延时方法比较

基于VxWorks操作系统下的延时方法比较

基于VxWorks操作系统下的延时方法比较引言VxWorks操作系统是运行在目标机上的高性能、可裁剪的嵌入式实时多任务操作系统,其良好的可靠性和卓越的实时性被广泛地应用在通信、军事、航空、航天、航海等高精尖技术及实时性要求极高的领域中。

在实际的工程应用中,周期任务,需要有最大的延迟或称为等待时间。

这类任务一般会为BIT检测任务,链路检测任务,点迹查询任务等。

这段等待时间,在VxWorks操作系统中,可以通过多种延时方法实现。

1 taskDelay法原理taskDelay是最简单的延时方法。

延时操作提供了一个简单的任务休眠机制。

当一个任务调用taskDelay后,它将主动放弃CPU一段时间,进入Delay状态。

超时后,这个任务会排到Ready队列中同优先级队列的队尾等待执行。

它的单位是tick,tick是VxWorks下的时钟中断频率,可以通过sysClkRateSet设置,一般在60-100之间。

在体系架构、CPU 频率等硬件条件允许的范围内,这个值可以随意设置。

不过,设置的时候要根据实际需要,而不是每个时间片的间隔越短越好。

时间片的数量影响着内核每秒钟调度的次数,而每次内核调度都需要消耗一定的CPU资源。

如果每秒产生的时间片数量过大,内核调度所消耗的CPU资源就会过多,从而影响整机效率。

在实际工程中,一般选取每秒tick数为100。

可以通过调用taskDelay,将CPU交给同等优先级的任务。

由于联盟其延时的基本单位为tick,因此,最小延时单位为10ms,延时精度不高。

一般来说,当该任务通过taskDelay进入睡眠状态时,若这段时间内被高优先级的任务占有资源时,则一直得等高优先级的任务放弃资源时,这个任务才会获得资源。

因此,taskDelay延时很方便,却需要有一定的风险。

实际的延时时间为预设延时时间与排队等候时间之和,这样将会导致延时不准确,也对任务的调度安排提出了一个挑战。

这样看来,时间片延时并不是很准确,其准确程度需要根据任务调度的状况来决定。

VxWorks几种常用的延时方法

VxWorks几种常用的延时方法

VxWorks几种常用的延时方法
林先贤
【期刊名称】《单片机与嵌入式系统应用》
【年(卷),期】2007(000)005
【摘要】嵌入式系统中,一个任务往往需要在特定的延时之后执行一个指定的动作,比如等待外设以确保数据可靠,控制扬声器发声时间以及串口通信超时重发等。

这就需要利用定时器机制来计量特定长度的时间段。

VxWorks作为实时嵌入式系统,提供多样的定时接口函数。

下面列举一些常用的定时方式,并说明其注意事项。

【总页数】3页(P61-62,65)
【作者】林先贤
【作者单位】东软飞利浦医疗系统
【正文语种】中文
【中图分类】TP3
【相关文献】
1.利用C51开发单片机应用系统中几种延时方法的研究 [J], 方玉甫;李振璧
2.Keil C51程序设计中几种精确延时方法 [J], 段向东;毋茂盛;毋玉芝
3.常用几种实验设计统计分析方法的正确选择(一)完全随机设计资料的统计分析方
法 [J], 闫丽娜;杨海涛;高霞
4.常用几种实验设计统计分析方法的正确选择(二)——配对设计、区组设计,重复测量设计资料的统计分析方法 [J], 闫丽娜;王立芹;唐龙妹
5.基于VxWorks操作系统下的延时方法比较 [J], 白晓慧
因版权原因,仅展示原文概要,查看原文内容请购买。

VxWorks中Timer机制

VxWorks中Timer机制

[摘要] Timer是实时操作系统的一个重要组成部分。

本文结合近阶段的学习和实验情况,对VxWorks中的时间函数和定时器作了一些探讨。

主要介绍了Timer的机制,相关的函数,并给出了一些具体的例子。

一. TickTick是指每秒中定时器中断的次数。

POSIX标准中,tick等于50,即每20ms 定时器中断一次。

VxWorks中,tick的缺省设置为60。

因为实时操作系统中,任务的调度和定时器密切相关,tick设置是否合理对整个系统性能的影响是很明显的。

如果tick太小,则系统实时响应能力较差;反之,如果tick太大,则会使得系统的绝大多数资源浪费在不断的任务管理和调度中。

Tick的次数在userconfig.c文件中设置,其语句为sysClkRateSet (60)。

用户可以更改这个文件,然后重新编译BSP库,也可以在应用程序中更改。

和tick相关的函数主要有:sysClkRateGet:得到每秒系统的tick数sysClkRateSet:设置系统的tick数二.看门狗时钟(Watchdog Timer)Watchdog Timer 提供了这样一种机制,它使一个C函数和一个时间延迟联系起来。

当该时间延迟到达以后,系统会调用该C函数。

Watchdog Timer采用了中断服务进程(ISR)的机理,当C函数被激活时,它是作为ISR运行的。

和Watchdog Timer相关的函数如下:wdCreate:创建Watchdog TimerwdDelete:删除Watchdog TimerwdStart:启动一个Watchdog TimerwdCancel:取消一个正在记数的Watchdog Timer Watchdog使用过程如下:首先调用wdCreate创建一个Watchdog Timer, 然后通过wdStart启动该Timer。

当tick累计到设定的数字时,和它相联系的C函数被激活作为ISR运行。

VxWorks通用定时器设计与实现

VxWorks通用定时器设计与实现

VxWorks通用定时器设计与实现摘要:在进行网络通信设备开发时,需要使用通用定时器。

本文在研究VxWorks系统看门狗函数的基础上,提出了基于看门狗函数的定制定时器的设计方法,可以使定制定时器的最小周期满足网络通信设备开发的需要本文给出了定制定时器实现的思想。

1 概述VxWorks是WindRiver公司开发的具有工业领导地位的高性能实时操作系统内核,具有先进的网络功能,易于设计高效的嵌入式系统目前已成为嵌入式操作系统的首选,并将其作为通信产品的软件平台。

在进行网络通信设备开发时,需要用到定时器,如以周期为m秒对某个端口进行查询、以周期为n分对某个设备的性能数据进行统计等。

而VxWorks只提供了像watchDog(看门狗),而没有提供一个通用的定时器。

本文提出的通用定时器设计方法,占用系统资源少,运行效率高,并可根据需要定制满足要求的定时器。

2 通用定时器的基本原理虽然在Vxworks没有提供像windows中的定时器一样好用的定时器,但可以利用VxWorks的看门狗来实现定时器。

对看门狗的操作函数主要有三个:创建看门狗函数WDOG_ID wdCreate(void);启动看门狗函数STATUS wdStart(WDOG_ID wdId,int delay,FUNCPTR pRoutine,int parameter);删除看门狗函数STATUS wdDelete(WDOG_ID wdId)。

通过对看门狗启动函数进行研究发现,如果能够在看门狗的响应函数中重新启动看门狗.那么就可以实现以一个固定的周期循环执行的定时器。

以下是定时器的基本框架:void settimer(int interval){ int in_interval;m_interval=sysClkRateGet()*interval;/*将延时秒数转化为ticks数*/gm wdID =wdCreate();/*创建看门狗*/if(gm_perfHist_wdID = NULL){printf("Could not create watchdog timer\n");return ;}if(wdStart(gm_wdID,m_interval,(FUNCPTR)action_func,interval) = ERROR)/*启动看门狗*/{printf ("Error in starting routine associated with timer\n");wdDelete(gm_wdlD);/*如果启动看门狗不成功,则删除看门狗*/return;}return;}void action_func(int interval){ int m_interval;m_interval=sysClkRateGet()*interval;/*将延时秒数转化为ticks数*/if(wdStart(gm_wdID,m_interval,(FUNCPTR)action_fnnc,interval)= ERROR)/*启动看门狗*/{printf ("Error in starting routine associated with timer\n");wdDelete(gm_wdID);return;}/*执行用户函数*/……}用户只需调用settimer并给出以秒为单位的定时器周期,就可以建立一个定时器。

VxWorks下的异步通用定时器设计

VxWorks下的异步通用定时器设计

VxWorks下的异步通用定时器设计1 概述VxWorks 是WindRiver 公司开发的高性能实时嵌入式操作系统内核。

在应用软件开发过程中经常会用到定时器。

VxWorks 下要实现定时功能有2 个途径:一,借助taskDelay 函数实现;二,使用VxWorks 提供的看门狗(watchdog)。

使用taskDelay 函数实现定时器的缺点在于它是基于任务的,任务优先级会导致定时不准。

看门狗基于系统时钟中断,定时精度大大优于前者,但是对用户的回调函数有诸多限制(如不允许使用semTake、printf 等需要等待获取某种资源的函数,否则会引起死机)。

另外,看门狗只触发一次回调函数,如果用户需要周期定时器就需要重新启动看门狗。

本文设计了基于看门狗机制的异步通用定时器,并根据实际需要设计了周期性定时和一次性定时两种定时器。

异步是指定时器运行于任务中,对用户没有任何限制。

异步通用定时器提供类似于Windows 下定时器的操作接口,简单、方便。

2 VxWorks 下的看门狗VxWorks 提供看门狗机制,允许将希望若干时间延迟后执行的用户函数连接到看门狗,在定时时间到达后由看门狗自动执行。

看门狗机制由操作系统维持在系统时钟中断,连接到看门狗的函数同样运行在系统时钟中断服务程序中。

如果操作系统由于种种原因(如在系统时钟中断前的中断或者内核状态),将不能立即执行的函数存放在tExcTask 任务的队列中,则队列中的函数将以tExc-Task 任务的优先级运行(通常为0)。

操作系统对中断服务程序的各种限制同样适用于连接到看门狗的用户函数,如不能使用printf、semTake 等。

对看门狗的操作函数有4 个:创建看门狗函数,WDOGID wdCreate(void);启动看门狗函数,STATUS wdStart(WDOG_ID wdId,int delay,FUNCPTR pRoutine,intparameter);删除看门狗函数,STATUS WdDelete(WDOG_ID wdld);取消看门狗计时函数,STATUS。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

编程过程中,出于需要,大家或多或少要用到定时/延时。

VxWorks下提供了几种定时/延时机制,根据收集的一些资料和VxWorks相关文档,在学习和上机实验的基础上,对它们的使用以及我所遇到的问题做一个总结,希望对大家能有所帮助。

不正确之处,恳请斧正。

1 taskDelay
taskdelay()提供了一个简单的任务睡眠机制,也常用于需要定时/延时机制的应用中。

它的格式是STATUS taskDelay(int ticks /* number of ticks to delay task */),可以看出使用该函数实现延时的单位为tick(一般系统中一个tick都是ms级的)。

在VxWorks下可以这样使用taskDelay()函数:taskDelay(sysClkRateGet()*1)。

函数sysClkRateGet()返回系统的时钟速率,单位是tick数/每秒(利用函数sysClkRateSet()可以改变系统的时钟速率)。

在POSIX中有一个与taskdelay()相对应的函数――nanosleep()(下文中有介绍)。

这两个函数仅仅是延时单位不同,效果是相同的。

利用taskdelay(),可以将调用的任务移动到具有相同优先级的就绪队列尾部。

特别的,可以通过调用taskdelay(0),将cpu交给系统中其他相同优先级的任务。

延时为0的调用只能用于taskdelay()中,nanosleep()认为这种调用是错误的。

taskdelay()会导致调用的任务在指定的延时期间(以ticks计数)放弃cpu,使任务处于DELAY状态(因此,其不能用于中断服务程序中)。

通常其受到任务调度的影响,但在等待一些与中断无关联的外部条件时,其是有用的。

如果调用的任务受到一个信号,指出其没有被阻塞或被忽略,taskDelay()将返回ERROR,并在信号处理程序运行后设置errno为EINTR。

2 WatchDog
VxWorks提供了一个看门狗定时器(watchdog timer)机制,利用提供的函数,任何任务都可以创建一个看门狗定时器,经过指定的延时后,实现在系统时钟ISR的上下文中运行指定的程序。

在VxWorks中,看门狗定时器作为系统时钟中断服务程序的一部分来维护。

因此,与看门狗定时器相联系的函数运行在系统
时钟中断级。

在使用看门狗定时器实现定时/延时时,经过指定的时间,应用程序中断在系统时钟中断优先级上面,然而,如果内核不能立即执行这个中断服务程序,这个任务就被排队到tExcTask 工作队列中去,处在 tExcTask 工作队列中的任务的优先级为 tExcTask (通常是 0)。

对于使用看门狗定时器的中断服务程序,仍然必须遵守一般的ISR所要遵守的规则。

通过wdCreate( )可以创建一个看门狗定时器。

调用wdStart()启动定时器,延时参数以tick为单位,同时还要指定定时完成后要调用的程序。

如果你的应用程序需要多个看门狗函数,使用wdCreate( )为每个需求产生独立的看门狗ID。

因为对于给定的看门狗ID,只有最近的wdStart()有效。

在指定的tick计数到达之前,要取消一个看门狗计时器,可以调用wdCancel()实现。

每调用一次wdStart(),看门狗定时器只执行一次。

对于一些要求周期性执行的应用程序。

要获得该效果,定时器函数本身必须通过递归调用wdStart()来重新启动定时器。

利用看门狗定时器,调用的任务不会被阻塞:因为wdStart()调用是立即返回的。

使用该方法实现延时,关联函数所受限制太大,好多系统调用不可用,郁闷也…
#define TICK_MS (1000/SYS_CLK_RATE)/*每tick的毫秒数*/
int timer_array[30];
void timer_run()/*定时器调用函数*/
{wdStart(timer_ID,timerLength/TICK_MS,(FUNCPTR)(timer_ run),0);}
UINT16 SimOs_SetTimer(UINT16 timerID, ULONG timerLength) /*系统定时*/
{
WDOG_ID timer_ID;
extern int timer_array[];
timer_ID="wdCreate"();/*创建定时器*/
timer_array[timerID]=(int)timer_ID;
if(timerLength==0)
timerLength="1";
wdStart(timer_ID,timerLength/TICK_MS,(FUNCPTR)(timer_run) ,0);/*打开定时器*/
}
/*清除系统定时*/
UINT16 SimOs_KillTimer(UINT16 timerID)
{
extern int timer_array[30];
WDOG_ID timer_ID;
timer_ID=(WDOG_ID)timer_array[timerID];
if(wdDelete(timer_ID)==OK)
return XW_TRUE;
}
3 timer(POSIX)
3.1 timer
VxWorks提供IEEE的POSIX 1003.1b标准定时器接口。

使用这种定时器机制,在指定的时间间隔后,任务向自身发信号。

定时器是建立在时钟和信号之上。

程序可以创建创建、设置和删除一个定时器。

当定时器到达期限,将向任务发送默认的信号(SIGALRM)。

使用timer的一般流程:
/* 创建定时器 */
if(timer_create(CLOCK_REALTIME,0,&mytimer)==ERROR)
return(ERROR);
/* 用户程序与定时器相连 */
if(timer_connect(mytimer,(VOIDFUNCPTR)my_handler,0)==ERROR)
return(ERROR);
/* 设置定时器值 */
if(timer_settime(mytimer,0,&value,0)==ERROR)
return(ERROR);
/* 一段延时 */。

/* 删除定时器 */
if (timer_delete(mytimer)==ERROR)
return(ERROR);
在使用定时器时,容易忽略定时结束后任务向自身发信号这一处理步骤。

即在定时结束后,要向创建定时器的任务发送信号,如果此时任务已不存在,定时程序将不能执行,提示的错误是“interrupt: timerWdHandler : kill failed (timer=******,tid=******,errno=0x16)”(有一个《关于timer(定时器)中几个函数的疑问!》帖子,其中提到该问题)。

在上机时,我设置了一个较长时间的定时器,在创建定时器任务中使用相等的延时操作(taskDelay()、nanosleep()随便哪个都行),此时程序正常运行,定时结束后正确地执行关联到定时器的程序;再次运行,在定时结束前,我在shell下删除掉创建定时器的任务,定时结束后又出现上述的错误。

因此,使用POSIX定时器时,一定要注意不能让创建定时器的任务在触发定时程序之前结束,否则。

准备reset吧
3.2 nanosleep()
函数nanosleep()的功能与VxWorks提供的taskDelay()类似,nanosleep()允许指定以秒和纳秒为单位的定时/延时时间,taskDelay()以tick作为定时/延时时间。

两者只是延时单位不同,而不是精度不同,都由系统时钟频率决定。

与taskDelay()一样,使用nanosleep()实现定时/延时的任务也受调度的影响,在实际操作中一定要注意这一点。

使用nanosleep()时,定时参数使用的是结构itimerspe中的it_value,可以指定it_value中的秒和纳秒为定时/延时时间。

函数的使用较为简单,不再赘述。

4 其它
使用带有超时值timeout的msgQReceive()、semTask()也可以实现延时(有使用这种方式来进行延时的人吗?不有吗?有吗?不有吗?有吗?不有吗?。

)。

该方法将阻塞任务,让其等待超时,利用该方法实现延时可以使用函数semTask(…,timeout)、msgQReceive(…,…,…,timeout)。

调用任务被放进阻塞队列中(注意,使用semTask和msgQReceive时,time的值不能是NO_WAIT,如果指定NO_WAIT的话,将立即返回,也就达不到延时的效果了^_^)。

如果你希望任务不被阻塞,还能继续执行,sorry,此法不行,使用看门狗吧。

当阻塞的任务满足继续执行的条件后,将被放入ready队列。

这里要注意的是,任务被放入ready队列并不意味着立刻就被执行。

想想看,如果比它高优先级的任务正在占用资源,或也在等资源,那么…延时将是不确定的。

相关文档
最新文档