體系編程、SOC編程那些事兒

轉:https://blog.csdn.net/yueqian_scut/article/details/49968897android

筆者將從芯片IC的系統設計的角度去詮釋如何掌握體系編程和SOC編程。筆者有超過10年的嵌入式研發經驗,做爲架構師屢次主導過基於ARM/MIPS/51核的多媒體SOC研發併成功量產案例,在高端處理器體系編程和嵌入式Linux方面有豐富的教學經驗,但願本系列文章能給嵌入式學習者和從業者有較深入的指引。編程

1、體系編程的邊界和範疇緩存

嵌入式開發人員每每從最簡單的51單片機編程開始,而後慢慢會接觸到PIC、AVR、STM32等系列或者型號控制器,還會可能轉向三星S5PV2十、Exynos4412等高端處理器編程。架構

開發人員通常的開發過程都是理解完該型號控制器或者處理器對應的指令集和datasheet,而後經過簡單的例程開始編程,而最廣泛的模塊是GPIO、中斷和定時器timer。在接觸到多種類型的處理器編程以後,咱們可能會有概括式的疑問:性能

在include一個表明該型號IC的register map的頭文件後,某些系列芯片的控制編程多是徹底同樣的,而不一樣系列芯片的控制編程也是相似,惟一的不一樣可能在於寄存器命名的不一樣。這是爲何?學習

要回答這些問題,咱們必需要弄懂體系編程的範疇,明確體系編程的邊界。要深入地理解體系編程,咱們須要從芯片的系統設計的角度去理解芯片的研發構成,能夠參考筆者以前撰寫過的《集成電路設計和分工》。測試

其中有一點很是重要,就是咱們要理解CPU核心和SOC的關係。這個世界上有能力研發SOC(System on chip片上系統)的公司不少不少,大到大名鼎鼎的蘋果和三星公司,小到深圳那些籍籍無名但又很賺錢的芯片設計公司都是屬於這個行列。而CPU核呢,放眼世界,能設計CPU知識產權核的就那麼幾家,如Intel的X86,ARM公司的ARM核,MIPS公司的MIPS核,51內核也算一個。這裏要說明一點,中國沒有,國家雖然重點扶持集成電路,但高層也知道這個砸重金也沒用,實實在在的先把集成電路封裝、工藝等技術發展起來再說。如今的android智能機都是基於ARM核的,想知道ARM之父是誰嗎?前不久大師steve furber在廣東工業大學作了講座:操作系統

 

SOC都是根據市場需求和功能定位,在某個類型的CPU核基礎上集成各類通用的外圍模塊控制器,如前面說的GPIO、INT和TIMER,和一些專用的模塊控制器,如TI公司的藍牙單芯片CC2541集成的藍牙基帶和射頻控制器。SOC和CPU核的關係以下圖:.net

 

體系編程明顯是針對體系結構的編程,而體系的載體就是CPU。所以,89C5一、CC2541等都是51體系編程,而PIC3二、ATJ213X都是基於MIPS體系編程,而S5PV210和S3C2440都是ARM體系編程。對同一家CPU核設計公司,它沒有理由將本身的CPU核設計成風格迥異,同一家公司不一樣的CPU處理器系列應該遵循同一個體系結構。那麼,體系結構的範疇是什麼?是上圖中紅色的部分,其包括CPU核的設計和總線的時序和控制標準。而CPU核又細分CU(控制單元)和PU(運算單元),CU再分取指、譯碼、訪問寄存器、回寫存儲單元等流水線操做,高級CPU通常還會集成協處理。所以體系架構編程通常包括如下內容:設計

1)指令集(尋址、運算)、彙編僞指令

2)流水線、指令預取和跳轉規則。在流水線的工做模式下,指令預取當前執行指令的下面N條指令,所以PC和執行地址並不一致,所以假如發生中斷、異常等狀況下的返回地址要如何肯定。

3)協處理(MMU虛擬內存、cache緩存)

4)寄存器使用和參數傳遞規範(ABI)。其要解決寄存器級如何實現C語言的參數傳遞。請參考筆者以前的博文《C/彙編混合編程接口--MIPS ABI》

5)異常中斷處理(硬件中斷、通常異常、指令陷入中斷等),上圖中的INT管理全部的硬件中斷,如串口、定時器、外部等中斷,並將全部的中斷引腳進行或以後送入CPU的中斷信號。所以,對於CPU來講,當發生中斷時,它並不知道是哪一個模塊發生了中斷,只有INT模塊才知道。

6)調試規範

