繁体中文
高级搜索
 
首页 | 电子技术应用 | 行业最新动态 | 行业最新产品 | 软件资料下载 | 电路图纸欣赏 | 博客文章精选 | 电子精品论坛 | 电子技术贴吧

当前位置:首页 >> 博客文章精选 >> 嵌入式系统-博客 >> VxWorks丰富的定时管理和时钟管理
VxWorks丰富的定时管理和时钟管理
作者:   来源: 发表时间:2006-12-08  字号:  

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


!注意:如果您发现此文章出现影响您的阅读的状况,请从浏览器地址栏里复制本文的链接到留言本报告给站长解决!
  • 上一篇: VxWorks编程方法(1)
  • 下一篇: 为arm,51与优盘进行串口通信的东东

  • >> 联系我们请给我们留言·留言本
    本站所有提供的信息软件资料均来自网络,版权及著作权归原作者所有,如果无意中侵犯了您的相关权利或触及法律法规,请给我们留言, 我们将在24小时内删除。
      浙ICP备05071687号  电子技术精品网