精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

鴻蒙輕內核M核源碼分析系列十五CPU使用率CPUP

開發 前端
CPUP(Central Processing Unit Percentage,CPU占用率)分為系統CPU占用率和任務CPU占用率。用戶通過系統級的CPU占用率,判斷當前系統負載是否超出設計規格。

[[409327]]

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

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

https://harmonyos.51cto.com

CPUP(Central Processing Unit Percentage,CPU占用率)分為系統CPU占用率和任務CPU占用率。用戶通過系統級的CPU占用率,判斷當前系統負載是否超出設計規格。通過系統中各個任務的CPU占用情況,判斷各個任務的CPU占用率是否符合設計的預期。

系統CPU占用率是指周期時間內系統的CPU占用率,用于表示系統一段時間內的閑忙程度,也表示CPU的負載情況。系統CPU占用率的有效表示范圍為0~100,其精度(可通過配置調整)為百分比。100表示系統滿負荷運轉。

任務CPU占用率指單個任務的CPU占用率,用于表示單個任務在一段時間內的閑忙程度。任務CPU占用率的有效表示范圍為0~100,其精度(可通過配置調整)為百分比。100表示在一段時間內系統一直在運行該任務。

本文通過分析鴻蒙輕內核CPUP擴展模塊的源碼。

CPUP模塊用任務級記錄的方式,在任務切換時,記錄任務啟動時間,任務切出或者退出時間,每次當任務退出時,系統會累加整個任務的占用時間。接下來,我們看下CPUP模塊支持的常見操作的源代碼。

1、CPUP結構體定義和常用宏定義

1.1 CPUP結構體定義

在文件components\cpup\los_cpup.h定義的CPUP控制塊結構體為OsCpupCB,結構體源代碼如下,allTime記錄該任務自系統啟動以來運行的cycle數,startTime記錄任務開始運行的時間,historyTime[]歷史運行時間數組的10個元素記錄最近10秒中每一秒中每個任務自系統啟動以來運行的cycle數,其他結構體成員的解釋見注釋部分。

  1. typedef struct { 
  2.     UINT32 cpupID;                                        /**< 任務編號 */ 
  3.     UINT16 status;                                        /**< 任務狀態 */ 
  4.     UINT64 allTime;                                       /**< 總共運行的時間 */ 
  5.     UINT64 startTime;                                     /**< 任務開始時間 */ 
  6.     UINT64 historyTime[OS_CPUP_HISTORY_RECORD_NUM];       /**< 歷史運行時間數組,其中OS_CPUP_HISTORY_RECORD_NUM為10 */ 
  7. } OsCpupCB; 

另外,還定義了一個結構體CPUP_INFO_S,如下:

  1. typedef struct tagCpupInfo { 
  2.     UINT16 usStatus;            /**< 保存當前運行任務狀態           */ 
  3.     UINT32 uwUsage;             /**< 使用情況,值范圍為 [0,1000].   */ 
  4. } CPUP_INFO_S; 

1.2 CPUP枚舉定義

CPUP頭文件components\cpup\los_cpup.h中還提供了相關的枚舉,CPUP占用率類型CPUP_TYPE_E,及CPUP統計時間間隔模式CPUP_MODE_E。

  1. typedef enum { 
  2.     SYS_CPU_USAGE = 0,   /* 系統CPUP */ 
  3.     TASK_CPU_USAGE,      /* 任務CPUP */ 
  4. } CPUP_TYPE_E; 
  5.  
  6. typedef enum { 
  7.     CPUP_IN_10S = 0,     /* CPUP統計周期10s */ 
  8.     CPUP_IN_1S,          /* CPUP統計周期1s */ 
  9.     CPUP_LESS_THAN_1S,   /* CPUP統計周期<1s */ 
  10. } CPUP_MODE_E; 

2、CPUP初始化

CPUP默認關閉,用戶可以通過宏LOSCFG_BASE_CORE_CPUP進行開啟。開啟CPUP的情況下,在系統啟動時,在kernel\src\los_init.c中調用OsCpupInit()進行CPUP模塊初始化。下面,我們分析下CPUP初始化的代碼。

⑴處計算CPUP結構體池需要的內存大小,然后為CPUP申請內存,如果申請失敗,則返回錯誤。⑵處初始化成功后,設置初始化標記g_cpupInitFlg。

  1. LITE_OS_SEC_TEXT_INIT UINT32 OsCpupInit() 
  2.     UINT32 size
  3.  
  4.     size = g_taskMaxNum * sizeof(OsCpupCB); 
  5. ⑴  g_cpup = (OsCpupCB *)LOS_MemAlloc(m_aucSysMem0, size); 
  6.  
  7.     if (g_cpup == NULL) { 
  8.         return LOS_ERRNO_CPUP_NO_MEMORY; 
  9.     } 
  10.  
  11.     (VOID)memset_s(g_cpup, size, 0, size); 
  12. ⑵  g_cpupInitFlg = 1; 
  13.  
  14.     return LOS_OK; 

3、CPUP常用操作

3.1 CPUP內部接口

我們先分析下內部接口,這些接口會被LOS_開頭的外部接口調用。

3.1.1 OsTskCycleStart記錄任務開始時間

CPUP模塊對外接口執行后期會調用該內部接口,設置下一個任務的開始運行時間。

⑴處先判斷CPUP是否已經初始化,如果沒有初始化過,退出該函數的執行。⑵處獲取新任務的任務編號。⑶處設置該任務對應的CPUP結構體的任務編號和開始時間。

  1. LITE_OS_SEC_TEXT_MINOR VOID OsTskCycleStart(VOID) 
  2.     UINT32 taskID; 
  3.  
  4. ⑴  if (g_cpupInitFlg == 0) { 
  5.         return
  6.     } 
  7.  
  8. ⑵  taskID = g_losTask.newTask->taskID; 
  9. ⑶  g_cpup[taskID].cpupID = taskID; 
  10.     g_cpup[taskID].startTime = LOS_SysCycleGet(); 
  11.  
  12.     return

