liteos時間管理(九)

1. 時間管理

1.1 概述

1.1.1 概念

時間管理以系統時鐘爲基礎。時間管理提供給應用程序全部和時間有關的服務。編程

系統時鐘是由定時/計數器產生的輸出脈衝觸發中斷而產生的,通常定義爲整數或長整數。輸出脈衝的週期叫作一個「時鐘滴答」。系統時鐘也稱爲時標或者Tick。一個Tick的時長能夠靜態配置。操作系統

用戶是以秒、毫秒爲單位計時,而芯片CPU的計時是以Tick爲單位的,當用戶須要對系統操做時,例如任務掛起、延時等,輸入秒爲單位的數值,此時須要時間管理模塊對兩者進行轉換。指針

Tick與秒之間的對應關係能夠配置。code

Huawei LiteOS的時間管理模塊提供時間轉換、統計、延遲功能以知足用戶對時間相關需求的實現。orm

1.1.2 相關概念

  • Cycle

系統最小的計時單位。 Cycle的時長由系統主頻決定,系統主頻就是每秒鐘的Cycle數。接口

  • Tick
    Tick是操做系統的基本時間單位,對應的時長由系統主頻及每秒Tick數決定,由用戶配置。

2. 開發指導

2.1 使用場景

用戶須要瞭解當前系統運行的時間以及Tick與秒、毫秒之間的轉換關係等。開發

2.2 功能

Huawei LiteOS系統中的時間管理主要提供如下兩種功能:it

  • 時間轉換:根據主頻實現CPU Tick數到毫秒、微秒的轉換。
  • 時間統計:獲取系統Tick數。
功能分類 接口名 描述
時間轉換 LOS_MS2Tick 毫秒轉換成Tick
- LOS_Tick2MS Tick轉化爲毫秒
時間統計 LOS_CyclePerTickGet 每一個Tick多少Cycle數
- LOS_TickCountGet 獲取當前的Tick數

2.3 時間管理錯誤碼

時間轉換存在出錯的可能性,須要返回對應的錯誤碼,以便快速定位錯誤緣由。編譯

序 號 定義 實際數值 描述 參考解決方案
1 LOS_ERRNO_SYS_PTR_NULL 0x02000010 入參指針爲空 檢查入參,傳入非空入參
2 LOS_ERRNO_SYS_CLOCK_INVAILD 0x02000011 無效的系統時鐘配置 在los_config.h配置有效的時鐘
3 LOS_ERRNO_SYS_MAXNUMOFCORES_IS_INVAILD 0x02000012 錯誤碼暫時沒有使用 錯誤碼暫時沒有使用
4 LOS_ERRNO_SYS_PERIERRCOREID 0x02000013 錯誤碼暫時沒有使用 錯誤碼暫時沒有使用
5 LOS_ERRNO_SYS_HOOK_IS_FULL 0x02000014 錯誤碼暫時沒有使用 錯誤碼暫時沒有使用

2.4 開發流程

時間管理的典型開發流程:table

  1. 確認配置項LOSCFG_BASE_CORE_TICK_HW_TIME爲YES開啓狀態。
    • 在los_config.h中配置每秒的Tick數LOSCFG_BASE_CORE_TICK_PER_SECOND;
  2. 調用時鐘轉換接口。
  3. 獲取系統Tick數完成時間統計。
    • 經過LOS_TickCountGet獲取全局g_ullTickCount。

3. 注意事項

  • 獲取系統Tick數須要在系統時鐘使能以後。
  • 時間管理不是單獨的功能模塊,依賴於los_config.h中的OS_SYS_CLOCK和LOSCFG_BASE_CORE_TICK_PER_SECOND兩個配置選項。
  • 系統的Tick數在關中斷的狀況下不進行計數,故系統Tick數不能做爲準確時間計算。

4. 編程實例

4.1 實例描述

在下面的例子中,介紹了時間管理的基本方法,包括:

  1. 時間轉換:將毫秒數轉換爲Tick數,或將Tick數轉換爲毫秒數。
  2. 時間統計和時間延遲:統計每秒的Cycle數、 Tick數和延遲後的Tick數。

4.2 編程示例

前提條件:

  • 配好LOSCFG_BASE_CORE_TICK_PER_SECOND每秒的Tick數。
  • 配好OS_SYS_CLOCK 系統時鐘,單位: Hz。

時間轉換:

VOID Example_TransformTime(VOID)
{
    UINT32 uwMs;
    UINT32 uwTick;
    uwTick = LOS_MS2Tick(10000);//10000 ms數轉換爲Tick數
    printf("uwTick = %d \n",uwTick);
    uwMs= LOS_Tick2MS(100);//100 Tick數轉換爲ms數
    printf("uwMs = %d \n",uwMs);
}

時間統計和時間延遲:

VOID Example_GetTime(VOID)
{
    UINT32 uwcyclePerTick;
    UINT64 uwTickCount;
    uwcyclePerTick = LOS_CyclePerTickGet();//每一個Tick多少Cycle數
    if(0 != uwcyclePerTick)
    {
         dprintf("LOS_CyclePerTickGet = %d \n", uwcyclePerTick);
    }
    uwTickCount = LOS_TickCountGet();//獲取Tick數
    if(0 != uwTickCount)
    {
        dprintf("LOS_TickCountGet = %d \n", (UINT32)uwTickCount);
    }
    LOS_TaskDelay(200);//延遲200 Tick
    uwTickCount = LOS_TickCountGet();
    if(0 != uwTickCount)
    {
        dprintf("LOS_TickCountGet after delay = %d \n", (UINT32)uwTickCount);
    }
}

4.4 結果驗證

編譯運行獲得的結果爲:

時間轉換:

tick = 1000
uwMs = 1000

時間統計和時間延遲:

LOS_CyclePerTickGet = 495000
LOS_TickCountGet = 1
LOS_TickCountGet after delay = 201
相關文章
相關標籤/搜索