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