日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當(dāng)前位置:首頁 > 嵌入式 > 嵌入式客棧
[導(dǎo)讀]來源:公眾號(hào)【魚鷹談單片機(jī)】作者:魚鷹OspreyID??:emOsprey這篇筆記有如下內(nèi)容:1、為什么需要計(jì)算各個(gè)線程的CPU使用率?2、該如何計(jì)算線程CPU使用率?3、FreeRTOS線程計(jì)算的弊端?如何打破FreeRTOS線程計(jì)算方式的時(shí)間限制?4、關(guān)鍵代碼介紹。上次介紹...

來源:公眾號(hào)【魚鷹談單片機(jī)】
作者:魚鷹Osprey
ID ??:emOsprey
這篇筆記有如下內(nèi)容:
1、為什么需要計(jì)算各個(gè)線程CPU使用率?2、該如何計(jì)算線程CPU使用率?3、FreeRTOS線程計(jì)算的弊端?如何打破 FreeRTOS 線程計(jì)算方式的時(shí)間限制?4、關(guān)鍵代碼介紹。

上次介紹了如何計(jì)算整個(gè)系統(tǒng)的CPU使用率:《單片機(jī)里面的CPU使用率是什么鬼?》《實(shí)操RT-Thread系統(tǒng)CPU利用率功能添加》但是卻沒有介紹該如何計(jì)算每個(gè)線程(任務(wù))的CPU使用率。
為什么要計(jì)算線程CPU使用率?
首先要問的是,為什么要計(jì)算線程的CPU使用率,有啥用?我們知道系統(tǒng)的CPU使用率關(guān)注的是整個(gè)系統(tǒng)的使用情況,使用率越低,表示越能更及時(shí)的響應(yīng)外部情況,整個(gè)系統(tǒng)的性能也會(huì)越好。但這是從系統(tǒng)整體考量的,并不能反映單個(gè)線程的執(zhí)行情況。比如雖然整體的CPU使用率是30%,但是有一個(gè)線程占據(jù)了25%的使用率,一個(gè)線程使用率是5%,那么你肯定會(huì)想,為啥這個(gè)線程需要占用這么高的CPU使用率,是不是代碼寫的有問題,是不是代碼可以優(yōu)化一下?當(dāng)系統(tǒng)運(yùn)行時(shí),如果你能實(shí)時(shí)觀察各個(gè)線程的CPU使用率,那么你就能知道平時(shí)這個(gè)線程的CPU使用情況是怎樣的,為什么后來又高那么多,那么你就可以由此分析出這個(gè)線程可能出現(xiàn)了問題,也就可以針對性的進(jìn)行檢查了。這點(diǎn)對于合作開發(fā)的項(xiàng)目更是明顯,很多時(shí)候因?yàn)橛行┚€程的代碼不是自己寫的,所以根本不知道代碼執(zhí)行情況,一旦系統(tǒng)出現(xiàn)問題,那么可能就是互相甩鍋了。而當(dāng)計(jì)算了線程的CPU使用率,一旦發(fā)現(xiàn)某個(gè)線程執(zhí)行異常,那么就能交給負(fù)責(zé)的人去查看了。所以說,使用操作系統(tǒng)的項(xiàng)目是非常有必要計(jì)算各個(gè)線程(任務(wù))的CPU使用率的。就好比你的電腦,風(fēng)扇嗡嗡響(CPU高負(fù)荷運(yùn)行),如果只有一個(gè)系統(tǒng)CPU使用率,發(fā)現(xiàn)高達(dá)90%,但是你卻根本不知道為什么這么高,所以只能重啟。而一旦有了進(jìn)程CPU使用率,查看一下哪個(gè)進(jìn)程CPU使用率高,把對應(yīng)的進(jìn)程關(guān)閉就行了,根本不需要重啟電腦。

