掌握嵌入式Linux編程0簡介

来源:https://www.cnblogs.com/testing-/archive/2023/05/31/17447423.html
-Advertisement-
Play Games

JRE 和 JDK JRE:Java運行環境,如果想要運行Java程式至少要安裝JRE JDK:Java開發環境(開發工具包),如果要開發Java程式,必須安裝JDK JRE = JVM + 核心類庫 JDK = JRE + 開發工具包 JDK > JRE >JVM 關係如圖所示: JDK下載地址: ...


簡介

多年來,Linux一直是嵌入式計算的主流。然而,涵蓋這一主題的書籍卻少之又少:本書旨在填補這一空白。術語 "嵌入式Linux "沒有很好的定義,可以應用於從恆溫器到Wi-Fi路由器到工業控制單元等各種設備內部的操作系統。然而,它們都是建立在相同的基本開源軟體上。這些就是我在本書中描述的技術,基於我作為工程師的經驗和我為培訓課程開發的材料。

技術不會停滯不前。圍繞嵌入式計算的行業與主流計算一樣容易受到摩爾定律的影響。這意味著指數級的增長,意味著自本書第一版出版以來,有大量的東西發生了令人驚訝的變化。這第三版經過全面修訂,使用了主要開源組件的最新版本,其中包括Linux 5.4、Yocto Project 3.1 Dunfell和Buildroot 2020.02 LTS。除了Autotools之外,本書現在還包括CMake,這是一個現代的構建系統,近年來被越來越多的人採用。

《掌握嵌入式Linux編程》大致按照你在實際項目中遇到的順序來涵蓋這些主題。前八章涉及項目的早期階段,包括選擇工具鏈、引導程式和內核等基礎知識。我以Buildroot和Yocto項目為例,介紹了嵌入式構建系統的概念。本節最後對Yocto項目進行了新的深入介紹。

第2節,第9至15章,探討了在認真進行開發之前需要做出的各種設計決定。它涵蓋了文件系統、軟體更新、設備驅動、初始程式和電源管理等主題。第12章演示了使用分線板進行快速原型開發的各種技術,包括如何閱讀原理圖、焊接焊頭以及使用邏輯分析儀對信號進行故障診斷。第14章是對Buildroot的深入研究,你將學習如何使用BusyBox runit將你的系統軟體分割成獨立的服務。

第3節,第16、17和18章,將在項目的實施階段幫助你。我們從Python打包和依賴性管理開始,隨著機器學習應用繼續風靡全球,這個話題的重要性越來越大。接下來,我們繼續討論各種形式的進程間通信和多線程編程。本節最後仔細研究了Linux是如何管理記憶體的,並演示瞭如何使用現有的各種工具來測量記憶體使用情況和檢測記憶體泄漏。

第四部分包括第19章和第20章,向你展示瞭如何有效地利用Linux提供的許多調試和剖析工具,以檢測問題和識別瓶頸。第19章現在介紹瞭如何配置Visual Studio Code以使用GDB進行遠程調試。第20章現在包括了BPF的內容,這是一項新的技術,能夠在Linux內核內部進行高級程式跟蹤。最後一章彙集了幾條線索來解釋Linux如何用於實時應用。

每一章都介紹了嵌入式Linux的一個主要領域。它描述了背景,以便你可以學習一般的原則,但它也包括詳細的工作實例,說明每一個領域的情況。你可以把它當作一本理論書,或一本實例書。如果你能同時做到這兩點,效果就最好了:理解理論併在現實生活中進行嘗試。

本書適用對象

本書是為那些對嵌入式計算和Linux有興趣的開發人員編寫的,他們希望將自己的知識擴展到該主題的各個分支。在編寫本書時,我假定他們對Linux命令行有基本的瞭解,在編程實例中,對C和Python語言有一定的瞭解。有幾章集中討論了嵌入式目標板中的硬體,因此,熟悉硬體和硬體介面在這些情況下將是一個絕對的優勢。

本書的內容

第1章 "起步",通過描述嵌入式Linux生態系統和你在開始項目時可利用的選擇來設置場景。