7)總線規範。對於編程人員來講,並不須要太關心總線規範。但它是SOC芯片設計的重要規範。它規定了總線的時序和仲裁的規範以及存儲工做模式(馮諾依曼仍是哈佛結構)。

對於一個CPU核設計公司來講,它會給SOC芯片設計公司提供兩樣東西,一是體系設計相關規範,如ARMV7指令集,描述了每一條指令執行的僞代碼過程(這個僞代碼針對的是硬件語言,如HDL);另外一樣東西是特定系列CPU的設計規範,以及在該規範下實現的CPU IP核(知識產權核),爲RTL寄存器級電路。

那麼,對於同一個體系下不一樣的系列,他們的差別在哪裏?

例如,ARM公司如今的發展方向是Cortex A系列主要面向高端消費類電子,如手機平板,Cortex R主要面向軍工、航空等實時要求高的場合,Cortex M系列則是搶佔低端控制器市場,如STM32,STM8等。三者的體系都是ARM體系結構,但三者的工藝、功耗、性能並不同,並且,CPU核集成的東西是不同的,例如M系列並無集成cache,至關A系列,M系列的MMU也是一個簡化版。

體系編程是嵌入式架構師和操做系統開發人員須要精通的,對於通常的開發人員比較少接觸到。以上的分析都是基於理論層面的分析。而SOC編程則是面向廣大的普通開發者,將會從系統設計的角度指導你們如何進行SOC編程。

2、SOC編程的範疇和定義

SOC編程是針對片上集成模塊進行寄存器控制編程。在開發實踐中,咱們每每把SOC編程和體系編程統稱爲體系編程了。不要緊,只要咱們理解清楚他們之間的關係就能夠了。

那麼SOC編程的範疇是什麼?

1)   通用控制模塊,如CLOCK、GPIO、INT、TIMER、UART等。

2)   專用控制模塊,如LCD、藍牙、編解碼等。

有些模塊不須要經過引腳鏈接外圍設備就能夠完成功能,如TIMER,大部分模塊須要經過引腳鏈接外圍設備來完成功能。所以芯片片上集成的是模塊的控制部分,例如LCD控制器,該控制電路實現LCD驅動器(外圍設備)所須要的數據傳輸時序、行信號、列信號和設置接口等。換一個角度說,若是沒有LCD控制器,咱們也同樣可以經過GPIO來模擬出LCD驅動器的時序,可是這樣作,對於普通的開發者來講太複雜,對CPU來講也是一個沉重的負擔。因此係統設計人員會針對LCD驅動器來實現專有的控制電路。

那麼對於LCD控制器來講,咱們SOC編程來作什麼呢?至少,咱們須要給LCD控制器一個標識,讓它啓動或者關閉,如何給出這個信號呢?LCD控制器電路無非是一堆的時序電路和邏輯組合電路,啓動和關閉能夠用一個信號輸入來表示,而該信號在CPU看來能夠映射成一個寄存器的其中一個bit。所以,SOC編程便是針對寄存器編程。對於LCD控制編程,固然不僅一個寄存器這麼簡單,由於對於一個SOC廠商來講,它但願能兼容市面越多的LCD驅動器,兼容不一樣的分辨率和圖像深度,所以確定會有不一樣的寄存器來進行設置。

從教學的角度來總結,體系編程和SOC編程分爲五個層次:

1)體系指令集,如ARM指令集

2)特定系列的CPU規範,如基於ARM體系的CortexA8核

3)SOC級,在CPU核的bus總線基礎上集成clock、timer、interrupt、GPIO等控制器,如三星的S5PV210和TI的OMAP3430都是基於Cortex A8核。

4)板級電路,如開發板、手機主板電路,其電路圖將明確SOC的引腳和外圍設備的鏈接關係。如GPIO A的第一個引腳接LED0,那要控制LED0就須要對GPIOA0進行控制編程。

5)外圍設備規格,表示板級電路圖上全部外圍設備的規格,如具體LCD SPEC(尺寸、分辨率、延時參數等)。

筆者給SOC編程的過程定義是:基於1)和2)的指令集和CPU總線控制機制,根據具體外圍設備5)的特性參數和4)具體的電路鏈接關係,對3)SOC對應控制模塊的寄存器進行編程,達到控制、使用的目的。

