原创 VxWorks丰富的定时管理和时钟管理

2006-10-25 12:17 6869 9 10 分类: MCU/ 嵌入式

VxWorks提供丰富的定时管理和时钟管理,主要应用在以下几个方面:


? 维护系统日历时钟


? 在任务等待信号量、消息、事件(VxWorks5.5版本以上)或内存段时的超时处理。(系统提供的函数调用都有关于timeout的参数设置。)


? 以一定的时间间隔或在特定的时间唤醒或发送告警到一个任务。


? 处理任务调度中的时间片轮转。


VxWorks系统这些功能都依赖于周期性的定时中断,离开实时时钟或定时器硬件就无法工作。介绍几个常用的系统调用:


l sysClkConnect( )――连接系统时钟中断服务程序(sysLib.h)


函数原型:――connect a routine to the system clock interrupt
STATUS sysClkConnect
(
FUNCPTR routine, /* routine called at each system clock interrupt */
int arg /* argument with which to call routine */
)


l sysClkRateSet( )――设置每秒钟系统时钟中断次数(既每秒钟的tick数)(sysLib.h)
函数原型:――set the system clock rate
STATUS sysClkRateSet
(
int ticksPerSecond /* number of clock interrupts per second */
)


l sysClkEnable ( )――使能系统时钟中断(sysLib.h)


函数原型:――turn on system clock interrupts


void sysClkEnable (void)


系统定时器的设置是在usrConfig.c中通过usrRoot( )函数完成的,主要就是调用以上三个函数,代码如下:


/* set up system timer */


sysClkConnect ((FUNCPTR) usrClock, 0); /* connect clock ISR */


sysClkRateSet (SYS_CLK_RATE); /* set system clock rate */


sysClkEnable (); /* start it */


其中usrClock( )也是在usrConfig.c中定义的,函数只是通知系统内核时钟tick。


void usrClock ()


{


tickAnnounce (); /* announce system tick to kernel */


}


(有关tickLib.h中的函数以后再介绍)


而系统时钟频率SYS_CLK_RATE的值在congfigAll.h中定义为60,代码如下:


#define SYS_CLK_RATE 60 /* default system clock rate */


你可以通过改这个值来自己设置系统时钟中断频率,一般在60到100,但不能大于600。SYS_CLK_RATE只设置的过大会增加任务切换开销。


l sysClkRateGet( )――得到每秒钟系统时钟中断次数(既每秒钟的tick数)(sysLib.h)


函数原型:――get the system clock rate


int sysClkRateGet (void)


[此贴子已经被作者于2004-5-31 17:13:36编辑过]
--------------------------------------------------------------------------------


学习总结:VxWorks的定时与时钟管理2

http://bbs.edw.com.cn/dispbbs.asp?boardID="3"&ID="29415"&page="1"


自己的一个小程序:(如何使用sysCkRateSet和sysClkRateGet)


/**********************************/
#i nclude "vxWorks.h"
#i nclude "sysLib.h"


