VxWorks中Timer机制

[摘要] Timer是实时操作系统的一个重要组成部分。本文结合近阶段的学习和实验情况,对VxWorks中的时间函数和定时器作了一些探讨。主要介绍了Timer的机制,相关的函数,并给出了一些具体的例子。

 

. Tick

Tick是指每秒中定时器中断的次数。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 Timer

wdDelete

删除Watchdog Timer

wdStart

启动一个Watchdog Timer

wdCancel

取消一个正在记数的Watchdog Timer

 

Watchdog使用过程如下:首先调用wdCreate创建一个Watchdog Timer, 然后通过wdStart启动该Timer。当tick累计到设定的数字时,和它相联系的C函数被激活作为ISR运行。下面是一个例子,该例子在延迟3秒后输出一句话:“Watchdog timer just expired”。

例:

#include "VxWorks.h"

#include "logLib.h"

#include "wdLib.h"

#include "taskLib.h"

 

/* defines */

#define  SECONDS (3)

 

WDOG_ID myWatchDogId;

myTask (void)

       /* Create watchdog */

 

       if ((myWatchDogId = wdCreate()) == NULL)

                return (ERROR);

 

       /* Set timer to go off in SECONDS - printing a message to stdout */

     if (wdStart (myWatchDogId, sysClkRateGet() * SECONDS, logMsg,

                    "Watchdog timer just expired\n") == ERROR)

       taskDelay(200);

       return (ERROR);

 

.POSIX Timer

VxWorks提供了和POSIX1003.1b兼容的时间机制。和POSIX Timer相关的主要函数如下:

 

clock_gettime

取得当前时间

clock_settime

设置当前时间

timer_create

创建定时器

timer_connect

将定时器和某个C 函数相连接

timer_cancel

取消某个定时器

timer_delete

删除定时器

timer_settime

设置Timer的中断周期

 

下面是POSIX Timer的例子。该例子中,myTimer()用来初始化Timer,将myHandler()tmID Timer相关联。每隔1秒,myHandler()被调用一次。当myHandler()被调用10次后,它取消并删除定时器tmID

POSIX Timer中,定义了两个重要的结构,它们都在time.h文件中定义。其定义如下:

struct timespec

{

                                           /* interval = tv_sec*10**9 + tv_nsec */

    time_t tv_sec;                 /* seconds */

    long tv_nsec;            /* nanoseconds (0 - 1,000,000,000) */

};

struct itimerspec

        {

            struct timespec it_interval;          /* timer period (reload value) */

            struct timespec it_value;             /* timer expiration*/

        };

 

例子见附录。

 

.小结:

VxWorks目前并没有向我们提供系统的文档及开发资料,所有的资料只有连机帮助。帮助中对各个系统函数也只作了一个简单的介绍,对函数中的输入、输出、返回值以及函数中用到的各种结构、宏定义都没有说明。本文中提供的例子及对函数的理解都是通过实验得出的,可能会有曲解或错误的地方,欢迎大家批评指正。

为了测试系统函数,编制了一些小程序,如有兴趣者可和我联系。

VxWorks中并没有系统地讲述其时间机制,而是分散在帮助文件的各个地方,有兴趣者可参见以下章节:

²  Tornado 1.0.1 online Manuals -> VxWorks Programmer’s Guide -> Basic Os -> Watchdog Timers

²  Tornado 1.0.1 online Manuals -> VxWorks Programmer’s Guide-> Basic Os -> POSIX Clock and Timers

²  Tornado 1.0.1 online Manuals -> VxWorks Reference -> Libraries and Drivers -> ClockLib

²  Tornado 1.0.1 online Manuals -> VxWorks Reference -> Libraries and Drivers -> sysLib

²  Tornado 1.0.1 online Manuals -> VxWorks Reference -> Libraries and Drivers -> tickLib

²  Tornado 1.0.1 online Manuals -> VxWorks Reference -> Libraries and Drivers -> timerLib

 

