成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

鴻蒙內核源碼分析(時間管理篇) | Tick是操作系統的基本時間單位

系統
文章由鴻蒙社區產出,想要了解更多內容請前往:51CTO和華為官方戰略合作共建的鴻蒙技術社區https://harmonyos.51cto.com

[[390985]]

想了解更多內容,請訪問:

51CTO和華為官方合作共建的鴻蒙技術社區

https://harmonyos.51cto.com

本篇說清楚時間概念

讀本篇之前建議先讀鴻蒙內核源碼分析(總目錄)其他篇.

時間概念太重要了,在鴻蒙內核又是如何管理和使用時間的呢?

時間管理以系統時鐘 g_sysClock 為基礎,給應用程序提供所有和時間有關的服務。

[[390986]]

● 用戶以秒、毫秒為單位計時.

● 操作系統以Tick為單位計時,這個認識很重要. 每秒的tick大小很大程度上決定了內核調度的次數多少.

● 當用戶需要對系統進行操作時,例如任務掛起、延時等,此時需要時間管理模塊對Tick和秒/毫秒進行轉換。

熟悉兩個概念:

● Cycle(周期):系統最小的計時單位。Cycle的時長由系統主時鐘頻率決定,系統主時鐘頻率就是每秒鐘的Cycle數。

● Tick(節拍):Tick是操作系統的基本時間單位,由用戶配置的每秒Tick數決定,可大可小.

怎么去理解他們之間的關系呢?看幾個宏定義就清楚了.

時鐘周期(振蕩周期)

在鴻蒙g_sysClock表示時鐘周期,是CPU的赫茲,也就是上面說的Cycle,這是固定不變的,由硬件晶振的頻率決定的. OsMain是內核運行的第一個C函數,首個子函數就是 osRegister,完成對g_sysClock的賦值

CPU周期也叫(機器周期)

在鴻蒙宏OS_CYCLE_PER_TICK表示機器周期,Tick由用戶根據實際情況配置. 例如:主頻為1G的CPU,其振蕩周期為: 1吉赫 (GHz 109 Hz) = 1 000 000 000 Hz 當Tick為100時,則1 000 000 000/100 = 10000000 ,即一秒內可產生1千萬個CPU周期.CPU就是用這1千萬個周期去執行指令的.

指令周期

指令周期是執行一條指令所需要的時間,一般由若干個機器周期組成。指令不同,所需的機器周期數也不同。 對于一些簡單的的單字節指令,在取指令周期中,指令取出到指令寄存器后,立即譯碼執行,不再需要其它的機器周期。 對于一些比較復雜的指令,例如轉移指令、乘法指令,則需要兩個或者兩個以上的機器周期。 通常含一個機器周期的指令稱為單周期指令,包含兩個機器周期的指令稱為雙周期指令。

Tick硬中斷函數

  1. LITE_OS_SEC_BSS volatile UINT64 g_tickCount[LOSCFG_KERNEL_CORE_NUM] = {0};//tick計數器,系統一旦啟動,一直在++, 為防止溢出,這是一個 UINT64 的變量 
  2. LITE_OS_SEC_DATA_INIT UINT32 g_sysClock;//系統時鐘,是絕大部分部件工作的時鐘源,也是其他所有外設的時鐘的來源  
  3. LITE_OS_SEC_DATA_INIT UINT32 g_tickPerSecond;//每秒Tick數,鴻蒙默認是每秒100次,即:10ms 
  4. LITE_OS_SEC_BSS DOUBLE g_cycle2NsScale; //周期轉納秒級 
  5.  
  6. /* spinlock for task module */ 
  7. LITE_OS_SEC_BSS SPIN_LOCK_INIT(g_tickSpin); //節拍器自旋鎖 
  8. #define TICK_LOCK(state)                       LOS_SpinLockSave(&g_tickSpin, &(state)) 
  9. /* 
  10.  * Description : Tick interruption handler 
  11.  *///節拍中斷處理函數 ,鴻蒙默認10ms觸發一次 
  12. LITE_OS_SEC_TEXT VOID OsTickHandler(VOID) 
  13.     UINT32 intSave; 
  14.  
  15.     TICK_LOCK(intSave); 
  16.     g_tickCount[ArchCurrCpuid()]++;//當前CPU核計數器 
  17.     TICK_UNLOCK(intSave); 
  18.  
  19. #ifdef LOSCFG_KERNEL_VDSO 
  20.     OsUpdateVdsoTimeval(); 
  21. #endif 
  22.  
  23. #ifdef LOSCFG_KERNEL_TICKLESS 
  24.     OsTickIrqFlagSet(OsTicklessFlagGet()); 
  25. #endif 
  26.  
  27. #if (LOSCFG_BASE_CORE_TICK_HW_TIME == YES) 
  28.     HalClockIrqClear(); /* diff from every platform */ 
  29. #endif 
  30.  
  31.     OsTimesliceCheck();//時間片檢查 
  32.  
  33.     OsTaskScan(); /* task timeout scan *///任務掃描 
  34.  
  35. #if (LOSCFG_BASE_CORE_SWTMR == YES) 
  36.     OsSwtmrScan();//定時器掃描,看是否有超時的定時器 
  37. #endif 
  38.  
  39. #ifdef __cplusplus 
  40. #if __cplusplus 
  41.   

解讀

● g_tickCount記錄每個CPU核tick的數組,每次硬中斷都觸發 OsTickHandler,每個CPU核單獨計數.

● OsTickHandler是內核調度的動力,其中會檢查任務時間片是否用完,定時器是否超時.主動delay的任務是否需要被喚醒,其本質是個硬中斷,在HalClockInit硬時鐘初始化時創建的,具體在硬中斷篇中會詳細講解.

● TICK_LOCK是tick操作的自旋鎖,宏原型LOS_SpinLockSave在自旋鎖篇中已詳細介紹.

功能函數

  1. #define OS_SYS_MS_PER_SECOND   1000         //一秒多少毫秒 
  2. //獲取自系統啟動以來的Tick數 
  3. LITE_OS_SEC_TEXT_MINOR UINT64 LOS_TickCountGet(VOID) 
  4.     UINT32 intSave; 
  5.     UINT64 tick; 
  6.  
  7.     /* 
  8.      * use core0's tick as system's timeline, 
  9.      * the tick needs to be atomic. 
  10.      */ 
  11.     TICK_LOCK(intSave); 
  12.     tick = g_tickCount[0];//使用CPU core0作為系統的 tick數 
  13.     TICK_UNLOCK(intSave); 
  14.  
  15.     return tick; 
  16. //每個Tick多少Cycle數 
  17. LITE_OS_SEC_TEXT_MINOR UINT32 LOS_CyclePerTickGet(VOID) 
  18.     return g_sysClock / LOSCFG_BASE_CORE_TICK_PER_SECOND; 
  19. //毫秒轉換成Tick 
  20. LITE_OS_SEC_TEXT_MINOR UINT32 LOS_MS2Tick(UINT32 millisec) 
  21.     if (millisec == OS_MAX_VALUE) { 
  22.         return OS_MAX_VALUE; 
  23.     } 
  24.  
  25.     return ((UINT64)millisec * LOSCFG_BASE_CORE_TICK_PER_SECOND) / OS_SYS_MS_PER_SECOND; 
  26. //Tick轉化為毫秒 
  27. LITE_OS_SEC_TEXT_MINOR UINT32 LOS_Tick2MS(UINT32 tick) 
  28.     return ((UINT64)tick * OS_SYS_MS_PER_SECOND) / LOSCFG_BASE_CORE_TICK_PER_SECOND; 

說明

● 在CPU篇中講過,0號CPU核默認為主核,默認獲取自系統啟動以來的Tick數使用的是g_tickCount[0]

● 因每個CPU核的tick是獨立計數的,所以g_tickCount中各值是不一樣的.

● 系統的Tick數在關中斷的情況下不進行計數,因為OsTickHandler本質是由硬中斷觸發的,屏蔽硬中斷的情況下就不會觸發OsTickHandler,自然也就不會有g_tickCount[ArchCurrCpuid()]++的計數,所以系統Tick數不能作為準確時間使用.

● 追問下,什么情況下硬中斷會被屏蔽?

編程示例

前提條件:

● 使用每秒的Tick數LOSCFG_BASE_CORE_TICK_PER_SECOND的默認值100。

● 配好OS_SYS_CLOCK系統主時鐘頻率。

