本系列文章深入探討了新興的確定性以太網(wǎng)標(biāo)準(zhǔn)以太網(wǎng)時(shí)間敏感網(wǎng)絡(luò) (TSN),以及如何在各種基于 Linux 的嵌入式系統(tǒng)上有效地實(shí)現(xiàn)它。我們將使用一系列低成本、現(xiàn)成的開發(fā)板硬件,演示如何為我們的用例配置 Raspberry Pi 和聯(lián)發(fā)科 LinkIt 智能板,然后使用實(shí)時(shí)數(shù)據(jù)包技術(shù)在設(shè)備和設(shè)備之間進(jìn)行通信控制機(jī)器人外圍設(shè)備。
首先,需要對底層組件有基本的了解。在本文中,我們從嵌入式 Linux 開始。
桌面 Linux 與嵌入式 Linux
嵌入式 Linux 是 Linux 內(nèi)核的改編版,用于嵌入式系統(tǒng)。嵌入式 Linux 最流行的例子是 Android 操作系統(tǒng)。
但是,需要大量硬件資源來支持嵌入式 Linux,特別是如果它將部署在實(shí)時(shí)機(jī)器對機(jī)器 (M2M) 通信、機(jī)器人控制或本系列后面重點(diǎn)介紹的復(fù)雜計(jì)時(shí)應(yīng)用等用例中。 這些資源至少包括支持以太網(wǎng)和其他基本接口的嵌入式硬件平臺(板或片上系統(tǒng)),以及用于容納操作系統(tǒng)、庫、文件系統(tǒng)、應(yīng)用程序、引導(dǎo)加載程序、等等
就像普通的 Linux 一樣,嵌入式 Linux 是開源的、可修改的,并且是用 C 編寫的。同樣就像桌面 Linux 或任何其他操作系統(tǒng)一樣,嵌入式 Linux 的作用是將用戶和應(yīng)用程序從底層處理器中抽象出來,內(nèi)存和其他硬件組件;為各種功能分配和交付系統(tǒng)資源;同時(shí)管理多個(gè)任務(wù)和應(yīng)用程序,等等。因此,嵌入式 Linux 系統(tǒng)堆棧看起來就像您的典型桌面。
盡管如此,如果您現(xiàn)在還沒有注意到,嵌入式 Linux 和傳統(tǒng)桌面 Linux 之間存在許多顯著差異。其中包括直接從閃存而不是硬盤驅(qū)動器啟動的能力。
下面提供了一個(gè)比較嵌入式和桌面 Linux 之間一些主要差異的圖表。
嵌入式 Linux:交叉編譯器、庫和引導(dǎo)加載程序
由于嵌入式 Linux 是為特定應(yīng)用程序設(shè)計(jì)的,因此工程師在開始需要開源操作系統(tǒng)的系統(tǒng)設(shè)計(jì)時(shí)必須使用一些特定的開發(fā)工具。下面當(dāng)然不是一個(gè)詳盡的列表,但一個(gè)很好的起點(diǎn)是使用正確的庫、強(qiáng)大的交叉編譯器和與 Linux 內(nèi)核配對的高效引導(dǎo)加載程序。
交叉編譯器
對于不熟悉的人,交叉編譯器是一種編譯器,它執(zhí)行編寫的代碼以在編譯器所在的機(jī)器之外的其他機(jī)器上運(yùn)行。例如,在您的 PC 或筆記本電腦上運(yùn)行的交叉編譯器能夠生成為嵌入式系統(tǒng)(如 Android 智能手機(jī))編寫的代碼。
嵌入式 Linux 系統(tǒng)需要交叉編譯器,因?yàn)檫@些設(shè)備通常沒有本地編譯代碼所需的資源,因此必須在其他地方編譯代碼然后交付給目標(biāo)。
當(dāng)涉及到提供諸如大小優(yōu)化、支持控制處理的特性等特性的交叉編譯器時(shí),有幾個(gè)選項(xiàng)。但是這里列出了一些最常見的交叉編譯器:
構(gòu)建根
Crosstool-NG
約克托
C 庫
C 庫提供內(nèi)核和應(yīng)用程序之間的接口,因此必須是交叉編譯過程的一部分。嵌入式 Linux 系統(tǒng)中的任何程序,無論是用 python、java 還是其他語言編寫的,都必須在運(yùn)行時(shí)調(diào)用 C 庫才能通過 Linux 內(nèi)核訪問硬件資源。
以下是一些用于嵌入式 Linux 系統(tǒng)的流行 C 庫。
glibc – 標(biāo)準(zhǔn)的 GNU C 庫功能豐富,但以占用大量內(nèi)存為代價(jià)。它也沒有任何配置選項(xiàng)。
uClibc – “u”表示 uClibc 是一個(gè)用于嵌入式系統(tǒng)的小型微控制器 C 庫。
musl – musl 也很小,在 RAM 和存儲空間有限的系統(tǒng)中是一個(gè)不錯(cuò)的選擇。
eglibc – eglibc 與 glibc 相同,但經(jīng)過修改使其更適合在嵌入式設(shè)備中使用,例如支持配置。
特定應(yīng)用程序庫
嵌入式 Linux 內(nèi)核的功能有限,因此需要特定的庫。我們當(dāng)然不能全部列出,但下面列出了一些更受歡迎的。其中一些將在本系列的后面部分使用。
libgpiod——標(biāo)準(zhǔn)命令行并不是當(dāng)今與 Linux 設(shè)備文件交互的唯一方式。libgpiod 用于與 Linux 設(shè)備中的 GPIO 硬件進(jìn)行交互。
libusb ——libusb 是一個(gè) C 庫,它為來自單一平臺的所有通用 USB 設(shè)備提供驅(qū)動程序。
套接字——套接字庫連接網(wǎng)絡(luò)上的節(jié)點(diǎn)。
serdisplib – 這個(gè)庫可以驅(qū)動多個(gè)顯示器,如 OLED、USB 顯示器或帶有內(nèi)置控制器的顯示器。
Pigpio – Pigpio 庫可用于控制 Raspberry Pi GPIO。
opc-ua – opc-ua 協(xié)議是一種適用于時(shí)間敏感網(wǎng)絡(luò)的協(xié)議。
lockdev - 鎖定和解鎖設(shè)備
libxls - 該庫用于讀取和轉(zhuǎn)換 excel 文件。
libstroke – 用于識別鼠標(biāo)筆劃和手勢的庫。
libserialport – 在編寫使用串行端口的軟件時(shí)提取特定于操作系統(tǒng)的詳細(xì)信息
hidapi – 用于與 USB 和藍(lán)牙 HID 設(shè)備通信的庫。血紅蛋白
mjpg_streamer – 用于從一個(gè)或多個(gè)輸入中捕獲 JPEG 幀并通過 IP 網(wǎng)絡(luò)流式傳輸它們
奶酪– 奶酪可以幫助您使用網(wǎng)絡(luò)攝像頭拍攝視頻、照片等。
Elisa – 這是一個(gè)簡單的音樂播放器,因此您可以播放任何音頻。
引導(dǎo)加載程序
引導(dǎo)加載程序是系統(tǒng)上電后運(yùn)行的第一個(gè)代碼,它處理基本的硬件初始化,并從嵌入式 Linux 系統(tǒng)中的硬盤驅(qū)動器或 SD 卡或閃存等可引導(dǎo)設(shè)備加載操作系統(tǒng)。一旦引導(dǎo)加載程序?yàn)?Linux 內(nèi)核設(shè)置了可執(zhí)行環(huán)境并且內(nèi)核開始執(zhí)行,就不再需要引導(dǎo)加載程序。
引導(dǎo)加載程序有各種形狀和大小,可以根據(jù)用戶或系統(tǒng)需要進(jìn)行定制。事實(shí)上,一些嵌入式板帶有引導(dǎo)加載程序。
審核編輯:郭婷
評論
查看更多