精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

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

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

3天內不再提示

如何進行嵌入式Linux系統開發?

嵌入式IoT ? 來源:嵌入式IoT ? 作者:嵌入式IoT ? 2021-03-22 11:30 ? 次閱讀

樹莓派4 嵌入式Linux開發過程詳解

1.概述

2.開發環境概述

2.1 安裝虛擬機環境

2.2 樹莓派開發環境搭建

3.交叉編譯工具的安裝與uboot的編譯

3.1 安裝arm 64位交叉編譯環境

3.2 編譯樹莓派上的uboot

3.3 將u-boot放到樹莓派上運行

4.樹莓派4b上的Linux編譯和下載

4.1 編譯樹莓派Linux源代碼

4.2 將編譯好的Linux固件運行

5.根文件使用

5.1 uboot中設置啟動項

5.2 插入SD卡掛在到虛擬機上

5.3 修改文件腳本

6.小結

1.概述

在這篇文章中,將會通過樹莓派4的Linux的啟動過程,描述如何進行嵌入式Linux系統開發的思路。通過樹莓派4B的啟動流程,看到一個Linux啟動過程,同時,通過一步一步搭建一個完整的樹莓派嵌入式Linux開發環境,來指導分析各部分的開發過程。

通過對本文的閱讀,可以掌握一些嵌入式Linux開發和環境搭建的方法,也能夠對樹莓派4的運行流程以及Linux的運行流程有一個大致的了解,從romboot--》uboot--》kernel--》rootfs整個運行流程有了比較清楚的了解后,再去學習linux以及嵌入式底層,將會更加的清晰。

2.開發環境概述

嵌入式軟件是獨特的,它需要利用PC機編譯嵌入式平臺可以運行的機器碼,這樣就需要借助交叉編譯工具鏈進行。在進行Linux的開發工作時,都會利用宿主機進行交叉編譯后,將生成的目標代碼下載到機器上運行。

一般來說,開發板和PC的連接渠道是串口和網線,UART可以看到基本的調試信息,而網線則可以用來將板子和電腦進行文件傳輸。

串口連接如下:

網線的連接一般可以將樹莓派和PC都在同一個網段下。

當在同一個網段內進行開發時,比較的方便。做嵌入式Linux開發,使用Linux比較方便。由于大部分學習和工作都是在windows下,所以這里可以在Ubuntu下裝一個虛擬機進行開發工作。

2.1 安裝虛擬機環境

在windows上的虛擬機環境可以安裝VMware Workstation 16 Player或者Oracle VM VirtualBox。

2.1.1 鏡像下載

比如VMware Workstation 16 Player這個軟件,然后從ubuntu的官方下載特定版本。

可以從國內鏡像下載,這樣比較快。

選擇特定的版本進行安裝

853e5bb4-891f-11eb-8b86-12bb97331649.png

下一步開始安裝ubuntu20.04

然后設置用戶名和密碼

選擇虛擬機硬盤空間的大小,為了方便使用,這里設置40G空間。

接著點擊完成開始安裝。

等一段時間后,會進入自動安裝的界面,全程無需干預。

完成安裝后,會自動啟動。

2.1.2 必要軟件包的安裝

下面列出了需要安裝的軟件包

gitsudo apt install git用于代碼管理,代碼下載

net-toolssudo apt install net-tools提供ifconfig等功能

vimsudo apt install vim文本編輯工具

tftpsudo apt install tftpd-hpa可以通過tftp與樹莓派之間傳輸文件

nfssudo apt install nfs-kernel-server可以提供網絡共享文件

軟件名稱安裝命令說明

git

首先安裝git

sudo apt install git

為了管理工程,首先需要創建一個Github的賬號,然后配置git的用戶名和密碼。

git config --global user.name “YOUR_FIRST_NAME YOUR_LAST_NAME” git config --global user.email “YOUR_GIT_ASSOCIATED_EMAIL”

net-tools

輸入下面的命令可以進行安裝工作

sudo apt install net-tools

要確保網絡環境在一個網段,那么就需要設置網卡為橋接模式。

需要注意的是在選擇網絡適配器時,選擇自己的網卡。

在Ubuntu上輸入ifconfig,并且在window上輸入ipconfig。只要前面的網段一樣,最后不一樣即可。這樣就可以進行下一步的工作了。

tftp

TFTP (Trivial File Transfer Protocol) 是一個簡化版的FTP,適合用于簡潔的場景,比如嵌入式開發的時候向下位機傳輸文件。