時間轉換

  1. VOID Example_TransformTime(VOID) 
  2.     UINT32 ms; 
  3.     UINT32 tick; 
  4.  
  5.     tick = LOS_MS2Tick(10000);    // 10000ms轉換為tick 
  6.     dprintf("tick = %d \n",tick); 
  7.     ms = LOS_Tick2MS(100);        // 100tick轉換為ms 
  8.     dprintf("ms = %d \n",ms); 

時間轉換結果

  1. tick = 1000 
  2. ms = 1000 

時間統計和時間延遲

  1. LITE_OS_SEC_TEXT UINT32 LOS_TaskDelay(UINT32 tick); 
  2. VOID Example_GetTime(VOID) 
  3.     UINT32 cyclePerTick; 
  4.     UINT64 tickCount; 
  5.  
  6.     cyclePerTick  = LOS_CyclePerTickGet(); 
  7.     if(0 != cyclePerTick) { 
  8.         dprintf("LOS_CyclePerTickGet = %d \n", cyclePerTick); 
  9.     } 
  10.  
  11.     tickCount = LOS_TickCountGet(); 
  12.     if(0 != tickCount) { 
  13.         dprintf("LOS_TickCountGet = %d \n", (UINT32)tickCount); 
  14.     } 
  15.  
  16.     LOS_TaskDelay(200);//延遲200個tick 
  17.     tickCount = LOS_TickCountGet(); 
  18.     if(0 != tickCount) { 
  19.         dprintf("LOS_TickCountGet after delay = %d \n", (UINT32)tickCount); 
  20.     } 

時間統計和時間延遲結果

  1. LOS_CyclePerTickGet = 495000 //取決于CPU的頻率 
  2. LOS_TickCountGet = 1 //實際情況不一定是1的 
  3. LOS_TickCountGet after delay = 201 //實際情況不一定是201,但二者的差距會是200 

想了解更多內容,請訪問:

51CTO和華為官方合作共建的鴻蒙技術社區

https://harmonyos.51cto.com

 

責任編輯:jianghua 來源: 鴻蒙社區
相關推薦

2021-05-08 15:14:50

鴻蒙HarmonyOS應用

2021-04-08 09:32:17

鴻蒙HarmonyOS應用

2020-02-24 11:11:10

IT企業技術

2021-03-11 11:14:39

鴻蒙HarmonyOS應用

2021-04-01 17:36:30

鴻蒙HarmonyOS應用開發

2021-03-15 15:18:16

鴻蒙HarmonyOS應用

2020-07-07 11:01:04

Linux工具命令

2023-02-23 09:02:40

CIO領域管理

2024-12-27 09:46:10

2013-10-11 14:18:54

2013-10-11 13:31:10

2009-06-19 20:32:00

Linux

2021-03-18 13:00:51

JupyterPython編程語言

2012-07-31 09:55:50

時間管理管理

2013-03-14 17:17:34

2024-11-15 12:24:53

2011-01-14 16:23:46

Linux內核

2023-01-17 16:05:50

程序員時間管理日程表

2010-04-28 18:59:59

Unix操作系統

2025-05-14 09:12:13

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲精美视频 | 99福利视频 | 97精品超碰一区二区三区 | 在线中文字幕视频 | 久久在线看 | 精品久久久久国产免费第一页 | 五月婷婷色 | 精品国产31久久久久久 | 精品久久久久久亚洲综合网站 | 久草视频观看 | 激情91 | 欧美中文在线 | 久久久久久久国产 | 亚洲一区二区三区桃乃木香奈 | 国产一区久久 | 91精品国产综合久久久动漫日韩 | 国产日韩欧美精品 | 成人毛片在线观看 | 欧美 日韩 视频 | 日韩中文字幕在线播放 | 久久久久久精 | 欧洲一级黄| 久草网在线视频 | 久久久观看 | 亚洲区一区二 | 成人区精品一区二区婷婷 | 久久久精品网 | 欧美日本韩国一区二区三区 | 国产成人精品a视频 | 日本在线免费 | 网站黄色在线 | 天天操一操 | 日韩精品一区二区三区中文在线 | 自拍在线 | 九九在线视频 | 天天操天天怕 | 国产欧美精品区一区二区三区 | 国产乱码精品一区二区三区中文 | 欧美日韩国产一区 | 亚洲激情综合 | 99久久婷婷国产精品综合 |