由於嵌入式系統的任務是乙個無限迴圈,並且uc/os-ii還是個搶占式核心,所以為了使優先級別高的任務不至於獨佔cpu,uc/os-ii規定:除了空閒任務之外的所有任務必須在任務中合適的位置呼叫系統提供的函式ostimedly(),使當前任務的執行延時(暫停)一段時間並進行一次任務排程,以讓出cpu的使用權。
函式ostimedly()的**如下
void ostimedly (int16u ticks)
ostcbcur->ostcbdly = ticks; /* load ticks in tcb */
os_exit_critical();
os_sched(); /* find next task to run! */
}}
函式的引數ticks是一時鐘節拍數為單位的延時時間。為了使用更為習慣的方法來使任務延時,系統還提供了用時,分,秒,微妙為引數的延時任務ostimedlyhmsm(),其函式原型如下:
int8u ostimedlyhmsm (int8u hours, int8u minutes, int8u seconds, int16u milli)}}
}if (minutes > 59)
if (seconds > 59)
if (milli > 999)
#endif
/* compute the total number
of clock ticks required.. */
/* .. (rounded to
the nearest tick) */
ticks = ((int32u)hours * 3600l + (int32u)minutes * 60l + (int32u)seconds) * os_ticks_per_sec
+ os_ticks_per_sec * ((int32u)milli + 500l / os_ticks_per_sec) / 1000l;
loops = (int16u)(ticks / 65536l); /* compute the integral number
of65536 tick delays */
ticks = ticks % 65536l; /* obtain the fractional number
of ticks */
ostimedly((int16u)ticks);
while (loops > 0)
return (os_no_err);}
呼叫延時函式,當規定的延時時間期滿,或者有其他任務通過呼叫函式ostimedlyresume()取消延時時,他會立即進入就緒狀態。如果任務比正在執行的任務優先級別高,則立即引發一次任務排程。
linux驅動之時間管理
系統的時鐘頻率 時鐘頻率詳解和程式設計 一般系統都會有個預設的時鐘頻率hz,其實就是1秒內系統時鐘發生多少次中斷。假如 系統的hz為1000,則表示1秒內系統會產生1000次時鐘中斷 滴答數 系統核心會有個統計時鐘中斷發生的次數的計數器,該計數器從系統啟動引導被初始化為0後,只要發生一次時鐘中斷,該...
ucos iii學習之時間管理
與時間服務相關的api總結 任務呼叫這個函式後就會被掛起直到期滿。這個函式可以有三種模式 相對延時模式,週期性延時模式,絕對定時模式。1 相對延時模式 任務每次執行時都會被延時大約2毫秒。當任務在時基中斷將要到來時被掛起,那麼實際的延時時基會少乙個時基。2 週期性延時 任務設定匹配值決定了任務被喚醒...
驅動學習之時間管理
通常情況下,jiffies在linux系統啟動引導階段初始化為0,當系統完成了對時鐘中斷的初始化之後,在每個時鐘中斷處理例程中,該值都會被 1,因此該值儲存了系統自最近一次啟動以來的時鐘滴答數。除了時鐘中斷程式對該值有修改的權利,其它任何模組都只有讀的權利。這裡再介紹乙個概念hz,該值在核心原始碼根...