#i nclude "stdio.h"
void test()
{
int TimeRate,NumB;
TimeRate = 100;
if(sysClkRateSet(TimeRate) ==ERROR)
{
printf("Error in setting rate!\n");
}
NumB = sysClkRateGet();
printf("NumB = %d\n",NumB);
}
运行结果:
-> test
NumB = 100
value = 11 = 0xb = __major_os_version__ + 0x7
l tickAnnounce( )――通知系统内核时钟tick
函数原型:――announce a clock tick to the kernel
void tickAnnounce (void)
它被usrConfig.c中的usrClock( )调用,而usrClock( )又是系统时钟中断服务程序,想让应用程序运行在系统时钟中断级,则可将其加在ursClock程序里。
l tickSet( )――设置内核时钟计数器值(内核tick的数)
函数原型:――set the value of the kernel's tick counter
void tickSet
(
ULONG ticks /* new time in ticks */
)
l tickGet( )――得到内核时钟计数器值
函数原型:――get the value of the kernel's tick counter
ULONG tickGet (void)
下面两个例子:
/**********例一:用tickGet获得现在内核tick定时器的tick数******************/
#i nclude "vxWorks.h"
#i nclude "tickLib.h"
#i nclude "stdio.h"
#i nclude "taskLib.h"
#i nclude "logLib.h"
void test()
{
ULONG TickCounts;
for(int i="0";i<5;i++)
{
TickCounts = tickGet();
logMsg("TickCounts = %d\n",TickCounts,0,0,0,0,0);
taskDelay(100);
}
}
运行结果:(在目标仿真器上输出)
0x12892b8 (t12): TickCounts = 299830
0x12892b8 (t12): TickCounts = 299930
0x12892b8 (t12): TickCounts = 300030
0x12892b8 (t12): TickCounts = 300130
0x12892b8 (t12): TickCounts = 300230
如果将上面的logMsg换为printf,则输出在shell中(注意两种输出的区别)。
/***********例二:tickSet和tickGet的使用例程************************/
#i nclude "vxWorks.h"
#i nclude "tickLib.h"
#i nclude "stdio.h"
#i nclude "taskLib.h"
void test()
{
ULONG TickCountSet = 0;
tickSet(TickCountSet);
for(int i="0";i<5;i++)
{
ULONG TickCounts = tickGet();
printf("TickCounts = %d\n",TickCounts);
taskDelay(100);
}
}
运行结果:
-> test
TickCounts = 0
TickCounts = 100
TickCounts = 200
TickCounts = 300
TickCounts = 400
value = 0 = 0x0

文章评论3条评论)

登录后参与讨论

shenyandetongxing_551209819 2006-12-25 12:31

#define 只是替换一下而已,在下面的计算中要看结果的数据类型了.

shenyandetongxing_551209819 2006-11-5 00:12

可以用Watchdog定时器吧。

#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;
}

参考一下吧,这是以前的一个测试的程序

用户75753 2006-11-4 21:18

如果我要实现精确到1ms的定时,该怎么办?

用户824863 2006-8-25 17:29

小店刚刚开张,还没来得及呢,以后会有的!

用户824863 2006-8-25 17:08

老婆真是给面子!!
相关推荐阅读
shenyandetongxing_551209819 2010-02-25 21:34
MyEclipse 建立第一个工程
1.打开MyEclipse--新建个工程File--New--Project--WebProject 2.在ProjectName中输入hello--Finish 3.然后为工程添加struts框架,...
shenyandetongxing_551209819 2010-02-06 22:42
人力资源管理软件(技术储备)
JAVA的SSH开发框架Struts、Spring、Hibernate在各层的作用1、Struts 负责 web层ActionFormBean 接收网页中表单提交的数据,然后通过Action 进行处理...
shenyandetongxing_551209819 2010-02-06 02:51
个人资源管理软件(需求)
先提提需求吧,这是重中之重,这不是简单就能完成的,需要不断的修改和完善。既然是个人资源管理就要首先搞清楚个人资源包括哪些部分:1  人脉资源,也就是我们常说的关系,人是社会型动物就不可能生活在真空里,...
shenyandetongxing_551209819 2010-02-06 02:33
HR软件设计开始(关注个人资源管理与分析)
最近对HR很感兴趣,上网搜了一下,HR的软件也不少,其中风头正劲的用友公司做的挺多,但是看了看都是针对企业级的。但自己平常的工作和进步帮助不大。想整一个关于人力资源、人际关系进行总结、分析的软件,让自...
shenyandetongxing_551209819 2010-02-06 02:30
对HR和B/S模式的东西感兴趣
最近对HR很感兴趣,上网搜了一下,HR的软件也不少,其中风头正劲的用友公司做的挺多,但是看了看都是针对企业级的。但自己平常的工作和进步帮助不大。想整一个关于人力资源、人际关系进行总结、分析的软件,让自...
shenyandetongxing_551209819 2008-10-01 16:18
由于工作原因,改行!!
已经好久没有上我的博客了,还有很多朋友支持我,很欣慰:)现在由于工作原因很长一段时间内将挥泪告别嵌入式。现在如果有做PKI或PMI的跟我一起交流啊:)...
我要评论
3
9
关闭 站长推荐上一条 /2 下一条