安裝tftp的目的是方便開發,在樹莓派上,存儲介質是SD卡,如果每次編譯完成后,都需要插拔SD卡,然后將Linux的固件進行安裝,這樣非常的麻煩,這里可以采用uboot通過tftp加載Linux的固件的方式進行加載。

安裝過程如下:

首先安裝復位程序

sudo apt install tftpd-hpa sudo apt install tftp-hpa

檢查服務器的運行狀態

sudo systemctl status tftpd-hpa

打開配置文件

sudo vim /etc/default/tftpd-hpa

編輯的內容如下:

TFTP_USERNAME=“tftp” #tftpd程序使用的賬戶 TFTP_DIRECTORY=“/srv/tftp” #目錄 TFTP_ADDRESS=“:69” #端口 TFTP_OPTIONS=“--secure --create” #--secure 不設置會有跨目錄的問題 --create是要自己添加的,給客戶端寫入數據的權力

設置訪問目錄的權限

sudo chown tftp:tftp /srv/tftp

重啟tftp服務器

sudo systemctl restart tftpd-hpa

本地測試tftp服務器

1.首先在/srv/tftp目錄中新建一個abc.txt文件。

sudo vim /srv/tftp/abc.txt

2.輸入tftp 127.0.0.1

出現上述的現象,表示測試成功。

遠程測試

需要保證tftp服務器沒有問題,可以在windows上下載一個Tftp64的軟件。打開后選擇tftp client選擇傳輸的文件即可。

選擇put按鈕,彈出下面的命令表示成功。如果不成功,需要注意電腦防火墻的設置問題。

檢查tftp服務器中的文件,可以正常的見到文件,表示tftp環境搭建成功。

nfs

安裝nfs目的是一旦開發Linux上的應用程序時,不希望頻繁的傳輸文件,每次在宿主機上編譯好應用程序后,直接拷貝到本地目錄,嵌入式平臺上的Linux可以通過nfs文件系統訪問到宿主機上剛編譯好的程序,這樣更加的方便Linux的應用程序的開發工作。

sudo apt install nfs-kernel-server

然后創建一個nfs的共享目錄,用于存放共享文件。

sudo mkdir /opt/nfs

修改配置文件

sudo vim /etc/exports /opt/nfs 10.1.1.* (rw,async,root_squash)

編輯/etc/exports中的文件如下:

其中10.1.1.*為自己網段的地址信息。

最后重啟nfs即可

sudo systemctl restart nfs-kernel-server

測試nfs的安裝情況

安裝完成后,可以進行nfs客戶端的安裝

sudo apt install nfs-common

然后創建一個本地的文件夾目錄

sudo mkdir -p /opt/nfs-client

最后掛載即可

sudo mount -t nfs 10.1.1.160:/opt/nfs /opt/nfs-client

當在/opt/nfs下創建一個文件,/opt/nfs-client目錄同樣可以看到,表示成功。

2.2 樹莓派開發環境搭建

2.2.1 硬件連接

樹莓派4上的實際硬件引腳分布如上圖所示,其中需要連接串口RX、TX、GND。

準備一個8g以上的SD卡,然后打開Raspberry Pi Imager,選擇樹莓派鏡像燒錄進去。

進行這一步的目的,是因為樹莓派啟動流程需要從SD卡中加載第一階段的啟動文件。

默認情況下,燒錄的固件,連接上串口后是沒有輸出的,需要自己修改sd卡中的config.txt文件。在末尾加上下面的一句話即可。

enable_uart=1

這樣通過mobaxterm工具打開串口,并且連接上電源后,可以看到如下的輸出

接著輸入用戶名,密碼如下

raspberrypi login:pi Password:raspberry

這樣就可以使用默認的樹莓派4串口調試功能了。

2.2.2 樹莓派4b啟動流程分析

簡述一下樹莓派4b的啟動流程是,上電后,樹莓派會自動加載位于SD卡文件中的bootcode.bin文件,該文件是加載到樹莓派的GPU中運行,該程序初始化PLL,DDR等,接著讀取SD卡文件中的start4.elf文件去執行,該文件執行過程中,會讀取config.txt文件,根據配置腳本選擇可以執行的固件。

往往做嵌入式開發,其底層的啟動邏輯是要非常清晰的,這樣才能在任何情況下梳理清楚問題所在,從而確保硬件和軟件層面上的一致性。

上圖基本上展示了一個通用的嵌入式Linux的啟動流程,每一個階段的特點和功能點都有著很好的描述。

而樹莓派4b上的Broadcom BCM2711的啟動遵循以下的流程。

第一階段的bootloader:

第一階段的BootROM一般是固化在芯片的內部,在GPU中執行,此時ARM核處于復位狀態。

樹莓派4b的BootROM通過EEPROM加載進來,4b之前都是SD卡上的bootcode.bin文件。

第二階段的bootloader:

這一階段的boot固件的加載方式都是從SD卡、網絡、USB等等。

在樹莓派4上,使用的是SD卡中的start.elf二進制文件。

start.elf文件去SD的文件系統中找到config.txt文件,然后根據里面的信息處理boot流程。

這篇文章中,主要修改config.txt配置文件,進行uboot的啟動流程。

3.交叉編譯工具的安裝與uboot的編譯

3.1 安裝arm 64位交叉編譯環境

因為需要編譯64位的程序,所以這里需要安裝arm的64位交叉編譯環境。

https://www.linaro.org/downloads/

從上面的網站中進去

建議下載gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu.tar.xz。

下載完成后,放到指定的目錄。

#創建一個文件夾 sudo mkdir -p /opt/linaro #解壓到指定的文件夾路徑 sudo tar -xvf gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu.tar -C /opt/linaro

更新環境變量

sudo vim ~/.bashrc

在末尾添加如下的

alias crosscompiler=‘export KERNEL=kernel8;export ARCH=arm64;export CROSS_COMPILE=/opt/linaro/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-’

更新環境

source ~/.bashrc

3.2 編譯樹莓派上的uboot

首先需要下載代碼

git clone https://github.com/u-boot/u-boot.git

正常的下載完成圖如下:

8a6f08cc-891f-11eb-8b86-12bb97331649.png

接著切換分支,然后開始編譯。

cd u-boot git checkout v2020.04-rc3

在編譯之前,首先需要安裝編譯必備的程序

sudo apt install u-boot-tools bison bc make flex libssl-dev ncurses-*

安裝完成后,執行

crosscompiler

該命令為環境變量中定義的命令,可以設置環境變量。

make rpi_4_defconfig

直接采用默認的配置編譯即可。

make -j $(nproc)

編譯完成后的uboot.bin文件就是可以直接在樹莓派4b上執行的程序。

8a9ab56c-891f-11eb-8b86-12bb97331649.png

3.3 將u-boot放到樹莓派上運行

到這一步就可以將編譯好的u-boot程序放到樹莓派4b上運行了。

將樹莓派的SD卡插到電腦上,通過將SD卡中的config.txt重新命令為config.txt.bak。并且新建config.txt。

arm_control=0x200 kernel=u-boot.bin dtoverlay=disable-bt

這三行的意思是

arm_control=0x200 #因為樹莓派4b支持的是64位的架構,這里用來表示運行64位程序

使用uboot

kernel=u-boot.bin # kernel表示運行的固件

使能串口

dtoverlay=disable-bt #樹莓派4設計的時候,如果打開了串口調試,則藍牙無法使用

將SD卡插入電腦,可以看到uboot正常的啟動。

8ac53710-891f-11eb-8b86-12bb97331649.png

4.樹莓派4b上的Linux編譯和下載

4.1 編譯樹莓派Linux源代碼

目前已經完成了樹莓派4b的uboot功能,接下來開始編譯樹莓派的Linux kernel了。

樹莓派單獨有維護Linux的代碼分支,可以通過下面的命令進行下載。

git clone --branch rpi-5.6.y https://github.com/raspberrypi/linux

進入Linux的目錄

創建一個新的目錄存放編譯好的固件

mkdir rpi_hw

開始編譯

make O=rpi_hw bcm2711_defconfig

去掉MMC/SD/SDIO驅動

make O=rpi_hw menuconfig

進入Device Driver選擇去掉MMC/SD/SDIO card support。

保存配置后,就可以編譯了。

make O=rpi_hw -j $(nproc)

為什么要去掉MMC/SD/SDIO驅動?

這是因為需要編譯從網絡啟動的驅動,所以不需要在樹莓派的SD卡里面進行操作。

編譯完成后,可以在rpi_hw/arch/arm64/boot中找到編譯好的文件。

8b0195ca-891f-11eb-8b86-12bb97331649.png

將編譯完成的Linux內核文件放到

sudo cp rpi_hw/arch/arm64/boot/Image /srv/tftp/

4.2 將編譯好的Linux固件運行

在將編譯好的固件通過uboot加載到RAM中運行的期間,首先需要明白樹莓派4b內存的分布情況。

通過uboot中的bdinfo命令,可以看到樹莓派4b上有兩塊bank,第一塊bank在0x00000000,第二塊在0x40000000。