????????
如何計(jì)算線程CPU使用率?
那么現(xiàn)在就來看看該如何計(jì)算各個(gè)線程的CPU使用率。從前面的筆記,我們其實(shí)也可以猜測該如何計(jì)算,無非就是獲取每個(gè)線程的執(zhí)行時(shí)間罷了。比如,1秒時(shí)間內(nèi),空閑任務(wù)執(zhí)行700毫秒,任務(wù)1執(zhí)行200毫秒,任務(wù)2執(zhí)行100毫秒,那么各個(gè)任務(wù)的CPU使用率分別是 70%、20%、10%。以前計(jì)算系統(tǒng)的CPU使用率的時(shí)候,采用了軟件方法計(jì)算空閑任務(wù)的運(yùn)行時(shí)間,這必然是不夠準(zhǔn)確的,所以最好的方式是采用硬件計(jì)時(shí)。因?yàn)轸~鷹采用STM32F103進(jìn)行測試,所以使用DWT外設(shè)進(jìn)行精確計(jì)時(shí),不過麻煩的是,在KEIL 軟件仿真情況下,DWT外設(shè)是無法工作的,所以如果要測試的話,必須使用硬件仿真的方式,不過如果真要KEIL軟件仿真的話,也不是沒有辦法,就是使用硬件定時(shí)器,這個(gè)按下不表。畢竟,DWT外設(shè)的功能在這里說白了也就是個(gè)定時(shí)器而已。既然要獲取線程的執(zhí)行時(shí)間,關(guān)鍵一點(diǎn)就是,我們要知道操作系統(tǒng)什么時(shí)候會(huì)切換到某一個(gè)線程運(yùn)行,什么時(shí)候又會(huì)從這個(gè)線程切出,到另一個(gè)線程執(zhí)行呢?這個(gè)關(guān)鍵還是在系統(tǒng)內(nèi)置的鉤子函數(shù)。上次的筆記魚鷹介紹過空閑鉤子函數(shù),今天介紹另一個(gè)鉤子,任務(wù)切換鉤子函數(shù)。這個(gè)鉤子函數(shù)的特點(diǎn)就是,每當(dāng)系統(tǒng)需要切換到下一個(gè)任務(wù)時(shí),就會(huì)先執(zhí)行這個(gè)函數(shù)。這個(gè)函數(shù)一般有兩個(gè)參數(shù),當(dāng)前任務(wù)即將切換的任務(wù)。只要設(shè)置任務(wù)切換的鉤子函數(shù),并且有時(shí)間戳,那么計(jì)算一個(gè)任務(wù)的執(zhí)行時(shí)間也就不那么困難了。比如,操作系統(tǒng)在時(shí)刻12345 ms 切換到空閑任務(wù)執(zhí)行,突然一個(gè)任務(wù)就緒,開始準(zhǔn)備執(zhí)行,所以在時(shí)刻12445切換到那個(gè)就緒任務(wù)執(zhí)行,那么空閑任務(wù)的執(zhí)行時(shí)間我們也就可以準(zhǔn)確計(jì)算出來了。12445 – 12345 = 100 ms也就是說,這一次空閑任務(wù)執(zhí)行了 100 毫秒。如果我們要計(jì)算單位時(shí)間(比如1秒內(nèi))空閑任務(wù)的執(zhí)行時(shí)間,我們只要在每次運(yùn)行到空閑任務(wù)時(shí)累計(jì)時(shí)間即可。比如1秒內(nèi),空閑任務(wù)執(zhí)行了 5 次,分別是 10、200、100、200、50,累計(jì)時(shí)間為10 200 100 200 50 = 560毫秒由此,可計(jì)算空閑任務(wù)的CPU使用率為 56%,從而可計(jì)算出系統(tǒng)的CPU使用率是44%。是的,通過線程的CPU使用率方法,我們其實(shí)也可以計(jì)算整個(gè)系統(tǒng)的CPU使用率。而且這種計(jì)算方式比前面所說的計(jì)算方法更準(zhǔn)確,更科學(xué)。前面采用時(shí)間戳進(jìn)行計(jì)算,但是時(shí)間戳是會(huì)溢出的,那個(gè)時(shí)候,你的時(shí)間計(jì)算還是準(zhǔn)確的嗎?
FreeRTOS線程計(jì)算限制?
現(xiàn)在魚鷹就來說說第三個(gè)問題,F(xiàn)reeRTOS線程計(jì)算的弊端?如何打破 FreeRTOS 線程計(jì)算方式的時(shí)間限制?從網(wǎng)上查找FreeRTOS任務(wù)CPU計(jì)算相關(guān)的資料,可以得到以下信息:1、需要開一個(gè)定時(shí)器,這個(gè)定時(shí)器中斷頻率是操作系統(tǒng)時(shí)鐘的十幾倍(為了保證計(jì)算精度)。2、一個(gè)64 位的變量在定時(shí)器自加更新,一旦變量溢出,時(shí)間計(jì)算就會(huì)出現(xiàn)問題。(相關(guān)細(xì)節(jié)可查看安富萊教程)第一個(gè)問題會(huì)導(dǎo)致系統(tǒng)性能下降(中斷頻率太高,一般是微秒級別的),而第二個(gè)問題導(dǎo)致在一段時(shí)間內(nèi)(小時(shí)級別)線程CPU使用率計(jì)算準(zhǔn)確,超出時(shí)間后,計(jì)算會(huì)有問題,所以教程中不建議在正式版本加入此功能。第一個(gè)問題其實(shí)很好解決,就是使用硬件定時(shí)器,不再由CPU去更新時(shí)間,這樣不會(huì)占用CPU時(shí)間,第二個(gè)問題其實(shí)也非常好解決,就是通過《延時(shí)功能進(jìn)化論(合集)》的方式解決溢出問題,這里不再展開說其中的奧妙。
任務(wù)切換鉤子函數(shù)的實(shí)現(xiàn)總之,魚鷹接下來的實(shí)現(xiàn)方式解決了以上兩個(gè)痛點(diǎn),即使無限執(zhí)行下去,也不會(huì)影響到計(jì)算精度問題,唯一對系統(tǒng)產(chǎn)生的一點(diǎn)影響,只有在任務(wù)切換時(shí)消耗的一點(diǎn)計(jì)算時(shí)間(微秒級別)。那么先上任務(wù)切換鉤子函數(shù)關(guān)鍵實(shí)現(xiàn)代碼(RT-Thread):
void thread_stats_scheduler_hook(struct rt_thread *from, struct rt_thread *to){ static uint32_t schedule_last_time; uint32_t time; time = get_curr_time(); from->user_data = (time - schedule_last_time); schedule_last_time = time;}如何將這個(gè)函數(shù)注冊到操作系統(tǒng)中被系統(tǒng)調(diào)用呢?通過這個(gè)函數(shù)即可:那么現(xiàn)在來分析這個(gè)鉤子函數(shù)實(shí)現(xiàn):一個(gè)靜態(tài)變量,用于記錄切換時(shí)的時(shí)間戳。每次任務(wù)開始切換時(shí),更新這個(gè)時(shí)間戳,同時(shí)累積時(shí)間,這個(gè)時(shí)間保存在當(dāng)前任務(wù)的user_data里面。難理解?看下圖就清楚了。假設(shè)系統(tǒng)調(diào)度是從任務(wù)1切換到任務(wù)2,即from為任務(wù)1,to為任務(wù)2,此時(shí)獲取的時(shí)間戳為 T1。上一次的時(shí)間戳我們已經(jīng)通過靜態(tài)變量保留了,這里為T0,那么T1-T0就是from任務(wù)即任務(wù)1在本次運(yùn)行的時(shí)間,只要下次運(yùn)行任務(wù)1時(shí)繼續(xù)不斷的累積這個(gè)時(shí)間,那么就可以得到任務(wù)1的總運(yùn)行時(shí)間。任務(wù)2同理。當(dāng)然我們不可能一直累積下去,不然肯定會(huì)溢出,所以隔一段時(shí)間就需要清零,這個(gè)時(shí)間其實(shí)就是線程CPU計(jì)算的周期。????這里還有一個(gè)函數(shù)沒有說,就是 get_curr_time(),在這里使用DWT,為了可以重新實(shí)現(xiàn)該函數(shù),魚鷹使用了弱屬性 weak(關(guān)于這個(gè)看參考:《困惑多年,為什么 printf 可以重定向??》)。
__weakuint32_t get_curr_time() { return DWT->CYCCNT; // don't use the function rt_tick_get()}這里可以看到有個(gè)注釋,不要使用 rt_tick_get 函數(shù),為啥?精度太低,有些任務(wù)本來執(zhí)行了的,但是因?yàn)閳?zhí)行時(shí)間小于操作系統(tǒng)的時(shí)鐘(比如1毫秒),那么就無法累積時(shí)間了,那么即使這個(gè)任務(wù)運(yùn)行再多,時(shí)間累積也為 0,這肯定是我們不希望看到的。然后再說一個(gè)點(diǎn),為了簡化代碼(鉤子函數(shù)代碼只有短短幾行),魚鷹這樣的實(shí)現(xiàn)是有兩個(gè)問題的。1、首次運(yùn)行計(jì)算有誤,因?yàn)殪o態(tài)變量應(yīng)該在運(yùn)行任務(wù)之前就初始化的(不應(yīng)該初始化為 0),而鉤子函數(shù)是在任務(wù)運(yùn)行之后才調(diào)用的,所以從開機(jī)以來的時(shí)間被累加到第一個(gè)運(yùn)行任務(wù)中了,這肯定是有問題的,不過后面隨著系統(tǒng)的運(yùn)行,靜態(tài)變量被持續(xù)更新,就不會(huì)再出現(xiàn)這個(gè)問題了。2、為了減少修改,魚鷹把線程的use_data當(dāng)成一個(gè)變量使用了,實(shí)際上這個(gè)變量的功能應(yīng)該是存儲(chǔ)線程私有變量地址的,但是因?yàn)轸~鷹懶得修改太多代碼,所以直接拿來用了。正因?yàn)槿绱?,所以魚鷹添加線程CPU計(jì)算時(shí),只要修改很少的代碼就可以了。
線程CPU計(jì)算
目前我們已經(jīng)能夠通過鉤子函數(shù)獲取各個(gè)線程的CPU執(zhí)行時(shí)間,現(xiàn)在就看該如何計(jì)算了。為了計(jì)算各個(gè)線程的CPU使用率,我們需要確定計(jì)算周期,這里我們可以設(shè)置1秒計(jì)算一次。其次,我們需要確定在哪個(gè)任務(wù)執(zhí)行計(jì)算。原理上來說,可以是系統(tǒng)中的任何一個(gè)任務(wù),但是為了減少對系統(tǒng)的干擾,可以將計(jì)算工作放到優(yōu)先級比較低的任務(wù)中進(jìn)行,比如空閑任務(wù)。現(xiàn)在,看看函數(shù)是如何實(shí)現(xiàn)的:
// can call the function 1 s (max 60s when stm32f1xx because of dwt)void thread_cal_usage(thread_run_info_def *run_info){ static uint32_t total_time_last; uint32_t time, total_time; struct rt_list_node *node; struct rt_list_node *list; struct rt_thread *thread; uint32_t i; rt_enter_critical(); // 關(guān)閉系統(tǒng)調(diào)度,防止在計(jì)算過程中更新線程時(shí)間,影響計(jì)算 time = get_curr_time(); // 獲取當(dāng)前時(shí)間戳 total_time = time - total_time_last; // 計(jì)算運(yùn)行總時(shí)間 total_time_last = time; // 更新時(shí)間 list =
本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時(shí)聯(lián)系本站刪除( 郵箱:macysun@21ic.com )。
換一批
延伸閱讀

由臺(tái)達(dá)集團(tuán)于2026年3月29日通過美通社發(fā)布新聞稿《集裝箱式SST直流移動(dòng)智算中心發(fā)布》中,第3張有誤,已進(jìn)行替換。特此更正,更新后的全文及圖片如下: 集裝箱式SST直流移動(dòng)智算中心發(fā)布 臺(tái)達(dá)、漢騰科技、龍芯中科攜...

關(guān)鍵字: 移動(dòng) ST 固態(tài)變壓器 CPU

面對AI Agent與Physical AI的浪潮,單純依靠增加GPU或NPU的補(bǔ)丁式方案已難以為繼,CPU架構(gòu)必須進(jìn)行面向AI的底層重塑。 阿里達(dá)摩院發(fā)布的玄鐵C950旗艦處理器,不僅刷新了單核性能紀(jì)錄,更通過原生A...

關(guān)鍵字: 玄鐵C950 CPU AI 物理AI RISC-V

北京2026年3月27日 /美通社/ -- 當(dāng)?shù)谑鍖萌珖\(yùn)動(dòng)會(huì)辦公系統(tǒng)全程穩(wěn)定運(yùn)行時(shí),當(dāng)銀行柜員輕點(diǎn)鼠標(biāo)實(shí)現(xiàn)業(yè)務(wù)秒級響應(yīng)時(shí),當(dāng)大學(xué)生刷一卡通順暢進(jìn)出宿舍、食堂、圖書館時(shí),當(dāng)新能源汽車充電樁智能調(diào)度、巨災(zāi)預(yù)警系統(tǒng)精準(zhǔn)響應(yīng)...