.附录 vxtimer.c

 

/******************************************************************************

 

         标题: vxtimer.c

         功能: VxWorks timer test programm.

         说明:

                   This is a test program for VxWorks. In function myTimer, the timer

         handler--myHandler is connect to the timer tmId. Once the timer reaches

         the set time, myHandler will be called. It will display some infomration

         on the screen.

                   To run this program, just compile it and do as follows:

                            ld<vxtimer.o

                            sp myTimer

         作者: An Yunbo

         日期: 1999/7/14          

******************************************************************************/

 

 

#include "VxWorks.h"

#include "time.h"

#include "timers.h"

#include "syslib.h"

#include "logLib.h"

#include "stdio.h"

 

#define COUNT 10

 

/******************************************************************************

 

         标题: myhandler

         功能: the timer handler. it will be called once the set time is

         reachted.

         格式:void myHandler(timer_t tmId, int arg).

         输入:

                   timer_t tmId: the Id of the set timer.

                   int arg. A user parameter.

         输出:

         返回值:

******************************************************************************/

void myHandler(timer_t tmId,int arg)

{

         static int iCount=0;

         int iRet;

        

         iCount++;

         printf("myHandler is called. the arg is      %d,count is %d\n",arg,iCount);

        

         /* When this funciton is called COUNT times, cancle the timer and

            delete it.

         */

         if(iCount>=COUNT)

         {

                   iRet=timer_cancel(tmId);

                   if(iRet!=0)

                   {

                            printf("time_cancel error.\n");

                            return;

                   }

                   printf("Timer cancled\n");

                   timer_delete(tmId);

                   if(iRet!=0)

                   {

                            printf("time_delete error.\n");

                            return;

                   }

         }

}

 

 

/*************************************************************************

         标题:myTimer

         功能:init timId and connect it with function myHandler.

         格式:void myTimer().

         输入:

         输出:

         返回值:

*************************************************************************/

void myTimer()

