『壹』 宓屽叆寮忔搷浣滅郴緇熺戞櫘鏃墮棿
宓屽叆寮忔搷浣滅郴緇熸槸涓縐嶇壒孌婄殑鎿嶄綔緋葷粺錛屽畠琚璁捐$敤浜庡祵鍏ュ紡緋葷粺涓銆傚傛灉浣犻渶瑕丩inux榪欑被宓屽叆寮忔搷浣滅郴緇熺殑鏀鎸侊紝鍙闇杞繪澗瀹夎匧inux緋葷粺鑷寵櫄鎷熸満鎴栫‖浠惰懼囦笂錛屽苟閰嶇疆浜ゅ弶緙栬瘧鐜澧冦
🛠️寮鍙戞祦紼嬬畝榪
紜淇濆紑鍙戞澘涓庝笂浣嶆満欏虹晠閫氫俊鏄棣栬佷換鍔°傚紑鍙戞澘涓轟綘棰勭暀浜嗙綉鍙c丆OM鍙e拰騫跺彛Jtag銆傚ぇ澶氭暟鎯呭喌涓嬶紝閫氳繃COM鍙h繘琛岄氫俊錛岃╀綘鍦ㄤ笂浣嶆満鍒╃敤瓚呯駭緇堢錛圵indows鐜澧冿級鎴朚inicom錛圠inux鐜澧冿級杞繪澗鏌ョ湅鎿嶄綔緋葷粺淇℃伅銆
🔧紜浠舵惌寤哄氨緇鍚
紜浠舵惌寤哄氨緇鍚庯紝涓嬩竴姝ユ搷浣滄槸錛1️⃣ Bootloader鐨勭Щ妞嶏紝濡俇boot銆乂iVi鎴朢edboot絳夈2️⃣ 鍐呮牳縐繪嶏紝緗戜笂璧勬簮涓板瘜錛屾棤闇鎷呭咖銆3️⃣ 鏂囦歡緋葷粺縐繪嶃4️⃣ linux鐜澧冧笅鐨勯┍鍔ㄤ笌紼嬪簭璁捐°
💡鏃犻渶鎿嶄綔緋葷粺鏀鎸
鑻ヤ綘鐨勯」鐩鏃犻渶鎿嶄綔緋葷粺鏀鎸侊紝鍙闇瀹夎匒DS寮鍙戣蔣浠訛紝鐢–鎴栨眹緙栬璦緙栧啓紼嬪簭錛屽啀閫氳繃jtag涓嬭澆鑷蟲澘瀛愶紝杞繪澗鎼炲畾錛
🕰️瀹炴椂鏃墮挓璁捐
鏃犻渶澶嶆潅鎿嶄綔緋葷粺錛孋璇璦鍗沖彲鎼炲畾錛
💥鎺㈢儲宓屽叆寮忔搷浣滅郴緇熺殑濂ョ
宓屽叆寮忔搷浣滅郴緇熸槸涓縐嶇壒孌婄殑鎿嶄綔緋葷粺錛屽畠琚璁捐$敤浜庡祵鍏ュ紡緋葷粺涓銆傚揩鏉ュ姞鍏ユ垜浠錛屼竴璧鋒帰緔㈠祵鍏ュ紡鎿嶄綔緋葷粺鐨勫ゥ縐樺惂錛
『貳』 在linux系統中進行編程的具體流程是什麼麻煩說具體點,謝謝嘍
中使用Linux開發,根據應用需求的不同有不同的配置開發方法,但是一般都要經過如下的過程:
1.建立開發環境
操作系統一般使用RedHat-Linux,版本從7到9都可以,選擇定製安裝或全部安裝,通過網路下載相應的GCC交叉編譯器進行安裝(例如arm-Linux-gcc、arm-μclibc-gcc),或者安裝產品廠家提供的交叉編譯器。
2.配置開發主機
配置MINICOM,一般的參數為波特率為115 200bps,數據位為8位,停止位為1,無奇偶校驗,軟體硬體流控設為無。在Windows下的超級終端的配置也是這樣的。MINICOM軟體的作用是作為調試嵌入式開發板的信息輸出的監視器和鍵盤輸入的工具。配置網路,主要是配置NFS網路文件系統,需要關閉防火牆,簡化嵌入式網路調試環境設置過程。
3.建立引導裝載程序BOOTLOADER
從網路上下載一些公開源代碼的BOOTLOADER,如U-BOOT、BLOB、VIVI、LILO、ARM-BOOT、RED-BOOT等,根據自己具體的晶元進行移植修改。有些晶元沒有內置引導裝載程序,例如三星的ARM7、ARM9系列晶元,這樣就需要編寫開發板上Flash的燒寫程序,網路上有免費下載的Windows下通過JTAG並口簡易模擬器燒寫ARM外圍Flash晶元的燒寫程序,也有Linux下的公開源代碼的J-Flash程序。如果不能燒寫自己的開發板,就需要根據自己的具體電路進行源代碼修改。這是系統正常運行的第一步。如果購買了廠家的模擬器當然比較容易燒寫Flash,這對於需要迅速開發自己產品的人來說可以極大地提高開發速度,但是其中的核心技術是無法了解的。
4.下載別人已經移植好的Linux操作系統
如μCLinux、ARM-Linux、PPC-Linux等,如果有專門針對所使用的CPU移植好的Linux操作系統那是再好不過的,下載後再添加自己的特定硬體的驅動程序,進行調試修改,對於帶MMU的CPU可以使用模塊方式調試驅動,對於μCLinux這樣的系統則需編譯進內核進行調試。
5.建立根文件系統
從下載使用BUSYBOX軟體進行功能裁減,產生一個最基本的根文件系統,再根據自己的應用需要添加其他程序。默認的啟動腳本一般都不會符合應用的需要,所以就要修改根文件系統中的啟動腳本,它的存放位置位於/etc目錄下,包括:/etc/init.d/rc.S、/etc/profile、/etc/.profile等,自動掛裝文件系統的配置文件/etc/fstab,具體情況會隨系統不同而不同。根文件系統在嵌入式系統中一般設為只讀,需要使用mkcramfs、genromfs等工具產生燒寫映像文件。
6.建立應用程序的Flash磁碟分區
一般使用JFFS2或YAFFS文件系統,這需要在內核中提供這些文件系統的驅動,有的系統使用一個線性Flash(NOR型)512KB~32MB,有的系統使用非線性Flash(NAND型)8~512MB,有的兩個同時使用,需要根據應用規劃Flash的分區方案。
7.開發應用程序
應用程序可以放入根文件系統中,也可以放入YAFFS、JFFS2文件系統中,有的應用不使用根文件系統,直接將應用程序和內核設計在一起,這有點類似於μCOS-II的方式。
8.燒寫內核、根文件系統、應用程序
9.發布產品
另外,站長團上有產品團購,便宜有保證
『叄』 做一個嵌入式Linux系統究竟要做哪些工作
1、Linux 基礎
安裝Linux操作系統 Linux文件系統 Linux常用命令 Linux啟動過程詳解 熟悉Linux服務能夠獨立安裝Linux操作系統
能夠熟練使用Linux系統的基本命令 認識Linux系統的常用服務安裝Linux操作系統 Linux基本命令實踐 設置Linux環境變數 定製Linux的服務
Shell 編程基礎使用vi編輯文件 使用Emacs編輯文件 使用其他編輯器
2、Shell 編程基礎
Shell簡介 認識後台程序Bash編程熟悉Linux系統下的編輯環境 熟悉Linux下的各種Shell 熟練進行shell編程熟悉vi基本操作
熟悉Emacs的基本操作 比較不同shell的區別 編寫一個測試伺服器是否連通的shell腳本程序 編寫一個查看進程是否存在的shell腳本程序
編寫一個帶有循環語句的shell腳本程序
3、Linux 下的C 編程基礎
linux C語言環境概述 Gcc使用方法 Gdb調試技術 Autoconf Automake Makefile 代碼優化
熟悉Linux系統下的開發環境 熟悉Gcc編譯器 熟悉Makefile規則編寫Hello,World程序 使用 make命令編譯程序 編寫帶有一個循環的程序
調試一個有問題的程序
4、嵌入式系統開發基礎
嵌入式系統概述交叉編譯 配置TFTP服務 配置NFS服務 下載Bootloader和內核
嵌入式Linux應用軟體開發流程熟悉嵌入式系統概念以及開發流程 建立嵌入式系統開發環境製作cross_gcc工具鏈 編譯並下載U-boot
編譯並下載Linux內核 編譯並下載Linux應用程序
5、嵌入式系統移植
Linux內核代碼 平台相關代碼分析 ARM平台介紹 平台移植的關鍵技術 移植Linux內核到 ARM平台 了解移植的概念
能夠移植Linux內核移植Linux2.6內核到 ARM9開發板
6、嵌入式 Linux 下串口通信
串列I/O的基本概念 嵌入式Linux應用軟體開發流程 Linux系統的文件和設備 與文件相關的系統調用 配置超級終端和MiniCOM
能夠熟悉進行串口通信 熟悉文件I/O 編寫串口通信程序 編寫多串口通信程序
7、嵌入式系統中多進程程序設計
Linux系統進程概述 嵌入式系統的進程特點 進程操作 守護進程 相關的系統調用了解Linux系統中進程的概念 能夠編寫多進程程序編寫多進程程序
編寫一個守護進程程序 sleep系統調用任務管理、同步與通信 Linux任務概述任務調度 管道 信號 共享內存 任務管理 API 了解Linux系統任務管理機制
熟悉進程間通信的幾種方式 熟悉嵌入式Linux中的任務間同步與通信編寫一個簡單的管道程序實現文件傳輸 編寫一個使用共享內存的程序
8、嵌入式系統中多線程程序設計
線程的基礎知識 多線程編程方法 線程應用中的同步問題了解線程的概念 能夠編寫簡單的多線程程序編寫一個多線程程序
9、嵌入式 Linux 網路編程
網路基礎知識 嵌入式Linux中TCP/IP網路結構 socket 編程 常用 API函數 分析Ping命令的實現 基本UDP套介面編程 許可證管理
PPP協議 GPRS 了解嵌入式Linux網路體系結構 能夠進行嵌入式Linux環境下的socket 編程 熟悉UDP協議、PPP協議 熟悉GPRS
使用socket 編寫代理伺服器 使用socket 編寫路由器 編寫許可證伺服器 指出TCP和UDP的優缺點 編寫一個web伺服器 編寫一個運行在
ARM平台的網路播放器
10、GUI 程序開發
GUI基礎 嵌入式系統GUI類型 編譯QT 進行QT開發熟悉嵌入式系統常用的GUI 能夠進行QT編程使用QT編寫「Hello,World」程序
調試一個加入信號/槽的實例 通過重載QWidget 類方法處理事件
11、Linux 字元設備驅動程序
設備驅動程序基礎知識 Linux系統的模塊 字元設備驅動分析 fs_operation結構 載入驅動程序了解設備驅動程序的概念
了解Linux字元設備驅動程序結構 能夠編寫字元設備驅動程序編寫Skull驅動 編寫鍵盤驅動 編寫I/O驅動 分析一個看門狗驅動程序
對比Linux2.6內核與2.4內核中字元設備驅動的不同Linux 塊設備驅動程序塊設備驅動程序工作原理 典型的塊設備驅動程序分析
塊設備的讀寫請求隊列了解Linux塊設備驅動程序結構 能夠編寫簡單的塊設備驅動程序比較字元設備與塊設備的異同 編寫MMC卡驅動程序 分析一個文件系統
對比Linux2.6內核與2.4內核中塊設備驅動的不同
12、文件系統
虛擬文件系統 文件系統的建立 ramfs內存文件系統 proc文件系統 devfs 文件系統 MTD技術簡介 MTD塊設備初始化
MTD塊設備的讀寫操作了解Linux系統的文件系統 了解嵌入式Linux的文件系統 了解MTD技術 能夠編寫簡單的文件系統為 ARM9開發板添加 MTD支持
移植JFFS2文件系統 通過proc文件系統修改操作系統參數 分析romfs 文件系統源代碼 創建一個cramfs 文件系統
無論選擇哪一方向,基本的linux的知識是需要具備的,其他還需要掌握的知識有ARM(最常用的一款嵌入式處理器)和C語言編程,每一方面知識的掌握熟練程度都最終決定了個人進行嵌入式linux開發的綜合能力。
更多詳情來源:《華清遠見嵌入式學院》
『肆』 如何在linux下用gtk開發圖形界面應用程序
* 使用 GTK+ 和 Glade 快速開發 Linux 圖形界面
** GTK+ 簡介
*** 基本概念
GTK+ 是一種用於創建圖形界面的庫. 嗯, gnome 用的就是它, 不過並不是說只
有在 gnome 環境中才能用, 只要系統上裝有 GTK 的庫 (基本上有圖形系統的個
人機都會有的啦) 就能運行基於 GTK 的程序. 除了 UNIX-like 平台, 它還移植
到 windows 上, 還有面向嵌入設備的 framebuffer 版本等等.
GTK 依賴兩個重要的庫. 一個是 GLib, 這並不是一個圖形庫, 也和 glibc 不同
, 它大抵上提供了一些介面以屏蔽系統的不同, 比如 gint 在哪裡都是 32bit
的, 等等; 另一個是 GDK, 它是一個設備無關的圖形庫, 支持基本的畫點, 以及
與窗口管理器溝通等任務, 由於 GTK 被設計成能在各個平台, 而非僅僅在
XWindow 環境下使用, 所以這個庫也是必要的. 而在他們上面的 GTK 庫, 就提
供了一些 widget --- 可以理解為控制項啦, 不過窗口也是一個 widget 的說, 給
我們使用, 並提供了包裝良好的事件響應機制.
*** GTK+ 開發基礎
要開發基於 GTK 的軟體, 必須先安裝 GTK+ 的開發包. 檢查是否正確安裝的辦
法是在安裝後執行 ``pkg-config --cflags --libs gtk+-2.0'', 如果安裝不正
確, 會提示找不到相應的包.
GTK 本身是基於 C 的庫, 當然也有 C++ 等語言的 wrap, 但它的整個體系是面
向對象的. 其最基本的類是 GObject, GtkObject 繼承了它, GtkObject 又派生
出我們最經常用到的 GtkWidget, 我們使用的所有窗體控制項都派生於它. 於是,
在 C 環境中我們就要手動處理這些類轉換, GTK 和底層的 GLib 等提供了一種
統一的轉換方法, 比如把類型為 GtkWidget* 的 button 轉換成 GtkButton 形,
寫法是: GTK_BUTTON(button), 就醬子.
我不打算在這里列一個 GTK 的 hello world 占頁面, 這個程序隨便 google 一
下就能找到. 我們可以自己想一想一個圖形界面應該如何建立.
首先我們要進行初始化, GTK 提供了 gtk_init() 作為初始化, 它檢查程序參數
中的一些特定部分, 進行自己的設置. 調用方法如下:
gtk_init(&argc, &argv);
將 argc 和 argv 傳指針的目的是 gtk_init 會對他們進行加工, 把 GTK 自己
用到的一些參數抽取出來.
接著, 我們必須要創建這些控制項吧, GTK 中, 創建一個控制項會返回一個
GtkWidget 類型 (或它的派生類) 的指針, 所有創建控制項的函數的格式是
gtk_控制項類型_new(參數表). 比如創建一個窗口的寫法是:
GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
然後, 我們要設定事件響應函數, GTK 中的事件叫做 signal. GTK 的事件響應
函數介面應該是類似這樣的
void
destroy(GtkWidget *widget, gpointer data)
我們把它連入到一個控制項中的方法是這樣的
g_signal_connect(G_OBJECT(window), "destroy", G_CALLBACK(destroy), NULL);
應該很好理解吧.
我們創建的咚咚, 要說明他們的位置和包含關系, GTK 用 container 來解決這
個問題, 它可以保證在窗口縮放的時候控制項的擺放依然合理, container 的具體
使用不詳細說, 後面經常要跟 container 打交道, 但基本上不用管 C 代碼, 嗯
. 不過其實我們的任何的可視控制項都繼承自 container, 比如 button 也是一個
container, 它很多時候裝的是一個 GtkLabel, 也就是用來顯示純文本的控制項,
於是我們就能見到一個文本按鈕, 嗯. 使用 container 的方法如下.
gtk_container_add(GTK_CONTAINER(window), button);
這樣 button 就會占滿整個 window 的控制項, 我們後面可以看到可以用
GtkVBox, GtkHBox 等 container 分隔窗體.
好了, 我們可以准備啟動程序了, 我們可以用 gtk_widget_show() 來顯示各個
控制項, 然後我們就應該進入到所謂的事件響應循環了, 這就要使用 gtk_main().
在程序運行過程中, 我們要操縱控制項, 比如說我們要在一個 entry 控制項(文本框
) 中取出其中的文字, 這樣的操作使用 gtk_控制項類型_動作(對象, 參數) 的形
式完成的, 比如剛才所說的任務, 做法是 gtk_entry_get_text(entry).
順便講講 GTK 程序的退出, 關閉 GTK 的窗口 (即使是所有窗口) 也不代表程序
退出, 因為那說到底只是一個界面而已, 我們當然可以使用 exit() 的自爆法退
出, 但最好還是給 GTK 一個料理後事的機會, 在主窗口的 destroy 事件響應函
數上用 gtk_main_quit() 就好了.
編譯 GTK 程序的辦法也很簡單.
gcc -o foo foo.c `pkg-config --cflags --libs gtk+-2.0`
** 使用 Glade 快速定製用戶界面
好了, 說了一堆有的沒的, 如果我現在說我上面說的那一堆中的大部分我們都不
會用到, 是不是覺得偶很歉扁? 前面的介紹只是給大家 GTK 這個庫的一些基本
概念, 概念就好了, 我們倒真的不用拿這些來編程的. 想想, 一個復雜一點的界
面, 十幾個控制項, 再加上各種各樣的 container, 自己掛事件, 再加上超常的命
名, 想想都恐怖.
這時候, Glade 橫空出世了! 這是一個可視化的界面編輯器 --- 但它僅僅是一
個界面編輯器而已, 甚至連代碼編輯框也沒有給出. 先不管了, 打開 glade (安
裝省略, 饒了我把, 記得裝 libglade-dev), 應該很好懂了, 指指點點就能弄好
一個界面, 然後在屬性窗的信號一欄中選取需要的信號, 設定響應函數, 非常好
弄.
玩了幾分鍾, 問題來了, 怎麼把它變為程序啊? 提供類似功能的 IDE 如
Borland C++ Builder, 在點擊創建新控制項的時候, 我們能即使在代碼窗看到自
動生成的代碼, Glade 也可以採用這種形式, 在設計好界面並保存後, 按一下主
窗口的 build 按鈕, 它就自動生成了界面代碼, 根本不用自己寫的. 打開代碼
目錄, callbacks.c 里已經有自動創建的事件響應的空函數, 在裡面填處理, 然
後 configure make 就行了.
但是, 這樣的開發方式還是有問題的. 第一, 自動生成的代碼非常復雜, 可是很
多時候我們還是不能完全不看它, 處理和界面是混在一起了, 理解他們變得困難
; 其二, 由於以上的原因, 修改界面變得非常痛苦; 其三, 它給你生成那堆有的
沒的配置文件不一定是你想要的.
因此 glade 提供了另一種方法, glade 編輯所得的 .glade 文件是一個 XML 文
件, 其實它已經完整地描述了界面, 我們能否採用一種簡單的方式直接載入, 配
置它呢. 這樣做, 我們的代碼中就真真正正地去處了煩人的界面生成代碼, 而專
注於處理部分了.
libglade 正是由於這個而來, 它能很好地完成上面所說的工作. 當我們用
glade 創建了一個 .glade 界面後, 用這種方法我們就可以建立界面, 運行程序
了.
#include <gtk/gtk.h>
#include <glade/glade.h>
GladeXML *GUI;
int
main(int argc, char **argv)
{
gtk_init(&argc, &argv);
/* load the interface */
GUI = glade_xml_new("frame.glade", NULL, NULL);
/* connect the signals in the interface */
glade_xml_signal_autoconnect(GUI);
/* start the event loop */
gtk_main();
return 0;
}
剩下的事情很簡單, 如果你的 button 的 clicked 控制項有一個響應函數
on_button_clicked, 你寫
void
on_button_clicked(GtkWidget *widget, gpointer data)
{
// balabalabala
}
就可以了. 所以, 上面講的一堆創建界面的方法, 其實大部分時候都用不著.
由於用到了 libglade, 我們的編譯方法變為
gcc -o foo foo.c `pkg-config --cflags --libs libglade-2.0`
** 開發舉例
一個很簡單的程序, 密碼學對稱加密演算法要用到的, 如果說是界面, 就是三個文
本框: 明文, 密碼, 密文, 三個按鈕, 加密, 解密, 清除, 完了. 為了實驗眾多
的演算法, 我們加了一個下拉窗口, 用來選擇演算法. 我把它設計成一個 wrapper
和框架, 它不實現任何演算法, 只是在界面中獲取用戶輸入, 調用外部程序, 並把
結果顯示出來而已. 這樣, 實際的演算法實現可以用純 C 寫的文本界面程序完成,
移植起來很方便, 在 windows 隨便做個一樣的界面做前端就整個移植過去了.
於是, 我們需要的窗體元素是 GtkEntry, GtkComboBoxEntry, GtkButton, 查查
手冊, 我們用到的界面相關的函數只有以下幾個:
- gtk_entry_get_text(), 用於獲取文本框輸入
- gtk_entry_set_text(), 用於在文本框中顯示結果
- gtk_combo_box_get_active_text(), 用於在 ComboBoxEntry (派生自
ComboBox) 取出用戶選中的演算法.
另一個問題是, 他們都需要相應的對象指針做參數, 這應該怎樣獲得呢? 我們使
用 glade_xml_get_widget(GUI, "控制項名") 就能取得控制項了.
『伍』 嵌入式linux系統開發的具體步驟
第一步、建立交叉編譯環境
沒有交叉開發經驗的讀者,可能一時很難接受這個概念。首先,要明白兩個概念:一般
我們工作的機器,稱為開發機、主機;我們製作好的系統將要放到某台機器,如手機或另一
台PC機,這台機我們稱為目標主機。
我們一般開發機上已經有一套開發工具,我們稱之為原生開發套件,我們一般就是用它
們來寫程序,那麼,那什麼又是交叉編譯環境呢?其實一點也不神秘,也就是在開發機上再
安裝一套開發工具,這套開發工具編譯出來的程序,如內核、系統工作或者我們自己的程序,
是放在目標主機上運行的。
那麼或許有初學者會問,直接用原生開發工具為目標主機編譯程序不就完了?至少我當
初是這么想的。一般來說,我們的開發機都是X86 平台,原生開發套件開發的工具,也針
對X86 平台,而我們的目標主機可能是PowerPC、IXP、MIPS……所以,我們的交叉編譯
環境是針對某一類具體平台的。
一般來講,交叉開發環境需要二進制工具程序、編譯器、C鏈接庫,嵌入式開發常用的
這三類軟體是:
Binutils
Gcc
uClibc
當然,GNU包含的工具套件不僅於此,你還要以根據實際需要,進行選擇
第二步、編譯內核
開發工具是針對某一類硬體平台,內核同樣也是。這一步,我們需要用第一步中建立的
工具,對內核進行編譯,對於有內核編譯經驗的人來說,這是非常簡單的;
第三步、建立根文件系統
也就是建立我們平常看到的bin、dev、proc……這一大堆目錄,以及一些必備的文件;
另外,我們還需要為我們的目標系統安裝一些常用的工具軟體,如ls、ifconfig……當然,
一個辦法是找到這些工具的源代碼,用第一步建立的交叉編譯工具來編譯,但是這些軟體一
是數量多,二是某些體積較大,不適合嵌入式系統,這一步,我們一般都是用busybox來完
成的,包括系統引導軟體init;
最後,我們為系統還需要建立初始化的引導文件,如inittab……
『陸』 求嵌入式linux開發詳細流程(步驟)
建立以Linux系統為基抄礎的開發襲環境;
配置開發主機(MINICOM調試嵌入式開發板、NFS網路文件系統,防火牆);
建立引導裝載程序BOOTLOADER(公開源代碼的BOOTLOADER,如U-BOOT、BLOB、VIVI、LILO、ARM-BOOT、RED-BOOT等);
下載別人已經移植好的Linux操作系統(如μCLinux、ARM-Linux、PPC-Linux等);
建立根文件系統(包括:/etc/init.d/rc.S、/etc/profile、/etc/.profile等);
建立應用程序的Flash磁碟分區,一般使用JFFS2或YAFFS文件系統;
開發應用程序,應用程序可以放入根文件系統中,也可以放入YAFFS、JFFS2文件系統中;
燒寫內核、根文件系統、應用程序、發布產品。