在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

i.MX6ULL開發板源碼自制交叉編譯器

武漢萬象奧科 ? 2021-12-29 19:05 ? 次閱讀

前言

文章基于HD-IMX6ULL-MB 系列開發板測試驗證,該開發板由武漢芯路遙科技有限公司與武漢萬象奧科電子有限公司合作推出。此開發板基于 NXP iMX6ULL 系列 Cortex-A7 高性能處理器設計,適用于快速開發一系列具有創新性的產品如人機界面工業 4.0 掃描儀、車載終端以及便攜式醫療設備。

poYBAGHJb9-AGJjfAAFp4I2KTKg619.jpg


自己制作交叉編譯器


早期(2009年以前)我們在做嵌入式系統開發時,第一件事就是自己制作交叉編譯器。當時做交叉編譯器 需要自己下載gcc、glibc、binutils等相關工具的源碼,然后一個一個源碼編譯安裝。制作交叉編譯器的 過程中最痛苦的莫過于各個軟件之間的版本依賴關系,如gcc 4.6.2 依賴 glibc 2.13,如果你選定 gcc 4.7 則可能編譯制作失敗,然后再嘗試一個新的版本重新編譯,直至找到一個合適的版本為止。


后來為了方便交叉編譯器的制作,有很多組織或個人開始編寫這些制作交叉編譯器的腳本或框架,并測 試解決這些軟件版本之間的依賴關系。當時最知名的莫過于基于 glibc crosstool 和 基于 uclibc

buildroot 了。在開始講解如何制作交叉編譯器之前,我們首先來了解一下 C運行庫


1.嵌入式C運行庫


1.1glibc庫

glibc是gnu發布的libc庫,也即c運行庫。glibc是linux 系統中最底層的api(應用程序開發接口),幾乎其它任何的運行庫都會倚賴于glibc。glibc除了封裝linux操作系統所提供的系統服務外,它本身也提供了 許多其它一些必要功能服務的實現,主要的如下:

string,字符串處理

signal,信號處理

dlfcn,管理共享庫的動態加載

direct,文件目錄操作

elf,共享庫的動態加載器,也即interpreter

iconv,不同字符集的編碼轉換

inet,socket接口的實現

intl,國際化,也即gettext的實現

io

linuxthreads

locale,本地化

login,虛擬終端設備的管理,及系統的安全訪問

malloc,動態內存的分配與管理

nis

stdlib,其它基本功能


gcc 是編譯器,基本上 Linux 下所有的程序(包括內核)都是 gcc 編譯的,libc 當然也是。gcc 和 libc 是互相依賴的兩個軟件,它們合作的方式類似 Linux 系統的 "自舉"。先在一個可以運行的帶有老 libc 和

gcc 的系統上,用老 gcc 編譯出一個新版本的 gcc + 老 libc,再用這個新 gcc 編譯出一個新 gcc + 新

libc,再用這套新的組合編譯整個新系統。


1.2 uClibc庫

PC上常用的標準庫glibc是一個非常寵大而完整的庫,但早期對于嵌入式系統來說,由于Flash和RAM的 存儲空間有線,其體積顯得過于大了一些。uClibc的出現就是為了解決這個問題,uClibc盡可能的兼容

Glibc,大多數應用程序可以在很小或完全不修改的情況下就可能使用uClibc替代glibc。通過uClibc來代 替Glibc,可以在不改變應用程序功能的前提下,大大減少發布文件的大小,無論應用程序以靜態鏈接來 編譯,還是以動態鏈接形式編譯。


uClibc比一般用于Linux發行版的C庫GNU C Library (glibc)要小得多,glibc目標是要支持最大范圍的硬件和內核平臺的所有C標準,而uClibc專注于嵌入式Linux.很多功能可以根據空間需求進行取舍。現在uClibc更多運行于標準的以及無MMU的Linux系統上,支持i386,x86 64,ARM (big/little endian), AVR32,Blackfin,h8300,m68k,MIPS (big/little endian), PowerPC,SuperH (big/little endian),

SPARC,和v850等處理器


由于當前嵌入式系統硬件性能的提升,用于存儲程序的Flash空間和用于運行程序的RAM空間都有了大幅 提升,為了保證程序更大的兼容性,uClibc也逐步退出了歷史的舞臺了。



uClibc早期官網: uClibc最新官網:

https://www.uclibc.org/ h ttps://uclibc-ng.org/



1.3 eglibc庫


