BSP及嵌入式驅動開發筆記
第一講嵌入式系統基本概念
以應用為中心,以電腦技術為基礎,其軟硬體可配置,對功能、可靠性、成本、體積、功耗有嚴格約束的一種專用系統,所用的電腦稱為嵌入式電腦。
Linux目錄檔案
/bin :顯而易見,bin 就是二進位(binary)英文縮寫。
/boot :在這個目錄下存放的都是系統啟動時要用到的程式。在使用grub或lilo引導linux的時候,會用到這裡的一些資訊。
/dev:dev 是裝置(device)的英文縮寫。這個目錄對所有的使用者都十分重要。因為在這個目錄中包含了所有linux系統中使用的外部裝置。但是這裡並不是放的外部裝置的驅動程式。
/etc :etc這個目錄是linux系統中最重要的目錄之一。在這個目錄下存放了系統管理時要用到的各種設定檔和子目錄。我們要用到的網路設定檔,檔案系統,x系統設定檔,裝置配置資訊,設定使用者資訊等都在這個目錄下。
/sbin :這個目錄是用來存放系統管理員的系統管理程式。
/home :如果建立一個使用者,使用者名稱是“jl”,那麼在/home目錄下就有一個對應的/home/jl路徑,用來存放使用者的主目錄。
/lib :lib是庫(library)英文縮寫。這個目錄是用來存放系統動態串連共用庫的。幾乎所有的應用程式都會用到這個目錄下的共用庫。
/mnt :這個目錄在一般情況下也是空的。可以臨時將別的檔案系統掛在這個目錄下。
/proc :可以在這個目錄下擷取系統資訊。這些資訊是在記憶體中,由系統自己產生的。
/root :如果使用者是以超級使用者的身份登入的,這個就是超級使用者的主目錄。
/tmp :用來存放不同程式執行時產生的臨時檔案。
/usr :這是linux系統中佔用硬碟空間最大的目錄。
Linux命令
1、ls、mkdir、rmdir、date、who 相對路徑和絕對路徑
2、檔案解壓命令
gzip *.jpg壓縮 gzip –d *.gz解壓
打包命令
.gz
解壓1:gunzip FileName.gz
解壓2:gzip -dFileName.gz
壓縮:gzip FileName
打包
.tar.gz 和 .tgz
解壓:tar zxvfFileName.tar.gz ./DirName
壓縮:tar zcvfFileName.tar.gz DirName
.tar.bz2
解壓:tar xjf FileName.tar.bz2 ./DirName
壓縮:tar cjf FileName.tar.bz2 DirName
fdisk –l查看磁碟裝置資訊 fdisk –l /dev/sdb 查看磁碟裝置資訊如u盤
mount 掛載u盤和nfs
mount -t nfs 主機ip:共用目錄 掛載點 mount -t nfs 192.168.1.4:/arm2410s /mnt
–onolock加檔案鎖 mount –t nfs –onolock 192.168.1.4:/home/test /mnt
mount –t msdos /dev/sdb1 mnt/usb u盤裝置是/dev/sdb1 掛載到 /mnt/usb
mount -t vfat /dev/sdb1 /mnt/sdcard 掛載u盤
msdos檔案系統參數 如fat32用vfat fat16用msdos ext用ext2
redhat-config-users查看使用者
第2講 嵌入式交叉開發環境
嵌入式linux開發流程
1、 建立開發環境
2、 配置開發主機,配置MINICOM(相當於Windows下的超級終端)
3、 建立引導裝載程式bootloader
4、 下載別人已經移植好的linux作業系統
5、 建立根檔案系統
6、 建立應用程式的flash分區
7、 開發應用程式
8、 燒寫核心、根檔案系統、應用程式
9、 發布產品
開發模式 交叉編譯
• 宿主機(Host)是用來開發嵌入式軟體的系統。指要安裝虛擬機器軟體的電腦。
• 目標機(Target)是被開發的目的嵌入式系統。指arm裝置。
• 交叉編譯器(Cross-compiler)是進行交叉平台開發的主要軟體工具。它是運行在一種處理器體繫結構上,但是可以產生在另一種不同的處理器體繫結構上啟動並執行目標代碼的編譯器。
串口、網線
虛擬機器裡面的Linux系統、arm、PC
ftp在三者中都可以通,nfs為linux和linux系統之間通訊,samba伺服器是在linux和Windows之間通訊,NFS可以將遠程檔案系統載入在本地檔案系統下。
Redhat遠程登入Windows
Windows遠程登入linux 開啟Windows和linux裡面的telnet服務
虛擬機器和本機網路連同步驟
1. 關閉防火牆
2. 網卡啟用和設定
3. 開啟服務
4. 設定為橋接方式
5. 關掉無線網路
注意事項
1、VMwareVirtual Ethernet Adapter for VMnet1和redhat的ip要處在同一網段。
2、redhat裡面網路設定
3、虛擬機器的網路設定host-only
1BRIDGE:相當於主機和虛擬機器連線到同一個hub上,虛擬機器要和主機配置到同一網段上
2 NAT:使用vmnet8,主機開啟必要的VMware服務,如vmvaredhcp,虛擬機器設定成dhcp方式即可,當然也可以手工設定成vmnet1同一網段,比較麻煩
3HOST-ONLY:使用vmnet1,直接和主機互聯,可以使用ifconfig查看配置情況
Linux裡面常見的編輯編程工具Vi gedit kwrite emacs kdevelop
第3講 Linux下的c語言開發
交叉編譯工具的安裝
先將目錄sharefile\ 中的arm-linux-gcc-3.3.2.tgz 、arm-linux-gcc-2.95.3.tgz和
arm-linux-gcc-3.4.1.tgz 拷貝到某個目錄下如tmp\,然後進入到該目錄,執行解壓命令:
#cd \tmp
#tar xvzf arm-linux-gcc-3.3.2.tgz –C /
#tar xvzf arm-linux-gcc-2.95.3.tgz –C /
#tar xvzf arm-linux-gcc-3.4.1.tgz –C /
#mkdir –p/opt/FriendlyARM/QQ2440 ; 建立工作目錄,備用
然後運行命令
#gedit /root/.bashrc
編輯/root/.bashrc 檔案,在最後一行 export PATH=$PATH:/usr/local/arm/3.4.1/bin
(arm上編譯,pc上編譯)
1、 編寫代碼
2、 編譯(雙平台)
3、 執行
gcc的執行過程
使用gcc由C語言原始碼檔案產生可執行檔的過程要經曆四個相互關聯的步驟∶
1、預先處理(也稱先行編譯,Preprocessing)
——對標頭檔(include)、先行編譯語句(如define等)進行分析[前置處理器cpp]
2、編譯(Compilation)
——將預先處理後的檔案轉換成組合語言,組建檔案.s[編譯器ccl]
3、彙編(Assembly)
——由彙編變為目標代碼(機器代碼),產生.o的檔案[彙編器as]
4、串連(Linking)
——串連目標代碼,產生可執行程式[連結器ld]
-I用來指定標頭檔目錄.
/usr/include目錄一般是不用指定的,但是如果標頭檔不在/usr/include裡我們就要用-I參數指定了,比如標頭檔放在/myinclude目錄裡,那編譯命令列就要加上
- I myinclude參數了,如果不加你會得到一個“xxxx.h:No such file or directory”的錯誤。
eg.
-includefile
功能相當於在代碼中使用#include
例子用法:
gcc -oexample example.c -include /usr/include/stdio.h
Makefile基本結構
target: prerequisites 依賴關係
<TAB> command 命令
Make工具及makefile檔案概述
1、 config 產生make檔案
2、 make 產生可執行檔
3、 make install (檔案先拷貝至系統路徑)將檔案安裝至指定位置
4、 make clean 清楚make產生的安裝檔案
Makefile執行個體:
#makefile開始
myprog : foo.o bar.o
gcc foo.o bar.o -o myprog
foo.o : foo.c foo.h bar.h
gcc -c foo.c -o foo.o
bar.o : bar.c bar.h
gcc -c bar.c -o bar.o
clean:
-rm *.o myprog
#makefile結束
環境變數:
a) 隱藏檔名列表。
b) 儲存可執行檔名。
c) 儲存編譯器標識。
d) 儲存參數列表。
使用環境變數後的makefile執行個體
=======makefile開始======
OBJS=foo.o bar.o
CC=gcc
CFLAGS=-Wall–O –g#-WALL開啟警告資訊–O最佳化–g可調試
EXEC=myprog
$(EXEC):$(OBJS)
$(CC) $(OBJS) –o $(EXEC)
foo.o:foo.c foo.h bar.h
$(CC) $(CFLAGS) –c foo.c –o foo.o
bar.o:bar.cbar.h
$(CC) $(CFLAGS)bar.c –o bar.o
========makefile結束=======
內部變數:
$@---擴充成當前規則的目的檔案名稱
$<---擴充成依靠列表中的第一個依靠檔案
$^ ---擴充成整個依靠的列表
Makefile變數
=====makefile開始======
OBJS =foo.o bar.o
CC = gcc
CFLAG=-Wall –O –g
myprog:$(OBJS)
$(CC) $^ -o $@
foo.o:foo.cfoo.h bar.h
$(CC) $(CFLAG) –c $< -o $@
bar.o:bar.cbar.h
$(CC) $(CFLAG) –c $< -o $@
======makefile結束=======
第4講 bootloader與核心
Bootloader概念:就是在作業系統核心運行之前啟動並執行一段小程式。通過這段小程式,可以初始化硬體裝置、建立記憶體空間的映射圖,從而將系統的軟硬體環境帶到一個合適的狀態,以便為最終叫用作業系統核心準備好正確的環境。
Bootloader的功能
1.硬體裝置初始化(CPU的主頻、SDRAM、中斷、串口等)
2.核心啟動參數
3.啟動核心
4.與主機進行互動,從串口、USB口或者網路口下載映象檔案,並可以對FLASH等存放裝置進行管理
嵌入式系統最先執行的是bootloader
Bootloader的燒寫方式
1.通過JTAG口
2.通過乙太網路口
3.通過串口
4.其中前兩種方式比後一種快得多
Bootloader的操作模式
1.啟動載入模式(產品發布)
2.下載模式(燒寫系統)
Vivi一個bootloader,編譯配置,常見的bootloader有vivi和uboot。
核心的裁減make menuconfig核心編譯的結果是產生zImage檔案
arch/arm/boot/zImage,可自解壓的壓縮核心的映像檔案
構建根檔案系統 ./mkyaffsimage root_nfs root.img
第5講 驅動與QT
目前Linux 支援的裝置驅動大體可分為三種:
字元裝置(character device);如串口、觸控螢幕、並口、虛擬控制台、AD等。
塊裝置(block deivce);諸如磁碟,記憶體,Flash等。
網路介面裝置(network interface)。eth0等。
塊設裝置與字元裝置類似,塊裝置也是通過檔案系統來進行訪問,它們之間的區別僅僅在於核心內部管理資料的方式不同。
傳統方式中的裝置管理中,除了裝置類型外,核心還需要一對稱作主次裝置號的參數, 才能唯一標識一個裝置。
主裝置號相同的裝置使用相同的驅動程式,次裝置號用於區分具體裝置的執行個體。
為該模組建立一個裝置節點。主裝置號指某一類裝置次裝置號指某一個裝置。
命令: mknod /dev/tsc 254 0
其中/dev/ts表示我們的裝置名稱是ts,“c” 說明它是字元裝置,“254” 是主裝置號,“0” 是次裝置號。
一旦通過mknod 建立了裝置檔案,它就一直保留下來,除非我們手工刪除它。
Linux驅動編譯和載入方式
一種是直接編譯到核心,當核心啟動之後,新的驅動程式隨之運行;
二是編譯為模組,動態載入運行。
對模組操作需要使用module-utiles:
insmod將編譯的模組直接插入核心
rmmod從核心中卸載模組
lsmod顯示已安裝的模組
驅動程式與應用程式的區別
應用程式一般有一個main 函數,從頭到尾執行一個任務;
驅動程式卻不同,它沒有main 函數,通過使用宏module_init(初始化函數名),將初始化函應用程式可以和GLIBC庫串連,因此可以包含標準的標頭檔,比如<stdio.h>、<stdlib.h>等,;
在驅動程式中是不能使用標準C 庫的,因此不能調用所有的C庫函數, 只能調用核心的函數<linux/module.h>。
Qt是挪威Trolltech公司出品的一個跨平台的C++圖形化使用者介面庫。
考試
選擇 20
填空 20
指令操作 20
編程 20
分析 20