3.1.2 OsTskCycleEnd記錄任務結束時間

CPUP模塊對外接口執行前期會調用該內部接口,獲取當前任務的結束時間,并統計當前任務的運行總時間。

⑴處先判斷CPUP是否已經初始化,如果沒有初始化過,退出該函數的執行。⑵處獲取當前任務的任務編號。⑶處如果該任務的開始時間為0,退出函數執行。⑷處獲取系統的當前cycle數。⑸如果獲取的小于任務CPUP開始時間,則把獲取的cycle數加上每個tick的cycle數。⑹處計算當前任務的運行的總時間,然后把開始時間置0。

  1. LITE_OS_SEC_TEXT_MINOR VOID OsTskCycleEnd(VOID) 
  2.     UINT32 taskID; 
  3.     UINT64 cpuCycle; 
  4.  
  5. ⑴  if (g_cpupInitFlg == 0) { 
  6.         return
  7.     } 
  8.  
  9. ⑵  taskID = g_losTask.runTask->taskID; 
  10.  
  11. ⑶  if (g_cpup[taskID].startTime == 0) { 
  12.         return
  13.     } 
  14.  
  15. ⑷  cpuCycle = LOS_SysCycleGet(); 
  16.  
  17. ⑸  if (cpuCycle < g_cpup[taskID].startTime) { 
  18.         cpuCycle += g_cyclesPerTick; 
  19.     } 
  20.  
  21. ⑹  g_cpup[taskID].allTime += (cpuCycle - g_cpup[taskID].startTime); 
  22.     g_cpup[taskID].startTime = 0; 
  23.  
  24.     return

3.1.3 OsTskCycleEndStart任務切換時更新任務歷史運行時間

該函數在任務調度切換時會被執行,計算當前運行任務的運行總時間,記錄新任務的開始時間,并更新所有任務的歷史運行時間。函數的示意圖如下:

鴻蒙輕內核M核源碼分析系列十五 CPU使用率CPUP-鴻蒙HarmonyOS技術社區

⑴處先判斷CPUP是否已經初始化,如果沒有初始化過,退出該函數的執行。

⑵處獲取當前任務的任務編號,然后獲取系統的當前cycle數。

⑶處如果當前任務的開始時間不為0,則計算當前任務的運行的總時間,然后把開始時間置0。

⑷處獲取新任務的任務編號。

⑸處設置該任務對應的CPUP結構體的任務編號和開始時間。

⑹處如果記錄間隔大于系統時鐘(即每秒的cycle數),更新上次記錄時間。這意味著每個任務的historyTime[]數組中的每個元素表示1s多的周期內該任務的運行cycle數量,并不是非常精確的。然后執行⑺,記錄每一個任務對應的CPUP的歷史運行時間。⑻處更新歷史運行時間數組的當前索引值。

  1. LITE_OS_SEC_TEXT_MINOR VOID OsTskCycleEndStart(VOID) 
  2.     UINT32 taskID; 
  3.     UINT64 cpuCycle; 
  4.     UINT16 loopNum; 
  5.  
  6. ⑴  if (g_cpupInitFlg == 0) { 
  7.         return
  8.     } 
  9.  
  10. ⑵  taskID = g_losTask.runTask->taskID; 
  11.     cpuCycle = LOS_SysCycleGet(); 
  12.  
  13. ⑶  if (g_cpup[taskID].startTime != 0) { 
  14.         if (cpuCycle < g_cpup[taskID].startTime) { 
  15.             cpuCycle += g_cyclesPerTick; 
  16.         } 
  17.  
  18.         g_cpup[taskID].allTime += (cpuCycle - g_cpup[taskID].startTime); 
  19.         g_cpup[taskID].startTime = 0; 
  20.     } 
  21.  
  22. ⑷  taskID = g_losTask.newTask->taskID; 
  23. ⑸  g_cpup[taskID].cpupID = taskID; 
  24.     g_cpup[taskID].startTime = cpuCycle; 
  25.  
  26. ⑹  if ((cpuCycle - g_lastRecordTime) > OS_CPUP_RECORD_PERIOD) { 
  27.         g_lastRecordTime = cpuCycle; 
  28.  
  29.         for (loopNum = 0; loopNum < g_taskMaxNum; loopNum++) { 
  30. ⑺          g_cpup[loopNum].historyTime[g_hisPos] = g_cpup[loopNum].allTime; 
  31.         } 
  32.  
  33. ⑻      if (g_hisPos == (OS_CPUP_HISTORY_RECORD_NUM - 1)) { 
  34.             g_hisPos = 0; 
  35.         } else { 
  36.             g_hisPos++; 
  37.         } 
  38.     } 
  39.  
  40.     return

3.1.4 OsGetPrePos獲取歷史運行時間數組上一索引位置

代碼比較簡單,如果傳入參數curPos為0,則返回數組的最后一個索引位置OS_CPUP_HISTORY_RECORD_NUM - 1。否則返回減1返回。

  1. LITE_OS_SEC_TEXT_MINOR static inline UINT16 OsGetPrePos(UINT16 curPos) 
  2.     return (curPos == 0) ? (OS_CPUP_HISTORY_RECORD_NUM - 1) : (curPos - 1); 

3.1.5 OsGetPositions獲取歷史運行時間數組的當前及上一索引位置

根據CPUP統計時間間隔模式,獲取歷史運行時間數組的當前及上一索引位置。