而樹莓派4b,當從SD卡中加載Image文件時,加載到DRAM的0x8000的地址處開始運行。

當然,地址也可以在uboot中設置,Linux會重新將代碼重定位。

此時,需要在uboot中設置啟動信息了。

首先設置uboot的靜態ip地址

setenv ipaddr 10.1.1.100 #設置開發板的靜態地址(自定義) setenv serverip 10.1.1.160 #設置服務器的地址 setenv netmask 255.255.255.0 saveenv reset

上述操作設置了ip地址接下來設置啟動

setenv kernel_addr_r 0x8000 setenv kernel Image setenv netboot ‘tftp ${kernel_addr_r} ${kernel} && booti ${kernel_addr_r} - ${fdtcontroladdr}’ setenv bootcmd ‘run netboot’ setenv bootargs ‘console=ttyAMA0’ saveenv reset

可以顯示如下:

最后啟動后報錯

這個很正常,目前沒有rootfs。但是現在Linux的內核可以正常的加載和調試了。

下面來掛在rootfs。

5.根文件使用

關于通用根文件系統的制作過程,這篇文章就不提了,現在主要描述如何使用。

5.1 uboot中設置啟動項

首先在uboot中設置路徑。

setenv nfsroot /opt/nfs/

設置啟動參數

setenv bootargs “console=ttyAMA0,115200 root=/dev/nfs rw nfsroot=${serverip}:${nfsroot},v3,tcp ip=$ipaddr:$serverip::$netmask:off”

保存配置

saveenv

5.2 插入SD卡掛在到虛擬機上

首先將U盤掛載到虛擬機上

可以看到出現兩個磁盤

其中:

rootfs為Linux根文件系統

boot為可以在windows上訪問的ext32文件

可以將rootfs里的文件全部拷貝到/opt/nfs/

sudo cp * /opt/nfs/ -R

在/opt/nfs目錄下,新建一個file的文件夾,把boot里面的文件全部拷貝進去即可

sudo mkdir -p /opt/nfs/file sudo cp * /opt/nfs/file/

5.3 修改文件腳本

需要修改

sudo vim etc/fstab

新增如下文件

10.1.1.160:/opt/nfs/file /boot nfs defaults,vers=4.1,proto=tcp 0 0

8c03e464-891f-11eb-8b86-12bb97331649.png

其目的是將默認的兩個項列表屏蔽掉,只需要掛載nfs里面的文件系統即可。

改完后,插上SD卡,就可以正常從tftp中獲取Linux的內核固件,并且能夠從nfs文件系統中掛載根文件系統了。

8c24e6be-891f-11eb-8b86-12bb97331649.png

如果發現需要密碼,或者密碼忘記了,可以進入

cd /opt/nfs/ sudo vim /etc/passwd

將中間的x刪掉。

8c82e5b6-891f-11eb-8b86-12bb97331649.png

在Linux中,默認x表示需要密碼進入。

6.小結

本文從樹莓派整個Linux系統的環境搭建和樹莓派的啟動進行一定的分析。對樹莓派的boot、u-boot加載Linux的kernel,以及掛載nfs文件系統做了一些實驗。

最后的自己制作根文件系統的部分,采用了樹莓派默認的根文件系統,如果需要自己裁剪制作,可以進行定制操作。

整個嵌入式Linux開發和環境搭建過程都可以在樹莓派4b上很好的進行測試,萬變不離其宗,掌握了嵌入式開發的流程和工具,做應用和做驅動開發都十分的方便和高效。

由于時間關系,當前還有一些實驗沒有完成,比如Linux上的應用開發,還有驅動開發等等,還有jlink調試等等。

樹莓派4b上學習Linux的使用和啟動非常的方便,價格也非常的合理,是一塊不錯的開發平臺。

原文標題:樹莓派4 嵌入式Linux開發過程詳解

文章出處:【微信公眾號:嵌入式IoT】歡迎添加關注!文章轉載請注明出處。

責任編輯:haq

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

    關注

    87

    文章

    11123

    瀏覽量

    207919
  • 樹莓派
    +關注

    關注

    116

    文章

    1679

    瀏覽量

    105256

原文標題:樹莓派4 嵌入式Linux開發過程詳解

