嵌入式linux入門筆記

2021-09-28 16:26:12 字數 2753 閱讀 6477

學習的是韋東山的jz2440板子,一開始假設是裸板,首先要用jtag把uboot燒到nor flash,完成後拔掉jtag,然後板子從nor flash啟動,剛開始啟動時馬上按空格鍵進入uboot選擇選單,會出現如下選擇項:

##### 100ask bootloader for openjtag #####

[n] download u-boot to nand flash

[o] download u-boot to nor flash

[k] download linux kernel uimage

[j] download root_jffs2 image

[y] download root_yaffs image

[d] download to sdram & run

[z] download zimage into ram

[g] boot linux from ram

[f] format the nand flash

[s] set the boot parameters

[b] boot the system

[r] reboot u-boot

[q] quit from menu

enter your selection:

選單中可以選擇燒n寫普通bin檔案到nand flash,由pc端通過usb把程式檔案傳輸給u-boot,再由u-boot把程式燒寫到nand flash,然後重新上電從nand flash啟動就可以執行裸板程式了。

同理在上面的選單中選擇k燒寫核心,pc端把核心傳到u-boot,u-boot再燒寫到nand flash。光有核心還不能執行應用程式,必須要燒寫根檔案系統。一開始我用的是資料裡提供的fs_mini_mdev.yaffs2,燒寫完畢後按q退出uboot選擇選單,輸入boot命令啟動核心,可以正常啟動bash,執行了ls等命令一切正常。

接著要做的事情就是自己寫個hello world的應用程式玩一下。先安裝交叉編譯器arm-linux-gcc,我的是arm-linux-gcc-4.3.2.tar.bz2,輸入命令sudo tar -jxvf arm-linux-gcc-4.3.2.tar.bz2解壓,輸入命令cp -r ./usr/local/ /usr/local/ 把解壓出來的arm子檔案複製到/usr/local/目錄下,輸入命令sudo gedit /etc/environment開啟環境變數,把上一行注釋掉,輸入path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/usr/local/arm/4.3.2/bin"設定arm-linux-gcc-4.3.2的位址,最後輸入 source /etc/environment使環境變數生效。可以使用命令arm-linux-gcc -v來檢視版本資訊,確認是否安裝成功。

安裝好後寫乙個hello world程式的main.c檔案,編譯arm-linux-gcc -o hello main.c,這樣就生成了乙個名為hello的arm可執行程式。由於現在還沒設定nfs,還不能用網路掛載,暫時使用u盤掛載。插入u盤後,開發板的shell會顯示

sd 0:0:0:0: [sda] 15728640 512-byte hardware sectors (8053 mb)

sd 0:0:0:0: [sda] write protect is off

sd 0:0:0:0: [sda] assuming drive cache: write through

sd 0:0:0:0: [sda] 15728640 512-byte hardware sectors (8053 mb)

sd 0:0:0:0: [sda] write protect is off

sd 0:0:0:0: [sda] assuming drive cache: write through

如下資訊,這個sda指的就是u盤裝置,掛載時用的名字一般是sda1,如果插拔後名字sda可能會變為sdb,可以通過cat /proc/partitions確認u盤名字。接下來進入/mnt目錄,新建乙個disk目錄,使用命令mkdir disk,然後使用掛載命令mount -t vfat /dev/sda1 /mnt/disk,成功後cd進入/mnt/disk目錄,輸入ls就可以顯示u盤下的所有檔案了。

之前我已經把hello檔案拷到了u盤,現在來執行一下./hello,顯示的是-sh: ./hello: not found。我用的是資料裡原來提供的核心,可能編譯器版本不一樣,所以把linux-2.6.22.6.tar.bz2的原始碼用arm-linux-gcc-4.3.2重新編譯一遍,結果還是老樣子。後來查資料說動態庫有問題,然後把hello程式改為靜態編譯,還是不行,但是執行後的錯誤提示變成了illegal instruction。

現在核心,應用程式都是用同乙個編譯器編譯的,那麼只有根檔案系統不同,查了一下作者說是用arm-linux-gcc-3.4.5版本編譯的,但是只要不執行應用程式,根檔案系統卻是正常執行的。看了一些根檔案系統的製作資料後,用arm-linux-gcc-4.3.2重新編譯busybox1.7製作最小根檔案系統,這樣核心,應用程式,根檔案系統都是統一編譯器編譯的,但是重新編譯製作根檔案系統後,連bash都進不去,核心啟動後卡死在freeing init memory: 136k,在載入busybox時出了問題,不知道什麼原因,遂放棄。後來用arm-linux-gcc-3.4.5編譯hello程式,仍然使用原來的根檔案系統,總算可以執行輸出hello world了,用arm-linux-gcc-3.4.5自己製作了乙個根檔案系統,也一切正常。

嵌入式入門

入門階段 不要只看書,要多動手,但千萬不是直接動手,不去看書 c語言 嵌入式程式設計大多用c語言 少量彙編,先學習c語言,彙編用到的時候再上網查詢。教材 隨便一本c語言大學教材,快速入門,電腦上照著教材敲 有問題網上搜尋解決。簡單模組 數碼管 蜂鳴器 電機 按鍵 流水燈等 不一定要學習開發板上的所有...

嵌入式Linux學習筆記

嵌入式linux學習筆記 學習 一 linux的優勢 1 廣泛的硬體支援 linux能夠支援x86 arm mips alpha powerpc等多種體系結構,目前已經成功移植到數十種硬體平台,幾乎能夠執行在所有流行的cpu上。linux有著異常豐富的驅動程式資源,支援各種主流硬體裝置和最新硬體技術...

嵌入式linux學習筆記

1 溢位 兩個數相加,如果最高位的進製和此高位的進製不同,則產生溢位。2 進製和溢位的概念不一樣。3 預取 取得是編譯後得到的機器 解碼 執行 4 arm的彙編指令長度是確定的,32位。5 一條彙編指令 條件碼 4bit 操作碼 分類碼 s 1bit 目的暫存器 4bit 源暫存器 4bit 立即數...