⑴處獲取歷史運行時間數組的當前索引位置,⑵如果時間間隔模式為1秒,當前索引curPos位置為g_hisPos的上一索引位置,上一索引位置prePos需要繼續上前一位。⑶如果時間間隔模式小于1秒,當前索引curPos位置為g_hisPos的上一索引位置,上一索引位置prePos為0。如果時間間隔模式是10秒,當前索引curPos位置就等于g_hisPos,上一索引位置prePos為0。⑷處設置傳出參數。

  1. LITE_OS_SEC_TEXT_MINOR static VOID OsGetPositions(UINT16 mode, UINT16* curPosAddr, UINT16* prePosAddr) 
  2.     UINT16 curPos; 
  3.     UINT16 prePos = 0; 
  4.  
  5. ⑴  curPos = g_hisPos; 
  6.  
  7. ⑵  if (mode == CPUP_IN_1S) { 
  8.         curPos = OsGetPrePos(curPos); 
  9.         prePos = OsGetPrePos(curPos); 
  10. ⑶  } else if (mode == CPUP_LESS_THAN_1S) { 
  11.         curPos = OsGetPrePos(curPos); 
  12.     } 
  13.  
  14. ⑷  *curPosAddr = curPos; 
  15.     *prePosAddr = prePos; 

3.2 CPUP對外接口

我們先分析下外部接口,接口說明如下:

3.2.1 LOS_SysCpuUsage

該函數會統計當前系統CPU占用率,返回值基于千分率計算,取值范圍為[0,1000]。函數的示意圖如下:

鴻蒙輕內核M核源碼分析系列十五 CPU使用率CPUP-鴻蒙HarmonyOS技術社區

⑴處先判斷CPUP是否已經初始化,如果沒有初始化過,返回錯誤碼。

⑵處調用函數OsTskCycleEnd()獲取當前任務的結束時間,并計算出運行總時間。

⑶處統計所有任務的運行總時間,如果總時間不為0,執行⑷計算出系統的任務CPU占用率。

⑸處調用函數OsTskCycleStart()設置新任務的CPUP統計的開始時間。

  1. LITE_OS_SEC_TEXT_MINOR UINT32 LOS_SysCpuUsage(VOID) 
  2.     UINT64  cpuCycleAll = 0; 
  3.     UINT32  cpupRet = 0; 
  4.     UINT16  loopNum; 
  5.     UINT32 intSave; 
  6.  
  7. ⑴  if (g_cpupInitFlg == 0) { 
  8.         return LOS_ERRNO_CPUP_NO_INIT; 
  9.     } 
  10.  
  11.     intSave = LOS_IntLock(); 
  12. ⑵  OsTskCycleEnd(); 
  13.  
  14. ⑶  for (loopNum = 0; loopNum < g_taskMaxNum; loopNum++) { 
  15.         cpuCycleAll += g_cpup[loopNum].allTime; 
  16.     } 
  17.  
  18. ⑷  if (cpuCycleAll) { 
  19.         cpupRet = LOS_CPUP_PRECISION -  (UINT32)((LOS_CPUP_PRECISION * 
  20.             g_cpup[g_idleTaskID].allTime) / cpuCycleAll); 
  21.     } 
  22.  
  23. ⑸  OsTskCycleStart(); 
  24.     LOS_IntRestore(intSave); 
  25.  
  26.     return cpupRet; 

3.2.2 LOS_HistorySysCpuUsage

該函數獲取系統歷史CPU占用率,對于歷史CPU占用率,需要傳入時間間隔模式參數,支持10秒、1秒、小于1秒三種。

⑴處先判斷CPUP是否已經初始化,如果沒有初始化過,返回錯誤碼。⑵處調用函數OsTskCycleEnd()獲取當前任務的結束時間,并計算出運行總時間。⑶處調用函數OsGetPositions()計算出歷史運行時間數組索引位置。⑷處計算出各個任務的周期內運行總時間,如果時間間隔模式為1秒,取值兩個歷史運行時間之差,即為1秒內任務的運行時間數。對于時間間隔模式為10秒,historyTime[curPos]表示10秒前的自系統啟動以來的任務運行的時間數,計算出來的差值即為10秒內任務的運行時間數。對于時間間隔模式為小于1秒,historyTime[curPos]表示上一秒前的自系統啟動以來的任務運行的時間數,計算出來的差值即為小于1秒內任務的運行時間數。⑸處計算空閑任務周期內運行總時間。⑹處如果總時間不為0,計算出系統的任務歷史CPU占用率。最后,調用函數OsTskCycleStart()設置新任務的CPUP統計的開始時間。可以參考示意圖進行理解:

鴻蒙輕內核M核源碼分析系列十五 CPU使用率CPUP-鴻蒙HarmonyOS技術社區
  1. LITE_OS_SEC_TEXT_MINOR UINT32 LOS_HistorySysCpuUsage(UINT16 mode) 
  2.     UINT64  cpuCycleAll = 0; 
  3.     UINT64  idleCycleAll = 0; 
  4.     UINT32  cpupRet = 0; 
  5.     UINT16  loopNum; 
  6.     UINT16  curPos; 
  7.     UINT16  prePos = 0; 
  8.     UINT32 intSave; 
  9.  
  10. ⑴  if (g_cpupInitFlg == 0) { 
  11.         return LOS_ERRNO_CPUP_NO_INIT; 
  12.     } 
  13.  
  14.     // get end time of current task 
  15.     intSave = LOS_IntLock(); 
  16. ⑵  OsTskCycleEnd(); 
  17.  
  18. ⑶  OsGetPositions(mode, &curPos, &prePos); 
  19.  
  20.     for (loopNum = 0; loopNum < g_taskMaxNum; loopNum++) { 
  21. ⑷      if (mode == CPUP_IN_1S) { 
  22.             cpuCycleAll += g_cpup[loopNum].historyTime[curPos] - g_cpup[loopNum].historyTime[prePos]; 
  23.         } else { 
  24.             cpuCycleAll += g_cpup[loopNum].allTime - g_cpup[loopNum].historyTime[curPos]; 
  25.         } 
  26.     } 
  27.  
  28. ⑸  if (mode == CPUP_IN_1S) { 
  29.         idleCycleAll += g_cpup[g_idleTaskID].historyTime[curPos] - 
  30.                            g_cpup[g_idleTaskID].historyTime[prePos]; 
  31.     } else { 
  32.         idleCycleAll += g_cpup[g_idleTaskID].allTime - g_cpup[g_idleTaskID].historyTime[curPos]; 
  33.     } 
  34.  
  35. ⑹  if (cpuCycleAll) { 
  36.         cpupRet = (LOS_CPUP_PRECISION -  (UINT32)((LOS_CPUP_PRECISION * idleCycleAll) / cpuCycleAll)); 
  37.     } 
  38.  
  39.     OsTskCycleStart(); 
  40.     LOS_IntRestore(intSave); 
  41.  
  42.     return cpupRet; 

3.2.3 LOS_TaskCpuUsage

該函數會統計指定任務的CPU占用率,和函數LOS_SysCpuUsage()代碼相似度高,可以參考上文對該函數的講解。

  1. LITE_OS_SEC_TEXT_MINOR UINT32 LOS_TaskCpuUsage(UINT32 taskID) 
  2.     UINT64  cpuCycleAll = 0; 
  3.     UINT16  loopNum; 
  4.     UINT32 intSave; 
  5.     UINT32  cpupRet = 0; 
  6.  
  7.     if (g_cpupInitFlg == 0) { 
  8.         return LOS_ERRNO_CPUP_NO_INIT; 
  9.     } 
  10.     if (OS_TSK_GET_INDEX(taskID) >= g_taskMaxNum) { 
  11.         return LOS_ERRNO_CPUP_TSK_ID_INVALID; 
  12.     } 
  13.     if (g_cpup[taskID].cpupID != taskID) { 
  14.         return LOS_ERRNO_CPUP_THREAD_NO_CREATED; 
  15.     } 
  16.     if ((g_cpup[taskID].status & OS_TASK_STATUS_UNUSED) || (g_cpup[taskID].status == 0)) { 
  17.         return LOS_ERRNO_CPUP_THREAD_NO_CREATED; 
  18.     } 
  19.     intSave = LOS_IntLock(); 
  20.     OsTskCycleEnd(); 
  21.  
  22.     for (loopNum = 0; loopNum < g_taskMaxNum; loopNum++) { 
  23.         if ((g_cpup[loopNum].status & OS_TASK_STATUS_UNUSED) || (g_cpup[loopNum].status == 0)) { 
  24.             continue
  25.         } 
  26.         cpuCycleAll += g_cpup[loopNum].allTime; 
  27.     } 
  28.  
  29.     if (cpuCycleAll) { 
  30.         cpupRet = (UINT32)((LOS_CPUP_PRECISION * g_cpup[taskID].allTime) / cpuCycleAll); 
  31.     } 
  32.  
  33.     OsTskCycleStart(); 
  34.     LOS_IntRestore(intSave); 
  35.  
  36.     return cpupRet; 

3.2.4 LOS_HistoryTaskCpuUsage

該函數獲取指定任務的歷史CPU占用率,和函數LOS_HistorySysCpuUsage()代碼相似度高,可以參考上文對該函數的講解。

  1. LITE_OS_SEC_TEXT_MINOR UINT32 LOS_HistoryTaskCpuUsage(UINT32 taskID, UINT16 mode) 
  2.     UINT64  cpuCycleAll = 0; 
  3.     UINT64  cpuCycleCurTsk = 0; 
  4.     UINT16  loopNum, curPos; 
  5.     UINT16  prePos = 0; 
  6.     UINT32 intSave; 
  7.     UINT32  cpupRet = 0; 
  8.  
  9.    if (g_cpupInitFlg == 0) { 
  10.         return LOS_ERRNO_CPUP_NO_INIT; 
  11.     } 
  12.     if (OS_TSK_GET_INDEX(taskID) >= g_taskMaxNum) { 
  13.         return LOS_ERRNO_CPUP_TSK_ID_INVALID; 
  14.     } 
  15.     if (g_cpup[taskID].cpupID != taskID) { 
  16.         return LOS_ERRNO_CPUP_THREAD_NO_CREATED; 
  17.     } 
  18.     if ((g_cpup[taskID].status & OS_TASK_STATUS_UNUSED) || (g_cpup[taskID].status == 0)) { 
  19.         return LOS_ERRNO_CPUP_THREAD_NO_CREATED; 
  20.     } 
  21.     intSave = LOS_IntLock(); 
  22.     OsTskCycleEnd(); 
  23.  
  24.     OsGetPositions(mode, &curPos, &prePos); 
  25.  
  26.     for (loopNum = 0; loopNum < g_taskMaxNum; loopNum++) { 
  27.         if ((g_cpup[loopNum].status & OS_TASK_STATUS_UNUSED) || (g_cpup[loopNum].status == 0)) { 
  28.             continue
  29.         } 
  30.  
  31.         if (mode == CPUP_IN_1S) { 
  32.             cpuCycleAll += g_cpup[loopNum].historyTime[curPos] - g_cpup[loopNum].historyTime[prePos]; 
  33.         } else { 
  34.             cpuCycleAll += g_cpup[loopNum].allTime - g_cpup[loopNum].historyTime[curPos]; 
  35.         } 
  36.     } 
  37.  
  38.     if (mode == CPUP_IN_1S) { 
  39.         cpuCycleCurTsk += g_cpup[taskID].historyTime[curPos] - g_cpup[taskID].historyTime[prePos]; 
  40.     } else { 
  41.         cpuCycleCurTsk += g_cpup[taskID].allTime - g_cpup[taskID].historyTime[curPos]; 
  42.     } 
  43.     if (cpuCycleAll) { 
  44.         cpupRet = (UINT32)((LOS_CPUP_PRECISION * cpuCycleCurTsk) / cpuCycleAll); 
  45.     } 
  46.  
  47.     OsTskCycleStart(); 
  48.     LOS_IntRestore(intSave); 
  49.  
  50.     return cpupRet; 

