uC OS II系統學習筆記(7) 時間管理

2021-08-07 10:51:11 字數 2138 閱讀 6041

任務延時函式即ostimedly(),申請該服務的任務可以延時一段時間,這個時間是根據時鐘節拍的數目來定的。其入口引數為:

void ostimedly (int16u ticks)
由以上可看出,傳入的引數是ticks,即時鐘節拍。如果時鐘節拍是1ms,那麼ostimedly(1)即為延時1毫秒,若時鐘節拍是10ms,那麼ostimedly(1)就是延時10毫秒。

需要注意的是,使用ostimedly()來進行延時是有延時抖動的,也就是說這個延時並不是精確的,這個在之前已經說過原因了。就不再提了。需要記住的一點是,如果乙個函式需要延時至少1個時鐘節拍,那麼呼叫ostimedly時傳入引數應該是2。因為有可能延時1個時鐘節拍時,實際上是不到1個時鐘節拍的時間。

按時分秒延時函式即:

int8u ostimedlyhmsm (int8u hours, int8u minutes, int8u seconds, int16u milli)
其中hmsm即分別代表小時,分鐘,秒鐘,毫秒。至於延時的方式,其實還是把傳入的引數轉換成時鐘節拍來進行延時。具體參照以下原始碼:

int8u ostimedlyhmsm (int8u hours, int8u minutes, int8u seconds, int16u milli)

if (seconds > 59)

if (milli > 999)

ticks = (int32u)hours * 3600l * os_ticks_per_sec (2)

+ (int32u)minutes * 60l * os_ticks_per_sec

+ (int32u)seconds * os_ticks_per_sec

+ os_ticks_per_sec * ((int32u)milli

+ 500l/os_ticks_per_sec) / 1000l; (3)

loops = ticks / 65536l; (4)

ticks = ticks % 65536l; (5)

ostimedly(ticks); (6)

while (loops > 0)

return (os_no_err);

} else

}

從(2)到(3)可以看出將傳入時間轉換成節拍數的操作。重點在於(3),可以看到加毫秒時,其公式為:

os_ticks_per_sec * ((int32u)milli + 500l/os_ticks_per_sec) / 1000l;
這個式子可以簡化一下得到:

( os_ticks_per_sec / 1000 ) * milli + 1/2。其中的1/2就是由os_ticks_per_sec * 500l/os_ticks_per_sec得來,目的是為了四捨五入取到最接近的節拍。可以看到,如果將簡化的式子加以理解,含義即1ms內的時鐘節拍數乘以需要延時的毫秒數加1/2。在有可能出現小數的情況下,會把小數點後的部分丟掉,所以加上1/2保證四捨五入。為了保證在計算過程中盡量不出現小數以影響精度,故出現了上述**中的式子。

另外,由於ostimedly只能夠最多 一次延時65535個時鐘節拍,所以如果需要延時的時間超過了65535個時鐘節拍,就會進行分次延時。

使用ostimedlyresume()可以使在延時期的任務結束延時。

int8u ostimedlyresume (int8u prio)
以上即只需要傳入乙個優先順序即可。當然,這個服務會自動判定需要結束延時的任務是否處於延時狀態等再進行操作。

無論時鐘節拍何時發生,系統都會將乙個32位的計數器加1,這個計數器在呼叫 osstart()或者計數器滿之後會從0開始計數。

而ostimeget()可以取得當前計數器的值,ostimeset()可以改變當前計數器的值。

int32u ostimeget (void)

void ostimeset (int32u ticks)

ucos II 系統學習之 任務堆疊檢測

不少屌絲同學都有類似經歷吧,在使用ucosii建立任務時,關於任務堆疊大小設為多大合適搞的不清不楚,鬱悶之下就隨便整個數,比如就1024吧,呵呵,反正也沒見得出問題,那就不多想了。我想大多數同學都是這樣做的吧。這樣只是因為在一般情況下,1024確實已經足夠大了,堆疊溢位的可能性很小而已。那麼,如果你...

LINUX學習筆記10 時間程式設計

a 需要包涵標頭檔案 include b 時間型別 1.t time null d 時間轉化 b time t t 定義時間變數 3.儲存至tm結構 struct tm 日光節約時間 4.將tm格式的時間轉化為字串,便於顯示 a char asctime const struct tm tm 5.將...

CentOS7 時間同步

今天在學習etcd集群搭建時遇到時間不同步錯誤,故做筆記記錄一下,錯誤資訊如下 與對等端47856ed020c3771a的時鐘差太大 找到對應的節點 47856ed020c3771a 192.168.6.12 2380 注 這裡主要就是通過時間伺服器對系統時間進行同步,所以0.asia.pool.n...