當前位置:首頁 » 操作系統 » linux嵌入式軟體

linux嵌入式軟體

發布時間: 2023-01-22 03:17:15

A. 學習linux嵌入式開發什麼軟體好

用Linux平台就行了,C語言一定要學好,指針一定要明確,像指針數組、數組指針、指針函數、函數指針數組、函數返回值是個指針,結構體指針(主要是鏈表)、文件操作指針(FILE *其實是typedef結構體的指針)等,要靈活運用typedef 定義類型、靈活運用結構體。
再學習Linux的系統編程,主要是文件操作,文件描述符fd,對文件的操作write,read,open.close等,然後學習進程fork();vfork();創建進程和管理父子進程,進程之間的通信無名管道、命名管道、消息隊列、共享內存、信號量、套接字等;都掌握之後要學線程以及線程的互斥和同步,線程之間共享進程的資源,就要對資源進行合理的分配,例如信號量sem和線程互斥鎖pthread_mutex,信號是用來檢測信號的ISGNAL的,常見的信號例如ctrl+c,中斷前台的進程和kill中斷後台的進程,如果對網路感興趣,可以學習下Linux的網路套接子Socket,實現多台主機之間進程的通信,例如QQ和IPMSG都是對網路套接字的操作,熟悉一下TCP、UDP協議和Tftp、HTTP的網路層的傳輸協議,個人覺得解析buff最費時間,可以自己做一下IPMSG,單用戶和並發server,echo伺服器。
感興趣GUI的可以學習一下C++和Qt,Qt被nokia收購,nokia被微軟收購,Qt支持很多的平台,很實用,C++主要是對類的操作,和C中的結構體相似,class 類名{};// 聲明類class 類名:繼承方式 基類{};//繼承類類中包含私有成員、公有成員、受保護的成員,類是對事物共性的一種抽象,對象是共性的一種實體化,是類的一個實例,老師的共性是:教書,吃飯,睡覺等,可以抽象成一個類,個性是年齡、性別、名字等,是老師類的一個實例,C++還有很多的內容,Qt是用C++來寫的,其中的窗口都是派生於QWidget的,具體的不多說了。
學完C++和Qt,有了面向對象的概念後,可以去學Java和android系統,做手機的應用軟體和游戲開發,和Java 和C++類似,去掉c++中指針部分,完全脫離了內存的操作,完全的面向對象,android和Qt類似,具體內容不多說了。
說說底層的吧:
底層主要用到的是C語言和arm匯編主要是v4版本以後的匯編標准語言,首先清楚底層是怎麼引導Linux系統的,嵌入式很大一部分使用縮減版的Linux內核主要是穩定版本的,千萬不要去追求最新,最適合的才是最好的,前部分由匯編語言引導C語言,主要設置開發板軟硬體的環境,主要是bootloader(vivi、uboot.bin),然後把設置好的param參數傳給內核,內核調用這些參數去找相應的文件,進行相應的操作,然後就是Linux的根文件系統了,最後是軟體的移植。
用到的軟體:vmplayer (Linux redenterp版)、windows下的超級終端,LSJF24X0.exe(下載bootloader時使用,也可以用H-Jtag)、tftpd32.exe(做windows下的server用,用於u-boot網線下載)等工具。
以上是個人的體會,僅供參考!

B. 基於 Linux 和 MiniGUI 的嵌入式系統軟體開發指南(六)

作者 魏永明MiniGUI 提供的非 GUI/GDI 介面本文講述了 MiniGUI 為應用程序提供的非 GUI/GDI 介面 這些介面能夠幫助應用程序更好地和操作系統交互 擴展應用程序功能 並提高應用程序的可移植性 內容主要涉及到如下幾個方面 MiniGUI Lite 和 select 系統調用 基於 UNIX Domain Socket 的進程間通訊 編寫可移植性代碼等 引言一般而言 GUI 系統的應用程序編程介面主要集中於窗口 消息隊列 圖形設備等相關方面 但因為 GUI 系統在處理系統事件時通常會提供自己的機制 而這些機制往往會和操作系統本身提供的機制不相兼容 比如 MiniGUI 提供了消息循環機制 而應用程序的結構一般是消息驅動的 也就是說 應用程序通過被動接收消息來工作 但很多情況下 應用程序需要主動監視某個系統事件 比如在 UNIX 操作系統中 可以通過 select 系統調用監聽某個文件描述符上是否有可讀數據 這樣 如何將 MiniGUI 的消息隊列機制和現有操作系統的其他機制融合在一起 就成了一個較為困難的問題 本文將講述幾種解決這一問題的方法 我們知道 MiniGUI Lite 採用 UNIX Domain Socket 實現客戶程序和伺服器程序之間的交互 應用程序也可以利用這一機制 完成自己的通訊任務――客戶向伺服器提交請求 而伺服器完成對客戶的請求處理並應答 一方面 在 MiniGUI Lite 的伺服器程序中 你可以擴展這一機制 注冊自己的請求處理函數 完成定製的請求/響應通訊任務 另一方面 MiniGUI Lite 當中也提供了若干用來創建和操作 UNIX Domain Socket 的函數 任何 MiniGUI Lite 的應用程序都可以建立 UNIX Domain Socket 並完成和其他 MiniGUI Lite 應用程序之間的數據交換 本文將舉例講述如何利用 MiniGUI Lite 提供的函數完成此類通訊任務 嵌入式 Linux 系統現在能夠在許多不同架構的硬體平台上運行 MiniGUI 也能夠在這些硬體平台上運行 但由於許多硬體平台具有和其他硬體平台不同的特性 比如說 常見的 CPU 是 Little Endian 的 而某些 CPU 則是 Big Endian 的 這要求我們在編寫代碼 尤其是文件 I/O 相關代碼時 必須編寫可移植代碼 以便適合具有不同架構的平台 本文將描述 MiniGUI 為應用程序提供的可移植性函數及其用法 除了與上述內容相關的函數之外 MiniGUI 還提供了其他一些函數 本文最後部分將描述這些函數的用途和用法 包括配置文件讀寫以及定點數運算 MiniGUI Lite和 select 系統調用我們知道 在 MiniGUI Lite 之上運行的應用程序只有一個消息隊列 應用程序在初始化之後 會建立一個消息循環 然後不停地從這個消息隊列當中獲得消息並處理 直到接收到 MSG_QUIT 消息為止 應用程序的窗口過程在處理消息時 要在處理完消息之後立即返回 以便有機會獲得其他的消息並處理 現在 如果應用程序在處理某個消息時監聽某個文件描述符而調用 select 系統調用 就有可能會出現問題――因為 select 系統調用可能會長時間阻塞 而由 MiniGUI Lite 伺服器發送給客戶的事件得不到及時處理 這樣 消息驅動的方式和 select 系統調用就難於很好地融合 在 MiniGUI Threads 中 因為每個線程都有自己相應的消息隊列 而系統消息隊列是由單獨運行的 desktop 線程管理的 所以任何一個應用程序建立的線程都可以長時間阻塞 從而可以調用類似 select 的系統調用 但在 MiniGUI Lite 當中 如果要監聽某個應用程序自己的文件描述符事件 必須進行恰當的處理 以避免長時間阻塞 在 MiniGUI Lite 當中 有幾種解決這一問題的辦法 在調用 select 系統調用時 傳遞超時值 保證 select 系統調用不會長時間阻塞 設置定時器 定時器到期時 利用 select 系統調用查看被監聽的文件描述符 如果沒有相應的事件發生 則立即返回 否則進行讀寫操作 利用 MiniGUI Lite 提供的 RegisterListenFD 函數在系統中注冊監聽文件描述符 並在被監聽的文件描述符上發生指定的事件時 向某個窗口發送 MSG_FDEVENT 消息 由於前兩種解決方法比較簡單 這里我們重點講述的第三種解決辦法 MiniGUI Lite 為應用程序提供了如下兩個函數及一個宏 #define MAX_NR_LISTEN_FD /* Return TRUE if all OK and FALSE on error */BOOL GUIAPI RegisterListenFD (int fd int type HWND hwnd void* context);/* Return TRUE if all OK and FALSE on error */BOOL GUIAPI UnregisterListenFD (int fd);MAX_NR_LISTEN_FD 宏定義了系統能夠監聽的最多文件描述符數 默認定義為 RegisterListenFD 函數在系統當中注冊一個需要監聽的文件描述符 並指定監聽的事件類型(type 參數 可取 POLLIN POLLOUT 或者 POLLERR) 接收 MSG_FDEVENT 消息的窗口句柄以及一個上下文信息 UnregisterListenFD 函數注銷一個被注冊的監聽文件描述符 在應用程序使用RegisterListenFD 函數注冊了被監聽的文件描述符之後 當指定的事件發生在該文件描述符上時 系統會將 MSG_FDEVENT 消息發送到指定的窗口 應用程序可在窗口過程中接收該消息並處理 MiniGUI 中的 libvcongui 就利用了上述函數監聽來自主控偽終端上的可讀事件 如下面的程序段所示(vcongui/vcongui c) /* 注冊主控偽終端偽監聽文件描述符 */ RegisterListenFD (pConInfo >masterPty POLLIN hMainWnd ); /* 進入消息循環 */ while (!pConInfo >terminate && GetMessage (&Msg hMainWnd)) { DispatchMessage (&Msg); } /* 注銷監聽文件描述符 */ UnregisterListenFD (pConInfo >masterPty); /* 虛擬控制台的窗口過程 */static int VCOnGUIMainWinProc (HWND hWnd int message WPARAM wParam LPARAM lParam){ PCONINFO pConInfo; pConInfo = (PCONINFO)GetWindowAdditionalData (hWnd); switch (message) { /* 接收到 MSG_FDEVENT 消息 則處理主控偽終端上的輸入數據 */ case MSG_FDEVENT: ReadMasterPty (pConInfo); break; } /* 調用默認窗口過程 */ if (pConInfo >DefWinProc) return (*pConInfo >DefWinProc)(hWnd message wParam lParam); else return DefaultMainWinProc (hWnd message wParam lParam);} 在 節當中 我們還可以看到RegisterListenFD 函數的使用 顯然 通過這種簡單的注冊監聽文件描述符的介面 MiniGUI Lite 程序能夠方便地利用底層的消息機制完成對非同步事件的處理 MiniGUI Lite 與進程間通訊 簡單請求/應答處理我們知道 MiniGUI Lite 利用了 UNIX Domain Socket 實現伺服器和客戶程序之間的通訊 為了實現客戶和伺服器之間的簡單方便的通訊 MiniGUI Lite 中定義了一種簡單的請求/響應結構 客戶程序通過指定的結構將請求發送到伺服器 伺服器處理請求並應答 在客戶端 一個請求定義如下(include/gdi h) typedef struct tagREQUEST { int id; const void* data; size_t len_data;} REQUEST;typedef REQUEST* PREQUEST;其中 id 是用來標識請求類型的整型數 data 是發送給該請求的關聯數據 len_data 則是數據的長度 客戶在初始化 REQUEST 結構之後 就可以調用 cli_request 向伺服器發送請求 並等待伺服器的應答 該函數的原型如下 /* send a request to server and wait reply */int cli_request (PREQUEST request void* result int len_rslt); 伺服器程序(即 mginit)會在自己的消息循環當中獲得來自客戶的請求 並進行處理 最終會將處理結果發送給客戶 在上述這種簡單的客戶/伺服器通訊中 客戶和伺服器必須就每個請求類型達成一致 也就是說 客戶和伺服器必須了解每種類型請求的數據含義並進行恰當的處理 MiniGUI Lite 利用上述這種簡單的通訊方法 實現了若干係統級的通訊任務 滑鼠游標的管理 滑鼠游標是一個全局資源 當客戶需要創建或者銷毀滑鼠游標 改變滑鼠游標的形狀 位置 顯示或者隱藏滑鼠時 就發送請求到伺服器 伺服器程序完成相應任務並將結果發送給客戶 層及活動客戶管理 當客戶查詢層的信息 新建層 加入某個已有層 或者設置層中的活動客戶時 通過該介面發送請求到伺服器 其他一些系統級的任務 比如在新的 GDI 介面中 伺服器程序統一管理顯示卡中可能用來建立內存 DC 的顯示內存 當客戶要申請建立在顯示內存中的內存 DC 時 就會發送請求到伺服器 為了讓應用程序也能夠通過這種簡單的方式實現客戶和伺服器之間的通訊 伺服器程序可以注冊一些定製的請求處理函數 然後客戶就可以向伺服器發送這些請求 為此 MiniGUI Lite 提供了如下介面 #define MAX_SYS_REQID x #define MAX_REQID x /* * Register user defined request handlers for server * Note that user defined request id should larger lishixin/Article/program/Oracle/201311/17973

C. 學習嵌入式Linux怎麼應用開發

提供一下幾種方案x0dx0ax0dx0a一、還按照《嵌入死linux應用開發完全手冊》(韋東山)的內容來,但是嵌入式linux的開發環境自己搭建。當時我是按照《鳥哥的私房菜-基礎篇》和《鳥哥的私房菜-伺服器篇》兩篇,整出一套開發平台,CentOS5.3 + samba/vsftpd + gcc / linux-gcc 。 window平台上的工具sourceinsight、secureCRT。 注意:我使用了四個月學會linux操作。不知道你是否會先學這兩本書,再學習韋東山老師的嵌入式呢。學完之後看似學習了很多,出來外面之後,我又去在windows平台開發,而且現在用C#。_。現在看什麼嵌入式系統都非常快,很容易理解架構,如何實現。可惜自己太年輕,沒有資本和人脈,不然可以實現很多有意思的東西。現在正在嘗試創業。x0dx0ax0dx0a二、尋找開發板,而不是書籍作為實驗的途徑。書籍只是輔助,輔助你實現某種功能。可以集中linux書籍、嵌入式開發書籍、單片機開發、編程語言。宋寶華的嵌入式書籍。開發板當時用的是飛凌的,由國嵌負責技術講解和培訓。講了不少有用的東西。現在網上的開發板多,可以淘,但是不用太貴,作用不大。找前衛的技術開發,中國看似不行。前衛老師都沒搞出什麼東西,我們在基本是0基礎的前提下,很難實現比較前衛的技術。打好基礎,看似是唯一的選擇。x0dx0ax0dx0a三、單獨找台PC機,直接安裝ubuntu11,買本ubuntu相關的書,他會交你怎樣安裝使用工具的。其實和第一種解決方式是一樣的,書是別人在五(六)年前寫的,不符合摩爾定理。所以沒辦法,我們在嵌入式方面的教育還是欠缺啊,出的書都少,記那麼基本,還全是個人。沒有什麼教育機構。x0dx0ax0dx0a希望以上對你有用。

D. 典型嵌入式linux軟體部分由哪些模塊組成他們的功能及相互聯系 Bootloader分為哪兩階段分