3.2.5 LOS_AllTaskCpuUsage

該函數獲取全部任務的CPU占用率,獲取的CPU占用率信息保存在傳出參數結構體CPUP_INFO_S *cpupInfo指向的內存區域里,需要注意這個內存區域的大小需要等于sizeof(CPUP_INFO_S) * g_taskMaxNum。還需要傳入時間間隔模式參數,支持10秒、1秒、小于1秒三種。

⑴處先判斷CPUP是否已經初始化,如果沒有初始化過,返回錯誤碼。傳出參數cpupInfo指針不能為空,否則返回錯誤碼。⑵處調用函數OsTskCycleEnd()獲取當前任務的結束時間,并計算出運行總時間。⑶處調用函數OsGetPositions()計算出歷史運行時間數組索引位置。⑷處計算出各個任務的周期內運行總時間,如果時間間隔模式為1秒,取值兩個歷史運行時間之差,否則取值XX。⑸處設置每一個任務的狀態,然后計算出每一個任務的CPU占用率。最后,調用函數OsTskCycleStart()設置新任務的CPUP統計的開始時間。

  1. LITE_OS_SEC_TEXT_MINOR UINT32 LOS_AllTaskCpuUsage(CPUP_INFO_S *cpupInfo, UINT16 mode) 
  2.     UINT16  loopNum; 
  3.     UINT16  curPos; 
  4.     UINT16  prePos = 0; 
  5.     UINT32 intSave; 
  6.     UINT64  cpuCycleAll = 0; 
  7.     UINT64  cpuCycleCurTsk = 0; 
  8.  
  9. ⑴  if (g_cpupInitFlg == 0) { 
  10.         return  LOS_ERRNO_CPUP_NO_INIT; 
  11.     } 
  12.  
  13.     if (cpupInfo == NULL) { 
  14.         return LOS_ERRNO_CPUP_TASK_PTR_NULL; 
  15.     } 
  16.  
  17.     intSave = LOS_IntLock(); 
  18. ⑵  OsTskCycleEnd(); 
  19.  
  20. ⑶  OsGetPositions(mode, &curPos, &prePos); 
  21.  
  22.     for (loopNum = 0; loopNum < g_taskMaxNum; loopNum++) { 
  23.         if ((g_cpup[loopNum].status & OS_TASK_STATUS_UNUSED) || 
  24.             (g_cpup[loopNum].status == 0)) { 
  25.             continue
  26.         } 
  27.  
  28.         if (mode == CPUP_IN_1S) { 
  29.             cpuCycleAll += g_cpup[loopNum].historyTime[curPos] - g_cpup[loopNum].historyTime[prePos]; 
  30.         } else { 
  31.             cpuCycleAll += g_cpup[loopNum].allTime - g_cpup[loopNum].historyTime[curPos]; 
  32.         } 
  33.     } 
  34.  
  35. ⑷  for (loopNum = 0; loopNum < g_taskMaxNum; loopNum++) { 
  36.         if ((g_cpup[loopNum].status & OS_TASK_STATUS_UNUSED) || 
  37.             (g_cpup[loopNum].status == 0)) { 
  38.             continue
  39.         } 
  40.  
  41.         if (mode == CPUP_IN_1S) { 
  42.             cpuCycleCurTsk += g_cpup[loopNum].historyTime[curPos] - g_cpup[loopNum].historyTime[prePos]; 
  43.         } else { 
  44.             cpuCycleCurTsk += g_cpup[loopNum].allTime - g_cpup[loopNum].historyTime[curPos]; 
  45.         } 
  46. ⑸      cpupInfo[loopNum].usStatus = g_cpup[loopNum].status; 
  47.         if (cpuCycleAll) { 
  48.             cpupInfo[loopNum].uwUsage = (UINT32)((LOS_CPUP_PRECISION * cpuCycleCurTsk) / cpuCycleAll); 
  49.         } 
  50.  
  51.         cpuCycleCurTsk = 0; 
  52.     } 
  53.  
  54.     OsTskCycleStart(); 
  55.     LOS_IntRestore(intSave); 
  56.  
  57.     return LOS_OK; 

3.2.6 LOS_CpupUsageMonitor

該函數獲取歷史CPU占用率并打印輸出,傳入參數有三個:CPU占用率類型,CPUP時間周期模式,指定的任務編號。對于任務CPU占用率,才需要指定有效的任務編號。

⑴處處理CPU占用率類型為系統CPU占用率的情況。

⑵處打印使用的CPUP時間周期模式。

⑶處通過調用函數LOS_HistorySysCpuUsage()獲取系統歷史CPU占用率,然后執行⑷打印輸出CPU占用率結果,輸出結果范圍為[0,100]。

⑸處理CPU占用率類型為指定任務CPU占用率的情況,首先判斷下任務編號的有效性,校驗任務是否創建等。

⑹處打印使用的CPUP時間周期模式。

