嵌入式linux编程,嵌入式Linux学习笔记 - 嵌入式Linux基础知识和开发环境的构建_Linux编程_Linux公社-Linux系统门户网站...
注:所有內(nèi)容基于友善之臂Mini2440開(kāi)發(fā)板
一、嵌入式Linux開(kāi)發(fā)環(huán)境的構(gòu)建
嵌入式開(kāi)發(fā)一般分為三個(gè)步驟:
1、編譯bootloader,燒到開(kāi)發(fā)板
2、編譯嵌入式Linux內(nèi)核,燒到開(kāi)發(fā)板
3、編譯各類(lèi)應(yīng)用程序,燒入開(kāi)發(fā)板
軟件環(huán)境構(gòu)建
采用主機(jī)windows,虛擬機(jī)CentOS上作為開(kāi)發(fā)環(huán)境,虛擬機(jī)的安裝和Linux安裝就不說(shuō)了。
安裝好后Linux應(yīng)該配置samba服務(wù),掛載windows下的代碼共享目錄
安裝交叉編譯工具鏈
對(duì)于嵌入式Linux,程序都是下到開(kāi)發(fā)板上運(yùn)行,開(kāi)發(fā)板和cpu相關(guān)的體系架構(gòu)與x86系列的都不一樣,所以不能用常規(guī)的gcc來(lái)編譯,必須用專門(mén)的交叉編譯工具
對(duì)于Mini2440,采用的是arm9處理器,使用友善之臂官方提供的編譯工具在光盤(pán)中有提供,下載地址:?http://www.linuxidc.com/Linux/2011-09/43527.htm
下載以后解壓到根目錄
# tar xvf arm-linux-gcc-4.3.2.tgz -C /
也可以自行編譯交叉工具鏈,但是過(guò)程繁瑣,容易出錯(cuò),我們還是把重點(diǎn)放在開(kāi)發(fā)上。
二、嵌入式編程基礎(chǔ)知識(shí)
一般的c/c++文件要變成可執(zhí)行文件需要經(jīng)過(guò)預(yù)處理、編譯、匯編、和連接等4個(gè)步驟
1)預(yù)處理
以#開(kāi)頭的為預(yù)處理命令,如包含命令#include、宏定義#define、條件編譯#if #ifdef,預(yù)處理的目的是將所有include文件插入到源文件中、將宏定義展開(kāi)、條件編譯成立的選擇使用的代碼,最后將所有代碼輸入到.i文件中等待處理,預(yù)處理需要用到arm-linux-cpp工具
2)編譯
把所有c/c++代碼(上面的.i文件)翻譯成匯編代碼,用到工具為ccl
3)匯編
將前面的匯編代碼翻譯成一定格式的機(jī)器碼,Linux上一般為ELF目標(biāo)文件,用到工具為arm-linux-as
4)連接
連接就是將上面生成的obj文件和系統(tǒng)庫(kù)的obj文件、庫(kù)文件連接起來(lái),最終生成在平臺(tái)上可執(zhí)行文件,用到工具為arm-linux-ld
arm-linux-gcc選項(xiàng)
1)-c
預(yù)處理、編譯和匯編源文件,不做連接,編譯器生成obj文件,gcc通過(guò).o替換.c .i .s等
2)-S
編譯后即停止,不進(jìn)行匯編,gcc用.s替換.c .i等
3)-E
預(yù)處理后停止,不進(jìn)行編譯,預(yù)處理代碼到標(biāo)準(zhǔn)輸出
4)-o file
指定輸出file文件
5)-v
顯示gcc版本,編譯細(xì)節(jié)
6)-Wall
打開(kāi)警告選項(xiàng)
7)-g
打開(kāi)調(diào)試選項(xiàng),可用gdb調(diào)試
8)-llibrary
連接名為library的庫(kù)文件,真正名字為liblibrary.a
9)-static
靜態(tài)編譯
10)-shared
生成共享obj文件
11)-Idir
指定dir為頭文件搜索目錄
12)-Ldir.
指定dir為庫(kù)文件搜索目錄
arm-linux-ld選項(xiàng)
1)-T
指定代碼段(-Ttext),數(shù)據(jù)段(-Tdate),bss段(-Tbss)的起始地址
使用連接腳本(-Txxx.lds)
例:
SECTIONS {
. = 0x30000000;
.text?? ? ? ?:?? ? ? ?{ *(.text)}
.rodata ALIGN(4)????: ?{ *(.rodate) }
.data ALIGN(4)????????: ?{ *(.data) }
.bss ALIGN(4)?? ? ? ? : ?{ *(.bss) *(COMMON) }
}
第二行表示當(dāng)前運(yùn)行地址為0x30000000,第三行定義了.text段,內(nèi)容為*(.text),表示所有輸入文件的代碼段,起始運(yùn)行地址為0x30000000
第四行定義了.rodata段,代碼緊挨.text,ALIGN(4)表示起始地址4字節(jié)對(duì)齊如果.text為0x30000000-0x300003f1,則.rodata地址為0x300003f4
arm-linux-objcopy選項(xiàng)
此命令用來(lái)復(fù)制一個(gè)目標(biāo)文件內(nèi)容到另一個(gè)文件中,可進(jìn)行格式轉(zhuǎn)換
例:將ELF格式轉(zhuǎn)換成二進(jìn)制文件
arm-linux-objcopy -O binary -S elf_file bin_file
arm-linux-objdump選項(xiàng)
常用來(lái)查看反匯編代碼
ELF轉(zhuǎn)反匯編
arm-linux-objdump -D elf_file > dis_file
二進(jìn)制轉(zhuǎn)反匯編
arm-linux-objdump -D -b binary -m arm bin_file > dis_file
Makefile介紹
1)格式:
目標(biāo) : 依賴
命令
例:
hello: hello.c
gcc -o hello hello.c
clean:
rm -f hello
2)賦值方法
延時(shí)變量:使用時(shí)才展開(kāi)
var = value
var ?= value(變量未定義才有效,即定義第一次出現(xiàn)的延時(shí)變量)
立即變量:定義時(shí)值就確定
var := value
對(duì)于 var += value 右邊變量如果前面使用:=定義為立即變量,則它是立即變量,否則為延時(shí)變量
3)Makefile常用函數(shù)
略,太多了,用到時(shí)再介紹
總結(jié)
以上是生活随笔為你收集整理的嵌入式linux编程,嵌入式Linux学习笔记 - 嵌入式Linux基础知识和开发环境的构建_Linux编程_Linux公社-Linux系统门户网站...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Redis 命令整理
- 下一篇: 2022-2028年中国智能制造装备产业