典型的嵌入式系統,軟體部分從下到上,分別是boot,kernel,rootfs,fsimg和上層應用。
起到的作用分別是,引導內核,啟動內核,掛載根文件系統,掛載實際文件系統,開啟上層應用主循環。
你問的這些問題,每一點都可以單獨拿出來,長篇大論的講很久了。建議去網上先看相關的資料。貪多求快是不好的,一個知識點一個知識點的掌握。

E. 嵌入式linux和linux有什麼不同.linux的作用是什麼

Linux作為開源免費操作系統,以其作為系統的應用可以較方便的進行系統功能的裁剪和跨體系結構移植。

在不同的目標體系結構下(x86,ARM,PowerPC etc.),由於匯編指令集的不同,同一段代碼利用不同的編譯器和庫文件生成的可執行代碼是不同的。不同體系的Linux其開發工具是不同的。

嵌入式linux屬於高度裁剪過的Linux,他將桌面Linux所具有的大部分應用功能(如GUI 工具,計算器,電子郵件 etc.)和部分系統功能省略,但集成了開發者希望嵌入式產品所具有的特殊應用功能(比如 一款以Linux為系統的觸摸式海事導航儀可以根據功能需要去除不需要的功能塊,但加入GPS定位,航速航向計算,航線規劃,觸摸檢測和對應功能實現等功能)。

嵌入式系統往往是指系統的資源(如DRAM/FLASH ROM,功耗,工作頻率 etc.)有較大限制且系統的工作環境相對多變和惡劣(如溫濕度變化大,酸鹼度腐蝕,外部撞擊和振動,外部電磁干擾,靜電導致的高壓損壞電路 etc.)。這也就需要開發人員更多的發現和假想可能的突發情況並採取相應預防措施。大部分嵌入式系統對響應的時間限制和正確性也有極高的要求。

F. Linux和嵌入式Linux有什麼區別

Linux是一種自由和開放源碼的類Unix操作系統,存在著許多不同的Linux版本,但它們都使用了Linux內核。Linux可安裝在各種計算機硬體設備中,比如手機、平板電腦、路由器、視頻游戲控制台、台式計算機、大型機和超級計算機。Linux是一個領先的操作系統,世界上運算最快的10台超級計算機運行的都是Linux操作系統。嵌入式Linux系統就是利用Linux其自身的許多特點,把它應用到嵌入式系統里。隨著微處理器的產生,價格低廉、結構小巧的CPU和外設連接提供了穩定可靠的硬體架構,那麼限制嵌入式系統發展的瓶頸就突出表現在了軟體方面。

G. 嵌入式軟體開發(Linux/單片機/DLC/DSP…)什麼意思

嵌入式軟體開發就是擼代碼,不過不是寫一般的電腦軟體,是給操作系統(linux、ucos、win ce嵌入式系統)擼、是給單片機(8051、stm32等等)擼。DLC不清楚(不好意思孤陋寡聞了)PLC倒是用過,DSP的全稱為Digital Signal Process,即數字信號處理技術,DSP晶元即指能夠實現數字信號處理技術的晶元。也是編程擼代碼。個人見解
------萌萌的文藝青年

H. 「干貨」嵌入式Linux系統移植的四大步驟(上)


在學習系統移植的相關知識,在學習和調試過程中,發現了很多問題,也解決了很多問題,但總是對於我們的開發結果有一種莫名其妙的感覺,糾其原因,主要對於我們的開發環境沒有一個深刻的認識,有時候幾個簡單的命令就可以完成非常復雜的功能,可是我們有沒有想過,為什麼會有這樣的效果?


如果沒有去追問,只是機械地完成,並且看到實驗效果,這樣做其實並沒有真正的掌握系統移植的本質。


在做每一個步驟的時候, 首先問問自己,為什麼要這樣做,然後再問問自己正在做什麼? 搞明白這幾個問題,我覺得就差不多了,以後不管更換什麼平台,什麼晶元,什麼開發環境,你都不會迷糊,很快就會上手。對於嵌入式的學習方法,我個人方法就是:從宏觀上把握(解決為什麼的問題),微觀上研究(解決正在做什麼的問題),下面以自己學習的arm-cortex_a8開發板為目標,介紹下自己的學習方法和經驗。


嵌入式Linux系統移植主要由四大部分組成:


一、搭建交叉開發環境
二、bootloader的選擇和移植
三、kernel的配置、編譯、和移植
四、根文件系統的製作


第一部分:搭建交叉開發環境


先介紹第一分部的內容:搭建交叉開發環境,首先必須得思考兩個問題,什麼是交叉環境? 為什麼需要搭建交叉環境?


先回答第一個問題,在嵌入式開發中,交叉開發是很重要的一個概念,開發的第一個環節就是搭建環境,第一步不能完成,後面的步驟從無談起,這里所說的交叉開發環境主要指的是:在開發主機上(通常是我的pc機)開發出能夠在目標機(通常是我們的開發板)上運行的程序。嵌入式比較特殊的是不能在目標機上開發程序(狹義上來說),因為對於一個原始的開發板,在沒有任何程序的情況下它根本都跑不起來,為了讓它能夠跑起來,我們還必須要藉助pc機進行燒錄程序等相關工作,開發板才能跑起來,這里的pc機就是我們說的開發主機,想想如果沒有開發主機,我們的目標機基本上就是無法開發,這也就是電子行業的一句名言:搞電子,說白了,就是玩電腦!


然後回答第二個問題,為什麼需要交叉開發環境?主要原因有以下幾點:


原因 1: 嵌入式系統的硬體資源有很多限制,比如cpu主頻相對較低,內存容量較小等,想想讓幾百MHZ主頻的MCU去編譯一個Linux kernel會讓我們等的不耐煩,相對來說,pc機的速度更快,硬體資源更加豐富,因此利用pc機進行開發會提高開發效率。


原因2: 嵌入式系統MCU體系結構和指令集不同,因此需要安裝交叉編譯工具進行編譯,這樣編譯的目標程序才能夠在相應的平台上比如:ARM、MIPS、 POWEPC上正常運行。


交叉開發環境的硬體組成主要由以下幾大部分


1.開發主機
2.目標機(開發板)
3.二者的鏈接介質,常用的主要有3種方式:(1)串口線 (2)USB線 (3)網線


對應的硬體介質,還必須要有相應的軟體「介質」支持:


1.對於串口,通常用的有串口調試助手,putty工具等,工具很多,功能都差不多,會用一兩款就可以;


2.對於USB線,當然必須要有USB的驅動才可以,一般晶元公司會提供,比如對於三星的晶元,USB下載主要由DNW軟體來完成;


3.對於網線,則必須要有網路協議支持才可以, 常用的服務主要兩個


第一:tftp服務:

主要用於實現文件的下載,比如開發調試的過程中,主要用tftp把要測試的bootloader、kernel和文件系統直接下載到內存中運行,而不需要預先燒錄到Flash晶元中,一方面,在測試的過程中,往往需要頻繁的下載,如果每次把這些要測試的文件都燒錄到Flash中然後再運行也可以,但是缺點是:過程比較麻煩,而且Flash的擦寫次數是有限的;另外一方面:測試的目的就是把這些目標文件載入到內存中直接運行就可以了,而tftp就剛好能夠實現這樣的功能,因此,更沒有必要把這些文件都燒錄到Flash中去。


第二: nfs服務:

主要用於實現網路文件的掛載,實際上是實現網路文件的共享,在開發的過程中,通常在系統移植的最後一步會製作文件系統,那麼這是可以把製作好的文件系統放置在我們開發主機PC的相應位置,開發板通過nfs服務進行掛載,從而測試我們製作的文件系統是否正確,在整個過程中並不需要把文件系統燒錄到Flash中去,而且掛載是自動進行掛載的,bootload啟動後,kernel運行起來後會根據我們設置的啟動參數進行自動掛載,因此,對於開發測試來講,這種方式非常的方便,能夠提高開發效率。


另外,還有一個名字叫 samba 的服務也比較重要,主要用於文件的共享,這里說的共享和nfs的文件共享不是同一個概念,nfs的共享是實現網路文件的共享,而samba實現的是開發主機上 Windows主機和Linux虛擬機之間的文件共享,是一種跨平台的文件共享 ,方便的實現文件的傳輸。


以上這幾種開發的工具在嵌入式開發中是必備的工具,對於嵌入式開發的效率提高做出了偉大的貢獻,因此,要對這幾個工具熟練使用,這樣你的開發效率會提高很多。等測試完成以後,就會把相應的目標文件燒錄到Flash中去,也就是等發布產品的時候才做的事情,因此對於開發人員來說,所有的工作永遠是測試。


通過前面的工作,我們已經准備好了交叉開發環境的硬體部分和一部分軟體,最後還缺少交叉編譯器,讀者可能會有疑問,為什麼要用交叉編譯器?前面已經講過,交叉開發環境必然會用到交叉編譯工具,通俗地講就是在一種平台上編譯出能運行在體系結構不同的另一種平台上的程序,開發主機PC平台(X86 CPU)上編譯出能運行在以ARM為內核的CPU平台上的程序,編譯得到的程序在X86 CPU平台上是不能運行的,必須放到ARM CPU平台上才能運行,雖然兩個平台用的都是Linux系統。相對於交叉編譯,平常做的編譯叫本地編譯,也就是在當前平台編譯,編譯得到的程序也是在本地執行。用來編譯這種跨平台程序的編譯器就叫交叉編譯器,相對來說,用來做本地編譯的工具就叫本地編譯器。所以要生成在目標機上運行的程序,必須要用交叉編譯工具鏈來完成。

這里又有一個問題,不就是一個交叉編譯工具嗎?為什麼又叫交叉工具鏈呢?原因很簡單,程序不能光編譯一下就可以運行,還得進行匯編和鏈接等過程,同時還需要進行調試,對於一個很大工程,還需要進行工程管理等等,所以,這里 說的交叉編譯工具是一個由 編譯器、連接器和解釋器 組成的綜合開發環境,交叉編譯工具鏈主要由binutils(主要包括匯編程序as和鏈接程序ld)、gcc(為GNU系統提供C編譯器)和glibc(一些基本的C函數和其他函數的定義) 3個部分組成。有時為了減小libc庫的大小,也可以用別的 c 庫來代替 glibc,例如 uClibc、dietlibc 和 newlib。

那麼,如何得到一個交叉工具鏈呢?是從網上下載一個「程序」然後安裝就可以使用了嗎?回答這個問題之前先思考這樣一個問題,我們的交叉工具鏈顧名思義就是在PC機上編譯出能夠在我們目標開發平台比如ARM上運行的程序,這里就又有一個問題了,我們的ARM處理器型號非常多,難道有專門針對我們某一款的交叉工具鏈嗎?若果有的話,可以想一想,這么多處理器平台,每個平台專門定製一個交叉工具鏈放在網路上,然後供大家去下載,想想可能需要找很久才能找到適合你的編譯器,顯然這種做法不太合理,且浪費資源!因此,要得到一個交叉工具鏈,就像我們移植一個Linux內核一樣,我們只關心我們需要的東西,編譯我們需要的東西在我們的平台上運行,不需要的東西我們不選擇不編譯,所以,交叉工具鏈的製作方法和系統移植有著很多相似的地方,也就是說,交叉開發工具是一個支持很多平台的工具集的集合(類似於Linux源碼),然後我們只需從這些工具集中找出跟我們平台相關的工具就行了,那麼如何才能找到跟我們的平台相關的工具,這就是涉及到一個如何製作交叉工具鏈的問題了。


通常構建交叉工具鏈有如下三種方法:


方法一 : 分步編譯和安裝交叉編譯工具鏈所需要的庫和源代碼,最終生成交叉編譯工具鏈。該方法相對比較困難,適合想深入學習構建交叉工具鏈的讀者。如果只是想使用交叉工具鏈,建議使用下列的方法二構建交叉工具鏈。


方法二: 通過Crosstool-ng腳本工具來實現一次編譯,生成交叉編譯工具鏈,該方法相對於方法一要簡單許多,並且出錯的機會也非常少,建議大多數情況下使用該方法構建交叉編譯工具鏈。


方法三 : 直接通過網上下載已經製作好的交叉編譯工具鏈。該方法的優點不用多說,當然是簡單省事,但與此同時該方法有一定的弊端就是局限性太大,因為畢竟是別人構建好的,也就是固定的,沒有靈活性,所以構建所用的庫以及編譯器的版本也許並不適合你要編譯的程序,同時也許會在使用時出現許多莫名其妙的錯誤,建議讀者慎用此方法。

crosstool-ng是一個腳本工具,可以製作出適合不同平台的交叉編譯工具鏈,在進行製作之前要安裝一下軟體:
$ sudo apt-get install g++ libncurses5-dev bison flex texinfo automake libtool patch gcj cvs cvsd gawk
crosstool腳本工具可以在http://ymorin.is-a-geek.org/projects/crosstool下載到本地,然後解壓,接下來就是進行安裝配置了,這個配置優點類似內核的配置。主要的過程有以下幾點:
1. 設定源碼包路徑和交叉編譯器的安裝路徑
2. 修改交叉編譯器針對的構架

3. 增加編譯時的並行進程數,以增加運行效率,加快編譯,因為這個編譯會比較慢。
4. 關閉JAVA編譯器 ,減少編譯時間
5. 編譯
6. 添加環境變數
7. 刷新環境變數。
8. 測試交叉工具鏈

到此,嵌入式Linux系統移植四大部分的第一部分工作全部完成,接下來可以進行後續的開發了。



第二部分:bootloader的選擇和移植


01 Boot Loader 概念


就是在操作系統內核運行之前運行的一段小程序。通過這段小程序,我們可以初始化硬體設備、建立內存空間的映射圖,從而將系統的軟硬體環境帶到一個合適的狀態,以便為最終調用操作系統內核准備好正確的環境,他就是所謂的引導載入程序(Boot Loader)。


02 為什麼系統移植之前要先移植BootLoader?


BootLoader的任務是引導操作系統,所謂引導操作系統,就是啟動內核,讓內核運行就是把內核載入到內存RAM中去運行,那先問兩個問題:第一個問題,是誰把內核搬到內存中去運行?第二個問題:我們說的內存是SDRAM,大家都知道,這種內存和SRAM不同,最大的不同就是SRAM只要系統上電就可以運行,而SDRAM需要軟體進行初始化才能運行,那麼在把內核搬運到內存運行之前必須要先初始化內存吧,那麼內存是由誰來初始化的呢?其實這兩件事情都是由bootloader來乾的,目的是為內核的運行准備好軟硬體環境,沒有bootloadr我們的系統當然不能跑起來。

03 bootloader的分類


首先更正一個錯誤的說法,很多人說bootloader就是U-boot,這種說法是錯誤的,確切來說是u-boot是bootloader的一種。也就是說bootloader具有很多種類,


由上圖可以看出,不同的bootloader具有不同的使用范圍,其中最令人矚目的就是有一個叫U-Boot的bootloader,是一個通用的引導程序,而且同時支持X86、ARM和PowerPC等多種處理器架構。U-Boot,全稱 Universal Boot Loader,是遵循GPL條款的開放源碼項目,是由德國DENX小組開發的用於多種嵌入式CPU的bootloader程序,對於Linux的開發,德國的u-boot做出了巨大的貢獻,而且是開源的。

u-boot具有以下特點:

① 開放源碼;
② 支持多種嵌入式操作系統內核,如Linux、NetBSD, VxWorks, QNX, RTEMS, ARTOS, LynxOS;
③ 支持多個處理器系列,如PowerPC、ARM、x86、MIPS、XScale;
④ 較高的可靠性和穩定性;
⑤ 高度靈活的功能設置,適合U-Boot調試、操作系統不同引導要求、產品發布等;
⑥ 豐富的設備驅動源碼,如串口、乙太網、SDRAM、FLASH、LCD、NVRAM、EEPROM、RTC、鍵盤等;
⑦ 較為豐富的開發調試文檔與強大的網路技術支持;
其實,把u-boot可以理解為是一個小型的操作系統。

04 u-boot的目錄結構


* board 目標板相關文件,主要包含SDRAM、FLASH驅動;
* common 獨立於處理器體系結構的通用代碼,如內存大小探測與故障檢測;
* cpu 與處理器相關的文件。如mpc8xx子目錄下含串口、網口、LCD驅動及中斷初始化等文件;
* driver 通用設備驅動,如CFI FLASH驅動(目前對INTEL FLASH支持較好)
* doc U-Boot的說明文檔;
* examples可在U-Boot下運行的示常式序;如hello_world.c,timer.c;
* include U-Boot頭文件;尤其configs子目錄下與目標板相關的配置頭文件是移植過程中經常要修改的文件;
* lib_xxx 處理器體系相關的文件,如lib_ppc, lib_arm目錄分別包含與PowerPC、ARM體系結構相關的文件;
* net 與網路功能相關的文件目錄,如bootp,nfs,tftp;
* post 上電自檢文件目錄。尚有待於進一步完善;
* rtc RTC驅動程序;
* tools 用於創建U-Boot S-RECORD和BIN鏡像文件的工具;

05 u-boot的工作模式


U-Boot的工作模式有 啟動載入模式和下載模式 。啟動載入模式是Bootloader的正常工作模式,嵌入式產品發布時,Bootloader必須工作在這種模式下,Bootloader將嵌入式操作系統從FLASH中載入到SDRAM中運行,整個過程是自動的。 下載模式 就是Bootloader通過某些通信手段將內核映像或根文件系統映像等從PC機中下載到目標板的SDRAM中運行,用戶可以利用Bootloader提供的一些令介面來完成自己想要的操作,這種模式主要用於測試和開發。

06 u-boot的啟動過程


大多數BootLoader都分為stage1和stage2兩大部分,U-boot也不例外。依賴於cpu體系結構的代碼(如設備初始化代碼等)通常都放在stage1且可以用匯編語言來實現,而stage2則通常用C語言來實現,這樣可以實現復雜的功能,而且有更好的可讀性和移植性。


1、 stage1(start.s代碼結構)
U-boot的stage1代碼通常放在start.s文件中,它用匯編語言寫成,其主要代碼部分如下:
(1) 定義入口。由於一個可執行的image必須有一個入口點,並且只能有一個全局入口,通常這個入口放在rom(Flash)的0x0地址,因此,必須通知編譯器以使其知道這個入口,該工作可通過修改連接器腳本來完成。
(2)設置異常向量(exception vector)。
(3)設置CPU的速度、時鍾頻率及中斷控制寄存器。
(4)初始化內存控制器 。
(5)將rom中的程序復制到ram中。
(6)初始化堆棧 。
(7)轉到ram中執行,該工作可使用指令ldrpc來完成。


2、 stage2(C語言代碼部分)

lib_arm/board.c中的start armboot是C語言開始的函數,也是整個啟動代碼中C語言的主函數,同時還是整個u-boot(armboot)的主函數,該函數主要完成如下操作:
(1)調用一系列的初始化函數。
(2)初始化flash設備。
(3)初始化系統內存分配函數。
(4)如果目標系統擁有nand設備,則初始化nand設備。
(5)如果目標系統有顯示設備,則初始化該類設備。
(6)初始化相關網路設備,填寫ip,c地址等。
(7)進入命令循環(即整個boot的工作循環),接受用戶從串口輸入的命令,然後進行相應的工作。

07 基於cortex-a8的s5pc100bootloader啟動過程分析


s5pc100支持兩種啟動方式,分別為USB啟動方式和NandFlash啟動方式:


1. S5PC100 USB啟動過程

[1] A8 reset, 執行iROM中的程序
[2] iROM中的程序根據S5PC100的配置管腳(SW1開關4,撥到4對面),判斷從哪裡啟動(USB)
[3] iROM中的程序會初始化USB,然後等待PC機下載程序
[4] 利用DNW程序,從PC機下載SDRAM的初始化程序到iRAM中運行,初始化SDRAM
[5] SDRAM初始化完畢,iROM中的程序繼續接管A8, 然後等待PC下載程序(BootLoader)
[6] PC利用DNW下載BootLoader到SDRAM
[7] 在SDRAM中運行BootLoader