⑺處通過調用函數LOS_HistoryTaskCpuUsage()獲取指定任務的歷史CPU占用率,然后執行⑻打印輸出CPU占用率結果,輸出結果范圍為[0,100]。

  1. LITE_OS_SEC_TEXT_MINOR UINT32 LOS_CpupUsageMonitor(CPUP_TYPE_E type, CPUP_MODE_E mode, UINT32 taskID) 
  2.     UINT32 ret; 
  3.     LosTaskCB *taskCB = NULL
  4.  
  5.     switch (type) { 
  6. ⑴      case SYS_CPU_USAGE: 
  7. ⑵          if (mode == CPUP_IN_10S) { 
  8.                 PRINTK("\nSysCpuUsage in 10s: "); 
  9.             } else if (mode == CPUP_IN_1S) { 
  10.                 PRINTK("\nSysCpuUsage in 1s: "); 
  11.             } else { 
  12.                 PRINTK("\nSysCpuUsage in <1s: "); 
  13.             } 
  14. ⑶          ret = LOS_HistorySysCpuUsage(mode); 
  15. ⑷          PRINTK("%d.%d", ret / LOS_CPUP_PRECISION_MULT, ret % LOS_CPUP_PRECISION_MULT); 
  16.             break; 
  17.  
  18. ⑸      case TASK_CPU_USAGE: 
  19.             if (taskID > LOSCFG_BASE_CORE_TSK_LIMIT) { 
  20.                 PRINT_ERR("\nThe taskid is invalid.\n"); 
  21.                 return OS_ERROR; 
  22.             } 
  23.             taskCB = OS_TCB_FROM_TID(taskID); 
  24.             if ((taskCB->taskStatus & OS_TASK_STATUS_UNUSED)) { 
  25.                 PRINT_ERR("\nThe taskid is invalid.\n"); 
  26.                 return OS_ERROR; 
  27.             } 
  28. ⑹          if (mode == CPUP_IN_10S) { 
  29.                 PRINTK("\nCPUusage of taskID %d in 10s: ", taskID); 
  30.             } else if (mode == CPUP_IN_1S) { 
  31.                 PRINTK("\nCPUusage of taskID %d in 1s: ", taskID); 
  32.             } else { 
  33.                 PRINTK("\nCPUusage of taskID %d in <1s: ", taskID); 
  34.             } 
  35. ⑺          ret = LOS_HistoryTaskCpuUsage(taskID, mode); 
  36. ⑻          PRINTK("%u.%u", ret / LOS_CPUP_PRECISION_MULT, ret % LOS_CPUP_PRECISION_MULT); 
  37.             break; 
  38.  
  39.         default
  40.             PRINT_ERR("\nThe type is invalid.\n"); 
  41.             return OS_ERROR; 
  42.     } 
  43.  
  44.     return LOS_OK; 

小結

本文帶領大家一起剖析了鴻蒙輕內核的CPUP擴展模塊的源代碼。

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

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

https://harmonyos.51cto.com

 

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

2021-06-04 09:57:49

鴻蒙HarmonyOS應用

2022-01-10 15:31:44

鴻蒙HarmonyOS應用

2022-01-12 10:50:23

鴻蒙HarmonyOS應用

2021-10-20 16:08:57

鴻蒙HarmonyOS應用

2021-05-25 09:28:34

鴻蒙HarmonyOS應用

2021-06-04 14:15:10

鴻蒙HarmonyOS應用

2021-05-17 09:28:59

鴻蒙HarmonyOS應用

2021-05-08 15:14:50

鴻蒙HarmonyOS應用

2021-05-31 20:30:55

鴻蒙HarmonyOS應用

2022-03-03 18:28:28

Harmony進程任務管理模塊

2022-04-13 11:02:12

鴻蒙事件模塊事件Event

2022-03-11 20:23:14

鴻蒙源碼分析進程管理

2021-05-27 09:43:56

鴻蒙HarmonyOS應用

2021-05-11 09:54:55

鴻蒙HarmonyOS應用

2021-06-09 09:48:01

鴻蒙HarmonyOS應用

2021-05-21 09:25:11

鴻蒙HarmonyOS應用

2021-09-22 14:36:32

鴻蒙HarmonyOS應用

2021-05-12 09:45:20

鴻蒙HarmonyOS應用

2022-01-14 08:39:47

鴻蒙HarmonyOS應用

2021-05-10 15:05:56

鴻蒙HarmonyOS應用
點贊
收藏

51CTO技術棧公眾號