關(guān)鍵字: CPU 指令集 芯片 操作系統(tǒng)

成立三十余年來,Arm一直是芯片行業(yè)特殊的“幕后推手”——不生產(chǎn)一顆芯片,卻定義了全球99%智能手機(jī)的底層架構(gòu)。然而,這家長期保持中立的IP授權(quán)巨頭,如今正打破自己一手建立的商業(yè)規(guī)則。

關(guān)鍵字: ARM CPU 芯片

Arm 首次將其平臺(tái)矩陣拓展至量產(chǎn)芯片產(chǎn)品,為業(yè)界提供覆蓋 IP、Arm計(jì)算子系統(tǒng) (CSS)及芯片的最廣泛的計(jì)算產(chǎn)品選擇。 發(fā)布首款由 Arm 設(shè)計(jì)的數(shù)據(jù)中心 CPU——Arm AGI CPU,專為代理式AI 基...

關(guān)鍵字: ARM CPU 數(shù)據(jù)中心 代理式AI

2026年3月24日,美國加州圣何塞訊——Super Micro Computer, Inc.(NASDAQ:SMCI)作為云端計(jì)算、AI/機(jī)器學(xué)習(xí)、存儲(chǔ)和5G/邊緣領(lǐng)域的全方位IT解決方案供應(yīng)商,宣布推出基于NVIDI...