3、SOC設計和編程

      理解SOC系統設計可以極大地幫助編程,每款SOC的控制例程都是由SOC系統設計人員給出,由於他們也須要經過編程來對SOC芯片進行功能測試和驗證。

      另外,咱們須要明白的一個觀點是,對於不一樣的體系來講,一樣的模塊的設計思路是基本一致的,或者能夠說,從編程的角度來講,片上集成的模塊的設計控制過程無關於體系結構(二者有關更多的是在總線控制方面,而這個跟編程人員來講關係不大)。所以基於ARM體系的LCD控制器和基於MIPS體系的LCD控制器,其設計思路都是一致的,不一樣系統的GPIO控制也是一致的。儘管底層的寄存器電路可能不同,但對於上層編程人員看來,二者是一致的,不一樣的可能只是寄存器名稱。例如51單片機和arm處理器的GPIO都是輸入寄存器、輸出寄存器、方向寄存器、上下拉寄存器等等。

      下面就以CLOCK和GPIO爲例說明SOC編程,儘可能提取通用的設計和控制過程。

1.最小系統

最小系統除了CPU和RAM以後,還有一個重要的組件就是晶振。SOC或者CPU說到底都是一堆邏輯組合電路和時序電路,時序電路須要時鐘才能正常工做,而晶振就是提供時鐘的,其在上電後不斷地產生時鐘。

2.   CLOCK

      通常的低端單片機並無時鐘控制模塊,其直接利用晶振(如12M或者24M)工做,即CPU的工做頻率就是12M或者24MHz。可是做爲一個高級處理器來講,其支持的主頻達到1G或者更高。而市場上並無1G的晶振,所以SOC內部必然要實現調頻,PLL鎖相環倍頻技術被普遍應用在處理器的CLOCK模塊中,其是將晶振的頻率進行倍頻提高。CLOCK模塊除了實現倍頻的控制外,還須要考慮這樣的需求:

1)SOC集成的模塊不少,各類模塊的工做頻率並不盡相同,或者說是在不一樣的層級,例如CPU和GPU、RAM的工做頻率在G級,LCD的工做頻率則在100M左右,視頻編解碼的工做頻率百M級別,而像GPIO、串口這些模塊的工做頻率能夠在10M級別。所以CLOCK還須要進行分頻。因此CLOCK模塊通常的處理方法是將模塊進行分類,並進行一級分頻。例如,S5PV210的CLOCK會將頻率分爲三個範圍,M域供給CPU、中斷異常等,D域供給LCD、JPEG、HDMI等,P域供給GPIO、UART等外圍設備。每一個域都給定一個頻率(能夠經過控制器調節)。

2)對於在同一個域內的模塊,其工做頻率不盡相同,所以容許其內部進行二級分頻。

所以,對於一個高級處理器集成的模塊編程來講,設置好其CLOCK源頻率的相關寄存器是第一步。通常一級分頻由操做系統開發人員設定,二級分頻設置由各模塊的開發人員負責。

3.引腳複用

      芯片封裝是芯片成本的重要組成部分,而封裝涉及到引腳複用,並且芯片封裝也涉及到最終產品的BOM成本,所以在系統設計時的引腳複用是一項很是關鍵的技術,能夠說SOC集成電路公司的絕密技術。儘量高效地進行引腳複用很是關鍵。

      對於編程人員說,咱們要作什麼呢?那就是記得每一個引腳均可能是功能複用引腳,在使用這個引腳以前,必須設置該引腳的功能。引腳通常默認是GPIO功能,若是咱們要使用該引腳進行串口或者LCD等控制線功能,就必須對該引腳對應的功能寄存器進行設置。這是SOC編程的第二步。

      CLOCK和引腳功能設置對全部模塊都是適用的。

4.GPIO

      這裏咱們要談通用的模塊GPIO。對於GPIO編程來講,咱們應該很是熟悉了,那就是它必定帶有輸入數據寄存器、輸出數據寄存器、輸入輸出高阻態設置寄存器、上下拉設置寄存器。通常的過程是:

1)設置上下拉寄存器

2)設置引腳的方向

3)經過輸入數據寄存器讀入數據或者寫數據到輸出數據寄存器。

記得功能引腳設置也是須要的。有些高級SOC可能還會有驅動能力等級設置寄存器,控制引腳的驅動強度。

 

5.INT

      請參考筆者的博文《軟件和硬件都是對生活的高度抽象---論中斷控制(ARM體系編程)》。

      筆者以前的教學以基於cortex A8的S5PV210爲例,有時間再整理該SOC的各個模塊的編程方法。

 

---------------------

本文來自 吳躍前 的CSDN 博客 ,全文地址請點擊:https://blog.csdn.net/yueqian_scut/article/details/49968897?utm_source=copy

相關文章
相關標籤/搜索