文章出處:【微信號:Embeded_IoT,微信公眾號:嵌入式IoT】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    嵌入式linux開發的基本步驟有哪些?

    嵌入式Linux開發是一個復雜的過程,涉及到硬件選擇、操作系統移植、驅動開發、應用程序開發等多個
    的頭像 發表于 09-02 09:11 ?185次閱讀

    嵌入式linux開發板怎么操作

    嵌入式Linux開發板是一種基于Linux操作系統嵌入式
    的頭像 發表于 09-02 09:09 ?203次閱讀

    嵌入式linux開發板芯片的工作原理

    了處理器、存儲器、輸入/輸出接口等硬件資源的嵌入式系統開發平臺。它通常采用Linux操作系統作為底層軟件平臺,提供了豐富的開發工具和庫函數,
    的頭像 發表于 09-02 09:07 ?172次閱讀

    【出版發行】嵌入式系統原理與開發——基于RISC-V和Linux系統

    【出版發行】嵌入式系統原理與開發——基于RISC-V和Linux系統
    的頭像 發表于 07-26 08:36 ?175次閱讀
    【出版發行】<b class='flag-5'>嵌入式</b><b class='flag-5'>系統</b>原理與<b class='flag-5'>開發</b>——基于RISC-V和<b class='flag-5'>Linux</b><b class='flag-5'>系統</b>

    專家力薦|《嵌入式系統原理與開發——基于RISC-V和Linux系統》新書發售

    當前,嵌入式系統已成為智能設備的核心之一,RISC-V+Linux的開源力量為嵌入式系統注入強大的創新動力。作為中國RISC-V軟硬件生態領
    的頭像 發表于 07-24 08:20 ?285次閱讀
    專家力薦|《<b class='flag-5'>嵌入式</b><b class='flag-5'>系統</b>原理與<b class='flag-5'>開發</b>——基于RISC-V和<b class='flag-5'>Linux</b><b class='flag-5'>系統</b>》新書發售

    ARM嵌入式Linux 系統開發從入門到精通

    ARM嵌入式Linux 系統開發從入門到精通
    發表于 03-10 18:44

    嵌入式Linux開發的三種方式

    嵌入式Linux開發主要有三種方式:裸機開發、SDK開發和驅動開發
    的頭像 發表于 01-22 14:22 ?789次閱讀

    QE for AFE嵌入式系統開發的評估工具說明

    電子發燒友網站提供《QE for AFE嵌入式系統開發的評估工具說明.pdf》資料免費下載
    發表于 12-21 10:27 ?0次下載
    QE for AFE<b class='flag-5'>嵌入式</b><b class='flag-5'>系統開發</b>的評估工具說明

    基于模型的設計嵌入式電機控制系統開發

    電子發燒友網站提供《基于模型的設計嵌入式電機控制系統開發.pdf》資料免費下載
    發表于 11-23 09:26 ?0次下載
    基于模型的設計<b class='flag-5'>嵌入式</b>電機控制<b class='flag-5'>系統開發</b>

    嵌入式系統開發資料分享

    電子發燒友網站提供《嵌入式系統開發資料分享.rar》資料免費下載
    發表于 11-10 09:41 ?1次下載
    <b class='flag-5'>嵌入式</b><b class='flag-5'>系統開發</b>資料分享

    基于LPC2131型ARM數子時鐘嵌入式系統開發

    電子發燒友網站提供《基于LPC2131型ARM數子時鐘嵌入式系統開發.doc》資料免費下載
    發表于 10-26 14:17 ?0次下載
    基于LPC2131型ARM數子時鐘<b class='flag-5'>嵌入式</b><b class='flag-5'>系統開發</b>

    Linux系統嵌入式開發是什么

    嵌入式開發聽起來很高大上,但其實它就在我們身邊。   嵌入式開發是指將操作系統、應用程序或數據存儲在嵌入式設備中,如手機、平板電腦、智能家居等。   隨著物聯網時代的到來,
    的頭像 發表于 10-12 15:40 ?1527次閱讀

    基于網絡的嵌入式監控系統開發

    電子發燒友網站提供《基于網絡的嵌入式監控系統開發.pdf》資料免費下載
    發表于 10-12 10:30 ?0次下載
    基于網絡的<b class='flag-5'>嵌入式</b>監控<b class='flag-5'>系統開發</b>

    什么是嵌入式Linux

    之有運行程序的能力與作用。在很多智能家電開發,智能產品的研究上有著主導的作用。(對個人、團隊開發產品有興趣的朋友一定要看看嵌入式!) linux
    發表于 10-11 13:47

    嵌入式Linux應用開發的完全手冊

    障礙。很多人買了開發板想進一步練習,卻發現不知從何入手。 鑒于上述種種困難及需求,作者結合自己的學習經歷、工.作心得寫成此書,期望能幫助讀者加快嵌入式 Linux 的入門速度,并體會到深入學習
    發表于 09-25 07:12