系统时间
系統(tǒng)時間
System Time
介紹
在前面的一篇文章中介紹了實時操作系統(tǒng)環(huán)境中的時間概念,以及與時間相關(guān)的設(shè)施的概念,這些設(shè)施可能與RTOS一起使用。
時鐘滴答聲
所有的計時設(shè)備都由一個硬件時鐘驅(qū)動。這只是一個振蕩器,它以固定的間隔產(chǎn)生一個中斷。為了使定時數(shù)對應(yīng)用程序有意義,必須知道振蕩器的頻率。
時鐘中斷服務(wù)程序
由硬件時鐘產(chǎn)生的中斷必須由中斷服務(wù)例程(ISR)適當(dāng)?shù)靥幚?#xff0c;它實現(xiàn)了RTOS的所有定時功能。Nucleus SE中時鐘ISR的詳細信息將在以后的文章中介紹。
計時設(shè)置
Nucleus RTO和Nucleus SE包括許多計時設(shè)施:
滴答時鐘-這是一個簡單的計數(shù)器,由時鐘ISR遞增。在Nucleus RTOS和Nucleus SE中,這個計數(shù)器是32位寬的,任務(wù)可以設(shè)置和讀取它的值。在Nucleus SE中,計時時鐘是可選的。本章余下部分將更詳細地討論這一主題。
應(yīng)用程序計時器–Nucleus RTO和Nucleus SE都支持計時器對象。
時間片調(diào)度——在Nucleus RTO中,相同優(yōu)先級的任務(wù)按循環(huán)調(diào)度,但也可以應(yīng)用時間片。在Nucleus SE中,時間片調(diào)度器是一個選項;這在前面的文章中詳細討論過。
任務(wù)睡眠。任務(wù)可以選擇在指定的時間段內(nèi)掛起(進入休眠狀態(tài))。
API調(diào)用超時-在Nucleus RTO和Nucleus SE中,許多API調(diào)用允許任務(wù)掛起,等待資源的可用性。這種暫停可以是不確定的,或者在Nucleus RTOS中,可以指定可選的超時時間。Nucleus SE不支持API調(diào)用超時。
準(zhǔn)確度
在這一點上,簡短地談一下計時精度是值得的。
定時設(shè)備的精度完全取決于時鐘振蕩器的頻率。例如,如果每隔10毫秒接收一個脈沖,而應(yīng)用程序任務(wù)想要延遲100毫秒,則顯然需要等待10個脈沖。然而,目前尚不清楚上一次脈沖發(fā)生的時間——可能是現(xiàn)在,也可能是近10毫秒前。因此,100毫秒的延遲可能長達(略低于)110毫秒。
解決這個問題的一個明顯的方法是增加振蕩器的頻率。如果脈沖以1毫秒的間隔出現(xiàn),100毫秒的延遲永遠不會超過101毫秒。缺點是時鐘ISR將花費10倍的CPU時間,這是一個開銷。
系統(tǒng)設(shè)計者必須確定所需定時器精度和可用CPU功率之間的平衡。
配置系統(tǒng)時間
與Nucleus SE的大多數(shù)方面一樣,系統(tǒng)時間的配置主要由nuse_config.h中的#define語句控制。密鑰設(shè)置是NUSE_SYSTEM_TIME_SUPPORT,這將啟用該功能。指定對象的數(shù)量是沒有問題的-系統(tǒng)時間只是啟用或不啟用。
選擇非零值是系統(tǒng)時間的“主啟用”。這將導(dǎo)致定義一個數(shù)據(jù)結(jié)構(gòu),本文稍后將對此進行詳細介紹。它還激活A(yù)PI啟用設(shè)置。
API啟用
Nucleus SE中的每個API函數(shù)(服務(wù)調(diào)用)在nuse_config.h中都有一個啟用的#define符號。對于系統(tǒng)時間,這些是:
NUSE_CLOCK_SET
NUSE_CLOCK_RETRIEVE
默認情況下,這兩個值都設(shè)置為FALSE,從而禁用每個服務(wù)調(diào)用并禁止包含任何實現(xiàn)代碼。要為應(yīng)用程序配置系統(tǒng)時間,需要選擇要使用的API調(diào)用并將其啟用符號設(shè)置為TRUE。
默認情況下,從配置文件nuse_config.h中提取。
#define NUSE_SYSTEM_TIME_SUPPORT FALSE
/* Enables the system tick clock *
/#define NUSE_CLOCK_SET FALSE /* Service call enabler /#define NUSE_CLOCK_RETRIEVE FALSE / Service call enabler */
如果啟用了系統(tǒng)時API函數(shù)而未啟用系統(tǒng)時功能,則會導(dǎo)致編譯時錯誤。如果您的代碼使用尚未啟用的API調(diào)用,則會導(dǎo)致鏈接時間錯誤,因為應(yīng)用程序中不會包含任何實現(xiàn)代碼。
系統(tǒng)時間服務(wù)調(diào)用
Nucleus RTOS支持與系統(tǒng)時間相關(guān)的兩個服務(wù)調(diào)用,它們提供以下功能:
設(shè)置系統(tǒng)時間值。由Nucleus SE中的NUSE_Clock_Set()實現(xiàn)。
獲取系統(tǒng)時間值。由Nucleus SE中的NUSE_Clock_Retrieve()實現(xiàn)。
將詳細檢查每個服務(wù)調(diào)用的實現(xiàn)。
系統(tǒng)時間設(shè)置和獲取服務(wù)
唯一可以對系統(tǒng)時間值執(zhí)行的操作是將其設(shè)置為一個值并獲取(檢索)其當(dāng)前值。Nucleus RTOS和Nucleus SE各自為這些操作提供了兩個基本的API調(diào)用,這里將對此進行討論。
系統(tǒng)時間值的解釋取決于應(yīng)用程序,因為它只是對自上次重置計數(shù)器以來的時鐘“滴答”次數(shù)的計數(shù)。要使用此信息,必須知道時鐘振蕩器的頻率。
設(shè)置時間
任何任務(wù)都可以通過調(diào)用此API函數(shù)來設(shè)置系統(tǒng)時間。
用于設(shè)置時間的Nucleus RTOS API調(diào)用
Service call prototype:
VOID NU_Set_Clock(UNSIGNED new_value);
Parameters:
new_value – the value to which the system time is to be set
Returns:
none.
Nucleus SE API Call for Setting Time
This API call supports the key functionality of the Nucleus RTOS API.
Service call prototype:
void NUSE_Clock_Set(U32 new_value);
Parameters:
new_value – the value to which the system time is to be set
Returns:
none.
設(shè)置時間的Nucleus SE實現(xiàn)
代碼非常簡單。提供的值只是存儲在一個關(guān)鍵部分的NUSE_Tick_時鐘中。
檢索時間
任務(wù)可以通過調(diào)用此API函數(shù)來獲取系統(tǒng)時間。
用于檢索時間的Nucleus RTOS API調(diào)用
Service call prototype:
UNSIGNED NU_Retrieve_Clock(VOID);
Parameters:
none
Returns:
the current system time value
Nucleus SE API Call for Retrieving Time
This API call supports the key functionality of the Nucleus RTOS API.
Service call prototype:
U32 NUSE_Clock_Retrieve(void);
Parameters:
none
Returns:
the current system time value
時間檢索的Nucleus-SE實現(xiàn)
代碼非常簡單。在臨界區(qū)內(nèi)獲得NUSE_Tick_Clock的值并返回。
數(shù)據(jù)結(jié)構(gòu)
系統(tǒng)時間使用一種數(shù)據(jù)結(jié)構(gòu)——在RAM中——它只是一個32位字。
強烈建議應(yīng)用程序代碼不要直接訪問這個數(shù)據(jù)結(jié)構(gòu),而是使用提供的API函數(shù)。這避免了與Nucleus SE未來版本的不兼容和不必要的副作用,并簡化了將應(yīng)用程序移植到Nucleus RTOS的過程。這里包含數(shù)據(jù)結(jié)構(gòu)的詳細信息,以便更容易地理解服務(wù)調(diào)用代碼的工作方式和調(diào)試。
RAM Data
The data structure is:
NUSE_Tick_Clock – This is a variable of type U32 where the system clock tick count is stored.
Nucleus SE啟動時,此數(shù)據(jù)結(jié)構(gòu)由NUSE_Init_Task()初始化為零。未來的文章將全面描述Nucleus SE的啟動過程。
ROM數(shù)據(jù)
沒有與系統(tǒng)時間相關(guān)聯(lián)的ROM數(shù)據(jù)結(jié)構(gòu)。
系統(tǒng)時間數(shù)據(jù)占用
與Nucleus SE的所有方面一樣,系統(tǒng)時間所需的數(shù)據(jù)內(nèi)存量是很容易預(yù)測的。
ROM數(shù)據(jù)占用為0。
RAM數(shù)據(jù)占用(字節(jié))總是4。
未實現(xiàn)的API調(diào)用
所有與系統(tǒng)時間相關(guān)的Nucleus RTOS API調(diào)用在Nucleus SE中都是等效的。
與Nucleus PLUS兼容
對于Nucleus SE的各個方面,我的目標(biāo)是盡可能保持與Nucleus RTOS的高級別應(yīng)用程序代碼兼容性。系統(tǒng)時間也不例外,而且,從用戶的角度來看,它的實現(xiàn)方式與Nucleus RTOS中的方式大致相同。Nucleus RTOS API調(diào)用可以直接映射到Nucleus SE調(diào)用上。
總結(jié)
- 上一篇: 应用程序计时器
- 下一篇: Nucleus 实时操作系统中断(上)