筆者將從芯片IC的系統(tǒng)設(shè)計(jì)的角度去詮釋如何掌握體系編程和SOC編程。筆者有超過(guò)10年的嵌入式研發(fā)經(jīng)驗(yàn),作為架構(gòu)師多次主導(dǎo)過(guò)基于ARM/MIPS/51核的多媒體SOC研發(fā)并成功量產(chǎn)案例,希望本系列文章能給嵌入式學(xué)習(xí)者和從業(yè)者有較深刻的指引。
一、體系編程的邊界和范疇
嵌入式開(kāi)發(fā)人員往往從最簡(jiǎn)單的51單片機(jī)編程開(kāi)始,然后慢慢會(huì)接觸到PIC、AVR、STM32等系列或者型號(hào)控制器,還會(huì)可能轉(zhuǎn)向三星S5PV210、Exynos4412等高端處理器編程。
開(kāi)發(fā)人員一般的開(kāi)發(fā)過(guò)程都是理解完該型號(hào)控制器或者處理器對(duì)應(yīng)的指令集和datasheet,然后通過(guò)簡(jiǎn)單的例程開(kāi)始編程,而最普遍的模塊是GPIO、中斷和定時(shí)器timer。在接觸到多種類型的處理器編程之后,我們可能會(huì)有歸納式的疑問(wèn):
在include一個(gè)代表該型號(hào)IC的register map的頭文件后,某些系列芯片的控制編程可能是完全一樣的,而不同系列芯片的控制編程也是類似,唯一的不同可能在于寄存器命名的不同。這是為什么?
要回答這些問(wèn)題,我們必須要弄懂體系編程的范疇,明確體系編程的邊界。要深刻地理解體系編程,我們需要從芯片的系統(tǒng)設(shè)計(jì)的角度去理解芯片的研發(fā)構(gòu)成,可以參考筆者之前撰寫過(guò)的《集成電路設(shè)計(jì)和分工》。
其中有一點(diǎn)非常重要,就是我們要理解CPU核心和SOC的關(guān)系。這個(gè)世界上有能力研發(fā)SOC(System on chip片上系統(tǒng))的公司很多很多,大到大名鼎鼎的蘋果和三星公司,小到深圳那些籍籍無(wú)名但又很賺錢的芯片設(shè)計(jì)公司都是屬于這個(gè)行列。而CPU核呢,放眼世界,能設(shè)計(jì)CPU知識(shí)產(chǎn)權(quán)核的就那么幾家,如Intel的X86,ARM公司的ARM核,MIPS公司的MIPS核,51內(nèi)核也算一個(gè)。這里要說(shuō)明一點(diǎn),中國(guó)沒(méi)有,國(guó)家雖然重點(diǎn)扶持集成電路,但高層也知道這個(gè)砸重金也沒(méi)用,實(shí)實(shí)在在的先把集成電路封裝、工藝等技術(shù)發(fā)展起來(lái)再說(shuō)?,F(xiàn)在的android智能機(jī)都是基于ARM核的,想知道ARM之父是誰(shuí)嗎?前不久大師steve furber在廣東工業(yè)大學(xué)做了講座:
SOC都是根據(jù)市場(chǎng)需求和功能定位,在某個(gè)類型的CPU核基礎(chǔ)上集成各種通用的外圍模塊控制器,如前面說(shuō)的GPIO、INT和TIMER,和一些專用的模塊控制器,如TI公司的藍(lán)牙單芯片CC2541集成的藍(lán)牙基帶和射頻控制器。SOC和CPU核的關(guān)系如下圖:
體系編程明顯是針對(duì)體系結(jié)構(gòu)的編程,而體系的載體就是CPU。因此,89C51、CC2541等都是51體系編程,而PIC32、ATJ213X都是基于MIPS體系編程,而S5PV210和S3C2440都是ARM體系編程。對(duì)同一家CPU核設(shè)計(jì)公司,它沒(méi)有理由將自己的CPU核設(shè)計(jì)成風(fēng)格迥異,同一家公司不同的CPU處理器系列應(yīng)該遵循同一個(gè)體系結(jié)構(gòu)。那么,體系結(jié)構(gòu)的范疇是什么?是上圖中紅色的部分,其包括CPU核的設(shè)計(jì)和總線的時(shí)序和控制標(biāo)準(zhǔn)。而CPU核又細(xì)分CU(控制單元)和PU(運(yùn)算單元),CU再分取指、譯碼、訪問(wèn)寄存器、回寫存儲(chǔ)單元等流水線操作,高級(jí)CPU一般還會(huì)集成協(xié)處理。因此體系架構(gòu)編程一般包括以下內(nèi)容:
1)指令集(尋址、運(yùn)算)、匯編偽指令
2)流水線、指令預(yù)取和跳轉(zhuǎn)規(guī)則。在流水線的工作模式下,指令預(yù)取當(dāng)前執(zhí)行指令的下面N條指令,因此PC和執(zhí)行地址并不一致,因此假如發(fā)生中斷、異常等情況下的返回地址要如何確定。
3)協(xié)處理(MMU虛擬內(nèi)存、cache緩存)
4)寄存器使用和參數(shù)傳遞規(guī)范(ABI)。其要解決寄存器級(jí)如何實(shí)現(xiàn)C語(yǔ)言的參數(shù)傳遞。請(qǐng)參考筆者之前的博文《C/匯編混合編程接口--MIPS ABI》
5)異常中斷處理(硬件中斷、一般異常、指令陷入中斷等),上圖中的INT管理所有的硬件中斷,如串口、定時(shí)器、外部等中斷,并將所有的中斷引腳進(jìn)行或之后送入CPU的中斷信號(hào)。因此,對(duì)于CPU來(lái)說(shuō),當(dāng)發(fā)生中斷時(shí),它并不知道是哪個(gè)模塊發(fā)生了中斷,只有INT模塊才知道。
6)調(diào)試規(guī)范
7)總線規(guī)范。對(duì)于編程人員來(lái)說(shuō),并不需要太關(guān)心總線規(guī)范。但它是SOC芯片設(shè)計(jì)的重要規(guī)范。它規(guī)定了總線的時(shí)序和仲裁的規(guī)范以及存儲(chǔ)工作模式(馮諾依曼還是哈佛結(jié)構(gòu))。
對(duì)于一個(gè)CPU核設(shè)計(jì)公司來(lái)說(shuō),它會(huì)給SOC芯片設(shè)計(jì)公司提供兩樣?xùn)|西,一是體系設(shè)計(jì)相關(guān)規(guī)范,如ARMV7指令集,描述了每一條指令執(zhí)行的偽代碼過(guò)程(這個(gè)偽代碼針對(duì)的是硬件語(yǔ)言,如HDL);另一樣?xùn)|西是特定系列CPU的設(shè)計(jì)規(guī)范,以及在該規(guī)范下實(shí)現(xiàn)的CPU IP核(知識(shí)產(chǎn)權(quán)核),為RTL寄存器級(jí)電路。
那么,對(duì)于同一個(gè)體系下不同的系列,他們的差異在哪里?
例如,ARM公司現(xiàn)在的發(fā)展方向是Cortex A系列主要面向高端消費(fèi)類電子,如手機(jī)平板,Cortex R主要面向軍工、航空等實(shí)時(shí)要求高的場(chǎng)合,Cortex M系列則是搶占低端控制器市場(chǎng),如STM32,STM8等。三者的體系都是ARM體系結(jié)構(gòu),但三者的工藝、功耗、性能并不一樣,而且,CPU核集成的東西是不一樣的,例如M系列并沒(méi)有集成cache,相當(dāng)A系列,M系列的MMU也是一個(gè)簡(jiǎn)化版。
體系編程是嵌入式架構(gòu)師和操作系統(tǒng)開(kāi)發(fā)人員需要精通的,對(duì)于一般的開(kāi)發(fā)人員比較少接觸到。以上的分析都是基于理論層面的分析。而SOC編程則是面向廣大的普通開(kāi)發(fā)者,將會(huì)從系統(tǒng)設(shè)計(jì)的角度指導(dǎo)大家如何進(jìn)行SOC編程。
二、SOC編程的范疇和定義
SOC編程是針對(duì)片上集成模塊進(jìn)行寄存器控制編程。在開(kāi)發(fā)實(shí)踐中,我們往往把SOC編程和體系編程統(tǒng)稱為體系編程了。沒(méi)關(guān)系,只要我們理解清楚他們之間的關(guān)系就可以了。
那么SOC編程的范疇是什么?
1) 通用控制模塊,如CLOCK、GPIO、INT、TIMER、UART等。
2) 專用控制模塊,如LCD、藍(lán)牙、編解碼等。
有些模塊不需要通過(guò)引腳連接外圍設(shè)備就可以完成功能,如TIMER,大部分模塊需要通過(guò)引腳連接外圍設(shè)備來(lái)完成功能。因此芯片片上集成的是模塊的控制部分,例如LCD控制器,該控制電路實(shí)現(xiàn)LCD驅(qū)動(dòng)器(外圍設(shè)備)所需要的數(shù)據(jù)傳輸時(shí)序、行信號(hào)、列信號(hào)和設(shè)置接口等。換一個(gè)角度說(shuō),如果沒(méi)有LCD控制器,我們也一樣能夠通過(guò)GPIO來(lái)模擬出LCD驅(qū)動(dòng)器的時(shí)序,但是這樣做,對(duì)于普通的開(kāi)發(fā)者來(lái)說(shuō)太復(fù)雜,對(duì)CPU來(lái)說(shuō)也是一個(gè)沉重的負(fù)擔(dān)。所以系統(tǒng)設(shè)計(jì)人員會(huì)針對(duì)LCD驅(qū)動(dòng)器來(lái)實(shí)現(xiàn)專有的控制電路。
那么對(duì)于LCD控制器來(lái)說(shuō),我們SOC編程來(lái)做什么呢?至少,我們需要給LCD控制器一個(gè)標(biāo)識(shí),讓它啟動(dòng)或者關(guān)閉,如何給出這個(gè)信號(hào)呢?LCD控制器電路無(wú)非是一堆的時(shí)序電路和邏輯組合電路,啟動(dòng)和關(guān)閉可以用一個(gè)信號(hào)輸入來(lái)表示,而該信號(hào)在CPU看來(lái)可以映射成一個(gè)寄存器的其中一個(gè)bit。因此,SOC編程即是針對(duì)寄存器編程。對(duì)于LCD控制編程,當(dāng)然不只一個(gè)寄存器這么簡(jiǎn)單,因?yàn)閷?duì)于一個(gè)SOC廠商來(lái)說(shuō),它希望能兼容市面越多的LCD驅(qū)動(dòng)器,兼容不同的分辨率和圖像深度,因此肯定會(huì)有不同的寄存器來(lái)進(jìn)行設(shè)置。
從教學(xué)的角度來(lái)總結(jié),體系編程和SOC編程分為五個(gè)層次:
1)體系指令集,如ARM指令集
2)特定系列的CPU規(guī)范,如基于ARM體系的CortexA8核
3)SOC級(jí),在CPU核的bus總線基礎(chǔ)上集成clock、timer、interrupt、GPIO等控制器,如三星的S5PV210和TI的OMAP3430都是基于Cortex A8核。
4)板級(jí)電路,如開(kāi)發(fā)板、手機(jī)主板電路,其電路圖將明確SOC的引腳和外圍設(shè)備的連接關(guān)系。如GPIO A的第一個(gè)引腳接LED0,那要控制LED0就需要對(duì)GPIOA0進(jìn)行控制編程。
5)外圍設(shè)備規(guī)格,表示板級(jí)電路圖上所有外圍設(shè)備的規(guī)格,如具體LCD SPEC(尺寸、分辨率、延時(shí)參數(shù)等)。
筆者給SOC編程的過(guò)程定義是:基于1)和2)的指令集和CPU總線控制機(jī)制,根據(jù)具體外圍設(shè)備5)的特性參數(shù)和4)具體的電路連接關(guān)系,對(duì)3)SOC對(duì)應(yīng)控制模塊的寄存器進(jìn)行編程,達(dá)到控制、使用的目的。
三、SOC設(shè)計(jì)和編程
理解SOC系統(tǒng)設(shè)計(jì)能夠極大地幫助編程,每款SOC的控制例程都是由SOC系統(tǒng)設(shè)計(jì)人員給出,因?yàn)樗麄円残枰ㄟ^(guò)編程來(lái)對(duì)SOC芯片進(jìn)行功能測(cè)試和驗(yàn)證。
另外,我們需要明白的一個(gè)觀點(diǎn)是,對(duì)于不同的體系來(lái)說(shuō),同樣的模塊的設(shè)計(jì)思路是基本一致的,或者可以說(shuō),從編程的角度來(lái)說(shuō),片上集成的模塊的設(shè)計(jì)控制過(guò)程無(wú)關(guān)于體系結(jié)構(gòu)(兩者有關(guān)更多的是在總線控制方面,而這個(gè)跟編程人員來(lái)說(shuō)關(guān)系不大)。因此基于ARM體系的LCD控制器和基于MIPS體系的LCD控制器,其設(shè)計(jì)思路都是一致的,不同系統(tǒng)的GPIO控制也是一致的。盡管底層的寄存器電路可能不一樣,但對(duì)于上層編程人員看來(lái),兩者是一致的,不同的可能只是寄存器名稱。例如51單片機(jī)和arm處理器的GPIO都是輸入寄存器、輸出寄存器、方向寄存器、上下拉寄存器等等。
下面就以CLOCK和GPIO為例說(shuō)明SOC編程,盡量提取通用的設(shè)計(jì)和控制過(guò)程。
1.最小系統(tǒng)
最小系統(tǒng)除了CPU和RAM之后,還有一個(gè)重要的組件就是晶振。SOC或者CPU說(shuō)到底都是一堆邏輯組合電路和時(shí)序電路,時(shí)序電路需要時(shí)鐘才能正常工作,而晶振就是提供時(shí)鐘的,其在上電后不斷地產(chǎn)生時(shí)鐘。
2. CLOCK
一般的低端單片機(jī)并沒(méi)有時(shí)鐘控制模塊,其直接利用晶振(如12M或者24M)工作,即CPU的工作頻率就是12M或者24MHz。但是作為一個(gè)高級(jí)處理器來(lái)說(shuō),其支持的主頻達(dá)到1G或者更高。而市場(chǎng)上并沒(méi)有1G的晶振,因此SOC內(nèi)部必然要實(shí)現(xiàn)調(diào)頻,PLL鎖相環(huán)倍頻技術(shù)被廣泛應(yīng)用在處理器的CLOCK模塊中,其是將晶振的頻率進(jìn)行倍頻提升。CLOCK模塊除了實(shí)現(xiàn)倍頻的控制外,還需要考慮這樣的需求:
1)SOC集成的模塊很多,各種模塊的工作頻率并不盡相同,或者說(shuō)是在不同的層級(jí),例如CPU和GPU、RAM的工作頻率在G級(jí),LCD的工作頻率則在100M左右,視頻編解碼的工作頻率百M(fèi)級(jí)別,而像GPIO、串口這些模塊的工作頻率可以在10M級(jí)別。因此CLOCK還需要進(jìn)行分頻。所以CLOCK模塊一般的處理方法是將模塊進(jìn)行分類,并進(jìn)行一級(jí)分頻。例如,S5PV210的CLOCK會(huì)將頻率分為三個(gè)范圍,M域供給CPU、中斷異常等,D域供給LCD、JPEG、HDMI等,P域供給GPIO、UART等外圍設(shè)備。每個(gè)域都給定一個(gè)頻率(可以通過(guò)控制器調(diào)節(jié))。
2)對(duì)于在同一個(gè)域內(nèi)的模塊,其工作頻率不盡相同,因此允許其內(nèi)部進(jìn)行二級(jí)分頻。
因此,對(duì)于一個(gè)高級(jí)處理器集成的模塊編程來(lái)說(shuō),設(shè)置好其CLOCK源頻率的相關(guān)寄存器是第一步。一般一級(jí)分頻由操作系統(tǒng)開(kāi)發(fā)人員設(shè)定,二級(jí)分頻設(shè)置由各模塊的開(kāi)發(fā)人員負(fù)責(zé)。
3.引腳復(fù)用
芯片封裝是芯片成本的重要組成部分,而封裝涉及到引腳復(fù)用,而且芯片封裝也涉及到最終產(chǎn)品的BOM成本,因此在系統(tǒng)設(shè)計(jì)時(shí)的引腳復(fù)用是一項(xiàng)非常關(guān)鍵的技術(shù),可以說(shuō)SOC集成電路公司的絕密技術(shù)。盡可能高效地進(jìn)行引腳復(fù)用非常關(guān)鍵。
對(duì)于編程人員說(shuō),我們要做什么呢?那就是記得每個(gè)引腳都可能是功能復(fù)用引腳,在使用這個(gè)引腳之前,必須設(shè)置該引腳的功能。引腳一般默認(rèn)是GPIO功能,如果我們要使用該引腳進(jìn)行串口或者LCD等控制線功能,就必須對(duì)該引腳對(duì)應(yīng)的功能寄存器進(jìn)行設(shè)置。這是SOC編程的第二步。
CLOCK和引腳功能設(shè)置對(duì)所有模塊都是適用的。
4.GPIO
這里我們要談通用的模塊GPIO。對(duì)于GPIO編程來(lái)說(shuō),我們應(yīng)該非常熟悉了,那就是它一定帶有輸入數(shù)據(jù)寄存器、輸出數(shù)據(jù)寄存器、輸入輸出高阻態(tài)設(shè)置寄存器、上下拉設(shè)置寄存器。一般的過(guò)程是:
1)設(shè)置上下拉寄存器
2)設(shè)置引腳的方向
3)通過(guò)輸入數(shù)據(jù)寄存器讀入數(shù)據(jù)或者寫數(shù)據(jù)到輸出數(shù)據(jù)寄存器。
記得功能引腳設(shè)置也是需要的。有些高級(jí)SOC可能還會(huì)有驅(qū)動(dòng)能力等級(jí)設(shè)置寄存器,控制引腳的驅(qū)動(dòng)強(qiáng)度。
5.INT
請(qǐng)參考筆者的博文《軟件和硬件都是對(duì)生活的高度抽象---論中斷控制(ARM體系編程)》。
編輯;hfy
-
cpu
+關(guān)注
關(guān)注
68文章
10863瀏覽量
211763 -
soc
+關(guān)注
關(guān)注
38文章
4165瀏覽量
218256 -
編程
+關(guān)注
關(guān)注
88文章
3616瀏覽量
93734 -
GPIO
+關(guān)注
關(guān)注
16文章
1204瀏覽量
52098
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論