第2章,學習工具鏈,描述了工具鏈的組成部分,並告訴你如何為目標板創建一個交叉編譯代碼的工具鏈。它描述了從哪裡獲得工具鏈,並提供瞭如何從源代碼構建工具鏈的細節。

第3章,關於引導程式,解釋了引導程式在將Linux內核載入記憶體中的作用,並以U-Boot為例。它還介紹了設備樹,作為幾乎所有嵌入式Linux系統中用來編碼硬體細節的機制。

第4章,配置和構建內核,提供了關於如何為嵌入式系統選擇一個Linux內核併為設備內的硬體進行配置的信息。它還包括如何將Linux移植到新硬體上。

第5章,構建根文件系統,通過逐步指導如何配置根文件系統,介紹了嵌入式Linux實現的用戶空間部分的思想。

第6章,選擇構建系統,包括兩個常用的嵌入式Linux構建系統:Buildroot和Yocto項目,它們可以自動完成前四章中描述的步驟。

第7章,用Yocto開發,演示瞭如何在現有BSP層上構建系統映像,用Yocto的可擴展SDK開發板載軟體包,以及推出自己的嵌入式Linux發行版,並完成運行時軟體包管理。

第8章 "引擎蓋下的Yocto "是對Yocto構建工作流程和架構的介紹,包括對Yocto獨特的多層方法的解釋。它還通過實際配方文件的例子,分解了BitBake的語法和語義的基本知識。

第9章 "創建存儲策略 "討論了管理快閃記憶體的挑戰,包括原始快閃記憶體晶元和嵌入式MMC(eMMC)包。它描述了適用於每種技術類型的文件系統。

第10章,在現場更新軟體,研究了設備部署後更新軟體的各種方法,包括完全管理的空中(OTA)更新。討論的關鍵話題是可靠性和安全性。

第11章,與設備驅動程式的交互,描述了內核設備驅動程式如何通過實現一個簡單的驅動程式與硬體交互。它還描述了從用戶空間調用設備驅動程式的各種方法。

第12章,使用突破板進行原型開發,演示瞭如何使用為BeagleBone Black預製的Debian映像和外圍突破板來快速製作硬體和軟體原型。你將學會如何閱讀數據表、為板子佈線、Mux設備樹綁定以及分析SPI信號。

第13章,啟動--init程式,解釋了第一個用戶空間的
程式--init--如何啟動系統的其他部分。它描述了三個版本的init程式,每個版本都適用於不同的嵌入式系統,從簡單的BusyBox init,到System V init,再到目前最先進的方法systemd。

第14章 "從BusyBox runit開始 "告訴你如何使用Buildroot將你的系統分成獨立的BusyBox runit服務,每個服務都有自己專門的進程監督和日誌記錄,就像systemd所提供的那樣。

第15章 "電源管理 "考慮了各種調整Linux以降低功耗的方法,包括動態頻率和電壓調整,選擇更深的空閑狀態,以及系統掛起。其目的是使設備在電池充電的情況下能運行更長時間,同時也能運行得更冷。

第16章,打包Python,解釋了將Python模塊捆綁在一起進行部署有哪些選擇,以及何時使用一種方法而不是另一種。它包括pip、虛擬環境、conda和Docker。

第17章,學習進程和線程,從應用程式員的角度來描述嵌入式系統。本章研究了進程和線程、進程間通信和調度策略。

第18章,管理記憶體,介紹了虛擬記憶體背後的思想,以及地址空間是如何被劃分為記憶體映射的。它還描述瞭如何準確測量記憶體的使用,以及如何檢測記憶體泄漏。

第19章,用GDB調試,告訴你如何使用GNU調試器GDB和調試代理gdbserver,來調試在目標設備上遠程運行的應用程式。它接著展示瞭如何利用KGDB的內核調試存根,將這個模型擴展到調試內核代碼。

第20章,剖析和跟蹤,涵蓋了測量系統性能的可用技術,從整個系統的剖析開始,然後歸納到特定的
導致性能低下的特定區域。它還描述瞭如何使用Valgrind來檢查一個應用程式使用線程同步和記憶體分配的正確性。

第21章,實時編程,提供了Linux上實時編程的詳細指南,包括內核的配置和PREEMPT_RT實時內核補丁。內核跟蹤工具Ftrace被用來測量內核延遲並顯示各種內核配置的效果。

