DB = Datasheet Book
RM = Reference Manual?
如果要成為一個(gè)工程師的話,拿到任何一款I(lǐng)C,大概最先讀的就應(yīng)該是這兩個(gè)了。
在做智能車之前,由于不了解套路,沒有預(yù)先看DB和RM,算是個(gè)失誤吧。雖然看了都不一定懂,F(xiàn)reescale公司的K60-family's DB有79頁(全英),RM有1817頁(全英),說實(shí)話,我能完全讀完的概率在0.048%左右。
但是還是必須要看的,遇到不能解決的問題,查RM是最可靠的解決辦法。
說點(diǎn)題外話,在一開始弄智能車的時(shí)候,我負(fù)責(zé)程序的編寫,可是一點(diǎn)沒有頭緒,只好借很多例程來看,逐漸舵機(jī)、攝像頭也就能動(dòng)彈了。可是看他們的例程和庫,發(fā)現(xiàn)底層的東西還是一竅不通,如何驅(qū)動(dòng),為什么能驅(qū)動(dòng),只是知道1 + 1 = 2,但至于為什么,哥德巴赫咯。現(xiàn)在靜下心來,倒是能慢慢研究了,越來越有種「初極狹,才通人。復(fù)行數(shù)十步,豁然開朗。土地平曠,屋舍儼然,有良田美池桑竹之屬。」的感覺啦。
回歸到正題,今天解決了什么問題:
我參加的是智能車比賽攝像頭組,需要處理大量由攝像頭傳回的圖像數(shù)據(jù),目前來看這方面的問題,一個(gè)是如何傳輸這些數(shù)據(jù)不占大量的CPU資源(DMA解決),另一個(gè)是如何更快處理已存到RAM中的數(shù)據(jù)(OC)。今天下午研究了下第二個(gè)問題。
OC = Overclock 超頻,讓CPU工作在超負(fù)荷狀態(tài)下,一個(gè)人頂兩個(gè)人用,當(dāng)然處理東西更快啦!但是同樣的,風(fēng)險(xiǎn)也會(huì)加大,輕則罷工撂挑子(程序跑飛),重則直接猝死(燒掉)。
在21ic還是Freescale社區(qū)查到了關(guān)于這方面的知識(shí),看到以后收益匪淺,謄抄過來:
在超頻之前首先需要澄清幾個(gè)概念,我們通常所說的主頻一般是指內(nèi)核時(shí)鐘或者系統(tǒng)時(shí)鐘(即core_clk或system_clk)。而對(duì)K60來說,其內(nèi)部還有總線時(shí)鐘(Bus_clk)、外部總線時(shí)鐘(FlexBus_clk)、flash時(shí)鐘(Flash_clk),而這幾個(gè)時(shí)鐘互相關(guān)聯(lián)且每個(gè)都是有其頻率限制的(如下圖1所示),所以當(dāng)我們要超頻內(nèi)核時(shí)鐘的時(shí)候還不得不考慮其他時(shí)鐘承受極限(姑且用這個(gè)詞吧)。在我們用MCG模塊內(nèi)部的PLL將輸入時(shí)鐘超頻到200MHz作為MCGOUTCLK輸出的時(shí)候還需要一道關(guān)卡(如下圖2),也就是說雖然這幾個(gè)時(shí)鐘屬于同宗(都來自MCGOUTCLK),但是也可以通過不同的分頻器(OUTDIV[1:4])約束不同的時(shí)鐘范圍,這里想起一個(gè)形象的例子。MCGOUTCLK就類似以前的官家大老爺,娶了四房姨太太(OUTDIV[1:4]),分別生了四個(gè)少爺(即core_clk、Bus_clk、FlexBus_clk和Flash_clk),每個(gè)少爺都是老爺?shù)膬鹤樱贿^在家中地位卻是由姨太太的排序決定的,其中大房的大少爺(core_clk)地位最高(頻率范圍最大),四房的小少爺(flash_clk)地位最低(頻率范圍最小),不過他們的地位最高也不會(huì)超過老爺(其他clk<=MCGOUTCLK),呵呵,有點(diǎn)意思~
在圖一里可以看到,MK60DN512ZVLQ10這款飛思卡爾的單片機(jī)默認(rèn)主頻是100 MHz,在下面的超頻里經(jīng)常讓K60工作在200MHz的頻率上!
由于了解的MCU不多,不知道是不是別的MCU也是同樣是這樣的四分頻,但是Intel超頻的話,似乎只有一個(gè)倍頻和外頻,大概沒有這么多內(nèi)部時(shí)鐘。
在野火(現(xiàn)山外)提供的一個(gè)例程里,我們可以看到:
在這次編輯的過程中,又學(xué)習(xí)到了子函數(shù)、枚舉、循環(huán)函數(shù)的一些知識(shí)……果然是知識(shí)越學(xué)越多……在圖四中傳遞的形參是clk_option opt ,而opt是圖三中宏定義的MCG_CLK_MHZ,又受到圖五中枚舉定義的限制……Gosh,有點(diǎn)繞口。并且Bus_clock應(yīng)該是<=1/2Core_clock(?)。
在PLL初始化的過程中也就設(shè)置了 ''mcg_div.prdiv ;?mcg_div.vdiv ''(分頻因數(shù)?)
圖七中這就是后續(xù)如何根據(jù)PLL來設(shè)置每個(gè)需要時(shí)序的模塊來工作的code,當(dāng)然我目前還是,很不明白……
所以PLL的存在是非常重要的,總不能所有的工人都在一個(gè)節(jié)奏上吧,總會(huì)有人干的快,有人干的慢。
MCG是K60提供的一個(gè)Function,在RM里查詢,也就引出了PLL和FLL的定義。(見圖八)
FLL = ?鎖頻環(huán) PLL = 鎖相環(huán)
有高手的總結(jié):
PLL鎖相環(huán),可以將晶振輸出頻率Fosc,倍增幾倍,以滿足高速運(yùn)算需要。
在不連接PLL時(shí),CPU時(shí)鐘和晶振時(shí)鐘相同,即CCLK = Fosc。
當(dāng)使能PLL并連接,則CCLK = Fosc * M,M為倍頻數(shù)。
看起來PLL更重要一些啊!那么再看RM,
最后一條就是我們要的目的了,不同的peripherals能在不同時(shí)鐘下工作,正合我意!
那么到這里基本就說完了OC、PLL是怎么一回事,那么回到一開始的問題上,OC以后能更快的處理速度嗎,RAM速度不是被限制住了嗎?之前那位大牛也給出了他的看法,
說到這里,可能有些人會(huì)質(zhì)疑,把主頻超的那么高,但取指令的速度上不去有個(gè)啥用,豈不是頗有些大馬拉小車的感覺嗎,其實(shí)不然,這里我說兩點(diǎn)。一個(gè)是通過RAM調(diào)試或者將函數(shù)聲明成RAM執(zhí)行函數(shù)的時(shí)候是可以加快執(zhí)行速度的,另一個(gè)就是當(dāng)做一些數(shù)學(xué)運(yùn)算的時(shí)候作用就很明顯了,因?yàn)橐话憧赡軙?huì)單純用到CPU內(nèi)部的ALU和寄存器組,后者數(shù)據(jù)訪問多一些(注意Cortex-M4是哈佛結(jié)構(gòu),數(shù)據(jù)與指令總線獨(dú)立的),自然其運(yùn)算速度就上去了,所以還是好處多多的。
這樣,不就能夠提高我們的讀取速度以及處理圖像的速度了嗎?誒,好像落下點(diǎn)什么,突然出現(xiàn)個(gè)莫名奇妙的詞,“哈佛結(jié)構(gòu)”,是什么東西?
百度一下!
我們現(xiàn)在用的PC(IBM兼容機(jī))絕大部分都是由馮諾依曼的思想設(shè)計(jì)而來,實(shí)現(xiàn)簡(jiǎn)單,成本低廉。但是又有瓶頸在,
在典型情況下,完成一條指令需要3個(gè)步驟,即:取指令、指令譯碼和執(zhí)行指令。從指令流的定時(shí)關(guān)系也可看出馮·諾依曼結(jié)構(gòu)與哈佛結(jié)構(gòu)處理方式的差別。舉一個(gè)最簡(jiǎn)單的對(duì)存儲(chǔ)器進(jìn)行讀寫操作的指令,指令1至指令3均為存、取數(shù)指令,對(duì)馮·諾曼結(jié)構(gòu)處理器,由于取指令和存取數(shù)據(jù)要從同一個(gè)存儲(chǔ)空間存取,經(jīng)由同一總線傳輸,因而它們無法重疊執(zhí)行,只有一個(gè)完成后再進(jìn)行下一個(gè)。
所以對(duì)于超頻來說,假如MCU采用的是馮諾依曼結(jié)構(gòu),那么根據(jù)木桶原理來說,超頻就變的事倍功半!而哈佛架構(gòu),正可以在MCU這個(gè)集成度比較高的IC上大施拳腳!來看哈佛結(jié)構(gòu)的介紹:
哈佛結(jié)構(gòu)是一種將程序指令存儲(chǔ)和數(shù)據(jù)存儲(chǔ)分開的存儲(chǔ)器結(jié)構(gòu)。中央處理器首先到程序指令存儲(chǔ)器中讀取程序指令內(nèi)容,解碼后得到數(shù)據(jù)地址,再到相應(yīng)的數(shù)據(jù)存儲(chǔ)器中讀取數(shù)據(jù),并進(jìn)行下一步的操作(通常是執(zhí)行)。程序指令存儲(chǔ)和數(shù)據(jù)存儲(chǔ)分開,可以使指令和數(shù)據(jù)有不同的數(shù)據(jù)寬度。
哈佛結(jié)構(gòu)是指程序和數(shù)據(jù)空間獨(dú)立的體系結(jié)構(gòu),目的是為了減輕程序運(yùn)行時(shí)的訪存瓶頸。例如最常見的卷積運(yùn)算中,一條指令同時(shí)取兩個(gè)操作數(shù),在流水線處理時(shí),同時(shí)還有一個(gè)取指操作,如果程序和數(shù)據(jù)通過一條總線訪問,取指和取數(shù)必會(huì)產(chǎn)生沖突,而這對(duì)大運(yùn)算量的循環(huán)的執(zhí)行效率是很不利的。哈佛結(jié)構(gòu)能基本上解決取指和取數(shù)的沖突問題。
改進(jìn)的哈佛結(jié)構(gòu),其結(jié)構(gòu)特點(diǎn)為:使用兩個(gè)獨(dú)立的存儲(chǔ)器模塊,分別存儲(chǔ)指令和數(shù)據(jù),每個(gè)存儲(chǔ)模塊都不允許指令和數(shù)據(jù)并存,以便實(shí)現(xiàn)并行處理;具有一條獨(dú)立的地址總線和一條獨(dú)立的數(shù)據(jù)總線,利用公用地址總線訪問兩個(gè)存儲(chǔ)模塊(程序存儲(chǔ)模塊和數(shù)據(jù)存儲(chǔ)模塊),公用數(shù)據(jù)總線則被用來完成程序存儲(chǔ)模塊或數(shù)據(jù)存儲(chǔ)模塊與CPU之間的數(shù)據(jù)傳輸。
正巧,哈佛結(jié)構(gòu)!之前對(duì)哈佛結(jié)構(gòu)一無所知,以為全世界的電腦都是由馮諾依曼思想指導(dǎo)構(gòu)成的,原來天天把玩的這塊MCU,就用的是聞所未聞的哈佛結(jié)構(gòu)啊~嗯,這個(gè)世界……
總結(jié):我們一開始遇到的問題,如何更快的處理數(shù)據(jù),到此算是在硬件上得到一定的解決,就是提高CPU的工作速度(時(shí)鐘頻率),并且通過配置參數(shù)來降低因主頻提高帶來其他部件可能會(huì)出現(xiàn)的問題。但在另一方面,積極的優(yōu)化代碼,使代碼合理化、精簡(jiǎn)化、簡(jiǎn)單化,也會(huì)在很大程度上提高工作效率!
The end.
參考資料:
http://bbs.21ic.com/forum.php?mod=viewthread&tid=831312
https://community.freescale.com/docs/DOC-95555
百度文庫:普林斯頓體系和哈佛結(jié)構(gòu)聯(lián)系與區(qū)別.doc