EGLIBC(Embedded GLIBC,縮寫為EGLIBC)是glibc的原創作組織FSF所新推出的glibc的一種變體, 目的在于將glibc用于嵌入式系統。它是GNU C 庫(glibc)的一個分支,也采用GNU寬通用公共許可證

(LGPL)發布。它希望能應用于嵌入式系統,但它的源代碼與可執行文件仍然保持與glibc一致。它的作 者宣稱它不是glibc的一個分支,而是用來容納glibc核心開發者拒絕采納的patch。


2009年5月6日,因為與glibc核心開發者之間對程序發展方向的爭議,Debian開發者宣布將要采用EGLIBC來取代glibc。Ubuntu自9.10后也采用了EGLIBC,Ark Linux也使用它。2014年初,官網上宣布,eglibc已經停止開發,因為現在的目標是在glibc上直接解決問題(goals are now being addressed directly in GLIBC),Debian開發者也恢復到使用glibc了。


1.4 newlib庫


在做一些單片機的裸機程序開發時,有時候最想要的是實現一個printf打印函數,以便及時輸出各種信 息。除去底層的設備驅動不說,printf本身的實現就有夠麻煩,如果平時有保存相關的代碼還好,不然就 很浪費時間。除此之外,還有一些諸如strlen、strcpy之類的函數,我們不愿意自己寫,既麻煩而且效率 不高,如果能借助已有的代碼或庫就好了。


Newlib 就滿足了這點需求,它是一個面向嵌入式系統的C運行庫。最初是由Cygnus Solutions收集組裝的一個源代碼集合,取名為newlib,現在由Red Hat維護。對于與GNU兼容的嵌入式C運行庫,Newlib 并不是唯一的選擇,但是從成熟度來講,newlib是最優秀的。newlib具有獨特的體系結構,具有可移植 性強,具有可重入特性、功能完備等特點,使得它能夠非常好地滿足深度嵌入式系統的要求。


Newlib 庫是一個開源的c函數庫,包括libc和libm兩部分。它支持ANSI C庫標準,針對不同處理器架構進行優化,輕量級,適用于嵌入式系統。其特點如下:

支持printf和優化的字符串操作

支持malloc和free等內存操作

支持函數可重入功能(不過這種支持對內存有壓力,總之是感覺弊大于利)

支持libm數學庫(不過一般嵌入式用不到浮點數,而且用模擬的開銷略大)

newlib的函數是分文件實現的,如果用不到,絕不加入鏈接,一般不會造成目標文件猛增的情況。

newlib C庫一般在制作單片機裸機開發的交叉編譯器時,使用得比較多。



2 Crosstool-ng制作交叉編譯器


Crosstool早期是個很不錯的交叉編譯器制作工具,但是后來完善得不夠好,于是有人弄出了個更好的

—— crosstool-ng(crosstool Next Generation)。其特點如下:

支持menuconfig(類似于Linux內核配置) 支持眾多的架構

可選多種不同的C庫等模塊提供示例配置

支持多種主機編譯環境:各種Linux發行版,Cygwin等。


接下來,我們學習了解一下如何使用 crosstool-ng 來制作一個ARM交叉編譯器。


2.1 Crosstool-NG 編譯與安裝


