【說在前面的話】
相對人的感官來說CPU跑的太快了——即便是人們常常用來描述時間短暫的“一眨眼功夫”對CPU來說也是及其“漫長”的好幾百毫秒了——仔細(xì)想想有幾個人能在一秒鐘內(nèi)連續(xù)眨十次眼睛呢?正因為如此,即便是超級循環(huán)里面順次執(zhí)行的多個任務(wù),在人類看來也往往是“一瞬間就執(zhí)行完了”。那么CPU究竟跑的有多快呢?是很快、非??爝€是快得不得了?如果我們繼續(xù)站在人類的視角考慮這個問題,其抽象程度無異于思考“無窮大究竟是多大”。
讓我們想象著周圍的時間相對你突然都慢了下來,從微處理器的視角重新審視這個世界。
【第一個參考點(diǎn)】
“1MHz就是 1us”
“1MHz就是1us”是一個基準(zhǔn)概念,通過修改思考方式,我們就可以利用它快速而有效的解決很多實際問題。作為練習(xí),我們來嘗試依次快速的回答以下幾個問題:
假設(shè)每個時鐘脈沖都對應(yīng)一個指令周期:
已知系統(tǒng)頻率是1MHz,請問1us內(nèi)有幾個指令周期?
已知系統(tǒng)頻率是12MHz,請問1us內(nèi)有幾個指令周期?
已知系統(tǒng)頻率是11.3728MHz,請問1us內(nèi)有幾個指令周期?
已知系統(tǒng)頻率是500KHz,請問1us內(nèi)有幾個指令周期?
很顯然,如果你試圖首先計算出系統(tǒng)周期:
再用1us去相除:
這個過程已經(jīng)慢了。
讓我們來換一種思維模式,既然1MHz對應(yīng)1us(也就是1us對應(yīng)一個指令周期),那么12MHz就是1MHz的12倍,1us時間內(nèi)就有12個指令周期;同理可得,當(dāng)系統(tǒng)頻率分別是11.3728MHz和500KHz(0.5MHz)的時候,1us時間內(nèi)對應(yīng)的指令周期數(shù)分別是11.3728個和0.5個。
借助這個等效,我們就可以對CPU的處理能力建立更多量化的感官,比如1ms的時間內(nèi),CPU能做多少事情呢?由于1ms等于1000us,對1MHz的系統(tǒng)來說,1ms可以完成1000個指令周期,12MHz的系統(tǒng)可以完成12000個指令周期。然而1000和12000這樣的數(shù)字對于只有十個手指的人類大腦來說還是太抽象了,因此我們更進(jìn)一步,把指令周期換算成等效的代碼尺寸:
由于主流的微控制器其指令集中大多是單周期指令,我們不妨假設(shè)所有指令都是單指令周期的,這樣1個指令周期就對應(yīng)一條指令;
假設(shè)每條指令都是2個字節(jié)大?。?6位指令);
這樣,1ms時間內(nèi)1MHz的系統(tǒng)可以運(yùn)行大約2KB的代碼,一個12MHz的系統(tǒng)可以運(yùn)行24KB的代碼,依次類推。
那么2KB是什么概念呢?如果你平時有留意編譯后的代碼尺寸,2KB大約是一個基礎(chǔ)驅(qū)動庫的尺寸,可以包含一個USART的驅(qū)動或者實現(xiàn)電源管理;而24KB幾乎是一個小型工程應(yīng)用的尺寸了。
借助這些非常具體的數(shù)字,我們很容易拿它們和中斷處理程序進(jìn)行比較,建立直觀的認(rèn)識——比如:
中斷處理程序“執(zhí)行的是不是足夠快”?
“丟中斷的風(fēng)險究竟有多大”等等?
使用中斷接收外設(shè)數(shù)據(jù)的時候會不會發(fā)生丟失?
可以肯定的是,這種忽略循環(huán)和條件分支的評估方法幾乎是一個代碼的最差情況,也就是說,在1MHz的系統(tǒng)中對于一個1KHz的毫秒中斷,中斷處理程序越接近2KB,就說明系統(tǒng)越可能“丟中斷”。
在這種情況下,除非你通過編譯器提供的等效匯編代碼仔細(xì)的計算過實際的周期數(shù),或者是通過perf_counter這樣的工具實際測量過代碼的周期消耗——確信時間上處理周期不會大于1ms且這期間不會存在其它中斷處理程序,否則你的中斷處理程序還是比2KB越小越好。
【一個真實的案例】
在一個72MHz的Cortex-M3/M4系統(tǒng)下,使用中斷模式來接收串口數(shù)據(jù),波特率為115200的情況下:
最大允許屏蔽中斷多長時間?
中斷處理程序允許的理論最大安全尺寸是多少?
首先,我們要搞清楚系統(tǒng)的指令大小和指令集的周期數(shù)情況。以ARM Cortex M3/M4為例,其指令大部分為單周期指令,支持16位指令和32位指令。為了評估中斷處理程序的尺寸上線,我們可以分別以16位指令和32位指令為基礎(chǔ)計算出兩個結(jié)果作為參考范圍;
其次,系統(tǒng)頻率為72MHz,假設(shè)USART沒有硬件FIFO,則115200的波特率在典型的“1起始位+1終止位+無校驗位+8數(shù)據(jù)位”的配置下(每個數(shù)據(jù)幀對應(yīng)10個bit),實際上對應(yīng)最大11.52KB/s的數(shù)據(jù)率——或者說,USART完成中斷每秒鐘發(fā)生 11.52K次。至此,我們可以回答第一個問題,即在這一系統(tǒng)中最大允許屏蔽中斷多長時間——1/11.52KHz ≈87us。
也就是說,假設(shè)中斷屏蔽的時間為87us則中斷處理程序的理論最大尺寸范圍是(72 * 87 * 2)字節(jié)到(72 * 87 * 4)字節(jié),即12.528KB到25.056KB之間。取最小值12KB。
結(jié)論,中斷處理程序及其調(diào)用的子函數(shù),其尺寸總和至少要小于12KB才能確保115200波特率的接收完成中斷得到及時的響應(yīng)。由于未考慮循環(huán)、分支以及其它任務(wù)的存在,以上結(jié)果僅用于粗略的快速評估,實際代碼通常應(yīng)該遠(yuǎn)小于這一上線值。當(dāng)實際尺寸接近或者超過13KB時基本可以判定該系統(tǒng)存在無法及時穩(wěn)定的響應(yīng)中斷的可能——需要對代碼進(jìn)行進(jìn)一步的具體分析。
【結(jié)語】
“1MHz就是1us”的等效為我們提供了一個基準(zhǔn),建立了關(guān)于“CPU跑多快”最直觀的感受,同時也為評估代碼尺寸、系統(tǒng)可靠性提供了有力的參考。掌握了這個基準(zhǔn),作為一個合格的程序員,不應(yīng)該僅憑人類的感覺毫無依據(jù)評價CPU的處理能力了,“72MHz足夠快了吧?”“我已經(jīng)用了芯片的最高頻率”這種話再也不能輕易說了,我們應(yīng)該定量而不是定性的去看待這類問題。
編輯:lyn
-
cpu
+關(guān)注
關(guān)注
68文章
10873瀏覽量
212082 -
1Mhz
+關(guān)注
關(guān)注
0文章
4瀏覽量
8927
原文標(biāo)題:【實時性迷思】CPU究竟跑的有多快?
文章出處:【微信號:zhuyandz,微信公眾號:FPGA之家】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論