2. S5PC100 Nandflash啟動過程

[1] A8 reset, 執行IROM中的程序
[2] iROM中的程序根據S5PC100的配置管腳(SW1開關4,撥到靠4那邊),判斷從哪裡啟動(Nandflash)
[3] iROM中的程序驅動Nandflash
[4] iROM中的程序會拷貝Nandflash前16k到iRAM
[5] 前16k的程序(BootLoader前半部分)初始化SDRAM,然後拷貝完整的BootLoader到SDRAM並運行
[6] BootLoader拷貝內核到SDRAM,並運行它
[7] 內核運行起來後,掛載rootfs,並且運行系統初始化腳本

08 u-boot移植(基於cortex_a8的s5pc100為例)


1.建立自己的平台

(1).下載源碼包2010.03版本,比較穩定
(2).解壓後添加我們自己的平台信息,以smdkc100為參考版,移植自己s5pc100的開發板
(3).修改相應目錄的文件名,和相應目錄的Makefile,指定交叉工具鏈。
(4).編譯
(5).針對我們的平台進行相應的移植,主要包括修改SDRAM的運行地址,從0x20000000
(6).「開關」相應的宏定義
(7).添加Nand和網卡的驅動代碼
(8).優化go命令
(9).重新編譯 make distclean(徹底刪除中間文件和配置文件) make s5pc100_config(配置我們的開發板) make(編譯出我們的u-boot.bin鏡像文件)
(10).設置環境變數,即啟動參數,把編譯好的u-boot下載到內存中運行,過程如下:
1. 配置開發板網路
ip地址配置:
$setenv ipaddr 192.168.0.6 配置ip地址到內存的環境變數
$saveenv 保存環境變數的值到nandflash的參數區

網路測試:
在開發開發板上ping虛擬機:
$ ping 192.168.0.157(虛擬機的ip地址)

如果網路測試失敗,從下面幾個方面檢查網路:
1. 網線連接好
2. 開發板和虛擬機的ip地址是否配置在同一個網段
3. 虛擬機網路一定要採用橋接(VM--Setting-->option)
4. 連接開發板時,虛擬機需要設置成 靜態ip地址

2. 在開發板上,配置tftp伺服器(虛擬機)的ip地址
$setenv serverip 192.168.0.157(虛擬機的ip地址)
$saveenv
3. 拷貝u-boot.bin到/tftpboot(虛擬機上的目錄)
4. 通過tftp下載u-boot.bin到開發板內存
$ tftp 20008000(內存地址即可) u-boot.bin(要下載的文件名)

如果上面的命令無法正常下載:
1. serverip配置是否正確
2. tftp服務啟動失敗,重啟tftp服務
#sudo service tftpd-hpa restart

5. 燒寫u-boot.bin到nandflash的0地址
$nand erase 0(起始地址) 40000(大小) 擦出nandflash 0 - 256k的區域
$nand write 20008000((緩存u-boot.bin的內存地址) 0(nandflash上u-boot的位置) 40000(燒寫大小)

6. 切換開發板的啟動方式到nandflash
1. 關閉開發板
2. 把SW1的開關4撥到4的那邊
3. 啟動開發板,它就從nandflash啟動

I. linux系統與嵌入式linux有什麼區別和關系

二者是同根生哦,聯系:都屬於linux,都必須符合通用的語法和結構;區別:前者屬於大的通用的,後者屬於適合嵌入式系統應用的,前者包含後者。比喻:前者相當於西瓜,後者相當於無籽西瓜

J. Flutter開發——Linux嵌入式應用開發

上文中 介紹了Linux平台下Flutter環境搭建和桌面應用開發,現在需要更深入了解如何將該應用運行在Linux系統的嵌入式設備上。

安裝及示例

在 ~/.bashrc 中配置 export PATH=$PATH:/opt/flutter-elinux/bin

打開weston虛擬機,此時發現 flutter-elinux devices 連接設備變成兩個,如下圖

即可編譯及運行基於wayland顯示後端的demo

避坑

熱點內容
編程的tr 發布:2024-05-07 05:37:25 瀏覽:422
蘋果4s的數據怎麼備份到安卓上 發布:2024-05-07 05:37:15 瀏覽:818
安卓怎麼注冊電郵 發布:2024-05-07 05:23:49 瀏覽:714
怎麼看清被塗鴉的內容安卓手機 發布:2024-05-07 05:16:52 瀏覽:702
配置業務分類時主要考慮哪些原因 發布:2024-05-07 05:12:40 瀏覽:185
外網如何訪問內網ip 發布:2024-05-07 05:12:30 瀏覽:814
網易版有拔刀劍的伺服器叫什麼 發布:2024-05-07 04:56:35 瀏覽:752
中國好源碼 發布:2024-05-07 04:56:29 瀏覽:872
小兵的伺服器是什麼 發布:2024-05-07 04:55:46 瀏覽:186
網易我的世界四月伺服器維護 發布:2024-05-07 04:24:58 瀏覽:214