關(guān)鍵字: DCBBS液冷架構(gòu) CPU 存儲(chǔ)

3月24日,由阿里巴巴達(dá)摩院主辦的2026玄鐵RISC-V生態(tài)大會(huì)在上海舉行。高通、Arteris、Canonical、SHD Group、海爾、中興通訊、全志科技、北京智芯微、南芯科技等全球數(shù)百家產(chǎn)學(xué)研機(jī)構(gòu)齊聚一堂,分...

關(guān)鍵字: RISC-V CPU 算力

Supermicro的NVIDIA Vera Rubin NVL72與HGX Rubin NVL8系統(tǒng)是基于DCBBS液冷架構(gòu)所設(shè)計(jì),與NVIDIA Blackwell...

關(guān)鍵字: CPU MICRO NVIDIA SUPER

3月24日消息,今日,在上海舉行的2026玄鐵RISC-V生態(tài)大會(huì)上,阿里巴巴達(dá)摩院發(fā)布新一代旗艦CPU產(chǎn)品玄鐵C950。

關(guān)鍵字: RISC-V CPU

March 18, 2026 ---- 根據(jù)TrendForce集邦咨詢最新AI Server研究,在大型云端服務(wù)供應(yīng)商(CSP)加大自研芯片力道的情況下,NVIDIA(英偉達(dá))在GTC 2026大會(huì)改為著重各領(lǐng)域的AI...

關(guān)鍵字: ASIC GPU CPU
關(guān)閉