日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

CPU使用百分比测量

發布時間:2025/4/5 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 CPU使用百分比测量 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

    • 1 CPU使用百分比測量
      • 1.1 需求概述
      • 1.2 設計原理
      • 1.3 設計實現

1 CPU使用百分比測量

1.1 需求概述

1.2 設計原理

1.3 設計實現

特殊代碼塊:

統計使用百分比:

相關代碼如下:

// 空閑任務計數與最大計數 uint32_t idleCount; uint32_t idleMaxCount;static void initCpuUsageStat (void); static void checkCpuUsage (void); static void cpuUsageSyncWithSysTick (void);static float cpuUsage; // cpu使用率統計 static uint32_t enableCpuUsageStat; // 是否使能cpu統計/********************************************************************************************************** ** Function name : initCpuUsageStat ** Descriptions : 初始化cpu統計 ** parameters : 無 ** Returned value : 無 ***********************************************************************************************************/ static void initCpuUsageStat (void) {idleCount = 0;idleMaxCount = 0;cpuUsage = 0;enableCpuUsageStat = 0; }/********************************************************************************************************** ** Function name : checkCpuUsage ** Descriptions : 檢查cpu使用率 ** parameters : 無 ** Returned value : 無 ***********************************************************************************************************/ static void checkCpuUsage (void) {// 與空閑任務的cpu統計同步if (enableCpuUsageStat == 0){enableCpuUsageStat = 1;tickCount = 0;return;}if (tickCount == TICKS_PER_SEC){// 統計最初1s內的最大計數值idleMaxCount = idleCount;idleCount = 0;// 計數完畢,開啟調度器,允許切換到其它任務tTaskSchedEnable();}else if (tickCount % TICKS_PER_SEC == 0){// 之后每隔1s統計一次,同時計算cpu利用率cpuUsage = 100 - (idleCount * 100.0 / idleMaxCount);idleCount = 0;} } /********************************************************************************************************** ** Function name : tTaskSystemTickHandler ** Descriptions : 系統時鐘節拍處理。 ** parameters : 無 ** Returned value : 無 ***********************************************************************************************************/ void tTaskSystemTickHandler (void) {tNode * node;// 進入臨界區,以保護在整個任務調度與切換期間,不會因為發生中斷導致currentTask和nextTask可能更改uint32_t status = tTaskEnterCritical();// 檢查所有任務的delayTicks數,如果不0的話,減1。for (node = tTaskDelayedList.headNode.nextNode; node != &(tTaskDelayedList.headNode); node = node->nextNode){tTask * task = tNodeParent(node, tTask, delayNode);if (--task->delayTicks == 0) {// 如果任務還處于等待事件的狀態,則將其從事件等待隊列中喚醒if (task->waitEvent) {// 此時,消息為空,等待結果為超時tEventRemoveTask(task, (void *)0, tErrorTimeout);}// 將任務從延時隊列中移除tTimeTaskWakeUp(task);// 將任務恢復到就緒狀態tTaskSchedRdy(task); }}// 檢查下當前任務的時間片是否已經到了if (--currentTask->slice == 0) {// 如果當前任務中還有其它任務的話,那么切換到下一個任務// 方法是將當前任務從隊列的頭部移除,插入到尾部// 這樣后面執行tTaskSched()時就會從頭部取出新的任務取出新的任務作為當前任務運行if (tListCount(&taskTable[currentTask->prio]) > 0) { tListRemoveFirst(&taskTable[currentTask->prio]);tListAddLast(&taskTable[currentTask->prio], &(currentTask->linkNode));// 重置計數器currentTask->slice = TINYOS_SLICE_MAX;}}// 節拍計數增加tickCount++;// 檢查cpu使用率checkCpuUsage();// 退出臨界區tTaskExitCritical(status); // 通知定時器模塊節拍事件tTimerModuleTickNotify();// 這個過程中可能有任務延時完畢(delayTicks = 0),進行一次調度。tTaskSched(); }/********************************************************************************************************** ** Function name : cpuUsageSyncWithSysTick ** Descriptions : 為檢查cpu使用率與系統時鐘節拍同步 ** parameters : 無 ** Returned value : 無 ***********************************************************************************************************/ static void cpuUsageSyncWithSysTick (void) {// 等待與時鐘節拍同步while (enableCpuUsageStat == 0){;;} }/********************************************************************************************************** ** Function name : cpuUsageSyncWithSysTick ** Descriptions : 為檢查cpu使用率與系統時鐘節拍同步 ** parameters : 無 ** Returned value : 無 ***********************************************************************************************************/ float tCpuUsageGet (void) {float usage = 0;uint32_t status = tTaskEnterCritical();usage = cpuUsage;tTaskExitCritical(status);return usage; }// 用于空閑任務的任務結構和堆棧空間 tTask tTaskIdle; tTaskStack idleTaskEnv[TINYOS_IDLETASK_STACK_SIZE];void idleTaskEntry (void * param) {// 禁止調度,防止后面在創建任務時切換到其它任務中去tTaskSchedDisable();// 初始化App相關配置tInitApp();// 初始化定時器任務tTimerInitTask();// 啟動系統時鐘節拍tSetSysTickPeriod(TINYOS_SYSTICK_MS);// 等待與時鐘同步cpuUsageSyncWithSysTick();for (;;){uint32_t status = tTaskEnterCritical();idleCount++;tTaskExitCritical(status);} }int main () {// 優先初始化tinyOS的核心功能tTaskSchedInit();// 初始化延時隊列tTaskDelayedInit();// 初始化定時器模塊tTimerModuleInit();// 初始化時鐘節拍tTimeTickInit();// 初始化cpu統計initCpuUsageStat();// 創建空閑任務tTaskInit(&tTaskIdle, idleTaskEntry, (void *)0, TINYOS_PRO_COUNT - 1, idleTaskEnv, TINYOS_IDLETASK_STACK_SIZE);// 這里,不再指定先運行哪個任務,而是自動查找最高優先級的任務運行nextTask = tTaskHighestReady();// 切換到nextTask, 這個函數永遠不會返回tTaskRunFirst();return 0; }

參考資料:

  • 【李述銅】從0到1自己動手寫嵌入式操作系統
  • 總結

    以上是生活随笔為你收集整理的CPU使用百分比测量的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。