首先我們到 Crosstool-NG 的官方站點(https://crosstool-ng.github.io/)下載其軟件源碼壓縮包,并解壓縮源碼。


pYYBAGHJb-CAY87nAACVjyWb6kY38.jpeg


接下來進入到源碼路徑下,開始Linux系統下源碼安裝的三部曲: ./configuremakemake install

。 這里在configure 時通過 --prefix 選項指定將編譯生成的文件安裝到當前路徑下即可。在進行

./configure 時可能會提示 help2man、 libtool 找不到,這可能是系統沒有安裝或者安裝的版本過低導致的,直接使用 sudo apt install 命令安裝相關系統命令即可。


pYYBAGHJb9-AKAtZAAE9SAMHxTA64.jpeg


上面命令成功編譯安裝之后,可執行程序將會放到 install 文件夾下,接下來我們可以測試 ct-ng 命令是否能夠成功執行。接下來我們將會使用該程序來制作交叉編譯器。


poYBAGHJb9-ADMJYAACYV30bvr024.jpeg


2.2 交叉編譯器配置


在Crosstool-NG的安裝路徑下,有很多參考的交叉編譯器示例配置,我們沒有必要所有的選項都自己從

0開始配置,可以在某個示例配置的基礎上來修改。


pYYBAGHJb-CAG8TMAADPdzPD1g002.jpeg


因為i.MX6ULL是ARM CortexA7核的處理器,但在上面的示例配置中并沒有該架構的相關配置,這樣我們在 A8的基礎上來進行修改,這兩種架構大致都差不多。我們將ARM CortexA8的示例配置拷貝一份并命名為 .config, 接下來的 ct-ng menuconfig 將會默認讀取該配置文件。


poYBAGHJb-CARu20AAAvAcLcFAw25.jpeg


接下來使用 export 命令導出 ct-ng 命令所在的路徑,如果是使用 SecureCRT 遠程登錄到Linux服務器上操作的話,還需要 export TERM=vt100 命令配置TERM環境變量,否則接下來的配置可能不能輸入。接下來再執行 ct-ng menuconfig 對交叉編譯器制作進行配置。


poYBAGHJb-CAQ3N_AABHzdysINI63.jpeg


下面是Crosstool-NG的配置界面,我們接下來需要在這里進行修改。在配置的過程中,上、下方向鍵 用來選擇相應選項,TAB用來選擇底下的 或 :在 Paths and misc options 選項中,我們主要要修改如下幾個選項,修改指定下載的軟件包存放路徑${PWD}/tarballs 和 交叉編譯器的安裝路徑 /opt/xtools/cortexA7:在 Target options 選項中,我們主要修改 “ Floating point” 選項,因為 iMX6ULL處理器帶有 FPU,這里為了保持兼容性,選擇 softfp (FPU)。在 Toolchain options 選項中,如果想拷貝該交叉編譯器給別的機器使用,則可以選中"Build Static Toolchain",另外修改 "Tuple's vendor string" 選項中指定交叉編譯器名稱。在 Operating System 選項中,因為我們移植的Linux內核目標版本為 5.10.x, 所以這里內核的版本選擇要跟開發板上移植的版本保持一致,否則今后編譯Linux內核時可能會出現兼容性問題。在這里, crosstool-NG的默認內核版本較低,這里需要修改配置為我們想要的版本。下面的這些選項配置,依賴Paths and misc options 菜單中的 [*] Try features marked as EXPERIMENTAL選項。"Source of linux" 選擇 (Custom location)"Custom source location" 里設置 Linux路徑為 (${PWD}/tarballs/linux-5.10.tar.xz) ,接下來我們將會手動下載相應的Linux內核源碼壓縮包到這里;"Version of linux" 里選擇 (newer than anything below) ;在 C-library 選項中,C library 選擇 (glibc) ,其他使用默認剩余的其它選項,我們就不作任何修改采用默認配置。關于 C compiler 編譯器里的相關選項,大家也可以了解一下。配置完成后回到主菜單,使用 Tab鍵 切換到 < Exit > ,然后選擇保存退出即可。交叉編譯器配置完成之后,接下來我們就準備開始交叉編譯器的編譯過程。2.3 交叉編譯器編譯在前面的配置中,我們計劃將交叉編譯器安裝到系統的 /opt/xtools 路徑下,這里我們首先需要使用root 權限創建這個文件夾,并給所有其他用戶 寫 權限。CrossTool-NG在編譯過程中,會下載制作交叉編譯器所需要的軟件源碼包,但有些軟件包的下載地址可 能已經失效,這時我們可以自己找到相關軟件的相應版本軟件包,然后手動下載到指定的壓縮包存放路 徑下,如前面配置中指定的 ${PWD}/tarballs 。下面是一些已知的失效文件,我們提前手動下載好,其它所需要的軟件包將會在開始編譯后自動下載。接下來我們就開始交叉編譯的編譯制作過程,這個過程的時間依賴PC的性能。我的Linux服務器處理器 是Intel(R) Xeon(R) CPU E31235 @ 3.20GHz,4核8線程,所以我這里使用 ct-ng build.8 命令用8個進程同時編譯。交叉編譯器編譯完成之后,我們可以使用下面命令查看制作好的交叉編譯器相關版本信息:2.4 交叉編譯器測試接下來我們使用制作好的交叉編譯器,交叉編譯之前寫好的 hello.c 測試程序,并放到 ARM 開發板上運行測試。需要注意的是因為新制作的交叉編譯器跟開發板上運行的C運行庫版本不一致,這里必須加上 -static 進行靜態鏈接,這樣編譯生成的程序才能在開發板上運行。ARM 開發板上下載運行測試:版權聲明本文檔所有內容文字資料由凌云實驗室郭工編著,主要用于凌云嵌入式Linux教學內部使用,版權歸屬 作者個人所有。任何媒體、網站、或個人未經本人協議授權不得轉載、鏈接、轉帖或以其他方式復制發布/發表。已經授權的媒體、網站,在下載使用時必須注明來源,違者本人將依法追究責任。Copyright (C)2021 凌云物網智科實驗室·郭工Author: GuoWenxue guowenxue@gmail.com

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • Linux系統
    +關注

    關注

    4

    文章

    595

    瀏覽量

    27479
  • 嵌入式開發
    +關注

    關注

    18

    文章

    1035

    瀏覽量

    47670
  • 開發板
    +關注

    關注

    25

    文章

    5121

    瀏覽量

    98036
收藏 人收藏

    評論

    相關推薦

    OpenHarmony源碼編譯后燒錄鏡像教程,RK3566鴻蒙開發板演示

    本文介紹瑞芯微主板/開發板編譯OpenHarmony源碼后燒錄鏡像的教程,觸覺智能Purple Pi OH鴻蒙開發板演示。搭載了瑞芯微RK3566四核處理
    的頭像 發表于 12-30 10:08 ?157次閱讀
    OpenHarmony<b class='flag-5'>源碼</b><b class='flag-5'>編譯</b>后燒錄鏡像教程,RK3566鴻蒙<b class='flag-5'>開發板</b>演示

    【迅為電子】i.MX6UL和i.MX6ULL芯片區別與開發板對比

    【迅為電子】i.MX6UL和i.MX6ULL芯片區別與開發板對比
    的頭像 發表于 11-28 14:31 ?550次閱讀
    【迅為電子】<b class='flag-5'>i.MX6</b>UL和<b class='flag-5'>i.MX6ULL</b>芯片區別與<b class='flag-5'>開發板</b>對比

    【新品】i.MX6ULL工業嵌入式核心!NXP低功耗MPU,LCD顯示

    核心新品上市ECK20-6Y2XA系列核心是億佰特基于NXPCortex-A7內核i.MX6ULL處理精心設計的,采用郵票孔連接的低成
    的頭像 發表于 11-15 01:04 ?295次閱讀
    【新品】<b class='flag-5'>i.MX6ULL</b>工業嵌入式核心<b class='flag-5'>板</b>!NXP低功耗MPU,LCD顯示

    i.MX Linux開發實戰指南—基于野火i.MX系列開發板

    電子發燒友網站提供《i.MX Linux開發實戰指南—基于野火i.MX系列開發板.pdf》資料免費下載
    發表于 10-10 17:23 ?11次下載

    在NXP源碼基礎上如何適配ELF 1開發板的UART功能

    UART即通用異步收發,是一種支持全雙工串行通信協議的接口。在i.MX6ULL處理平臺上,該處理原生支持多達8路的UART接口,提供了豐富的串行通信能力。 針對ELF 1
    的頭像 發表于 09-29 11:49 ?417次閱讀
    在NXP<b class='flag-5'>源碼</b>基礎上如何適配ELF 1<b class='flag-5'>開發板</b>的UART功能

    ElfBoard技術貼|如何在NXP源碼基礎上適配ELF 1開發板的UART功能

    UART即通用異步收發,是一種支持全雙工串行通信協議的接口。在i.MX6ULL處理平臺上,該處理原生支持多達8路的UART接口,提供了豐富的串行通信能力。 針對ELF 1
    的頭像 發表于 09-25 13:56 ?2410次閱讀
    ElfBoard技術貼|如何在NXP<b class='flag-5'>源碼</b>基礎上適配ELF 1<b class='flag-5'>開發板</b>的UART功能

    使用TPS6521815 PMIC為NXP i.MX 6ULL6UltraLite供電

    電子發燒友網站提供《使用TPS6521815 PMIC為NXP i.MX 6ULL6UltraLite供電.pdf》資料免費下載
    發表于 09-13 09:44 ?1次下載
    使用TPS6521815 PMIC為NXP <b class='flag-5'>i.MX</b> <b class='flag-5'>6ULL</b>、<b class='flag-5'>6</b>UltraLite供電

    【北京迅為】iTOP-i.MX6開發板使用手冊第四部分固件編譯第十四章非設備樹Android4.4系統編譯

    【北京迅為】iTOP-i.MX6開發板使用手冊第四部分固件編譯第十四章非設備樹Android4.4系統編譯
    的頭像 發表于 09-12 15:43 ?595次閱讀
    【北京迅為】iTOP-<b class='flag-5'>i.MX6</b><b class='flag-5'>開發板</b>使用手冊第四部分固件<b class='flag-5'>編譯</b>第十四章非設備樹Android4.4系統<b class='flag-5'>編譯</b>

    如何在NXP源碼基礎上適配ELF 1開發板的PWM功能

    本次源碼適配項目是在NXP i.MX6ULL EVK評估所搭載的Linux內核源碼(版本為Linux-imx_4.1.15)基礎上進行的,主要目標是通過調整功能接口引腳配置,使其適應
    的頭像 發表于 09-10 10:00 ?976次閱讀
    如何在NXP<b class='flag-5'>源碼</b>基礎上適配ELF 1<b class='flag-5'>開發板</b>的PWM功能

    linux開發板如何編譯curl

    準備開發環境 確保你的開發板已經安裝了編譯 curl 所需的工具,包括 gcc 、 make 和可能的其他庫。如果開發板交叉
    的頭像 發表于 08-30 15:33 ?766次閱讀

    嵌入式學習-飛凌嵌入式ElfBoard ELF 1板卡-在NXP源碼基礎上適配ELF 1開發板的按鍵功能

    本次源碼適配工作是在NXP i.MX6ULL EVK評估的Linux內核源碼(特定版本:Linux-imx_4.1.15)基礎上進行的。主要目標是調整功能接口引腳配置,以適應ELF
    發表于 07-04 09:11

    飛凌嵌入式ElfBoard ELF 1板卡-在NXP源碼基礎上適配ELF 1開發板的按鍵功能

    本次源碼適配工作是在NXP i.MX6ULL EVK評估的Linux內核源碼(特定版本:Linux-imx_4.1.15)基礎上進行的。主要目標是調整功能接口引腳配置,以適應ELF
    發表于 07-03 09:07

    米爾NXP i.MX 93開發板的Qt開發指南

    Qt應用開發中,推薦使用QtCreator集成開發環境,可以在LinuxPC下開發Qt應用,自動化地交叉編譯
    的頭像 發表于 06-07 08:01 ?1822次閱讀
    米爾NXP <b class='flag-5'>i.MX</b> 93<b class='flag-5'>開發板</b>的Qt<b class='flag-5'>開發</b>指南

    飛凌嵌入式ElfBoard ELF 1板卡-i.MX6ULL交叉編譯freetype字體引擎庫

    freetype。 交叉編譯zlib1、下載源碼https://zlib.net/2、將zlib-1.3.1.tar.gz 拷貝到開發環境/home/elf/work目錄下解壓elf@
    發表于 06-05 11:25

    QT開發學習筆記1(安裝交叉編譯器

    QT安裝交叉編譯器
    的頭像 發表于 02-18 10:02 ?1106次閱讀
    QT<b class='flag-5'>開發</b>學習筆記1(安裝<b class='flag-5'>交叉</b><b class='flag-5'>編譯器</b>)
    主站蜘蛛池模板: 免费国产99久久久香蕉 | 免费 的黄色 | 天天干人人| 国产精品污视频 | 婷婷六月丁 | 夜夜夜夜夜夜夜猛噜噜噜噜噜噜 | 日本大片网| 日本免费人成黄页在线观看视频 | 在线天堂中文新版有限公司 | 久久精品国产夜色 | 美女性爽视频国产免费 | 大胆国模一区二区三区伊人 | 香蕉久久久久久狠狠色 | 日本一本一道久久香蕉免费 | 午夜精品视频在线观看 | 天堂最新在线资源 | ⅹxxxx68日本老师hd | 亚洲伊人成综合成人网 | 五月亭亭激情五月 | 国产人成午夜免视频网站 | 人人干天天操 | 视频一区中文字幕 | 免费午夜在线视频 | 国产精品久久久久久久久齐齐 | 天天在线天天综合网色 | 国模私拍大尺度视频在线播放 | 国产精品福利视频手机免费观看 | 亚洲影视大全 | 免费观看四虎精品成人 | 色婷婷亚洲十月十月色天 | 一 级 黄 中国色 片 | 成人国产精品一级毛片了 | 日本国产视频 | 日a在线| 精品视频69v精品视频 | 欧美午夜色大片在线观看免费 | 色爽爽爽爽爽爽爽爽 | 天天干天天拍天天射天天添天天爱 | 天天操天天射天天插 | www我要色综合com | 免看乌克兰a一级 |