更好的利用本書

本書中使用的軟體完全是開放源代碼。幾乎在所有情況下,我都使用了寫作時的最新穩定版本。雖然我試圖以一種不針對具體版本的方式來描述主要功能,但不可避免的是,一些例子需要調整以適用於後來的軟體。

  • 更多細節請參見Yocto項目快速構建指南中的相容Linux發行版部分,網址是https://www.yoctoproject.org/docs/current/brief-yoctoprojectqs/brief-yoctoprojectqs.html。

嵌入式開發涉及兩個系統:用於開發程式的主機和運行程式的目標系統。對於主機系統,我使用了Ubuntu 20.04 LTS,但大多數Linux發行版只需稍加修改就可以使用。你可以決定在虛擬機中作為客人運行Linux,但你應該知道,有些任務,例如使用Yocto項目構建一個發行版,要求相當高,最好在Linux的本地安裝中運行。

我選擇了三個示範性的目標:QEMU模擬器、BeagleBone Black和Raspberry Pi 4。使用QEMU意味著你可以嘗試大部分的例子,而不需要投資任何額外的硬體。另一方面,如果你有真正的硬體,有些事情會做得更好,為此,我選擇了BeagleBone Black,因為它不貴,可以廣泛使用,而且它有非常好的社區支持。樹莓派4因其內置Wi-Fi和藍牙而被添加到第三版中。當然,你並不局限於這三個目標。本書的理念是為你提供問題的一般解決方案,這樣你就可以將它們應用於廣泛的目標板。

下載示例代碼文件
你可以從GitHub下載本書的示例代碼文件,地址是
https://github.com/PacktPublishing/Mastering-Embedded-Linux-Programming-Third-Edition。

釘釘或微信號: pythontesting 微信公眾號:pythontesting
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 假設,班級里40位同學,我們用程式保存40位學生的信息:學號,姓名,性別,生日,身份證號。如果是你,你會怎麼實現? 小菜同學拿到這個題,奮書疾筆,馬上寫出如下代碼: ArrayList list = new ArrayList(); ​ string stuNo1="10001"; string n ...
  • 1. 數組(Array) 數組是一個存儲相同類型元素的固定大小的順序集合。數組是用來存儲數據的集合,通常認為數組是一個同一類型變數的集合。 聲明數組變數並不是聲明 number0、number1、...、number99 一個個單獨的變數,而是聲明一個就像 numbers 這樣的變數,然後使用 nu ...
  • 今天這一份資料庫可以幫助學習認識簡繁體字。資料庫提供簡繁欄位,可以根據簡體選擇繁體,也可以根據繁體選擇簡體。 需要說明的是: 1.有很多簡體繁體字是一樣的,簡體字繁體字不一樣的記錄一共僅有3168條。 2.簡字中存在相同字多條記錄的情況,如下圖,不相同的簡字統計共有2萬多個。 3.同2一樣繁字中也存 ...
  • 很多時間,寫代碼並不能一擼到底,中間都是經歷過無數次的調試,才能正常正確的運行起來。就好像一臺設備剛買來也需要不斷的調試才能達到最佳狀態。 DotNet程式的調試,是DotNet程式員必備的技能之一,開發出穩定的程式、解決程式的疑難雜症都需要很強大的調試能力。DotNet調試有很多方法和技巧。 1. ...
  • C# 流程語句分為:順序結構,選擇結構,迴圈結構。 1. 順序結構 順序結構指的是程式一步步向下執行。 int a =10; int b =a; a++; 2. 選擇結構 C# 提供以下類型的選擇語句。 聲明描述 if聲明 一個if語句包含一個布爾表達式後跟一個或多個語句。 if...else聲明 ...
  • 在用雲伺服器搭建網站的時候,我們通常在Windows上寫好網站,再使用FTP客服端把寫好的網頁傳到Linux伺服器上。用Nginx搭建web伺服器時,預設的網站目錄是/var/www/html,該目錄的所有者是root和root組,如果用非root許可權的普通用戶登陸FTP,是無法對/var/www/ ...
  • 大家好,我是 god23bin。歡迎大家繼續圍觀《一分鐘學一個 Linux 命令》,每天只需一分鐘,記住一個 Linux 命令不成問題。本篇文章將聚焦於 pwd 命令,一個超級簡單又常用的命令。 ...
  • 哈嘍大家好,我是鹹魚 我們知道,隨著企業規模或者說業務規模的不斷擴大,為了應對不斷增長的業務需求和提高系統的可伸縮性、可靠性和性能,電腦系統由一開始的單體系統逐漸發展成分散式系統 那麼今天鹹魚給大家介紹一些關於小白在學習分散式系統遇到的一些常見誤解 ## 誤解1.網路是可靠的 **在分散式系統中, ...