亚洲午夜电影在线| 久久国产精品免费| 亚洲欧美日韩中文视频| 香蕉视频禁止18| 69xxx在线| 成人avav在线| 国产日韩精品在线| 色婷婷在线观看视频| 极品白浆推特女神在线观看| 日本视频一区二区三区| 久久777国产线看观看精品| 亚洲国产果冻传媒av在线观看| 成人av福利| 91玉足脚交白嫩脚丫在线播放| 国产欧美精品在线播放| 日产电影一区二区三区| 99国产精品一区二区| 亚洲精品电影网站| 欧美国产日韩在线视频| 欧美大胆成人| 亚洲国产精品久久一线不卡| 亚洲欧洲精品一区| 五月婷婷视频在线| 欧美激情1区2区| 这里只有精品在线播放| av无码一区二区三区| 国产高清日韩| 欧美三级电影精品| 久久国产色av免费观看| 99在线视频影院| 亚洲最大成人综合| 91免费视频黄| 五月婷婷在线视频| 久久精品国产**网站演员| 91sao在线观看国产| 中文字幕在线有码| 99视频精品全部免费在线视频| 亚洲欧美国产另类| 国产精品久久久久久久无码| 中文字幕亚洲在线观看| 7777精品伊人久久久大香线蕉最新版| 日韩精品一区二区三区色欲av| av电影院在线看| 亚洲午夜免费福利视频| 久久久久久久久久久综合| 毛片在线视频| 日韩美女视频一区二区| 日韩免费av电影| 成a人v在线播放| 欧美国产日韩a欧美在线观看| 欧美日韩在线高清| 蝌蚪视频在线播放| 国产欧美中文在线| 亚洲国产欧美日韩| 欧美成人性生活视频| 国产精品久久久爽爽爽麻豆色哟哟| 日韩在线第一区| 噜噜噜噜噜在线视频| 久久精品视频在线看| 日韩wuma| 久操视频在线免费播放| 樱花影视一区二区| 亚洲色成人www永久在线观看| 国产第一页在线| 欧美日韩在线免费观看| 免费日韩中文字幕| 福利一区视频| 4438成人网| 日本一区二区免费视频| 欧美激情15p| 亚洲人午夜精品免费| 懂色av粉嫩av浪潮av| 91精品国产自产在线观看永久∴| 久久久久www| 国产精品18p| 精品日本12videosex| 在线观看久久久久久| 99热99这里只有精品| 午夜精品视频| 欧美亚洲另类在线| 亚洲无码精品国产| 亚洲欧美成人综合| 欧美老少配视频| 日本少妇毛茸茸高潮| 久久精品一区二区国产| 国产欧美精品va在线观看| 亚洲精品中文字幕成人片| 99re成人在线| 樱花www成人免费视频| 密臀av在线| 在线视频欧美精品| 国产极品尤物在线| 天天干天天爽天天操| 久久精品亚洲精品国产欧美kt∨ | 国产精品视频久久久久久| 国产裸体歌舞团一区二区| 国产伦精品一区二区三区免| 国产精品99999| 亚洲综合激情网| 亚洲精品怡红院| 成人免费直播在线| 最新69国产成人精品视频免费| 久久99久久98精品免观看软件| 久久av免费| 美日韩丰满少妇在线观看| 国产美女激情视频| 国产成人精品免费在线| 丝袜足脚交91精品| 黑森林国产精品av| 91精品国产美女浴室洗澡无遮挡| wwwwww日本| 国内精品美女在线观看 | 成人黄色激情视频| 成人激情午夜影院| 中文字幕久久一区| 你懂得影院夜精品a| 欧美日韩国产精品专区 | 日韩手机在线视频| 国产传媒欧美日韩成人| 日本一区二区三区www| av在线理伦电影| 欧美一卡二卡三卡| 欧美肥妇bbwbbw| 久久亚洲影视| 国产a级全部精品| 无码精品人妻一区二区三区影院| 97精品视频在线观看自产线路二| 成人性做爰片免费视频| caoporn免费在线| 在线看国产一区二区| 熟妇人妻久久中文字幕| 欧美激情视频一区二区三区免费| 国产精品一香蕉国产线看观看| 欧美日韩影视| 天天色图综合网| 日本不卡视频一区| 欧美午夜影院| 97se视频在线观看| 最近中文字幕免费mv2018在线| 欧美精品视频www在线观看| 丰满的亚洲女人毛茸茸| 美女爽到呻吟久久久久| 麻豆蜜桃91| 欧美性xxx| 亚洲一级免费视频| 天堂免费在线视频| 国产亚洲精品久| 久久久久久三级| 不卡在线一区二区| 成人h视频在线观看播放| 午夜视频在线| 欧美一区三区二区| 国产亚洲精品码| www.欧美亚洲| 亚洲一区二区三区免费看| 亚洲精品国产嫩草在线观看| 在线电影中文日韩| 中文字幕在线观看欧美| 国产精品色一区二区三区| 久久久久久久久久一区| 亚洲一区二区| 国产精品一国产精品最新章节| 黄在线观看免费网站ktv| 精品亚洲一区二区三区在线观看| 内射一区二区三区| 国产精品一区二区在线看| 欧美精品在欧美一区二区| 国内精品国产成人国产三级粉色| 91国产视频在线| 成人影院免费观看| 欧美一区二区三区四区高清 | 成年人免费在线视频| 91麻豆精品国产91久久久久久 | 日韩在线一卡二卡| 国产激情91久久精品导航| 无码人妻少妇伦在线电影| 欧美激情在线免费| 91精品国产综合久久久久久久久| 26uuu亚洲电影在线观看| 亚洲国产精品免费| av首页在线观看| 一区二区三区精品视频| 成年人网站免费看| 精品一区二区三区av| 九九热只有这里有精品| 成人一级毛片| 国产精品二区三区| 成人黄色视屏网站| 欧美激情亚洲精品| 91短视频版在线观看www免费| 91精品国产综合久久国产大片| 久久草视频在线| 亚洲国产高清在线| 妖精视频一区二区| 蜜桃视频在线一区| 欧美激情视频免费看| 第一会所亚洲原创| 国产欧美欧洲| 操你啦在线视频| 亚洲精品在线看| 国产美女明星三级做爰| 一本色道久久综合亚洲aⅴ蜜桃| 国产午夜精品理论片在线| 久久亚洲捆绑美女| 日本xxxx免费| 极品美女销魂一区二区三区| 亚洲高清资源综合久久精品| 成人av激情人伦小说| 国产有码一区二区| www.com.cn成人| 欧美黄色免费网站| 麻豆影视在线观看_| 日韩精品电影网| 久久国产视频播放| 亚洲人被黑人高潮完整版| 中文字幕丰满乱子伦无码专区| 国产v综合v亚洲欧| 亚洲日本黄色片| 日韩va亚洲va欧美va久久| 日本一区二区三区www| 荡女精品导航| 4444kk亚洲人成电影在线| 日本一区二区电影| 欧美综合国产精品久久丁香| 欧美人与禽性xxxxx杂性| 亚洲最大中文字幕| 男人天堂网在线观看| 亚洲国产天堂网精品网站| 国产v片在线观看| 69堂精品视频| 一本色道久久综合亚洲| 欧美性猛交xxxx乱大交退制版| 黑人精品无码一区二区三区AV| 午夜精品久久久久久久蜜桃app| 精品少妇一区二区三区密爱| 国产精品嫩草影院com| 性欧美精品男男| 国产欧美日韩精品a在线观看| 亚洲AV无码国产成人久久| 99精品视频一区| 人妻无码中文久久久久专区| 成人免费毛片app| 又色又爽又黄18网站| 高清shemale亚洲人妖| 激情成人在线观看| 国产黄色精品网站| 亚洲中文字幕无码一区| 成人av综合一区| xxxx黄色片| 97国产一区二区| 欧美图片第一页| 国产亚洲女人久久久久毛片| 国产精品国产三级国产专业不| 欧美精彩视频一区二区三区| wwwww黄色| 亚洲欧美一区二区三区极速播放| 丰满少妇被猛烈进入一区二区| 一区二区三区加勒比av| 精品无码人妻一区二区三| 亚洲成a人v欧美综合天堂| 国内免费精品视频| 欧美丝袜一区二区| 少妇一级淫片日本| 91 com成人网| 国模人体一区二区| 亚洲欧美色图片| 午夜视频在线观看网站| 久久6免费高清热精品| 密臀av在线播放| 国产精品久久一区主播| 亚洲色图美国十次| 久久人人看视频| 在线亚洲人成| 成人信息集中地欧美| 亚洲视频一起| 欧美日韩高清免费| 希岛爱理一区二区三区| 日韩一级性生活片| 三级一区在线视频先锋| 久久久久久久久久毛片| a美女胸又www黄视频久久| 性欧美一区二区| 亚洲激情男女视频| 欧美国产成人精品一区二区三区| 欧美色网一区二区| 日本美女一级视频| 中文字幕久久久| 国产嫩草在线视频| 国产精品久久一区主播| 国产精品久av福利在线观看| 日韩高清专区| 很黄很黄激情成人| 精品日韩久久久| 成人天堂资源www在线| 少妇愉情理伦三级| 亚洲国产精品久久人人爱| 亚洲天堂avav| 精品在线小视频| 日韩电影免费观看| 国产精品久久久久久久久影视 | 精品日本一区二区三区| 999久久久免费精品国产| 国产亚洲黄色片| 久草这里只有精品视频| 在线观看福利片| 亚洲福中文字幕伊人影院| 亚洲影视一区二区| 亚洲男人天堂手机在线| 免费av不卡在线观看| 国产在线视频2019最新视频| 免费国产自久久久久三四区久久| 国产 欧美 日韩 一区| 久久99精品久久久久久国产越南| 国产精品无码午夜福利| 一区二区三区鲁丝不卡| 一区二区日韩在线观看| 亚洲欧美综合v| yellow字幕网在线| 亚洲综合精品伊人久久| 久久久综合色| 91极品尤物在线播放国产| 久久综合九色综合97婷婷女人| 久久久久久国产精品免费播放| 欧美精品v日韩精品v韩国精品v| 国产日韩精品在线看| 欧美一级bbbbb性bbbb喷潮片| 国产精品白浆| 黄色三级中文字幕| 国产成人精品亚洲日本在线桃色 | 五月激情综合网| 亚洲国产999| 美女精品视频一区| 欧美特黄不卡| 亚洲高潮无码久久| 国产呦萝稀缺另类资源| 久草免费资源站| 一区二区三区欧美激情| 国产视频在线观看免费 | 96av在线| 久久精品中文字幕一区二区三区| 神马影视一区二区| av动漫在线看| www国产成人| 中文字幕免费观看| 国产亚洲精品高潮| 78精品国产综合久久香蕉| 日韩av免费电影| 日本一不卡视频| 999久久久国产| 在线成人小视频| 羞羞网站在线免费观看| 成人免费视频网站| 亚洲国产mv| 欧美性xxxx图片| 在线观看日韩一区| 中文字幕在线免费| 成人亚洲欧美一区二区三区| 亚洲精品一区二区妖精| 男男受被啪到高潮自述| 亚洲国产精品一区二区久久| 香蕉视频免费在线看| 日韩av片免费在线观看| 欧美成人自拍| wwwxxx色| 色婷婷综合久色| 一区二区三区视频网站| 91免费版网站在线观看| 一本色道久久综合亚洲精品高清 | 91精品在线看| 国产精品videosex极品| jizz日本免费| 欧美日韩成人在线一区| 羞羞污视频在线观看| 欧美精品v日韩精品v国产精品| 免费的成人av| 国产真实夫妇交换视频| 亚洲视频综合网| 美女精品久久| 久久久久久久久久久福利| 成人免费一区二区三区在线观看| 亚洲爱爱综合网| 国产精品av网站| 亚洲午夜av| 成人做爰69片免网站| 精品福利一区二区三区 | 亚洲尤物在线| 日本精品在线免费观看| 日韩精品久久久久久福利| 欧美成人一二区| 日本在线观看一区二区三区| 国产毛片一区二区| 精品人妻一区二区三区免费看| 久久亚洲精品网站| 亚洲成aⅴ人片久久青草影院| 亚洲18在线看污www麻豆| 精品国产鲁一鲁一区二区张丽| 一区二区高清不卡| 免费在线观看91| 国产成人8x视频一区二区| 亚洲视屏在线观看|