linux嵌入命令
❶ 在嵌入式linux設備上如何安裝一些命令,例如yum等
所有的命令其實都是程序,除了 sh 內建的有限的幾個命令。
所以你明白了沒?想要用 yum ,那就去給你這個嵌入式設備裝 yum 程序。
很多命令都要去針對的編譯安裝。嵌入式在開發邏輯上,你需要什麼命令,就去編譯什麼命令的支持程序。而不是去找已經做好的二進製程序。那是 Linux 用戶而不是開發者的想法。
不過我可以告訴你,嵌入式用 yum 根本不實際。因為嵌入式 Linux 系統是針對性很強的系統,這種針對性對於嵌入式系統開發者來說,控制軟體組成基本是確定的工作。桌面 Linux 的 yum 是由這個操作系統的製作者們進行系統整體軟體組成及管理的一個程序,他主要的是提供一個在線軟體倉庫的功能。因為 yum 本身是基於 rpm 再開發的類 deb 在線倉庫程序。rpm 本身沒有在線軟體庫的功能功能。只是一個簡單的軟體包管理,依賴管理程序。
但你一個嵌入式系統,卻非要去用 yum 。難道你想做一個基於 arm 的桌面操作系統?嵌入式很多情況下,連軟體包管理器都不需要。更何況這種在線軟體倉庫?
就算你想弄軟體倉庫,那你的軟體頂多是應用程序倉庫,類似 android 的軟體商店就足夠了。根本不需要 yum 這種支持依賴管理等等各種的功能。而且一套 yum 和 rpm 的支持庫,就可以吃掉你的嵌入式設備的大部分存儲空間。而且為了實現 yum 的主要功能你還要去維護一個 yum 軟體倉庫伺服器才行。
有那功夫自己寫一個軟體管理器都來得及。本身嵌入式系統就不需要太多的軟體包管理功能。
❷ 如何在linux shell中嵌入hbase命令
1寫你要實現的功能的shell腳本 2chmod 增加可執行許可權 3放到類似usr/local/bin 之類的目錄下面,就是環境變數PATH能找到的目錄
❸ Linux常用基本命令大全介紹
學習Linux系統,命令是最基礎的一部分,有著很重要的地位,所以入門必須掌握好常用命令。下面由我為大家整理了Linux系統常用的基本命令入門篇,希望對大家有幫助!
Linux系統常用的基本命令入門篇一、基礎命令
1.Linu x的進 入與退出系統
進入Linux系統:
必須要輸入用戶的賬號,在系統安裝過程中可以創建以下兩種帳號:
1.root--超級用戶帳號(系統管理員),使用這個帳號可以在系統中做任何事情。
2.普通用戶--這個帳號供普通用戶使用,可以進行有限的操作。
一般的Linux使用者均為普通用戶,而系統管理員一般使用超級用戶帳號完成一些系統管理的工作。如果只需要完成一些由普通帳號就能完成的任務,建議不要使用超級用戶帳號,以免無意中破壞系統。影響系統的正常運行。
用戶登錄分兩步:第一步,輸入用戶的登錄名,系統根據該登錄名識別用戶;第二步,輸入用戶的口令,該口令是用戶自己設置的一個字元串,對其他用戶是保密的,是在登錄時系統用來辨別真假用戶的關鍵字。
當用戶正確地輸入用戶名和口令後,就能合法地進入系統。屏幕顯示:
[root@loclhost/root] #
這時就可以對系統做各種操作了。注意超級用戶的提示符是“#”,其他用戶的提示符是“$”。
2.修改口令
為了更好的保護用戶帳號的安全,Linux允許用戶隨時修改自己的口令,修改口令的命令是passwd,它將提示用戶輸入舊口令和新口令,之後還要求用戶再次確認新口令,以避免用戶無意中按錯鍵。如果用戶忘記了口令,可以向系統管理員申請為自己重新設置一個。
3.虛擬控制台
Linux是一個真正的多用戶 操作系統 ,它可以同時接受多個用戶登錄。Linux還允許一個用戶進行多次登錄,這是因為Linux和UNIX一樣,提供了虛擬控制台的訪問方式,允許用戶在同一時間從控制台進行多次登錄。虛擬控制台的選擇可以通過按下Alt鍵和一個功能鍵來實現,通常使用F1-F6例如,用戶登錄後,按一下Alt-F2鍵,用戶又可以看到"login:"提示符,說明用戶看到了第二個虛擬控制台。然後只需按Alt-F1鍵,就可以回到第一個虛擬控制台。 一個新安裝的Linux系統默認允許用戶使用Alt-F1到Alt-F6鍵來訪問前六個虛擬控制台。虛擬控制台可使用戶同時在多個控制台上工作,真正體現Linux系統多用戶的特性。用戶可以在某一虛擬控制台上進行的工作尚未結束時,切換到另一虛擬控制台開始另一項工作。
退出系統
不論是超級用戶,還是普通用戶,需要退出系統時,在shell提示符下,鍵入exit命令即可。
4.查看命令幫助信息
man命令
man命令用於查詢命令和程序的使用 方法 和參數。
例如:
man ls
將顯示ls命令的基本格式和使用方法
Linux系統常用的基本命令入門篇二、關機重啟命令
首先,是關機/重啟命令,僅在虛擬機時使用,實際工作中用不到
reboot 一般不跟參數使用,輸入指令即可重啟
shutdown 一般需要跟參數,例:
shutdown -r 延時多少分鍾重啟,一般使用now
shutdown -r now 立即重啟
shutdown -f 強制重啟
跟windows一樣,linux也存在注銷功能
exit
1)halt
halt 可不接參數
halt -f 強制關機
2)poweroff
poweroff 可不接參數使用
poweroff -f 強制關機
3)init 0
4)shutdown 不可單獨使用
shutdown -h 分鍾數 延時多久關機
shutdown -h now 立即關機
Linux系統常用的基本命令入門篇三、vi編輯
vi命令是UNIX操作系統和類UNIX操作系統中最通用的全屏幕純文本編輯器。
Linux中的vi編輯器叫vim,它是vi的增強版(vi Improved),與vi編輯器完全兼容,而且實現了很多增強功能。
vi編輯器支持編輯模式和命令模式,編輯模式下可以完成文本的編輯功能,命令模式下可以完成對文件的操作命令,要正確使用vi編輯器就必須熟練掌握著兩種模式的切換。
默認情況下,打開vi編輯器後自動進入命令模式。從編輯模式切換到命令模式使用“esc”鍵,從命令模式切換到編輯模式使用“A”、“a”、“O”、“o”、“I”、“i”鍵。
vi編輯器提供了豐富的內置命令,有些內置命令使用鍵盤組合鍵即可完成,有些內置命令則需要以冒號“:”開頭輸入。常用內置命令如下:
1 Ctrl+u:向文件首翻半屏;
2 Ctrl+d:向文件尾翻半屏;
3 Ctrl+f:向文件尾翻一屏;
4 Ctrl+b:向文件首翻一屏;
5 Esc:從編輯模式切換到命令模式;
6 ZZ:命令模式下保存當前文件所做的修改後退出vi;
7 :行號:游標跳轉到指定行的行首;
8 :$:游標跳轉到最後一行的行首;
9 x或X:刪除一個字元,x刪除游標後的,而X刪除游標前的;
10 D:刪除從當前游標到游標所在行尾的全部字元;
11 dd:刪除游標行正行內容;
12 ndd:刪除當前行及其後n-1行;
13 nyy:將當前行及其下n行的內容保存到寄存器?中,其中?為一個字母,n為一個數字;
14 p:粘貼文本操作,用於將緩存區的內容粘貼到當前游標所在位置的下方;
15 P:粘貼文本操作,用於將緩存區的內容粘貼到當前游標所在位置的上方;
16 /字元串:文本查找操作,用於從當前游標所在位置開始向文件尾部查找指定字元串的內容,查找的字元串會被加亮顯示;
17 ?name:文本查找操作,用於從當前游標所在位置開始向文件頭部查找指定字元串的內容,查找的字元串會被加亮顯示;
18 a,bs/F/T:替換文本操作,用於在第a行到第b行之間,將F字元串換成T字元串。其中,“s/”表示進行替換操作;
19 a:在當前字元後添加文本;
20 A:在行末添加文本;
21 i:在當前字元前插入文本;
22 I:在行首插入文本;
23 o:在當前行後面插入一空行;
24 O:在當前行前面插入一空行;
25 :wq:在命令模式下,執行存檔退出操作;
26 :w:在命令模式下,執行存檔操作;
27 :w!:在命令模式下,執行強制存檔操作;
28 :q:在命令模式下,執行退出vi操作;
29 :q!:在命令模式下,執行強制退出vi操作;
30 :e文件名:在命令模式下,打開並編輯指定名稱的文件;
31 :n:在命令模式下,如果同時打開多個文件,則繼續編輯下一個文件;
32 :f:在命令模式下,用於顯示當前的文件名、游標所在行的行號以及顯示比例;
33 :set nu:在命令模式下,用於在最左端顯示行號;
34 :set nonu:在命令模式下,用於在最左端不顯示行號;
35 :1,3y 復制第一行到第三行
36 :1,3d 刪除第一行到第三行
37 :1,3s/str/str_new/g 替換第一行到第三行中的字元串
38 :1,3s/str/str_new 替換第一行到第三行中的字元串第一個字元
39 :1,3 g/str /d 刪除第一行到第三行中含有這個字元串的行
Linux常用命令一、查詢相關
find
按規則查找某個文件或文件夾,包括子目錄
find . -name '_sh' -- 以.sh結尾的文件
find . -name '_hannel_ -- 包含channel字元的文件
find . -name 'build_ -- 以build開頭的文件
find . -name 'abc??' -- abc後面有兩個字元的文件
grep
查找內容包含指定的範本樣式的文件,Global Regular Expression Print
grep -n pattern files -- 規則 -n表示顯示行號
grep -n 'PostsActivity' AndroidManifest.xmlgrep -n 'd' AndroidManifest.xmlgrep 'aapt' build-channel.xml -- 文件中包含字元串的所有地方
grep -n 'aapt' build-channel.xml -- 文件中包含字元串的所有地方,並顯示行號
ps -e | grep java -- 所有java進程
ps -e | grep -i qq --所有qq進程,不區分大小寫
find . -name '_hannel.xml' | xargs grep -n 'aapt' -- 在以channel.xml結尾的文件中查找包含‘aapt’關鍵字的地方
ls | grep 'channel' -- 包含channel關鍵字的文件
which
在PATH變數指定的路徑中,搜索某個系統命令的位置,並且返回第一個搜索結果
which zipwhich grep
Linux常用命令二、查看命令
tail
tail [-f] [-c Number | -n Number | -m Number | -b Number | -k Number] [File]
從指定點開始將文件寫到標准輸出。使用tail命令的-f選項可以方便的查閱正在改變的日誌文件,tail -f filename會把filename里最尾部的內容顯示在屏幕上,並且不斷刷新,使你看到最新的文件內容。
tail -f test.log,循環查看文件內容,Ctrl+c來終止
tail -n 5 test.log,顯示文件最後5行內容
tail -n +5 test.log,從第5行開始顯示文件
more
more [-dlfpcsu] [-num] [+/ pattern] [+linenum] [file...]
more命令和cat的功能一樣都是查看文件里的內容,但有所不同的是more可以按頁來查看文件的內容,還支持直接跳轉行等功能。
more +3 test.log,顯示文件中從第3行起的內容
more -5 test.log,設定每屏顯示行數
ls -l | more -5,每頁顯示5個文件信息
more +/day3 test.log,查找第一個出現"day3"字元串的行,並從該處前兩行開始顯示輸出
less
less [options] [file...]
與more命令一樣,less命令也用來分屏顯示文件的內容。但是二者存在差別:less命令允許用戶向前或向後瀏覽文件,而more命令只能向前瀏覽。用less命令顯示文件時,用PageUp鍵向上翻頁,用PageDown鍵向下翻頁。要退出less程序,應按Q鍵。
less test.log,查看文件
ps -ef | less,查看進程信息並通過less分頁顯示
history | less,查看命令歷史使用記錄並通過less分頁顯示
less test1.log test2.log,瀏覽多個文件,n和p切換文件
watch
watch [options] command
每隔一段時間重復運行一個命令,默認間隔時間是2秒。要運行的命令直接傳給shell(注意引用和轉義特殊字元)。結果會展示為全屏模式,這樣你可以很方便的觀察改變
watch -n 60 date,執行date命令每分鍾一次,輸入^C 退出
watch -d ls -l,查看目錄變化
watch -d ’ls -l | fgrep joe’,想找joe用戶的文件
watch -d 'ls -l|grep scf',監測當前目錄中 scf' 的文件的變化
watch -n 10 'cat /proc/loadavg',10秒一次輸出系統的平均負載
watch -n 1 -d netstat -ant,每隔一秒高亮顯示網路鏈接數的變化
watch -n 1 -d 'pstree | grep http',每隔一秒高亮顯示http鏈接數的變化
Linux常用命令三、文件相關
vi
vi file
按i鍵,進入編輯模式
按esc鍵,進入命令模式
:w 保存文件但不退出vi
:w file 將修改另外保存到file中,不退出vi
:w! 強制保存,不推出vi
:wq 保存文件並退出vi
:wq! 強制保存文件,並退出vi
q: 不保存文件,退出vi
:q! 不保存文件,強制退出vi
:e! 放棄所有修改,從上次保存文件開始再編輯
chmod
change mode,變更文件或目錄的讀、寫、運行許可權
chmod [-cfvR] [--help] [--version] mode file...
mode:許可權設定字串,格式如下 : [ugoa...][[+-=][rw xX ]...][,...]
u 表示該檔案的擁有者,g 表示與該檔案的擁有者屬於同一個群體(group)者,o 表示其他以外的人,a 表示這三者皆是
+ 表示增加許可權、- 表示取消許可權、= 表示唯一設定許可權。
r 表示可讀取,w 表示可寫入,x 表示可執行,X 表示只有當該檔案是個子目錄或者該檔案已經被設定過為可執行。
chmod也可以用數字來表示許可權,語法為:chmod abc file,如chmod 777 file
其中a,b,c各為一個數字,分別表示User、Group、及Other的許可權。 r=4,w=2,x=1
chmod 777 file,等同於 chmod a=rwx file
chmod ug=rwx,o=x file,等同於 chmod 771 file
chmod 4755 filename,可使此程序具有root的許可權
ls -l 可以查看列出當前用戶的文件許可權
zip
zip -r filename.zip filesdir
zip -r test.zip ./_把當前所有文件壓縮到test.zip
zip -r test.zip test,把test文件所有文件及目錄,要是到test.zip
zip -d test.zip test.txt,刪除壓縮文件中test.txt文件
zip -m test.zip ./test.txt,向壓縮文件中test.zip中添加test.txt文件
zip -r test.zip file1 file2 file3 filesdir,處理多個文件和目錄,空格隔開
unzip
unzip zip-file,解壓到當前目錄
unzip -d dst-dir zip-file,解壓到指定的目錄,-d後為指定目錄
unzip -n zip-file,不覆蓋已經存在的文件,-n為不要覆蓋原有的文件
unzip -n -d dst-dir zip-file,解壓到指定的目錄,不覆蓋已經原有的文件
unzip -o -d dst-dir zip-file,-o不必先詢問用戶覆蓋原有文件
unzip -l zip-file,僅查看壓縮文件內所包含的文件
tar
tar cvf test.tar test,把test下所有文件和目錄做備份tar czvf test.tar.gz test,把test下所有文件和目錄做備份並進行壓縮tar xzvf test.tar.gz,把這個備份文件還原並解壓縮tar tvf test.tar | more,查看備份文件的內容,並以分屏方式顯示在 顯示器 上
tar czvf test.tar.gz test --exclude=test/svn,備份壓縮並排除目錄
touch
❹ 如何用嵌入式linux操作系統的命令來復制整個目錄
cp命令
功能:將給出的文件或目錄拷貝到另一文件或目錄中,就如同DOS下的命令一樣,功能非常強大。
語法:cp [選項] 源文件或目錄 目標文件或目錄
說明:該命令把指定的源文件復制到目標文件或把多個源文件復制到目標目錄中。
參數:
- a 該選項通常在拷貝目錄時使用。它保留鏈接、文件屬性,並遞歸地拷貝目錄,其作用等於dpR選項的組合。
- d 拷貝時保留鏈接。
- f 刪除已經存在的目標文件而不提示。
- i 和f選項相反,在覆蓋目標文件之前將給出提示要求用戶確認。回答y時目標文件將被覆蓋,是互動式拷貝。
- p 此時cp除復制源文件的內容外,還將把其修改時間和訪問許可權也復制到新文件中。
- r 若給出的源文件是一目錄文件,此時cp將遞歸復制該目錄下所有的子目錄和文件。此時目標文件必須為一個目錄名。
- l 不作拷貝,只是鏈接文件。
需要說明的是,為防止用戶在不經意的情況下用cp命令破壞另一個文件,如用戶指定的目標文件名是一個已存在的文件名,用cp命令拷貝文件後,這個文件就會被新拷貝的源文件覆蓋,因此,建議用戶在使用cp命令拷貝文件時,最好使用i選項。
$ cp - i exam1.c /usr/wang/shiyan1.c
該命令將文件exam1.c拷貝到/usr/wang 這個目錄下,並改名為 shiyan1.c。若不希望重新命名,可以使用下面的命令:
$ cp exam1.c /usr/ wang/
$ cp - r /usr/xu/ /usr/liu/ 將/usr/xu目錄中的所有文件及其子目錄拷貝到目錄/usr/liu中。
mv命令
功能:為文件或目錄改名或將文件由一個目錄移入另一個目錄中。該命令如同DOS下的ren和move的組合。
語法:mv [選項] 源文件或目錄 目標文件或目錄
說明:視mv命令中第二個參數類型的不同(是目標文件還是目標目錄),mv命令將文件重命名或將其移至一個新的目錄中。當第二個參數類型是文件時,mv命令完成文件重命名,此時,源文件只能有一個(也可以是源目錄名),它將所給的源文件或目錄重命名為給定的目標文件名。當第二個參數是已存在的目錄名稱時,源文件或目錄參數可以有多個,mv命令將各參數指定的源文件均移至目標目錄中。在跨文件系統移動文件時,mv先拷貝,再將原有文件刪除,而鏈至該文件的鏈接也將丟失。
❺ 嵌入式linux課程設計
Ⅰ 跪求 ARM嵌入式linux系統開發詳解(珍藏版)pdf
珍藏版啊。。
Ⅱ 學嵌入式linux需要先學什麼
剛入門的時候,淘寶買一塊cortex m3開發板即可入手,通過項目,你需要了解:任務調度、進程間通信、內存管理、設備驅動、文件系統、TCP/IP協議棧、同步非同步、中斷、軟體架構插件化等等基本原理,這些對你後面轉Linux應用開發,安卓開發,後台開發大有好處。
到這一步,就看自己職業方向想往哪裡發展,如果是想深入IOT物聯網做端雲連接,那麼可以把幾種基本匯流排驅動,I2C、SPI、USART理解透,如果是想擁抱互聯網轉入應用開發,那麼可以把基礎組件,如協議棧、文件系統吃透,BAT面試不是很難,問的都是這些基礎。
順便說一下,學東西就要學對市場有用的,不要過於學習屠龍之術,炫技給個人帶來不了財富,公司需要的是能幹活的人。
不準備講過於偏硬體的知識如Cortex-M3的多種中斷模式,操作寄存器組,晶元降噪等內容,而是專注於操作系統基本知識和項目經驗,這些對於開發者後面接觸Linux系統大有脾益,這些軟體開發經驗也是去互聯網公司看重的能力。如有需要學習Linux命令請如下查找:
Ⅲ 基於linux嵌入式平台井字棋課程設計
基於linux嵌入式平台井字棋課程
這么肯定還好的
確
Ⅳ 跪求一份完整的嵌入式Linux方面的C項目實例
怎樣的人適合學習嵌入式?
學習嵌入式需要有一定的基礎,這些基礎大概包括下面兩點:
學過c語言,匯編;
對微控制器有一定了解。
一般理工類(計算機,自動化,電子類專業)的學生大三學比較合適。因為到了大三,一般學過了c語言及匯編,雖然大部分學生沒有獨立寫過一個程序,但至少上過這門課,自己也看過相關知識點;而且上過8051等微控制器原理的課程,也看過類似的教課書。
具備以上基礎的人,也不是誰都可以學。因為嵌入式學習門檻比較高,難度比較大,不但要有一定的毅力,而且要觸類旁通,如果太死板也很難學會。
概括的說學習嵌入式還必備下列性格:
熱愛研發!
切忌浮躁!
執著,頑強,自信!
舉一反三!
如果你符合以上條件,完全可以經過努力把嵌入式學好,我了解到的在華清遠見學習的一個同學,之前基本上什麼基礎都沒有,寫一個「hello world」程序都為難,編譯了幾次才通過,但是經過四個月的努力,在華清遠見專業老師和同學們的熱心幫助下,從一個完全的菜鳥變成了入門級別的linux工程師了,找到了一份做應用開發的工作,工資大概有四千吧,還算不錯。
LZ要自學的話,可以多到華清遠見的網站上看看他們的課程設置,就知道自己該學些什麼,還有很多學習資料和視頻可以下載,另外華清遠見出版的40多本嵌入式專業暢銷書,外面各大書店和圖書館都有,你都可以去翻翻看看。
祝你早日學有所成!
請參考,希望能幫到你。
Ⅳ 做嵌入式原理課程設計 linux內核精簡 是什麼意思,該怎麼做
OK 我發給你 .
Ⅵ 求嵌入式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文件系統中;
燒寫內核、根文件系統、應用程序、發布產品。
Ⅶ 嵌入式Linux課程設計源代碼
Linux課程體系了解一來下:
Linux雲計源算網路管理實戰
Linux系統管理及服務配置實戰
Linux Shell自動化運維編程實戰
Linux雲計算網路管理實戰
大型網站高並發架構及自動化運維項目
網站安全滲透測試及性能調優項目實戰
公有雲運維技術項目實戰
企業私有雲架構及運維實戰
Python自動化運維開發基礎
Python自動化運維開發項目實戰
Ⅷ 嵌入式ARM/LINUX畢業設計
有辦法的話找個附近的嵌入式公司選他們的板子在上面做個小擴展性開發。最好選嵌入式教授采購實驗設備的代理 之類的,甚至可以「開發」一款他們已有的功能,抄一下寫個論文即可。
Ⅸ 學習嵌入式linux流程
嵌入式學習是一個循序漸進的過程,有C語言基礎還是比較好的,C++的話不搞上層應用就用不上,如果是希望向嵌入式Linux方向發展的話,關於這個方向,我認為大概分3個階段:
1、嵌入式linux上層應用,包括QT的GUI開發
2、嵌入式linux系統開發
3、嵌入式linux驅動開發
嵌入式目前主要面向的幾個操作系統是,LINUX,WINCE、VxWorks等等
Linux是開源免費的,而且其源代碼是開放的,更加適合我們學習嵌入式。
你可以嘗試以下路線:
(1) C語言是所有編程語言中的強者,單片機、DSP、類似ARM的種種晶元的編程都可以用C語言搞定),因此必須非常熟練的掌握。
推薦書籍:《The C Programming Language》 這本經典的教材是老外寫的,也有中譯版本。
(2) 操作系統原理,是必需的,如果你是計算機專業畢業那也就無所謂了,如果是非計算機專業的就必須找一本比較淺顯的計算機原理書籍看一看,把啥叫「進程」「線程」「系統調度」等等基本問題搞清楚。
(3)Linux操作系統就是用C語言編寫的,所以你也應該先學習下Linux方面的編程,只有你會應用了,才能近一步去了解其內核的精髓。
推薦書籍:《UNIX環境高級編程》(第2版)
(4) 了解ARM的架構,原理,以及其匯編指令,我們在嵌入式開發中,一般很少去寫匯編,但是最起碼的要求是能夠看懂arm匯編。
(5) 系統移植的時候,就需要你從最下層的bootloader開始,然後內核移植,文件系統移植等。而移植這部分對硬體的依賴是非常大的,其配置步驟也相對復雜,也沒有太多詳細資料。
(6) 驅動開發
linux驅動程序設計既是個極富有挑戰性的領域,又是一個博大精深的內容。
linux驅動程序設計本質是屬於linux內核編程范疇的,因而是對linux內核和內核編程是有要求的。在學習前你要想了解linux內核的組成,因為每一部分要詳細研究的話足夠可以擴展成一本厚書。
以上只不過是大概的框架,在實際的開發中還會涉及很多東西,比如:交叉編譯、makefile、shell腳本等等,所以說學習嵌入式的周期較長,門檻較高,自學的話更是需要較強的學習能力和專業功底。只要能堅持下來一定會取得成功!
其實LZ可以到一些嵌入式培訓機構的網站上看一下他們的課程設置,就會在腦子里有個清晰的思路,比如華清遠見的官方網站,上面的嵌入式內容很豐富,嵌入式方面的信息更新也很迅速,沒事可以去轉轉。
Ⅹ 求嵌入式Linux 課程設計,隨便什麼題目,用C或C++寫的!要有完整的源代碼,有實驗報告就更好了!
網上很多啊,自己去搜一個就好了,但是要改動一下,不然會重復的...弱弱的問一下,你是南京某高校的么?
❻ 「干貨」嵌入式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啟動