VxWorks豐富的定時管理和時鐘管理

VxWorks提供豐富的定時管理和時鐘管理,主要應用在以下幾個方面:
維護系統日曆時鐘
在任務等待信號量、消息、事件(VxWorks5.5版本以上)或內存段時的超時處理。(系統提供的函數調用都有關於timeout的參數設置。)
以一定的時間間隔或在特定的時間喚醒或發送告警到一個任務。
處理任務調度中的時間片輪轉。

VxWorks系統這些功能都依賴於週期性的定時中斷,離開實時時鐘或定時器硬件就無法工作。介紹幾個常用的系統調用:

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 */
)

sysClkRateSet( )――設置每秒鐘系統時鐘中斷次數(既每秒鐘的tick數)(sysLib.h)
函數原型:――set the system clock rate
STATUS sysClkRateSet
(
int ticksPerSecond /* number of clock interrupts per second */
)

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 */
}

而系統時鐘頻率SYS_CLK_RATE的值在congfigAll.h中定義爲60,代碼如下:
#define SYS_CLK_RATE 60 /* default system clock rate */
你可以通過改這個值來自己設置系統時鐘中斷頻率,一般在60到100,但不能大於600。SYS_CLK_RATE只設置的過大會增加任務切換開銷。

sysClkRateGet( )――得到每秒鐘系統時鐘中斷次數(既每秒鐘的tick數)(sysLib.h)
函數原型:――get the system clock rate
int sysClkRateGet (void)

 

 

--------------------------------------------------------------------------------

學習總結:VxWorks的定時與時鐘管理2

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

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

/**********************************/
#include "vxWorks.h"
#include "sysLib.h"
#include "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
tickAnnounce( )――通知系統內核時鐘tick
函數原型:――announce a clock tick to the kernel
void tickAnnounce (void)
它被usrConfig.c中的usrClock( )調用,而usrClock( )又是系統時鐘中斷服務程序,想讓應用程序運行在系統時鐘中斷級,則可將其加在ursClock程序裏。
tickSet( )――設置內核時鐘計數器值(內核tick的數)
函數原型:――set the value of the kernel's tick counter
void tickSet
(
ULONG ticks /* new time in ticks */
)
tickGet( )――得到內核時鐘計數器值
函數原型:――get the value of the kernel's tick counter
ULONG tickGet (void)


下面兩個例子:
/**********例一:用tickGet獲得現在內核tick定時器的tick數******************/
#include "vxWorks.h"
#include "tickLib.h"
#include "stdio.h"
#include "taskLib.h"
#include "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的使用例程************************/
#include "vxWorks.h"
#include "tickLib.h"
#include "stdio.h"
#include "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

發佈了26 篇原創文章 · 獲贊 5 · 訪問量 20萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章