一周排行
    -Advertisement-
    Play Games
  • 前言 在我們開發過程中基本上不可或缺的用到一些敏感機密數據,比如SQL伺服器的連接串或者是OAuth2的Secret等,這些敏感數據在代碼中是不太安全的,我們不應該在源代碼中存儲密碼和其他的敏感數據,一種推薦的方式是通過Asp.Net Core的機密管理器。 機密管理器 在 ASP.NET Core ...
  • 新改進提供的Taurus Rpc 功能,可以簡化微服務間的調用,同時可以不用再手動輸出模塊名稱,或調用路徑,包括負載均衡,這一切,由框架實現並提供了。新的Taurus Rpc 功能,將使得服務間的調用,更加輕鬆、簡約、高效。 ...
  • 順序棧的介面程式 目錄順序棧的介面程式頭文件創建順序棧入棧出棧利用棧將10進位轉16進位數驗證 頭文件 #include <stdio.h> #include <stdbool.h> #include <stdlib.h> 創建順序棧 // 指的是順序棧中的元素的數據類型,用戶可以根據需要進行修改 ...
  • 前言 整理這個官方翻譯的系列,原因是網上大部分的 tomcat 版本比較舊,此版本為 v11 最新的版本。 開源項目 從零手寫實現 tomcat minicat 別稱【嗅虎】心有猛虎,輕嗅薔薇。 系列文章 web server apache tomcat11-01-官方文檔入門介紹 web serv ...
  • C總結與剖析:關鍵字篇 -- <<C語言深度解剖>> 目錄C總結與剖析:關鍵字篇 -- <<C語言深度解剖>>程式的本質:二進位文件變數1.變數:記憶體上的某個位置開闢的空間2.變數的初始化3.為什麼要有變數4.局部變數與全局變數5.變數的大小由類型決定6.任何一個變數,記憶體賦值都是從低地址開始往高地 ...
  • 如果讓你來做一個有狀態流式應用的故障恢復,你會如何來做呢? 單機和多機會遇到什麼不同的問題? Flink Checkpoint 是做什麼用的?原理是什麼? ...
  • C++ 多級繼承 多級繼承是一種面向對象編程(OOP)特性,允許一個類從多個基類繼承屬性和方法。它使代碼更易於組織和維護,並促進代碼重用。 多級繼承的語法 在 C++ 中,使用 : 符號來指定繼承關係。多級繼承的語法如下: class DerivedClass : public BaseClass1 ...
  • 前言 什麼是SpringCloud? Spring Cloud 是一系列框架的有序集合,它利用 Spring Boot 的開發便利性簡化了分散式系統的開發,比如服務註冊、服務發現、網關、路由、鏈路追蹤等。Spring Cloud 並不是重覆造輪子,而是將市面上開發得比較好的模塊集成進去,進行封裝,從 ...
  • class_template 類模板和函數模板的定義和使用類似,我們已經進行了介紹。有時,有兩個或多個類,其功能是相同的,僅僅是數據類型不同。類模板用於實現類所需數據的類型參數化 template<class NameType, class AgeType> class Person { publi ...
  • 目錄system v IPC簡介共用記憶體需要用到的函數介面shmget函數--獲取對象IDshmat函數--獲得映射空間shmctl函數--釋放資源共用記憶體實現思路註意 system v IPC簡介 消息隊列、共用記憶體和信號量統稱為system v IPC(進程間通信機制),V是羅馬數字5,是UNI ...