{

         int iRet;

         struct timespec     stTp0,stTp1;

         struct itimerspec stValue;

         timer_t tmId;

        

 

         /* set current time to 0 second and o nsecond*/

         stTp0.tv_sec=0;

         stTp0.tv_nsec=0;

         iRet=clock_settime(CLOCK_REALTIME, &stTp0);

         if(iRet!=0)

         {

                   printf("clock_settime error.\n");

                   return;

         }

        

         iRet=timer_create(CLOCK_REALTIME,NULL,&tmId);

         iRet=timer_create(0,NULL,&tmId);

         if(iRet!=0)

         {

                   printf("timer_create error.\n");

                   return;

         }

        

 

         /* connect tmId with myHandler*/ 

         iRet=timer_connect(tmId,myHandler,10);

         if(iRet!=0)

         {

                   printf("timer_connect error.\n");

                   return;

         }

        

         /* set interrupt time: 1 second and the first interrup time will be 2

            second later

         */

         stValue.it_interval.tv_sec=1;

         stValue.it_interval.tv_nsec=0;

         stValue.it_value.tv_sec=2;

         stValue.it_value.tv_nsec=0;

         iRet=timer_settime(tmId,0,&stValue,0);

         if(iRet!=0)

         {

                   printf("timer_settime error.\n");

                   return;

         }

 

         /* sleep 10 second and print the remind time when the time interrupt come*/

         stTp0.tv_sec=10;

         stTp0.tv_nsec=0;

         while(1)

         {

                   nanosleep(&stTp0,&stTp1);

                   printf("tv_sec %ld tv_nsec %ld\n",stTp1.tv_sec,stTp1.tv_nsec);

         }

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/435363.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LINK : fatal error LNK1104: 无法打开文件“LIBCD.lib”

出现这类问题一般是由于所运行的项目是VC6&#xff08;或者vs2003)创建的&#xff0c;而后又用VS2005或者更高版本工具打开项目导致的&#xff0c;原因都是因为LIBCD.lib文件被更改了.要解决问题的话&#xff0c;只要在链接设置那里忽略它就没问题了。 解决办法是&#xff1a; …

TVDI计算流程

TVDI计算过程 下载数据的网站: https://ladsweb.modaps.eosdis.nasa.gov/search/ 所需数据modis的16天的ndvi数据(MOD13A2)和每8天的LST数据(MOD11A2) 北半球选择Terra,南半前选择Aqua,因为两个卫星旋转是相对的,太阳高度角不同,会有些许误差 利用modis处理工具(MRT)…

LSGO软件技术团队2015~2016学年第十二周(1116~1122)总结

团队简述&#xff1a; LSGO软件技术团队成立于2010年10月&#xff0c;主要从事的应用方向为互联网与移动互联网&#xff08;UI设计&#xff0c;前端开发&#xff0c;后台开发&#xff09;&#xff0c;地理信息系统&#xff1b;研究方向为大数据处理与机器学习。成立几年来为学校…

POSIX定时器

最强大的定时器接口来自POSIX时钟系列&#xff0c;其创建、初始化以及删除一个定时器的行动被分为三个不同的函数&#xff1a;timer_create()(创建定时器)、timer_settime()(初始化定时器)以及timer_delete(销毁它)。 创建一个定时器&#xff1a; int timer_create(clockid_t …

python append函数_让你python代码更快的3个小技巧!速度提高了一倍还多

大家好&#xff01;今天呢&#xff0c;我们来聊一聊如何加速你的 python 代码。Python 语言的优点可以列举出许多&#xff0c;语法简单易懂、模块丰富、应用广泛等等。但是世界上没有有完美的东西&#xff0c;python 一个明显缺点就是运行速度慢&#xff0c;至少跟 C 语言没法比…

扣扣保镖我喜欢

扣-扣-保-镖还是挺好用的&#xff0c;上次360召回之后&#xff0c;网上的下载链接都失效了&#xff0c;不过今天偶然发现我的硬盘上还有一份。。就打开试试&#xff0c;结果没事的哈。 qq版本&#xff1a;qq2010正式版 sp2.1(1861) 趣盘下载地址&#xff1a;http://oskycar.qup…

栅格计算面积

1.进行栅格重分类 2.重分类 3.打开属性&#xff0c;查看像元大小 4.打开属性表 5.添加字段 6.打开字段计算器 7.计算结果如下&#xff08;单位一般为平方米&#xff09;

autotools使用

Makefile固然可以帮助make完成它的使命&#xff0c;但要承认的是&#xff0c;编写Makefile确实不是一件轻松的事&#xff0c;尤其对于一个较大的项目而言更是如此。那么&#xff0c;有没有一种轻松的手段生成Makefile而同时又能让我们享受make的优越性呢&#xff1f;本节要讲au…

LSGO软件技术团队2015~2016学年第十三周(1123~1129)总结

团队简述&#xff1a; LSGO软件技术团队成立于2010年10月&#xff0c;主要从事的应用方向为互联网与移动互联网&#xff08;UI设计&#xff0c;前端开发&#xff0c;后台开发&#xff09;&#xff0c;地理信息系统&#xff1b;研究方向为大数据处理与机器学习。成立几年来为学校…

[转]揭开正则表达式的神秘面纱

揭开正则表达式的神秘面纱关闭高亮[原创文章&#xff0c;转载请保留或注明出处&#xff1a;http://www.regexlab.com/zh/regref.htm]引言正则表达式&#xff08;regular expression&#xff09;就是用一个“字符串”来描述一个特征&#xff0c;然后去验证另一个“字符串”是否符…

智能机器人及其应用ppt课件_一文了解!伺服系统机理及其在工业机器人等领域的应用...

更多&#xff0c;更及时的干货内容&#xff0c;请加我们的微信公众号&#xff1a;wc_sfdj诚邀业内人士及机构向我们投稿&#xff0c;投稿有礼投稿邮箱&#xff1a;tougao51wctt.com来源 | 网络欢迎阅读本篇文章&#xff0c;文末有福利哦&#xff01;(一)伺服系统综述1、伺服运动…

利用python爬取房价

​公众号二维码 爬取房价网站:(安居客)https://zb.fang.anjuke.com/loupan/all/ 由于该网站每隔一段时间需要进行验证(反爬虫),所以我们为了防止我们爬取信息的时候出现间断,所以需要借助execl来保证信息的连续性。 结果展示

Linux编程make命令

摘要:在开发一个系统时&#xff0c;一般是将一个系统分成几个模块&#xff0c;这样做提高了系统的可维护性&#xff0c;但由于各个模块间不可避免存在关联&#xff0c;所以当一个模块改动后&#xff0c;其他模块也许会有所更新&#xff0c;当然对小系统来说&#xff0c;手工编译…

python 计算订单_python实现apriori算法的关联规则之支持度、置信度、提升度

Apriori算法的简介 Apriori算法&#xff1a;使用候选项集找频繁项集 Apriori算法是一种最有影响的挖掘布尔关联规则频繁项集的算法。其核心是基于两阶段频集思想的递推算法。该关联规则在分类上属于单维、单层、布尔关联规则。在这里&#xff0c;所有支持度大于最小支持度的项集…

LSGO软件技术团队2015~2016学年第十四周(1130~1206)总结

团队简述&#xff1a; LSGO软件技术团队成立于2010年10月&#xff0c;主要从事的应用方向为互联网与移动互联网&#xff08;UI设计&#xff0c;前端开发&#xff0c;后台开发&#xff09;&#xff0c;地理信息系统&#xff1b;研究方向为大数据处理与机器学习。成立几年来为学校…

java安装和环境配置

下载jdk 网址为https://www.oracle.com/java/technologies/javase-downloads.html 2.安装jdk 3.配置环境 以下都是在系统变量下新建 为jdk安装目录 D:\Program Files\Java\jdk-15.0.2 .;%JAVA_HOME%\bin;%JAVA_HOME%\lib\tool.jar; %JAVA_HOME%\bin;%JAVA_HOME%\jre\bin; 4.…

在Windows Azure中使用自己的域名

请参考:http://blog.smarx.com/posts/custom-domain-names-in-windows-azure 本文是对这篇文章部分解释和补充。 并请记住&#xff0c;此博客总是能给你在Windows Azure的开发中带来帮助。 域名解析机制浅析 域名解析&#xff0c;本是个很简单的事情&#xff1a;我们如若想将我…

如何使用autotools工具

autotools是系列工具&#xff0c;读者首先要确认系统是否装了以下工具&#xff08;可以用which命令进行查看&#xff09;。 autoscanaclocalautoheaderautomakeautoconf 使用autotools主要就是利用各个工具的脚本文件以生成最后的Makefile。其总体流程是这样的&#xff1a; 使…

LSGO软件技术团队2015~2016学年第十五周(1207~1213)总结

团队简述&#xff1a; LSGO软件技术团队成立于2010年10月&#xff0c;主要从事的应用方向为互联网与移动互联网&#xff08;UI设计&#xff0c;前端开发&#xff0c;后台开发&#xff09;&#xff0c;地理信息系统&#xff1b;研究方向为大数据处理与机器学习。成立几年来为学校…

python代码太长_Python 太糟糕了?开发者总结了 8 大原因

作者对每一项“缺点”都进行了分析&#xff0c;全文洋洋洒洒&#xff0c;概括起来 8 个原因分别是&#xff1a; 1、版本不兼容 Python 3 与 Python 2 不完全兼容。作者以 Perl 语言和创造了世界上早期个人电脑的 Commodore 为例&#xff0c;分析了缺乏向后兼容性和分离版本是如…