完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>
標(biāo)簽 > OR1200
or1200主要是GNU開發(fā)工具鏈的安裝,有了GNU工具鏈提供的工具,我們可以在Linux環(huán)境下將匯編、C代碼編譯成OR1200平臺的可執(zhí)行代碼,這就是交叉編譯的過程。
OR1200主要是GNU開發(fā)工具鏈的安裝,有了GNU工具鏈提供的工具,我們可以在Linux環(huán)境下將匯編、C代碼編譯成OR1200平臺的可執(zhí)行代碼,這就是交叉編譯的過程。有了OR1200的可執(zhí)行代碼,就能夠在OR1200模擬器OR1KSim中運(yùn)行該可執(zhí)行代碼,觀察其是否如預(yù)期那樣執(zhí)行。
在介紹GNU開發(fā)工具鏈之前簡單說明交叉編譯的概念,在嵌入式開發(fā)中,開發(fā)平臺與運(yùn)行平臺往往是不同的,這是因?yàn)檫\(yùn)行平臺上一般都資源有限,不能夠安裝編譯開發(fā)環(huán)境,因此需要在其他性能更好的平臺上安裝編譯環(huán)境,比如我們常在x86的平臺上開發(fā)OR1200、ARM的應(yīng)用程序,但是x86與OR1200、ARM是不同的處理器體系結(jié)構(gòu),也就是處理器的指令集不同,那么就需要x86上的編譯器編譯得到能夠在OR1200、ARM架構(gòu)下執(zhí)行的目標(biāo)代碼,這就是交叉編譯。圖2.1顯示x86平臺與OR1200平臺上“寄存器相與”指令對應(yīng)不同的二進(jìn)制編碼。
or1200開發(fā)環(huán)境的安裝
主要是GNU開發(fā)工具鏈的安裝,有了GNU工具鏈提供的工具,我們可以在Linux環(huán)境下將匯編、C代碼編譯成OR1200平臺的可執(zhí)行代碼,這就是交叉編譯的過程。有了OR1200的可執(zhí)行代碼,就能夠在OR1200模擬器OR1KSim中運(yùn)行該可執(zhí)行代碼,觀察其是否如預(yù)期那樣執(zhí)行。
在介紹GNU開發(fā)工具鏈之前簡單說明交叉編譯的概念,在嵌入式開發(fā)中,開發(fā)平臺與運(yùn)行平臺往往是不同的,這是因?yàn)檫\(yùn)行平臺上一般都資源有限,不能夠安裝編譯開發(fā)環(huán)境,因此需要在其他性能更好的平臺上安裝編譯環(huán)境,比如我們常在x86的平臺上開發(fā)OR1200、ARM的應(yīng)用程序,但是x86與OR1200、ARM是不同的處理器體系結(jié)構(gòu),也就是處理器的指令集不同,那么就需要x86上的編譯器編譯得到能夠在OR1200、ARM架構(gòu)下執(zhí)行的目標(biāo)代碼,這就是交叉編譯。圖2.1顯示x86平臺與OR1200平臺上“寄存器相與”指令對應(yīng)不同的二進(jìn)制編碼。
圖2.1 x86平臺與OR1200處理器“寄存器相與”指令的二進(jìn)制編碼是不一樣的
因此我們在x86上開發(fā)程序的時(shí)候就需要針對不同的目標(biāo)平臺使用不同的編譯工具,從而得到可以在目標(biāo)平臺上執(zhí)行的二進(jìn)制代碼。在這方面GNU工具鏈?zhǔn)且粋€(gè)很好的選擇。GNU工具鏈 (GNU Toolchain) 是一組用于開發(fā)應(yīng)用程序和操作系統(tǒng)的編程工具的集合,這些工具構(gòu)成了一個(gè)完整的系統(tǒng),最重要的是其支持多種目標(biāo)平臺,其中就包括本書要介紹的OR1200。
GNU工具鏈包括GCC、Glibc、GDB、GNU Binutils。
1、GCC
GCC(GNU Compiler Collection)主要的工具包括cpp、g++、gcc、gcov、gprof等。其中cpp是C預(yù)處理器,主要用于在編譯C、C++或Objective-C源代碼之前對它們進(jìn)行預(yù)處理,由編譯器自動(dòng)調(diào)用。g++和gcc可以認(rèn)為分別是C++和C編譯器。
2、Glibc
Glibc(GNU libc)是GNU的C標(biāo)準(zhǔn)庫,Glibc是移植GNU工具鏈時(shí)一個(gè)不可或缺的部分。Glibc主要由兩部分組成,一部分是頭文件,另一部分是庫的二進(jìn)制文件,包括動(dòng)態(tài)和靜態(tài)兩個(gè)版本。有了Glibc就可以使用C語言開發(fā)程序。
3、GDB
GDB(GNU symbolic debugger)是一個(gè)功能很強(qiáng)大的調(diào)試工具,可以讓用戶調(diào)試一個(gè)程序,包括讓程序在希望的地方停下,此時(shí),用戶可以查看變量,寄存器,內(nèi)存及堆棧,而且可以修改變量及內(nèi)存值。
4、GNU Binutils
GNU Binutils(Binary Utilities) 是一組二進(jìn)制工具集,用來編譯、測試和分析軟件。其中主要的兩個(gè)工具是as和ld。as是GNU匯編器,通常也稱為GAS(GNU Assembler),ld是GNU鏈接器,as對GCC的輸出文件進(jìn)行匯編產(chǎn)生目標(biāo)文件,然后由ld鏈接目標(biāo)文件、重定位數(shù)據(jù),從而產(chǎn)生可執(zhí)行文件。此外,GNUBinutils還包括其它一些工具,如下:
?。?)addr2line:用于將程序中的地址對應(yīng)到文件名和相應(yīng)的行號。給定一個(gè)地址和一個(gè)可執(zhí)行文件,addr2line使用可執(zhí)行文件中的調(diào)試信息來確定該地址所對應(yīng)的文件和行號。
?。?)ar:用于建立、修改和提取檔案文件 (archives)。檔案文件經(jīng)常被用作庫文件,保存程序常用的函數(shù)過程。
?。?)c++filt:C++和Java中都有重載函數(shù)的特性,編譯器要區(qū)分重載函數(shù),就需要對函數(shù)標(biāo)識符進(jìn)行編碼轉(zhuǎn)換成一個(gè)匯編級別的標(biāo)簽 (label),這個(gè)過程稱為名字改編 (name mangling) 或名字修飾 (name decoration)。而c++filt所執(zhí)行的就是這個(gè)過程的逆過程。
?。?)dlltool:用于創(chuàng)建Windows動(dòng)態(tài)鏈接庫。
(5)ld:是鏈接器,編譯程序最后是調(diào)用ld,把目標(biāo)文件和歸檔文件鏈接在一起,重定位數(shù)據(jù)并鏈接符號引用。
?。?)gold:是一種比ld更快,但只針對ELF文件格式的鏈接器。
?。?)nm:用于列出二進(jìn)制文件 (包括庫文件和可執(zhí)行文件) 中的符號,這些符號可以是函數(shù)、全局變量、靜態(tài)變量等等。
?。?)objcopy:用于將一種格式的目標(biāo)文件復(fù)制成另外一種格式。
?。?)objdump:用于列出關(guān)于二進(jìn)制文件的各種信息。
(10)ranlib:用于為檔案文件生成索引信息,這樣可以提高檔案文件的訪問速度。
(11)readelf:類似于objdump,但是它只能處理ELF格式的文件,并且沒有使用GNU BFD庫。
(12)size:用于列出目標(biāo)文件或者檔案文件各段的大小。
(13)strings:用于列出目標(biāo)文件中的可打印字符串。
(14)strip:用于移除目標(biāo)文件中的符號,以減少程序文件的大小,這對于嵌入式系統(tǒng)比較有用。
GNU工具鏈可謂博大精深,功能全面,諸位讀者不要驚慌,本書不是一本介紹GNU工具鏈的書,只是使用到了其中一點(diǎn)工具(實(shí)際只有as、ld,因?yàn)闇y試代碼都是用匯編寫的),所以不懂GNU工具鏈沒有關(guān)系,筆者會在使用到其中工具的時(shí)候做一個(gè)簡單介紹,這就足夠了。
針對目標(biāo)平臺OR1200的GNU工具鏈,有三種安裝方法:
方法一:下載源文件,在Linux環(huán)境下自行編譯
方法二:下載編譯好的針對OR1200處理器的GNU工具鏈,可在Linux環(huán)境下安裝使用
方法三:下載一個(gè)Ubuntu的虛擬機(jī)文件,里面安裝好了針對OR1200處理器的GNU工具鏈
方法一筆者試過,容易出問題,而且比較耗時(shí),當(dāng)然對GNU工具鏈有著強(qiáng)烈興趣的朋友可以嘗試。方法二筆者沒用過。方法三簡單直接,速度快,不易出錯(cuò),而且基本都是Windows下的操作,適合新手,所以建議使用方法三,本書也只介紹方法三。
在瀏覽器中輸入地址:ftp://openrisc.opencores.org/virtualbox-image/,F(xiàn)TP的用戶名和密碼都是openrisc,登錄后會出現(xiàn)如圖2.2所示界面。
圖2.2 Ubuntu虛擬機(jī)鏡像下載
下載最新的那個(gè)文件就可以了,筆者使用的是2011-12-15版。下載完成后解壓該文件,大約4GB左右。此時(shí)還需要下載VisualBox以打開該文件。VisualBox是一款開源的虛擬機(jī)軟件,本書使用的是4.1.22版。下載完成后安裝VisualBox,安裝完成后打開VisualBox,界面如圖2.3所示。
圖2.3 VisualBox主界面
點(diǎn)擊“新建”出現(xiàn)“新建虛擬機(jī)”向?qū)Вc(diǎn)擊“下一步”,出現(xiàn)如下界面:
圖2.4 新建虛擬機(jī)設(shè)置一
此處操作系統(tǒng)選擇Linux,版本選擇Ubuntu,點(diǎn)擊下一步,設(shè)置內(nèi)存大小,如圖2.5所示。
圖2.5 新建虛擬機(jī)設(shè)置二
內(nèi)存大小依據(jù)個(gè)人情況設(shè)置,本人設(shè)置的是512M,已經(jīng)夠用了,畢竟我們需要編譯的程序都是十分簡單的,點(diǎn)擊下一步,選擇“使用現(xiàn)有的虛擬硬盤”,然后選擇解壓后的虛擬機(jī)文件。
圖2.6 新建虛擬機(jī)設(shè)置三
點(diǎn)擊“下一步”,VisualBox會將用戶剛才的設(shè)置都列出來,確認(rèn)無誤后,點(diǎn)擊“創(chuàng)建”,這樣虛擬機(jī)就創(chuàng)建好了。啟動(dòng)虛擬機(jī),顯示如圖2.7所示。
圖2.7 Ubuntu虛擬機(jī)桌面
雙擊左邊的“終端”圖標(biāo),就可以打開終端,在終端中輸入or32-elf-,然后按兩次Tab鍵,會列出虛擬機(jī)中已安裝的針對OR1200平臺的所有編譯工具,如圖2.8所示。
圖2.8 Ubuntu中已安裝的編譯工具
可見之前介紹過的GNU工具鏈中的GCC、as、ld、gdb等都包括在內(nèi)。這樣GNU工具鏈就安裝完成了。Ubuntu虛擬機(jī)提供的功能遠(yuǎn)不止GNU工具鏈,還包括OR1K模擬器、用于硬件調(diào)試的OR_DEBUG_PROXY、OpenRISC平臺參考SoC設(shè)計(jì)ORPSoCv2,其中在本書的研究過程中需要使用到OR1K模擬器——OR1KSim,2.2.5節(jié)會介紹其使用方法。
最后,因?yàn)樗拗鳈C(jī)是Windows平臺,而且在后面仿真時(shí)使用的ModelSim也是Windows平臺的,為了方便文件的傳遞,這里需要設(shè)置虛擬機(jī)與宿主機(jī)的文件共享。打開VisualBox中虛擬機(jī)的設(shè)置界面,選擇“共享文件夾”,如圖2.9所示。
圖2.9 虛擬機(jī)與宿主機(jī)共享文件夾設(shè)置步驟一
點(diǎn)擊界面右邊的添加文件夾按鈕,出現(xiàn)如圖2.10所示界面:
圖2.10 虛擬機(jī)與宿主機(jī)共享文件夾設(shè)置步驟二
在其中選擇共享文件夾的路徑,設(shè)置名稱,參考如上設(shè)置,然后啟動(dòng)虛擬機(jī),打開終端,輸入命令:
?。踦lain] view plain copysudo mount –t vboxsf UbuntuShareFolder /mnt/sharefolder
該命令的作用是將共享文件夾掛載在/mnt/sharefolder目錄下,sudo表示以Root用戶身份執(zhí)行該命令,終端會提示輸入密碼,Ubuntu虛擬機(jī)默認(rèn)Root用戶的密碼是openrisc。這樣就實(shí)現(xiàn)了虛擬機(jī)與宿主機(jī)的文件共享,對虛擬機(jī)而言共享文件放在/mnt/sharefolder路徑下,對宿主機(jī)而言共享文件放在圖2.10所示的E盤UbuntuShareFolder文件夾下。
編輯推薦廠商產(chǎn)品技術(shù)軟件/工具OS/語言教程專題
電機(jī)控制 | DSP | 氮化鎵 | 功率放大器 | ChatGPT | 自動(dòng)駕駛 | TI | 瑞薩電子 |
BLDC | PLC | 碳化硅 | 二極管 | OpenAI | 元宇宙 | 安森美 | ADI |
無刷電機(jī) | FOC | IGBT | 逆變器 | 文心一言 | 5G | 英飛凌 | 羅姆 |
直流電機(jī) | PID | MOSFET | 傳感器 | 人工智能 | 物聯(lián)網(wǎng) | NXP | 賽靈思 |
步進(jìn)電機(jī) | SPWM | 充電樁 | IPM | 機(jī)器視覺 | 無人機(jī) | 三菱電機(jī) | ST |
伺服電機(jī) | SVPWM | 光伏發(fā)電 | UPS | AR | 智能電網(wǎng) | 國民技術(shù) | Microchip |
Arduino | BeagleBone | 樹莓派 | STM32 | MSP430 | EFM32 | ARM mbed | EDA |
示波器 | LPC | imx8 | PSoC | Altium Designer | Allegro | Mentor | Pads |
OrCAD | Cadence | AutoCAD | 華秋DFM | Keil | MATLAB | MPLAB | Quartus |
C++ | Java | Python | JavaScript | node.js | RISC-V | verilog | Tensorflow |
Android | iOS | linux | RTOS | FreeRTOS | LiteOS | RT-THread | uCOS |
DuerOS | Brillo | Windows11 | HarmonyOS |