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