你碼的代碼是如何在SOC芯片上跑起來的
前言
SOC是啥?System on Chip。一個芯片,但是片上有好多東西的意思。市面上的AI芯片、包括你知道的麒麟xxx,驍龍xxx等等一系列手機芯片都是SOC。對于SOC設計者來講,顯然要知道碼農們碼出來的一行行代碼是如何在SOC上跑起來的。
來自清華大學工學博士桔里貓用科普的方式為介紹SOC代碼的重要步驟,其中省略了大量細節,盡量用非專業的詞匯講清楚。當然,如果要真的研究這些東西,還需要大量閱讀文檔。
1.概覽
一段C代碼要在SOC上跑起來,一般需要6個步驟。
這是一個總圖,包括了最簡單的編譯流程以及一個SOC可以跑的最小系統。
左面綠框里的東西是在PC機上進行的,主要就是把你寫的C代碼變成二進制的機器碼。
右面紫框里是PCB板,紅框就是一顆芯片。只有紅框里的芯片顯然是不可能運行的。你至少要有電源,FLASH,晶振這些。
FLASH是存儲你寫的程序的二進制文件的。
電源是干啥的,應當很清楚。
晶振是給芯片提供時鐘(Clock)的。當然芯片內部會有PLL來接收晶振的時鐘。
Reset是個按鈕,重置芯片的,理解為上電后自動按一下。你手動也可以按一下。
UART是輸出信息用的。畢竟你要知道你的helloworld到底跑了沒有,需要把結果通過某個東西輸出來。
紅框里就是芯片內的東西。此處畫了一個最最最簡單的AI芯片SOC。此處介紹一個最最最小的SOC架構:
1)ARM-M3是個CPU,可以換成RISC-V或者其他系列的CPU,都沒問題。
2)AXI是個總線。你可以理解為一種用于傳輸數據的模塊或者總線。用于兩個模塊或者多個模塊之間相互遞數據。反正它有一堆優點。。被SOC廣泛采用了。
3)SRAM是片上存儲器,用來存儲堆棧,速度很快。
4)NPU是個神經網絡加速單元。這個東西現在市面上一堆一堆。比如寒武紀最原始就是給華為提供這個IP。(當然,后來華為把寒武紀踹了開始自己寫這個NPU)
5)APB,AXI是高速總線,但總有好多外設其實不需要那么快的速度。為了防止AXI太忙,所以一般有個慢速的總線,APB。掛一些慢的東西,例如UART。
嵌入式物聯網的學習之路非常漫長,不少人因為學習路線不對或者學習內容不夠專業而錯失高薪offer。不過別擔心,我為大家整理了一份150多G的學習資源,基本上涵蓋了嵌入式物聯網學習的所有內容。點擊下方鏈接,0元領取學習資源,讓你的學習之路更加順暢!記得點贊、關注、收藏、轉發哦!
2.準備啟動文件
此處我們先要寫好一個叫startup.s的文件。這個文件直接是用匯編寫的,主要完成三個工作:堆棧的初始化,定位中斷向量表,調用啟動函數。
- 堆棧初始化
上圖是startup.s里面棧的初始化,主要就是分配一下大小,重置一下指針。
- 定義中斷向量表
上圖就是定義的中斷向量表,其實你可以理解這個就是各個小函數的地址。要放在Flash的0位置處。例如你要運行Reset_Handler這個小程序,PC就會先先訪問這個中斷向量表,得知Resethandler在哪個地址,然后PC跳到相應的位置開始執行Resethandler, 里面定義了各種中斷發生后CPU要做的事兒(小程序)。
- 調用ResetHandler
這個小程序就是默認的初始化操作。其實就干了兩件事兒,把你寫的二進制代碼文件從FLASH里搬到SRAM里,然后開始運行(bl main).
3.編寫業務代碼
這一步你應該比較熟,就是你的c文件。一般來講學c語言寫的第一個程序就是這個。
4.編譯生成機器碼
第三步是把寫的代碼變成機器可以認識的二進制文件。一般用到的工具是GCC,包括了鏈接、編譯等等一大堆東西。此處為了簡單解釋,你可以理解為把startup.s翻譯成二進制,把hellowolrd.c翻譯成二進制。然后把兩段二進制拼起來,最終生成code.bin。里面的東西如下圖所示。
生成這個code.bin以后,基本上電腦編譯這一步就算完成了。下一步就是下載到開發板了。
5.燒寫FLASH
第三步生成的code.bin總歸是個文件。在你的PC機上,如何讓它跑在SOC上呢?這需要一個媒介,就是FLASH,這是個小的存儲芯片。至于怎么燒寫進去,就要用這個燒寫器。其實一般來講接口都會設計的很優雅,比如用個micro usb啥的,不會讓你抱著磚寫FLASH的。
總之,第四步結束以后code.bin就到flash里面了。
6.燒寫FLASH
第五步是要復位一下芯片系統。為什么要復位一下這個,你可能要對數字芯片有一定的了解,讓芯片里的各個寄存器恢復到初始狀態。大體解釋一下的話,CPU里存在一個寄存器叫PC。例如PC=2,就從存儲2位置處取出指令來執行。這個復位就是讓PC恢復到0,開始跑。
7.CPU開始執行
emmm 到這一步,CPU開始跑程序。先跑startup.s, 再跑helloworld.c。
8.輸出計算結果
等計算結束以后,要輸出結果(結果也是一串二進制數)。這時候數據先從ARM寫到AXI總線,然后通過AXI-APB縱線橋寫到APB,然后寫到UART串口。最后你用串口線就能把結果在PC機上看到。
總結
emmm 感覺上述就是如何設計一個最小SOC系統并在系統上跑一個helloworld,實際上里面涉及到的細節非常多。比如UART如何用起來的, FLASH怎么接進去的。復位信號也不是一個RESET這么簡單,往往有power-on reset, system reset等等一堆。但是原理上就是上面講的這些。
- 贊