硬件杂谈
http://antkillerfarm.github.io/
開篇的話
自從改行做起了驅動軟件工程師,好多硬件的問題已經(jīng)不再像當初那樣,可以忽略不計了。于是就有了以下的心得。
0歐電阻的作用
在硬件原理圖,特別是硬件草案的原理圖中,常可看到0歐的電阻。0歐的電阻在效果上當然等同于導線,辛辛苦苦把它引出來焊上,究竟有何用處呢?硬件的同事告訴我,他們一般只在某些新添加的電路上使用這東西。一旦由于某些原因需要去掉新添加的電路的話,只要用電烙鐵把電阻取下來就可以了,而不用再造一批測試版。
空指針
空指針的概念,本來主要是個軟件概念。上學的時候,教C語言的老師,就反復強調(diào)要檢查空指針。
課本上給出的標準做法是:
1)聲明一個指針變量,并初始化為NULL。
2)在程序執(zhí)行過程中,指針被賦值為一個有某種含義的非空值。
3)使用該指針前,檢查其是否是空指針。
這里就有疑問了。C語言中所謂的指針,保存的不過是個地址值。請看下面的例子:
int a[10]; int *p = a;在這里p表示數(shù)組a的首地址,p+1表示a[1]的地址,那么p-1呢?在通常情況下,這也是個有意義的地址,只不過我們不知道它屬于哪個變量罷了。所以課本中的做法的一個隱含的前提就是,NULL不屬于任何變量。否則的話,對于以NULL開始的變量來說,檢查空指針顯然就毫無意義了。
對NULL的特殊性還有所懷疑的同學,可以試試往p-1中寫數(shù)據(jù)和往NULL中寫數(shù)據(jù),看看在執(zhí)行的時候,現(xiàn)象有什么不同。
從硬件的角度來說,32位的處理器有32位的地址總線,因此理論上說它的地址空間也是32位的。但是并非32位的地址都是有意義的。在一些嵌入式設備上,可能外設會占掉一部分地址空間,內(nèi)存會占掉另一部分地址空間,其余的都是未定義的地址空間。向這些未定義的地址讀寫數(shù)據(jù),會產(chǎn)生錯誤,通常的表現(xiàn)就是產(chǎn)生了一個異常或者中斷。
在PC上,由于外設和內(nèi)存有各自獨立的地址空間,再加上虛擬內(nèi)存的關系,這種未定義的地址空間是沒有了,但是NULL開始的一段地址空間,會被定義為保護段,對其的讀寫同樣會引發(fā)異常或者中斷。(關于PC的結論,僅針對一般的用戶態(tài)程序,內(nèi)核態(tài)程序不適用。)
因此往NULL中讀寫數(shù)據(jù)的BUG,通常是比較好解決的。而往p-1中寫數(shù)據(jù)的BUG,沒有相當?shù)募记苫蚬ぞ叩脑?#xff0c;是很難解決的。
IRQ與FIQ的區(qū)別
IRQ(Interrupt Request):指中斷模式。
FIQ(Fast Interrupt Request):指快速中斷模式。
是ARM處理器的兩種不同編程模式(ARM有7種處理模式)。
1、對FIQ你必須進快處理中斷請求,并離開這個模式。
2、IRQ可以被FIQ所中斷,但FIQ不能被IRQ所中斷,在處理FIQ時必須要關閉中斷。
3、FIQ的優(yōu)先級比IRQ高。
4、FIQ模式下,比IRQ模式多了幾個獨立的寄存器。
不要小看這幾個寄存器,ARM在編譯的時候,如果你FIQ中斷處理程序足夠用這幾個獨立的寄存器來運作,它就不會進行通用寄存器的壓棧,這樣也省了一些時間。
5、FIQ的中斷向量地址在0x0000001C,而IRQ的在0x00000018。(也有的在FFFF001C以及FFFF0018)
寫過完整匯編系統(tǒng)的都比較明白這點的差別,18只能放一條指令,為了不與1C處的FIQ沖突,這個地方只能跳轉,而FIQ不一樣,1C以后沒有任何中斷向量表了,這樣可以直接在1C處放FIQ的中斷處理程序,由于跳轉的范圍限制,至少少了一條跳轉指令。
6、IRQ和FIQ的響應延遲有區(qū)別
IRQ的響應并不及時,從Verilog仿真來看,IRQ會延遲幾個指令周期才跳轉到中斷向量處,看起來像是在等預取的指令執(zhí)行完。FIQ的響應不清楚,也許比IRQ快。
RISC vs. CISC
記得當初在學校里,學習“計算機組成原理”時,碰到了這兩個概念。課本上的準確提法記得不確切了,但大致是這個樣的(文獻A):
http://blog.ednchina.com/playlinus/39520/message.aspx
本來沒有什么,課本上寫些什么,記住就行了。直到遇到這篇文章(文獻B):
http://www.tektalk.org/2010/02/23/cpu%E4%BD%93%E7%B3%BB%E7%BB%93%E6%9E%84%E7%9A%84%E6%BC%94%E5%8F%98/
文章中的“RISC OR CISC已經(jīng)不再重要”這句話引起了我的注意和思考。
一直以來大部分課本上的觀點是這樣的:RISC由于速度快,必將取代CISC,而之所以沒取代,主要是由于現(xiàn)在的大部分軟件只能運行在X86體系上,也就是說是由于非技術的市場原因導致的。
市場原因當然不在我這篇文章的考量范疇,但“RISC比CISC快”這個結論卻值得打個問號。
課本中給出的解釋是:CISC由于指令復雜,所以需要將每條指令分解成微指令,才能執(zhí)行,因此指令的CPI(Cycles Per Instruction)要比RISC高,所以就慢。RISC盡管完成同樣的功能需要更多的指令,但根據(jù)80/20的原則,總的來說還是要比CISC快。
應該說這個結論,在上個世紀90年代中期以前,的確是頗有道理的。但主板倍頻技術的出現(xiàn),讓這個問題有了新的變化。在早期的X86計算機中,CPU和內(nèi)存工作在同樣的頻率下,也就是說CPU和內(nèi)存一樣快。而使用倍頻技術后,CPU頻率和內(nèi)存頻率之間就產(chǎn)生了差距。這種差距到后期,竟然幾乎相差了一個數(shù)量級,這個時候CPI就不再是決定CISC和RISC快慢的決定因素了。CISC由于指令密度高,在某些場合甚至比RISC快也就不足為奇了。
事實上,正如文獻B中所示的,現(xiàn)在商用的CPU已經(jīng)無法再用文獻A中的定義來分類了,因為他們都借鑒了對方的某些優(yōu)點。
1.提高指令密度。ARM按照傳統(tǒng)來說是RISC,但它引入了Thumb指令來提高指令密度,因此它的指令集不再是傳統(tǒng)RISC的定長指令集。
2.減少CPI。Intel的X86 CPU最初只有一個指令解碼器,而現(xiàn)在為了處理最常用的20%的簡單指令,它引入了簡單指令解碼器的概念,再加上指令流水線的引入,它在CPI上的表現(xiàn)與傳統(tǒng)的RISC已經(jīng)沒有什么太大的差別了。
順便說一句,Linux在多核機器上引入了“自旋鎖”的概念。自旋鎖的實現(xiàn),說白了就是一種有條件的死循環(huán),從表面看,死循環(huán)空占CPU,似乎是種很低效的方案,但由于CPU和其他設備之間速度的巨大差異,有時候這種方案反而是最快的方案。道理和上面的RISC vs. CISC是類似的。
總之,每個時代限制系統(tǒng)速度的瓶頸不同,因而完全有可能昨天的結論和今天的結論完全相反。
pin 1
一般的排線為了能夠方便的識別pin 1,通常會在pin 1處標一個小三角,并且pin 1線的顏色也與其他的線不同。
單火線
最近研究智能家居,提到了單火線的概念,現(xiàn)簡要描述如下:
這是一個接入電網(wǎng)的燈泡的原理圖,圖中的兩根線,上面的是火線,下面的是零線。實際生活中的那些沒有開關的插座燈泡就是以這樣的方式接入電網(wǎng)的。
這是普通的開關燈泡的原理圖。
這是單火線家居燈泡的原理圖。從拓撲結構上來說,這個圖和上一個圖的結構是一樣的。之所以畫的時候故意彎曲了一下,是想表明一個事實:開關和燈泡之間有一定的距離。實際上對于一般的家居燈泡來說,零線、火線、開關和燈泡之間的線都是建筑商在建筑施工時,布設在墻體內(nèi)部的。
那么問題就來了。由于開關和燈泡是串聯(lián)的,當我們將傳統(tǒng)的機械開關替換為智能開關的時候,由于開關本身沒有和零線直接相連,因此當燈泡處于關閉狀態(tài)的時候,開關本身也將無電可用。
解決的辦法:
為開關再接一根線。
這就是所謂的零火線開關。但這樣做的問題是,需要重新在墻體內(nèi)走線布線,有比較大的施工量,對于已經(jīng)入住的房屋來說,并不是太現(xiàn)實。這也是阻礙智能家居走進家庭的一個重要的技術問題。
單火線取電
通過加裝電容等儲電元件,可以給開關提供斷電時的能源。但由于開關和燈泡是串聯(lián)的,當燈泡本身的功耗較小時,儲電元件的微小電流不僅會維持開關的工作,亦會點亮燈泡,造成燈泡在關閉狀態(tài)下仍有微弱的光亮,即俗稱的“鬼火”現(xiàn)象。這個在低功率的LED燈上,表現(xiàn)的十分明顯。
ISP與IAP
ISP(In-System Programming)在系統(tǒng)可編程,指電路板上的空白器件可以編程寫入最終用戶代碼,而不需要從電路板上取下器件,已經(jīng)編程的器件也可以用ISP方式擦除或再編程。
IAP(In-Application Programming)指MCU可以在系統(tǒng)中獲取新代碼并對自己重新編程,即可用程序來改變程序。
與ISP、IAP相對應的是早期單片機所使用的存儲器燒寫器,該方式需要從電路板取下存儲芯片,安裝到燒寫器上燒寫之后,再放回原電路板。這種傳統(tǒng)的方式目前已經(jīng)用的非常少了。
上拉電阻和下拉電阻
上拉就是將不確定的信號通過一個電阻鉗位在高電平,電阻同時起限流作用。下拉同理,也是將不確定的信號通過一個電阻鉗位在低電平。
上拉是對器件輸入電流,下拉是輸出電流;強弱只是上拉電阻的阻值不同,沒有什么嚴格區(qū)分;對于非集電極(或漏極)開路輸出型電路(如普通門電路)提供電流和電壓的能力是有限的,上拉電阻的功能主要是為集電極開路輸出型電路輸出電流通道。
BGA & QFP
BGA封裝,就是那種引腳都在芯片背面的封裝。QFP封裝,即四側引腳扁平封裝。同樣面積情況下,顯然占據(jù)一個面的引腳數(shù),要超過僅占據(jù)四個邊的引腳數(shù)。
nor flash & nand flash
flash按照內(nèi)部存儲結構不同,分為兩種:nor flash和nand flash。
NorFLASH使用方便,易于連接,可以在芯片上直接運行代碼,穩(wěn)定性出色,傳輸速率高,在小容量時有很高的性價比,這使其很適合應于嵌入式系統(tǒng)中作為FLASH ROM。
在通信方式上Nor Flash分為兩種類型:CFI Flash和SPI Flash。
NandFLASH強調(diào)更高的性能,更低的成本,更小的體積,更長的使用壽命。這使NandFLASH很擅于存儲純資料或數(shù)據(jù)等,在嵌入式系統(tǒng)中用來支持文件系統(tǒng)。NandFLASH存在壞塊問題。
總結
- 上一篇: 在线激活流程研究, 芯片杂烩, 软件滤波
- 下一篇: cocos2d, Box2D