全文原創,轉載請標明出處算法
若是您發現我寫錯了、不明白我寫的內容或者能提出建設性意見,那麼懇請您在評論區發表高見編程
本文的定位只是讓具有基本電學、數制知識的讀者明白裸機工做的大體流程,並不針對某款特定的芯片,不講編程,全程幼兒園化sass
先講解一些基本的數字電子技術知識,再讓讀者嘗試打草稿"設計"一款單片機,而後延伸到何爲軟件何爲硬件,最終完結撒花服務器
1.芯片架構
電信號是目前最容易處理的信號,咱們能用模擬電路、數字電路來處理電信號併發
電路能被集成在一塊芯片裏成爲集成電路(IC,integrated circuit),模擬電路、數字電路都能被集成dom
單片機內核、電腦處理器內核都是數字電路,因此若是你認爲芯片就是電腦CPU、顯卡、內存條等等,那就錯了,你忽略了廣大的模擬集成電路,還有架起模擬電路和數字電路的橋樑的模數轉換器(ADC)、數模轉換器(DAC)異步
2.晶體管編程語言
模擬電路、數字電路里都有大量的晶體管(transistor)。晶體管是大名鼎鼎的貝爾實驗室的幾位工程師發明的,晶體管是20世紀最偉大的發明之一,它奠基了信息時代的硬件基礎,奠基信息時代的軟件基礎的是香農(Claude Elwood Shannon)的信息論。發明晶體管的幾位工程師都得到了諾貝爾物理學獎,發明集成電路的基爾比(Jack Kilby)也得到了諾貝爾物理學獎編輯器
晶體管在模擬電路里放大信號,在數字電路里當開關
晶體管學起來仍是很是複雜的,學過模擬電子技術的同窗確定會贊同我,這裏就簡短地介紹一下晶體管,不講深奧了:
上面是常見的晶體管的電路符號
晶體管能夠被看做受控電源,從上面的幾種晶體管裏抽出一個,它的各個引腳的名稱以下圖所示
對於上圖這種晶體管,它的Gate的電壓高於Source的電壓VGS能控制Drain到Source的電流IDS,人話版:下圖電路中只有2條電流通路,分別被用橙色、藍色箭頭標出。對於上圖中的這種晶體管,電流沒法從Gate流到Drain、沒法從Source流到Drain,VGS能控制Drain和Source之間的導電通道的"寬度",越"寬"的話則容許流過的最大電流越大
在模擬電路里,"寬度"可能的取值很是多,多得讓你對學習喪失信心
在數字電路里,"寬度"的取值範圍只限於2個值:0和最大
3.邏輯門、電平
下圖電路中電池負極接着地(GND),固然這個"地"不必定是地球表面,GND是用來定義電路中電壓爲0V的點的
高中物理學過"定義無窮遠處電勢爲0V"或"定義大地電勢爲0V",下圖電路也相似地定義電池負極電壓爲0V
若是說某個點的電壓是多少伏,那就是在說那個點的電壓相對於0V點的電壓;
若是說某個元件好比下圖中電阻的電壓,那就是在說這個電阻兩端各自對0V點的電壓的差值
讓上圖電路中的信號源輸出電壓夠小好比0V,那麼"寬度"就能取到0,藍箭頭指示的電流就不存在了,那麼Drain的電壓等於電池的正極電壓3.3V;
讓信號源輸出電壓夠大好比3.3V,那麼"寬度"就能取到最大,藍箭頭指示的電流也能達到最大,那麼這時Drain的電壓就接近電池負極的電壓0V
這樣就實現了經過信號源的電壓來控制藍色箭頭指示的電流通路的通斷,晶體管的做用是否是很像開關呢
這個電路實現了將輸入取反的功能,這樣的數字電路叫非門,上圖的非門存在一些問題好比輸出0V時有電流流過電阻,那麼電阻會消耗電能
之後就用下面這個符號來表示非門,左邊輸入,右邊輸出
在上面的非門的例子中也能夠把0V稱做低電平或者用二進制數0表示,把3.3V稱做高電平或者用二進制數1表示
實際上"不會致使數字電路錯誤工做"的低電平、高電平的電壓值並不固定,而是在必定範圍內,好比上面的非門的低電平範圍多是-0.3V~+0.5V、高電平範圍多是2.8V~3.5V
若是把晶體管換成耐壓值更高的、電池換成5V的,那麼低電平、高電平的範圍也可能變化,可能高電平的範圍變成4.5V~5.2V
低電平是0、高電平是1的數字邏輯稱做正邏輯,不然稱做反邏輯,大多數狀況下選用正邏輯,若是用反邏輯,得特別說明
對於正邏輯,高電平的電壓範圍是這種電平規則的特徵,好比高電平是3.3V的電平規則叫CMOS電平,高電平是5V的電平規則叫TTL電平
若是要實現不一樣電平的互聯,可能須要進行電平轉換,不然可能燒燬晶體管或者晶體管不認前級發來的高電平
相似地,還能用晶體管搭建出與門、或門、異或門等等,這些電路叫邏輯門電路。這裏不必畫出其它邏輯門的電路圖了吧,就算畫了,你也不必定看,總之你知道確實有這些邏輯門就行,你設計不出來不表明那些天才工程師、科學家們設計不出來
與門:能夠多輸入,全部輸入都爲1才輸出1
或門:能夠多輸入,只要有輸入爲1就輸出1
異或門:只能2輸入,2個輸入不一樣則輸出1,不然輸出0
這些簡單的邏輯門電路能構成功能更復雜的電路,好比加法電路:可能有2組輸入、1組輸出,每組輸入多是8bit,輸出可能也是8bit,輸入2個二進制數,自動輸出相加結果
你可能會問若是8bit不夠表示相加結果怎麼辦?怎麼算減法?怎麼計算負數的運算?這些問題並不影響你理解本文後面的部分,你要是有興趣的話,那就稍後去自行搜索這些問題吧
既然是用邏輯門構成的,那麼這個加法電路的輸入、輸出也是0、1,這種狀況下用二進制表示數具有自然的優點
你知道能用邏輯門搭出加法器就行,你是否能搭建出加法器並不影響你認識單片機
相似地,用邏輯門還能設計出數據選擇器、編碼器、譯碼器等等邏輯電路
4.組合邏輯電路、時序邏輯電路
上面提到的數字電路的輸出都只與輸入有關,這樣的數字電路叫組合邏輯電路
還有一類數字電路,它下一時刻的輸出不只與當前時刻的輸入有關,還與當前時刻的輸出有關。舉個例子好比秒錶,它在計時的時候:
秒錶電路須要知道到底有沒有"過了1秒",能夠每隔1秒發一個高脈衝或低脈衝或上升沿或降低沿讓電路知道過了1秒,這個週期爲1秒的信號就是這個時序邏輯電路的時鐘信號
這種下一時刻的輸出與這一時刻的輸入輸出都有關的邏輯電路叫時序邏輯電路
時鐘信號由振盪電路產生,時序邏輯電路的內部構造比組合邏輯電路的更復雜,設計振盪電路也有必定難度。這裏就不打擊你們的閱讀興趣了
如今你具有了必定的知識儲備,那麼來嘗試設計你的單片機。會設計單片機的話,也能大體知道設計電腦處理器的流程
5.最小系統
設計單片機
上面提到的時鐘信號、復位信號、電源,再加上單片機,就能組成單片機的最小系統
能夠這麼直觀地理解最小系統:用你設計的單片機制做產品,不管產品是什麼,時鐘信號、復位信號、電源、單片機是確定會被包含在產品裏的,這4個都具有時產品纔可能正常工做,只要缺乏一個,那麼產品總有個時候會不能正常工做;任何產品都能被看做是在最小系統上繼續搭建而成的
6.指令集
你得讓單片機獲取你下達的指令並執行:這個"指令"是什麼?以什麼形式存在?怎麼向單片機下達"指令"?
你的單片機的輸出是由單片機內部的數字電路處理獲得的,單片機裏能夠有不少具有不一樣功能的數字電路好比加法器、定時器等等,完成一件工做好比計算一個算式1+2×3+2×5確定會用到一些步驟,計算這個算式的步驟確定有前後順序,單片機可能會這麼作:
你得設計一個"聽話"的電路來完成上面的指令,還得設計一些存儲器來暫存中間結果
你向單片機傳達指令確定是用二進制串,由於數字電路只認二進制串,假設你設定0000表示算加法,那麼你但願這個"聽話"的電路:
是否是以爲這個"聽話"的電路難以設計?沒事,你不會設計不表明天才的工程師們、科學家們不會設計,假設你請來一位大神同窗Q,向Ta講述你的要求:
看你剛纔提的要求:收到0000、0001等以後就作某某事,這就是你設計的一套指令集架構(Instruction Set Architecture,簡稱ISA)
7.內核、微架構
你若是請另外一個大神設同窗W也設計一個"聽話"的電路來實現你的指令集,那麼同窗W設計的電路不必定和同窗Q設計的徹底相同,甚至W設計的電路可能效率更高,有些指令執行所需的時鐘週期比Q設計的電路須要的更少
Q和W萌生了獨自創業的想法,他們都認爲用這個電路繼續搭建出完整的單片機還得燒更多錢,不如之後只設計這種電路算了,把設計好的方案賣給其它設計單片機的公司,這樣雙方都能專一於各自的領域,最終產品的性能能夠更優越,雙方也都能節省精力
爲了方便單片機公司,Q和W把他們設計的電路繼續完善,好比集成加法器等等
Q和W完善以後的東西叫內核(Core),就是單片機內核、電腦處理器的內核,他們實現內核的方式叫微架構(Microarchitecture),他們的內核都能實現你設計的指令集,他們給本身設計的內核設定獨一無二的名字
現實世界中大名鼎鼎的ARM公司就像大神Q、W,ARM公司專一於設計內核,把內核設計方案賣給大名鼎鼎的ST、ADI、TI、NXP、華爲海思、高通、蘋果等等芯片設計公司
ARM公司如今設計的內核的名字都是Cortex ??,第1個問號是"A"、"R"或"M",第2個問號是十進制數,多是1位也多是2位十進制數,之後可能會是更長的十進制數。例如上圖中的Cortex A5三、Cortex M3
高通買來Cortex A53的受權,開發出驍龍625;ST買來Cortex M3的受權,開發出STM32F1系列
驍龍625常被稱爲片上系統(System on Chip,簡稱SoC)或者微處理器(Micro Processor),常被用於手機等等;STM32F1系列常被成爲單片機(Siingle Chip),被普遍應用於家電、玩具等等
因爲A53和M3的性能、功耗、成本的差別,人們對它們構成的芯片的稱呼不一樣,芯片的用途也不一樣
發現上圖中的Cortex A5三、M3裏有不少東西是你不認識的?不要緊,你總會認識的
也有公司從內核到芯片全都自行設計,好比大名鼎鼎的Intel、AMD、Nvidia
回來繼續設計你的單片機:
8.存儲器
你使用內核時,要是得全程手動地
這不得煩死你,這樣算算式比你手算還慢
因而你想把指令存起來,讓時鐘信號能本身不斷地跳變,你只需把指令編好存起來就行
你須要開發存儲器,你再找來一位大神E,向Ta提要求:
有1個高電平使能引腳(使能(enable),能夠理解爲使……能……,好比高電平使能,那麼使能腳爲高電平時則存儲器能工做,不然不工做,高電平就叫使能腳的有效電平)
使能腳電平無效時存儲器的數據線呈高阻態(高阻態也稱Hi-Z,若是你認識"高"的英文單詞、知道電學用Z表示阻抗,就不難理解Hi-Z就是高阻態。稍後讓你直觀理解高阻態)
能夠這麼理解高阻態:
上圖電路中若是電阻阻值越大,那麼測試點的電壓就越接近信號源的輸出電壓,當阻值無窮大好比開路時,測試點的電壓就是信號源的輸出電壓
存儲器不工做時數據線呈高阻態的好處:
假設一個電路中存儲器A、B都有8根數據線D0~D7,把它們各自的Dx(x是0~7的整數)接在一塊兒,當只有一塊存儲器假設是存儲器A工做時,那麼Dx相連的點的電壓就是存儲器A的數據線的輸出電壓
至於爲何要這麼鏈接存儲器A、B,這是大神Q、W給你建議的,他們把內核和存儲器聯調成功後,你就知道爲何要這麼接存儲器A、B了
大神E通過不斷研究發現(現實世界中也是如此):
掉電後數據會丟失的存儲器的讀寫速度很是快並且造價高昂,能夠每次只讀寫1個存儲單元,想讀寫哪一個單元就讀寫哪一個單元。這樣的存儲器被命名爲隨機訪問存儲器(Random Access Memory,簡稱RAM)。大神E的初代產品叫靜態隨機訪問存儲器(SRAM),是個組合邏輯電路;後來大神E又研發出容量更大、速度更快的SDRAM、DDR等,都是時序邏輯電路
掉電後數據不丟失的存儲器有的只能寫一次,有個能夠用紫外線照好久後擦掉內容後再寫,有的能夠用電飛快地擦除後再寫;
大神E對掉電後不丟失數據、能夠用電擦除內容的存儲器的研究成果以下:
命名 | 特性 |
EEPROM (Electrical Erasable Programable Read Only Memory) |
可讀寫任一存儲單元 集成度很低 速度慢 |
NOR Flash | 可只讀任一存儲單元 存儲區分塊,好比每4096個存儲單元爲一個塊,各塊內部連續、外部相鄰 若是要寫入的存儲單元的內容是0xFF就能直接寫,不然要把存儲單元所在的塊的全部存儲單元寫爲0xFF再繼續操做 集成度高些 成本低些 |
NAND Flash | 不能讀寫任一存儲單元,每次得至少讀或寫必定數量個存儲單元 集成度很是高 成本很是低 |
你可能會問:EEPROM是可寫的,爲何叫ROM?等下你會分析該如何把掉電不丟失數據的存儲器用在你的單片機裏,分析的時候你就知道了
這麼一看,NOR Flash、NAND Flash也屬於EEPROM的行列,可是如今EEPROM通常指上表中能隨意讀寫任一存儲單元的低集成度的存儲器
你確定須要用到掉電不丟失內容的存儲器,但那些只能寫1次、須要紫外線擦除很久的確定不用
若是採用EEPROM,單片機可能沒法小巧玲瓏
若是採用NAND Flash來存儲你的指令、數據,那麼會增長內核的複雜度、嚴重浪費這樣的存儲器的存儲空間、嚴重拉低內核的執行效率
那就用NOR Flash吧,能作到讀任一存儲單元,雖然作不到寫任一存儲單元,但你可讓單片機在運行時儘可能只讀取NOR Flash的內容而不寫入(如今知道爲何叫ROM了吧),讓須要被不斷讀寫的數據躺在RAM裏。SRAM控制簡單,就用它了
把這些存儲器塞到單片機裏面,這樣才"單片"嘛
9.總線
如今Q、W修改他們設計的內核,讓內核能自動地取你存儲的指令和數據、執行完後就繼續取下一條指令及其數據
Q、W對內核作出以下修改:
假設你選用的NOR Flash、SRAM的數據線都有8根、地址線都有7根,還各有1個名爲EN的使能引腳(假設高電平有效),像下圖這樣鏈接內核和存儲器
若是用十六進制數表示內核的地址總線上的值,高位在前低位在後,那麼顯然內核訪問地址0000 0000B~0111 1111B就能訪問到SRAM裏的內容、訪問地址1000 0000B~1111 1111B就能訪問到NOR Flash裏的內容
這樣作的好處顯而易見:內核的8條數據線最多能訪問28=256個不一樣的地址,上圖的鏈接方式把內核的地址總線的性能榨乾了
如今你知道爲何要讓存儲器在使能電平無效時讓數據線呈高阻態了吧
Q、W修改復位功能,讓內核在單片機掉電再上電後從地址0x80開始取指令、取數據、執行、取指令、取數據、執行……
能夠這麼實現:
你之後把編寫好的程序從NOR Flash的首地址開始存儲,內核就能按照你的意願工做了
前面列舉算加法的步驟時用了幾個存儲器來暫存加法的計算結果,這裏又用幾個存儲器來指定內核執行的指令的地址,這些存儲器起到了反映、控制電路的運行狀態的做用。把這樣的存儲器稱爲寄存器
10.外設
若是想讓單片機能具有更多功能呢?那就塞入更多電路到單片機裏
這些被塞入的電路模塊叫外設,因爲它們都在單片機內部、在內核外部,因此也叫片內核外外設
有的外設好比LED,它並不在單片機內部,因此叫片外外設或者板載外設
有的外設在內核裏,好比加速內核執行指令用的一些外設,這樣的外設叫核內外設
11.寄存器
單片機內核怎麼控制衆多的外設呢?給它們每一個分配一個內核?這樣太複雜了,外設須要實現的功能通常很單一,那就給外設們分配一些寄存器吧
至此你再次知道了那個很是重要的思想:寄存器能反映、控制單片機的運行狀態
這裏的片內外設寄存器掛在內核的地址總線上,可是寄存器並不老是須要掛在地址總線上,好比咱們用的電腦的處理器Intel、AMD公司的CPU,它的內核的不少寄存器就沒掛在內核的地址總線上,它的一些指令能讀寫這樣的寄存器
拿大名鼎鼎的STM32單片機來舉例:
取自STM32F103x八、F103xB的數據手冊Rev. 17第34頁的內存映射圖(memory map)
STM32的地址線有32根,這32根地址線能訪問到232個不一樣的地址,上圖指出了每一個地址範圍對應哪一個外設的寄存器、哪一個存儲器的內容,好比0x20000000對應單片機內部的NOR Flash的首地址,0x40012400~0x40012800對應ADC1的寄存器
232個地址並不是每一個都會被用到,那些沒被用到的地址被標記爲Reserved(保留)
若是要了解某個外設的寄存器的每一bit的意義、名稱,那就去查參考手冊上描述那個外設的寄存器的每一bit的功能的部分
取自STM32F10一、二、三、五、7 參考手冊Rev. 20第237頁
能夠這麼理解Address offset:
編寫程序讀寫外設的寄存器,就能控制外設
12.中斷
假設ADC等一衆外設工做得遠比內核慢,那麼內核想要實時瞭解各外設的工做進度和結果,該怎麼操做呢?不斷地讀外設們的寄存器?這樣確實能夠,可是太浪費時間了,內核寶貴的性能都被浪費在不斷查詢外設們的寄存器
能不能讓外設主動告訴內核並讓內核迅速處理?固然能夠,這種技術叫中斷
能夠這麼實現:
Q和W也以爲中斷技術很是重要,因而把中斷控制器集成到了他們設計的內核中
13.燒錄/下載
你能夠設計一個專門用來鏈接電腦和單片機的NOR Flash的外設放到單片機裏,好比不少同窗學習單片機知識用的第1塊單片機STC89C51就在單片機裏集成了名爲通用異步收發器(Universal Asynchronous Receiver Transmitter,簡稱UART)的外設,它負責單片機與單片機之間、單片機與電腦之間以符合UART的規則的方式通訊。STC公司開發了運行在Windows的專門用來向STC單片機寫入程序的軟件STC-ISP,STC單片機的UART外設收到某串二進制後就產生一箇中斷告訴內核把稍後UART接到的二進制串寫入NOR Flash
這個過程叫燒錄或者下載
在好久之前,給單片機的存儲器寫入程序須要高壓,一不當心就燒燬了單片機,因此有了"燒錄"這個名稱
單片機從電腦獲取指令,像不像你經過因特網從服務器下載遊戲?因此給單片機的存儲器寫入程序也能夠叫"下載"
14.彙編語言
有沒有以爲老是用二進制串給單片機下達指令很是麻煩?不如用助記符代替這些二進制指令吧,因而彙編語言產生了
內核確定不認識你創造的助記符,得用軟件把助記符轉成內核能直接執行的二進制,實現這個功能的軟件叫彙編器(assembler)
彙編語言有個很大的缺陷:過於依賴內核的工做流程、存儲器的佈局
你用匯編語言寫程序的話,得先打草稿來劃分存儲空間,好比地址0x12~0x21用來暫存計算的中間結果,地址0x80~0x8F用來存實現某個功能的指令,你但願掉電後依然能存儲用戶設定的一些變量,那麼得在Flash裏找一塊空間用來存這些變量……
把用匯編語言寫的程序移植到其它內核、其它存儲器佈局上但是個天大的工程,不如創造一種接近人類的語言、不依賴於內核和存儲器的編程語言吧,C語言就是這種語言的表明之一
15.C語言
內核更不可能認識C語言,因此須要用軟件把C語言代碼轉成內核能直接執行的二進制,須要多個軟件來實現:
編譯器:把C語言代碼轉成單片機能理解的二進制,還沒完:都說了C語言能夠不依賴存儲器佈局、你能夠在C語言代碼裏不寫任何一個存儲器地址,編譯器獲得的結果並不包含任何一個存儲器地址,因此單片機確定不能執行編譯器的產物
鏈接器:
若是你在Windows操做系統上用Visual Studio、Code::Blocks、Dev C++等IDE寫C語言程序,那麼鏈接器得鏈接處能讓Windows操做系統調用的可執行(executable,Windows下這種文件的擴展名是.exe)文件,這個步驟與鏈接處單片機能直接運行的一份二進制有所不一樣,你去了解一下Windows操做系統執行EXE文件的步驟就能大體猜出到底哪裏"有所不一樣"了
有了C語言,開發、調試單片機程序就輕鬆多了
16.調試
假設寫了個很是長的程序,雖然單片機能正常執行,可是執行的最終結果倒是錯的。編程人員特別想讓單片機慢點執行,以便觀察到單片機執行完關鍵步驟後的結果是否正確,這些"結果"可能在寄存器,可能在SRAM,也多是某個板載外設的工做狀態
上述的過程叫調試(debug)
Q和W也認爲調試功能很是重要,因而把調試系統集成到他們設計的內核裏
再拿大名鼎鼎的STM32單片機來舉例:
有一種叫硬件調試器的電子系統,支持STM32的硬件調試器有不少種,好比ST-Link、J-LInk、CMSIS DAP-Link等等
硬件調試器能對接單片機和電腦,經過硬件調試器,能下載程序到單片機,電腦也能控制單片機控制單片機
上圖是用Keil μVision MDK-ARM(這是個集成開發環境Integrated Development Environment,簡稱IDE,包含代碼編輯器、調試器、編譯器、鏈接器等等)+ST-Link硬件調試STM32F407ZG的界面,上半部分是反彙編(Disassembly),下半部分是源代碼
Keil μVision MDK-ARM的調試器還有不少很方便的工具,好比能實時查看某個變量的值得Watch、能查看正在執行的指令是怎麼被一路調用來的調用棧Call Stack等等
如今你的單片機已經很完善了,成功面世
可是有客戶在用你的單片機設計產品時遇到了一些問題:
17.軟件實現、硬件實現、通用計算、ASIC、超頻
那些讓單片機工做得很慢的代碼可能頻繁用到一系列操做,可能會讓單片機執行不少條指令才能完成這樣的1個操做,好比沒有內置乘法器電路的單片機算整數的乘法得用連加
連加就是對乘法的軟件實現,用乘法器電路算乘法就是硬件實現
再好比某個板載外設須要以某種規定與單片機通訊,編程人員能夠分析那個板載外設的通訊規則以後,編寫程序讓單片機的某些引腳在適當的時刻產生適當的電平來與板載外設進行通訊,編程人員得很是仔細地分析這種通訊規則,一個細節都不能出錯
若是這種通訊規則很是經常使用,那麼單片機廠商能夠用電路來實現這種通訊規則。把這個電路作成一個片內外設,單片機內核給這個片內外設的控制寄存器寫入控制字,以後內核只需把要發送的內容傳給這個外設,這個外設就能在不須要內核干預的狀況下正確地將信息發送出去
事實上有不少通訊規則已經被硬件化了,好比SPI、SAI、I2C、I2S、USART、USB、HDMI、PCIe、SATA等等
用硬件電路實現通訊協議的優點有:
用軟件實現的優點固然是金錢成本更低
可是硬件實現並不是老是優於軟件實現,例如機械按鍵的延時消抖,學過單片機編程的入門例程的同窗有感觸,沒學過的話之後就去學吧
調試也能不用到硬件調試器,而純軟件實現,這樣的調試叫模擬器調試
若是你對電腦有點研究,並且還必需要玩高畫質、高幀率的遊戲,那麼你買打遊戲用的電腦時確定會選帶獨立顯卡的
打遊戲時,獨立顯卡專一於計算遊戲裏炫酷的畫面,CPU專一於其它事情
舉個例子:
在這個例子中,CPU拼死也幹很差獨立顯卡輕輕鬆鬆能幹好的事
獨立顯卡設計者畫大力氣用硬件電路實現計算顯示畫面的算法,可能獨立顯卡一條指令能作好的事CPU須要成千上萬條指令才能作好
在上面的例子中,有4個核心的CPU就像是4個博士畢業生,有640個(真的能夠有這麼多)核心的獨立顯卡就像640個小學生
電腦CPU的定位是作通用計算,經過支持複雜的指令集,讓編程人員編寫複雜的程序能實現複雜的功能
獨立顯卡是計算顯示畫面(其實不限於計算顯示畫面)的專用集成電路(Application Specific Integrated Circuit,簡稱ASIC),經過硬件電路實現了能夠很是高效地實現某些功能,而在其它功能的實現上並不必定強於CPU
剛纔的例子也能說明有的工做經過並行執行能極大地提高效率,好比算10之內的加減法
但有的工做卻不能,假設你和你的一個同窗都喜歡玩第一人稱射擊遊戲,但大家的技術都不行,因而大家合做:一我的控制鼠標,一我的控制鍵盤,大家"合體"的效果可能並沒多少提高甚至更差。在這個例子中提高玩第一人稱射擊遊戲水平的方法就一我的控制一臺電腦不斷練習槍法、走位、意識、隊友配合、技能Combo等等,類比到單片機和電腦處理器就是提高執行速度,最多見的方法之一就是超頻
內核是被時鐘信號指揮的,若是時鐘信號跳變得更快,那麼內核就會運行得更快。內核收到的時鐘信號的頻率叫內核的主頻,把主頻提高到高於廠家建議的最高主頻即超頻,可是不能無限制提超頻,超頻會讓內核運行得更不穩定甚至燒燬內核
如今的電腦CPU已經很智能了,好比Intel的酷睿CPU能睿頻,即任務繁重時提高主頻,任務少時下降主頻來下降功耗
18.庫函數
經過寫單片機衆多的寄存器來設置片內外設確實容易出錯還費時費力,能夠把配置寄存器這種繁瑣的工做用函數來實現
例如ST公司爲STM32系列單片機編寫了豐富的庫函數,用戶能夠用C語言調用庫函數來配置STM32的外設寄存器
庫函數的優點就是優秀的C語言代碼的優點:能夠用英語把代碼讀出來
劣勢就是執行效率更低,你試試把用庫函數初始化單片機的C代碼反彙編就知道了:若是寫寄存器只須要幾行彙編指令,那麼用庫函數,得先用好多好多個RAM存儲單元來暫存外設的某個功能的標誌位,最終再把這些標誌位作運算後賦值給寄存器
STM32的性能足夠,因此代碼量不大時庫函數並無顯著下降單片機的運行效率
19.操做系統——存儲管理、併發……
剛纔說過,用匯編語言寫代碼須要打草稿劃分存儲空間,用C語言寫直接運行在單片機內核上的代碼雖不用打剛纔的草稿,但鏈接器須要打這個草稿,這個草稿的存在使得最終獲得的二進制代碼不必定能正常運行在存儲器地址分佈與你的單片機的不一樣的單片機上
剛纔還說過,內核的工做就是不斷地順序地取指令、取數據、執行,還能響應中斷,若是有多件事須要單片機同時作,那麼單片機只得不斷地交替作這些事情,致使有些很閒的事浪費單片機的大量資源,而有些很忙的事沒法被單片機及時響應
操做系統就能解決上面的2個問題
操做系統能動態地管理存儲器,能合理地分配內核資源到不一樣任務,對操做系統的詳細描述已超出本文討論的範圍,你知道操做系統的優點就行
完結撒花,作個重點總結: