嵌入式arm實(shí)習(xí)報(bào)告
嵌入式系統(tǒng)開(kāi)發(fā)與應(yīng)用概述
在今日,嵌入式ARM 技術(shù)已經(jīng)成為了一門(mén)比較熱門(mén)的學(xué)科,無(wú)論是在電子類(lèi)的什么領(lǐng)域,你都可以看到嵌入式ARM 的影子。如果你還停留在單片機(jī)級(jí)別的學(xué)習(xí),那么實(shí)際上你已經(jīng)落下時(shí)代腳步了,ARM 嵌入式技術(shù)正以幾何的倍數(shù)高速發(fā)展,它幾乎滲透到了幾乎你所想到的領(lǐng)域。由于嵌入式系統(tǒng)具有體積小、性能強(qiáng)、功耗低、可靠性高以及面向行業(yè)具體應(yīng)用等突出特征, 目前已經(jīng)廣泛地應(yīng)用于軍事國(guó)防、消費(fèi)電子、信息家電、網(wǎng)絡(luò)通信、工業(yè)控制等各個(gè)領(lǐng)域。嵌入式的廣泛應(yīng)用可以說(shuō)是無(wú)所不在。
linux系統(tǒng)
linux系統(tǒng)主要是由用戶(hù)空間和內(nèi)核空間再加上外部的硬件平臺(tái)構(gòu)成,用戶(hù)空間就是用戶(hù)應(yīng)用程序的運(yùn)行空間,主要包括兩方面的內(nèi)容:用戶(hù)應(yīng)用程序和GNU C Library(glibc)。而內(nèi)核空間有三方面的內(nèi)容,一是系統(tǒng)調(diào)用接口,它作為用戶(hù)空間和內(nèi)核空間相互轉(zhuǎn)移的一種方式,二是內(nèi)核空間,三是體系相關(guān)內(nèi)核代碼,在linux內(nèi)核代碼中,可以看到arch目錄下有許多子目錄,其中每一個(gè)子目錄代表一種硬件平臺(tái)。
而為什么要把linux系統(tǒng)劃分為用戶(hù)空間和內(nèi)核空間呢?主要是一旦用戶(hù)空間和內(nèi)核空間沒(méi)有分開(kāi),那用戶(hù)將擁有很大的權(quán)限去操控內(nèi)核或用戶(hù)應(yīng)用程序的崩潰將會(huì)造成系統(tǒng)的崩潰,而linux系統(tǒng)是利用cpu的模式分級(jí)來(lái)分別運(yùn)行用戶(hù)空間和內(nèi)核空間,這樣就可以使操作系統(tǒng)得到充分的保護(hù)。而現(xiàn)代的cpu通常實(shí)現(xiàn)了不同的工作模式,以ARM處理器為例實(shí)現(xiàn)了7種運(yùn)行模式,分別為:
1)用戶(hù)模式(usr):ARM微處理器正常程序執(zhí)行模式
2)系統(tǒng)模式(sys):運(yùn)行具有特權(quán)的操作系統(tǒng)任務(wù)
3)中斷模式(irq):用于通用的中斷處理
4)外部中斷模式(fiq):用于高速數(shù)據(jù)傳輸或通道處理
5)數(shù)據(jù)訪(fǎng)問(wèn)終止模式(abt):當(dāng)數(shù)據(jù)或指令預(yù)取終止時(shí)進(jìn)入該模式,可用于虛擬存儲(chǔ)及存儲(chǔ)保護(hù)
6)管理模式(svc):操作系統(tǒng)使用的保護(hù)模式
7)未定義指令中止模式(und):當(dāng)未定義的指令執(zhí)行時(shí)進(jìn)入該模式,可用于支持硬件協(xié)處理器的軟件仿真ARM微處理器的運(yùn)行模式可以通過(guò)軟件改變,也可以通過(guò)外部中斷或異常處理改變,除用戶(hù)模式外,其他模式都是非用戶(hù)模式或特權(quán)模式,除用戶(hù)模式和系統(tǒng)模式外,其他模式都是異常模式,常用于處理異?;蛑袛?,以及需要訪(fǎng)問(wèn)受保護(hù)的系統(tǒng)資源等情況。
同時(shí)用戶(hù)空間和內(nèi)核空間是程序執(zhí)行的兩種不同狀態(tài),通過(guò)系統(tǒng)調(diào)用和硬件中斷去實(shí)現(xiàn)用戶(hù)空間到內(nèi)核空間的轉(zhuǎn)移,系統(tǒng)調(diào)用是主動(dòng)的,硬件中斷是被動(dòng)的,比如鍵盤(pán)按下或者串口中斷。
接下來(lái)說(shuō)說(shuō)linux的內(nèi)核架構(gòu),它主要是包含7大組成部分
1.內(nèi)存管理 內(nèi)存管理的主要作用是使多個(gè)進(jìn)程能安全高效的共享內(nèi)存區(qū)域,通常使用以下兩個(gè)手段:
①內(nèi)存映射:將物理內(nèi)存映射到虛擬內(nèi)存中,變有限為無(wú)限
②有效管理:使用各種內(nèi)存管理算法(如伙伴算法),減少內(nèi)存浪費(fèi)
2.虛擬文件系統(tǒng) vfs隱藏了各種文件系統(tǒng)的具體細(xì)節(jié),為文件操作提供統(tǒng)一的接口
3.網(wǎng)絡(luò)協(xié)議棧 它為linux提供了完善豐富的網(wǎng)絡(luò)協(xié)議實(shí)現(xiàn)
4.進(jìn)程管理 進(jìn)程管理的重點(diǎn)是創(chuàng)建進(jìn)程、停止進(jìn)程,并控制它們之間的通信。進(jìn)程管理還包括控制活動(dòng)進(jìn)程如何共享cpu,即進(jìn)程調(diào)度。
5.設(shè)備驅(qū)動(dòng) 設(shè)備驅(qū)動(dòng)也是內(nèi)核的一部分,它不同于內(nèi)核的其他部件,并且獨(dú)立于內(nèi)核的其他部件,同時(shí)它是與設(shè)備交互的唯一模塊,通常由第三方廠(chǎng)商開(kāi)發(fā),一個(gè)驅(qū)動(dòng)程序不與其他驅(qū)動(dòng)程序交互;內(nèi)核與驅(qū)動(dòng)程序之間也僅通過(guò)一個(gè)嚴(yán)格定義的接口-交互。
6.系統(tǒng)調(diào)用接口 SCI層為用戶(hù)空間提供了一套標(biāo)準(zhǔn)的系統(tǒng)調(diào)用函數(shù)來(lái)訪(fǎng)問(wèn)Linux內(nèi)核,搭起了用戶(hù)空間到內(nèi)核空間的橋梁。
7.體系相關(guān)部分
Linux內(nèi)核源代碼采用樹(shù)形結(jié)構(gòu)進(jìn)行組織,非常合理地把功能相關(guān)的文件都放在同一個(gè)子目錄下,使得程序更具可讀性。
下面介紹下這些目錄的組成
arch目錄
arch是architecture的縮寫(xiě)。內(nèi)核所支持的每種CPU體系,在該目錄下都有對(duì)應(yīng)的子目錄。每個(gè)CPU的子目錄,又進(jìn)一步分解為boot,mm,kernel等子目錄,分別包含控制系統(tǒng)引導(dǎo),內(nèi)存管理,系統(tǒng)調(diào)用等。其下子目錄有
| --x86 /*英特爾cpu及與之相兼容體系結(jié)構(gòu)的子目錄*/
| |--boot /*引導(dǎo)程序*/
| | |--compressed /*內(nèi)核解壓縮*/
| |--tools /*生成壓縮內(nèi)核映像的程序*/
| |--kernel /*相關(guān)內(nèi)核特性實(shí)現(xiàn)方式,如信號(hào)處理、時(shí)鐘處理*/ | |--lib /*硬件相關(guān)工具函數(shù)*/
block目錄
部分塊設(shè)備驅(qū)動(dòng)程序
crypto目錄
加密、壓縮、CRC校驗(yàn)算法
documentation
內(nèi)核的文檔
drivers目錄(重點(diǎn))
設(shè)備驅(qū)動(dòng)程序
fs目錄
存放各種文件系統(tǒng)的實(shí)現(xiàn)代碼。每個(gè)子目錄對(duì)應(yīng)一種文件系統(tǒng)的實(shí)現(xiàn),公用的源程序用于實(shí)現(xiàn)虛擬文件系統(tǒng)vfs。
| |--devpts /* /dev/pts虛擬文件系統(tǒng)*/
| |--ext2 /*第二擴(kuò)展文件系統(tǒng)*/
| |--fat /*MS的fat32文件系統(tǒng)*/
| |--isofs /*ISO9660光盤(pán)cd-rom上的文件系統(tǒng)*/
include目錄
內(nèi)核所需要的頭文件。與平臺(tái)無(wú)關(guān)的頭文件在include/linux 子目錄下,與平臺(tái)相關(guān)的頭文件則放在相應(yīng)的子目錄中。
init目錄
內(nèi)核初始化代碼
ipc目錄
進(jìn)程間通信的實(shí)現(xiàn)代碼
kernel目錄
Linux大多數(shù)關(guān)鍵的核心功能都是在這個(gè)目錄實(shí)現(xiàn)。(調(diào)度程序,進(jìn)程控制,模塊化)
lib目錄
庫(kù)文件代碼
mm目錄
mm目錄中的文件用于實(shí)現(xiàn)內(nèi)存管理中與體系結(jié)構(gòu)無(wú)關(guān)的部分(與體系結(jié)構(gòu)相關(guān)的部分在哪里實(shí)現(xiàn)?arch)
net目錄
網(wǎng)絡(luò)協(xié)議的實(shí)現(xiàn)代碼
| |--802 /*802無(wú)線(xiàn)通訊協(xié)議核心支持代碼*/
| |--appletalk /*與蘋(píng)果系統(tǒng)連網(wǎng)的協(xié)議*/
| |--ax25 /*AX25無(wú)線(xiàn)INTERNET協(xié)議*/
| |--bridge /*橋接設(shè)備*/
| |--ipv4 /*IP協(xié)議族V4版32位尋址模式*/
| |--ipv6 /*IP協(xié)議族V6版*/
samples
一些內(nèi)核編程的范例
scripts
配置內(nèi)核的腳本
security
SElinux的模塊
sound
音頻設(shè)備的驅(qū)動(dòng)程序
usr
cpio命令實(shí)現(xiàn)
virt
內(nèi)核虛擬機(jī)
Linux內(nèi)核的配置與編譯
Linux內(nèi)核具有可定制的優(yōu)點(diǎn),配置內(nèi)核的目的是裁剪掉不必要的文件和目錄,獲得一個(gè)最簡(jiǎn)單的又能滿(mǎn)足用戶(hù)開(kāi)發(fā)的操作系統(tǒng),以解除嵌入式開(kāi)發(fā)過(guò)程中所遇到的存儲(chǔ)空間有限的困擾。內(nèi)核配置與編譯的具體步驟如下:
1.清除臨時(shí)文件、中間文件和配置文件
1)make clean
Remove most generated files but keep the config即清除大部分生成的文件但保留配置文件
2)make mrproper
Remove all generated files + config files即清除所有生成的文件還有配置文件
3)make distclean
Mrproper + remove editor backup and patch files即實(shí)現(xiàn)
make mrproper命令的同時(shí)刪除編輯器備份文件和補(bǔ)丁文件
2.確定目標(biāo)系統(tǒng)的軟硬件配置情況,比如cpu類(lèi)型,網(wǎng)卡型號(hào),所需支持的網(wǎng)絡(luò)協(xié)議等。
3.使用如下命令之一配置內(nèi)核:
1) make config:基于文本模式的交互式配置
2)make menuconfig:基于文本模式的菜單型配置
3)make oldconfig:使用已有的配置文件(.config),但是會(huì)詢(xún)問(wèn)新增的配置選項(xiàng)
4)make xconfig:圖形化的配置(需安裝圖形化系統(tǒng))
Make menuconfig是最為常用的內(nèi)核配置方式 如果一個(gè).config文件已經(jīng)存在,它將使用該文件設(shè)置那些默認(rèn)的值
4.編譯內(nèi)核
編譯內(nèi)核通常也需要幾個(gè)步驟,一是清除以前編譯通過(guò)的殘留文件;二是編譯內(nèi)核image文件和可加載模塊;三是安裝模塊。
下面是編譯內(nèi)核的具體步驟。
①make dep 命令用在內(nèi)核2.4或之前,用于建立源文件之間的依賴(lài)關(guān)系,在執(zhí)行內(nèi)核配置命令之后使用,不過(guò)在2.6內(nèi)核中已經(jīng)取消該命令,該功能由內(nèi)核配置命令實(shí)現(xiàn)。
②make clean 命令用于刪除前面留下來(lái)的中間文件,該命令不會(huì)刪除.config等配置文件。這個(gè)步驟是可選的,它的目的是清除原先編譯過(guò)而殘留的和.o(obj文件)。如果是剛下載的源代碼,那么這一步就可以省略了,但是如果已經(jīng)編譯多次內(nèi)核,這一步是必要的,不然后面可能會(huì)出現(xiàn)很多莫名其妙的小問(wèn)題。
③make zImage命令用于編譯生成壓縮形式的內(nèi)核鏡像,當(dāng)編譯成功后,就會(huì)在arch\arm\boot\目錄下生成zImage文件,大小一般為幾百KB。對(duì)于嵌入式Linux內(nèi)核而言,直接將生成的zImage下載到嵌入式目標(biāo)板的flash中即可。對(duì)于較大的內(nèi)核,如果用make zImage編譯,系統(tǒng)會(huì)提示使用make bzImage命令來(lái)編譯,bzImage是big zImage的縮寫(xiě),可用于生成較大的壓縮內(nèi)核,比如桌面Linux系統(tǒng)內(nèi)核。
④在配置菜單的過(guò)程中,有些選項(xiàng)被選擇為模塊的,即選項(xiàng)前為[M],并且在回答Enable loadable module support(CONFIG_MODULES)時(shí)選了Yes的,則接下來(lái)就還要用命令make modules 來(lái)編譯這些可加載模塊,并用
make modules_install將make modules生成的模塊文件復(fù)制到相應(yīng)目錄,桌面Linux內(nèi)核一般是在/lib/modules目錄下。
⑤制作init ramdisk
mkinitrd initrd-$version $version
例:
mkinitrd initrd-2.6.29 2.6.29
$version 可以通過(guò)查詢(xún)/lib/modules下的目錄得到Ramdisk是將一部分固定大小的內(nèi)存當(dāng)做分區(qū)來(lái)使用。它并非一個(gè)實(shí)際的文件系統(tǒng),二是一種將實(shí)際的文件系統(tǒng)裝入內(nèi)存的機(jī)制,并且可以作為根文件系統(tǒng)。將一些經(jīng)常被訪(fǎng)問(wèn)而又不會(huì)更改的文件(如只讀的根文件系統(tǒng))通過(guò)ramdisk放在內(nèi)存中,可以明顯的提高系統(tǒng)的性能。在linux的啟動(dòng)階段,initrd提供了一套機(jī)制,可以將內(nèi)核映像和根文件系統(tǒng)一起載入內(nèi)存。
⑥cp arch/x86/boot/bzImage
/boot/vmlinuz-$version
$version 為所編譯的內(nèi)核版本號(hào)
(拷貝initrd-2.6.29到/boot下,將arch/x86/boot/bzImage更名為vmlinuz-2.6.29移動(dòng)到/boot下)
⑦修改/etc/.oh100nf 或者/etc/.oh100nf
(GNU GRUB(簡(jiǎn)稱(chēng) GRUB )是一個(gè)來(lái)自GNU項(xiàng)目的多操作系統(tǒng)啟動(dòng)程序。GRUB是多啟動(dòng)規(guī)范的實(shí)現(xiàn),它允許用戶(hù)可以在計(jì)算機(jī)內(nèi)同時(shí)擁有多個(gè)操作系統(tǒng),并在計(jì)算機(jī)啟動(dòng)時(shí)選擇希望運(yùn)行的操作系統(tǒng)。GRUB可用于選擇操作系統(tǒng)分區(qū)上的不同內(nèi)核,也可用于向這些內(nèi)核傳遞啟動(dòng)參數(shù)。)
這時(shí)重啟Linux操作系統(tǒng),在進(jìn)入內(nèi)核時(shí)按下回車(chē)鍵進(jìn)入內(nèi)核選擇界面,選擇自己編譯的內(nèi)核,即可進(jìn)入自己編譯的內(nèi)核的操作系統(tǒng),用uname -r 可以查看當(dāng)前內(nèi)核版本。
嵌入式linux文件系統(tǒng)的制作與移植
文件系統(tǒng)包含兩個(gè)層次的含義:
1.按照固定格式組織的目錄與文件
2.在特定的存儲(chǔ)介質(zhì)上管理這些目錄和文件需要的數(shù)據(jù)
當(dāng)我們?cè)趌inux下輸入ls / 的時(shí)候,見(jiàn)到的目錄結(jié)構(gòu)以及這些目錄下的內(nèi)容都大同小異,這是因?yàn)樗械膌inux發(fā)行版在對(duì)根文件系統(tǒng)的布局上都遵循FHS(Filesystem Hierarchy Standard)標(biāo)準(zhǔn)的建議規(guī)定。
各個(gè)目錄名稱(chēng)及其存放的內(nèi)容:
/bin 必備的用戶(hù)命令,例如ls、cp等
/sbin 必備的系統(tǒng)管理員命令,例如ifconfig、reboot等
/dev 設(shè)備文件,例如mtdblock0、tty1等
/etc 系統(tǒng)配置文件,包括啟動(dòng)文件,例如inittab等
/lib 必要的`鏈接庫(kù),例如C鏈接庫(kù)、內(nèi)核模塊
/home 普通用戶(hù)主目錄
/root root用戶(hù)主目錄
/usr/bin 非必備的用戶(hù)程序,例如find、du等
/usr/sbin 非必備的管理員程序,例如chroot、inetd等
/usr/lib 庫(kù)文件
/var 守護(hù)程序和工具程序所存放的可變,例如日志文件
/proc 用來(lái)提供內(nèi)核與進(jìn)程信息的虛擬文件系統(tǒng),由內(nèi)核自動(dòng)生成目錄下的內(nèi)容
/sys 用來(lái)提供內(nèi)核與設(shè)備信息的虛擬文件系統(tǒng),由內(nèi)核自動(dòng)生成目錄下的內(nèi)容
/mnt 文件系統(tǒng)掛接點(diǎn),用于臨時(shí)安裝文件系統(tǒng)
/tmp 臨時(shí)性的文件,重啟后將自動(dòng)清除
根文件系統(tǒng)是Linux啟動(dòng)時(shí)使用的第一個(gè)文件系統(tǒng)。沒(méi)有根文件系統(tǒng),Linux將無(wú)法正常啟動(dòng)。根文件系統(tǒng)由一系列目錄組成,目錄中包含了應(yīng)用程序、C庫(kù)、以及相關(guān)的配置文件。
那如何制作一個(gè)根文件系統(tǒng)呢?主要包括以下步驟:
1、創(chuàng)建根文件系統(tǒng)的目錄
如:mkdir bin sbin lib etc dev proc sys usr mnt tmp var
2、創(chuàng)建設(shè)備文件
cd dev
mknod -m 666 console c 5 1
mknod -m 666 null c 1 3
cd ..
3、安裝/etc
tar -xzvf etc.tar.gz /xx-x/rootfs/etc
4、配置busybox
進(jìn)入busybox目錄執(zhí)行
make menuconfig
進(jìn)入 Busybox Settings
build Options->
選中 “Build busybox as a static binary”, 靜態(tài)鏈接
Cross Compiler prefix (arm-linux-)
Installation Options->
選中 “Don‘t use /usr”, 選中該項(xiàng)可以避免busybox被安裝到
宿主系統(tǒng)的/usr目錄下,破壞宿主系統(tǒng)
Busybox Installation Prefix (/nfsroot/rootfs)該選項(xiàng)表明編
譯后的busybox的安裝位置
7、編譯、安裝busybox
make ARCH=arm CROSS_COMPILE=arm-linux-
make install
前提是系統(tǒng)中安裝好了交叉編譯工具arm-linux-gcc
至此一個(gè)粗略的根文件系統(tǒng)制作完成,下面就需要移植到開(kāi)發(fā)板中。 我們知道ARM嵌入式系統(tǒng)的組成為:
1)bootloader 引導(dǎo)加載器
2)kernel 操作系統(tǒng)內(nèi)核
3)rootfs 根文件系統(tǒng) (帶GUI,QTopia)
在系統(tǒng)加載完內(nèi)核后就會(huì)去啟動(dòng)根文件系統(tǒng),而啟動(dòng)根文件系統(tǒng)這個(gè)過(guò)程被bootargs這個(gè)參數(shù)控制,所以我們需要修改這個(gè)參數(shù)以使系統(tǒng)運(yùn)行我們的根文件系統(tǒng),但這之前我們需要在宿主機(jī)上將根文件系統(tǒng)共享出來(lái)。我們先在linux系統(tǒng)中配置好nfs服務(wù)器,并且在設(shè)置配置文件exports將根文件系統(tǒng)所在路徑共享出來(lái),接下來(lái)在ARM開(kāi)發(fā)板啟動(dòng)時(shí)控制超級(jí)終端進(jìn)入shell界面,在這里輸入命令print會(huì)顯示開(kāi)發(fā)板啟動(dòng)的配置信息,通過(guò)set命令我們可以設(shè)置bootargs 參數(shù)為:
console=ttySAC0
root=/dev/nfs
nfsroot=192.168.0.113:/mynfs/rootfs ip=.oh100:eth0:off
設(shè)置完成后用save命令保存設(shè)置,輸入reset復(fù)位命令,ARM系統(tǒng)重啟,重啟完成后我們看到ARM系統(tǒng)的根文件系統(tǒng)就是我們自己制作的根文件系統(tǒng)。
實(shí)習(xí)體會(huì)
在嵌入式系統(tǒng)中,除了課本上的基礎(chǔ)知識(shí)外,還學(xué)會(huì)了軟件編程的基本思路,掌握了液晶屏的使用及其電路設(shè)計(jì)方法;掌握有關(guān)音頻處理的基礎(chǔ)知識(shí);掌握液晶顯示文本及圖形的方法與程序設(shè)計(jì)。
通過(guò)這次設(shè)計(jì),掌握了液晶顯示實(shí)驗(yàn)、μC/OS-II移植、μC/OS-IILCD顯示的工作原理及串口通信實(shí)驗(yàn)的工作過(guò)程,學(xué)會(huì)了使用仿真軟件Embest EduKit-IV實(shí)驗(yàn)平臺(tái)及ULINK2仿真器套件,并學(xué)會(huì)通過(guò)應(yīng)用軟件仿真來(lái)實(shí)現(xiàn)各種通信系統(tǒng)的設(shè)計(jì),對(duì)以后的學(xué)習(xí)和工作都起到了一定的作用,加強(qiáng)了動(dòng)手能力和學(xué)業(yè)技能。雖然花了很長(zhǎng)時(shí)間編寫(xiě)軟件程序設(shè)計(jì),但這一切還是理論上的。希望學(xué)校能提供機(jī)會(huì)和條件,讓我們能夠去真正地將理論和實(shí)踐相結(jié)合。通過(guò)這次程序,感覺(jué)自己所掌握的知識(shí)是那么的有限,還有許多需要改進(jìn)和不足的地方,同時(shí)也幫助了我怎樣學(xué)好這門(mén)課程,增加了我對(duì)這門(mén)學(xué)科的興趣??傮w來(lái)說(shuō),這次實(shí)習(xí)我受益匪淺。在摸索該如何設(shè)計(jì)電路使之實(shí)現(xiàn)所需功能的過(guò)程中特別有趣,培養(yǎng)了我的設(shè)計(jì)思維,增加了實(shí)際操作能力。在讓我體會(huì)到了設(shè)計(jì)電路的艱辛的同時(shí),更讓我體會(huì)到成功的喜悅和快樂(lè)。通過(guò)這次實(shí)習(xí)通信系統(tǒng)的設(shè)計(jì),使我更加清楚以后的發(fā)展及學(xué)習(xí)的方向。
arm嵌入式學(xué)習(xí)心得
嵌入式ARM學(xué)習(xí)心得【1】
本人大學(xué)學(xué)的是電子信息科學(xué)與技術(shù)專(zhuān)業(yè),其實(shí)這個(gè)專(zhuān)業(yè)和嵌入式?jīng)]有多大的關(guān)系,要說(shuō)有關(guān)系就是簡(jiǎn)單的講了下C語(yǔ)言語(yǔ)法,學(xué)完之后還不知道什么是C語(yǔ)言,只記住了,char,int,string等占幾個(gè)字節(jié),if,for,while循環(huán)什么的,感覺(jué)也就能算一些小學(xué)就會(huì)的題目,全國(guó)計(jì)算機(jī)等級(jí)二級(jí)也就糊涂的過(guò)了。
我這個(gè)專(zhuān)業(yè)沒(méi)學(xué)過(guò)C++,一開(kāi)始不知道什么是向?qū)ο?,什么叫面向過(guò)程,這可能讓大家笑話(huà)了。不過(guò)這說(shuō)的是實(shí)話(huà),大學(xué)的時(shí)候比較喜歡動(dòng)手,喜歡硬件方面的東西,也喜歡看書(shū)。在大一的時(shí)候就聽(tīng)學(xué)長(zhǎng)說(shuō),單片機(jī)很難學(xué),在沒(méi)事的時(shí)候就從圖書(shū)管借了本關(guān)于51的書(shū),一開(kāi)始還真是不怎么懂,然后硬著頭皮去看,當(dāng)我把51的結(jié)構(gòu)看完了,就不像一開(kāi)始那樣一頭霧水了,自己在紙上把51的結(jié)構(gòu)圖默畫(huà)一遍,然后再把各個(gè)寄存器功能寫(xiě)一下,各個(gè)功能口的結(jié)構(gòu)也畫(huà)一遍,然后就不覺(jué)得51有什么難了。其實(shí)有些時(shí)候不是這個(gè)東西你不會(huì),而是在不會(huì)的時(shí)候自己先告訴自己這個(gè)太難了,自己先放棄了。我們學(xué)習(xí)51芯片,是為了以后的打基礎(chǔ),知道是怎么通過(guò)配置寄存器來(lái)實(shí)現(xiàn)功能。
大二下學(xué)期的時(shí)候,我們開(kāi)了51的課,這個(gè)課幾乎就沒(méi)怎么去,因?yàn)槲艺J(rèn)為沒(méi)有必要去聽(tīng)自己會(huì)的東西了。后來(lái)聽(tīng)別人說(shuō)avr的資源會(huì)比51的豐富的很多,所以就想試試,看看有什么難的,就從網(wǎng)上買(mǎi)了本馬潮老師《AVR單片機(jī)嵌入式系統(tǒng)原理與應(yīng)用實(shí)踐》,一邊看書(shū),一邊想自己畫(huà)一個(gè)板了,一開(kāi)始想實(shí)現(xiàn)一個(gè)點(diǎn)陣屏,實(shí)現(xiàn)滾動(dòng)效果,后來(lái)想想做個(gè)板也花不少錢(qián)呢,為什么不多加一些功能呢,還能多學(xué)到些知識(shí),所以就加了溫感,紅外,鐵電存儲(chǔ)器等并把所有的擴(kuò)展口都擴(kuò)展了出來(lái),備以后用,那時(shí)還挺自豪的呢,同學(xué)們都很羨慕,不過(guò)現(xiàn)在想想其實(shí)也沒(méi)什么了。
大學(xué)也聽(tīng)說(shuō)過(guò)嵌入式這個(gè)詞,不過(guò)不太明白是什么意思,09年的時(shí)候從網(wǎng)上找到中嵌視頻,有四張DVD(大約13G),下載下來(lái)后,從頭到尾的看了一遍,沒(méi)什么印象,只記得講一些不知所云的函數(shù),然后莫名其妙的講怎么使用那個(gè)44b0的開(kāi)發(fā)板,不過(guò)聽(tīng)完了,還是有很大收獲的,就有一種想裝一個(gè)linux的沖動(dòng),我是大二下學(xué)期才有的自己電腦,不過(guò)電腦的配置比較低,1g內(nèi)存,跑虛擬機(jī)就像個(gè)蝸牛,所以就想著怎么才能裝個(gè)linux,自己用XP習(xí)慣了,如果全換了又舍不得,那時(shí)從書(shū)上知道linux的文件系統(tǒng)和windows不一樣,只有一個(gè)根分區(qū),所以也害怕一裝linux全盤(pán)就被格式化了,不過(guò)最后還是欲望戰(zhàn)勝了擔(dān)心,買(mǎi)了張redhat9的光盤(pán),小心的裝這個(gè)系統(tǒng),里邊的英文也不是太難,還是知道大概意思的,所以一步步的裝,最后裝到我的硬盤(pán)的最后空間,重新啟動(dòng),竟可以選擇進(jìn)入哪一個(gè)系統(tǒng)了,從這之后,自己就不害怕怎么裝系統(tǒng)了,應(yīng)了那句言,紙上得來(lái)終覺(jué)淺,絕知此事要躬行。所以我認(rèn)為,買(mǎi)一個(gè)開(kāi)發(fā)板是完全有必要的,拿到實(shí)物操作一下就不會(huì)感覺(jué)太抽象了。
后來(lái)也想學(xué)學(xué)arm,但不知道arm是什么東西,所以就買(mǎi)了本《從51到arm》,講的是關(guān)于arm的大體結(jié)構(gòu),看完后感覺(jué),原來(lái)arm就是一個(gè)速度更快,接口更豐富的單片機(jī)啊。
如果想做linux設(shè)備驅(qū)動(dòng)的同學(xué)應(yīng)該對(duì)arm硬件有一些了解。如果對(duì)驅(qū)動(dòng)不感興趣,完全沒(méi)有必要去看。交叉編譯器會(huì)幫我們做好這些事情,他比我們更了解arm結(jié)構(gòu)。
大三下學(xué)期開(kāi)始準(zhǔn)備考研了,所以自己這些興趣就先放下了,報(bào)的北郵的信通學(xué)院通信專(zhuān)業(yè),當(dāng)時(shí)就是想一定要上個(gè)好學(xué)校好專(zhuān)業(yè),也沒(méi)想太多,結(jié)果考了的成績(jī)差了點(diǎn),沒(méi)有被錄取,也不想調(diào)劑一個(gè)二流的學(xué)校,然后就參加工作了,工作中每天都用的到開(kāi)發(fā)板,當(dāng)我看到一個(gè)小板上還可以跑系統(tǒng)的時(shí)候感覺(jué)很不可思議,以為要很大工程。后來(lái)邊工作邊學(xué)習(xí),每天都要看電腦看到眼發(fā)疼,晚上也都差不多十二點(diǎn)時(shí)才睡覺(jué)。感覺(jué)到累,不過(guò)也感覺(jué)到自己在進(jìn)步。
閑話(huà)有點(diǎn)多了,說(shuō)了很多都是自己大學(xué)那點(diǎn)破事。
聽(tīng)很多的初學(xué)者說(shuō)不知道從哪里開(kāi)始,學(xué)習(xí)嵌入都要學(xué)哪些東西,從網(wǎng)上搜了一下,一大堆的東西要學(xué),一下就推薦十幾本書(shū),說(shuō)看完這本書(shū)怎么怎么樣,看完那本書(shū)怎么怎么樣,一下子就給初學(xué)者給嚇住了,其實(shí)完全沒(méi)必要把網(wǎng)上的那些東西全部看一遍,那樣又費(fèi)時(shí),又感覺(jué)工程太大,讓初學(xué)者沒(méi)有信心去把每一種都看完。網(wǎng)上說(shuō)的些方面都要知道,不一定全部都掌握,我們可以退成求其次,每一個(gè)都知道一些,當(dāng)然會(huì)的越多越好。今天學(xué)點(diǎn)這個(gè)明天學(xué)點(diǎn)那,換著樣來(lái)也不會(huì)覺(jué)得煩。而且還能感覺(jué)到每天都有收獲。
下面給嵌入式初學(xué)者一些自己的我個(gè)人建議。
1、嵌入式涉及到很多的基礎(chǔ)知識(shí)
c語(yǔ)言,關(guān)于C語(yǔ)言要知道基本的語(yǔ)法,什么是結(jié)構(gòu)體,什么是共用體,有什么區(qū)別,不用強(qiáng)記一些二級(jí)考的東西,因在實(shí)際中用的很少。
c++要知道什么是類(lèi),怎么定義,繼承,接口,要深刻理解,當(dāng)然基本語(yǔ)法也是必不可少的。
操作系統(tǒng)原理也應(yīng)該知道基本的原理的,我記得我大學(xué)沒(méi)這個(gè)課還是去電信學(xué)院蹭別的專(zhuān)業(yè)的課呢,后來(lái)學(xué)習(xí)發(fā)現(xiàn)很多的東西都是在這個(gè)課上學(xué)到的。什么時(shí)間片啊,任務(wù)調(diào)度啊,都是在那里知道的。
Linux基本命令的使用(vi編輯器必須會(huì)用,因?yàn)樵诮K端改文件的時(shí)候只能用這個(gè)),我們現(xiàn)在很多的人都習(xí)慣用鼠標(biāo)了,很少用到命令,我們學(xué)習(xí)嵌入linux可要改改這個(gè)習(xí)慣了,linux用命令操作一是效率高,二是功能非常強(qiáng)大,遠(yuǎn)非圖形界面能比的了的,其實(shí)我們用圖形界面的操作都要轉(zhuǎn)化為命令傳給硬件的。
Linux文件系統(tǒng)的管理要清楚,哪個(gè)目錄存放是什么東西,有什么用,文件權(quán)限管理等
Shell編程也要了解一些,在這給大家推薦一個(gè)教程,周朝劍的 shell編程,也就七八講吧,講的很全面。初學(xué)者看前4講就可以了。
Linux設(shè)備驅(qū)動(dòng)的架構(gòu)要了解,初學(xué)者可以以米爾的MYD-AM335X開(kāi)發(fā)板上的led驅(qū)動(dòng)分析一下,結(jié)合原理圖和linux設(shè)備驅(qū)動(dòng)相關(guān)書(shū)籍把每一行代碼都分析明白。關(guān)于驅(qū)動(dòng)給大家推薦一本書(shū)《LINUX設(shè)備驅(qū)動(dòng)程序》中國(guó)電力出版社出版的,很經(jīng)典的,初學(xué)者看可能看不太明白,不過(guò)要堅(jiān)持看,最次也得把前6章看完了。
2、看書(shū)不要希望一次就會(huì)
一次就明白是什么意思,也不要死記硬背,看不明白也沒(méi)關(guān)系,以后遇到了知道去哪里去找就可以了,以后遇到的多了,也就記住了,遇到的少的,忘記也就忘記了。還有,不要直接閱讀linux內(nèi)核源代碼,看一些自己把頭撞破也想不明白的事,會(huì)打擊初學(xué)者的積極性,要循序漸進(jìn),今天學(xué)個(gè)做個(gè)led,明天做個(gè)串口,后天說(shuō)不定就做硬件編解碼了。
3、你可以不接受培訓(xùn),但是不能不買(mǎi)開(kāi)發(fā)板
如果你想學(xué)習(xí)嵌入式一定要買(mǎi)塊學(xué)習(xí)板,現(xiàn)在的開(kāi)發(fā)板很便宜了,給我們初學(xué)者減輕了很多經(jīng)濟(jì)負(fù)擔(dān)??丛俣嗟囊曨l,看再多的書(shū),也不如自己動(dòng)手試一下,看著很簡(jiǎn)單的東西,做起來(lái)就可能遇到很多的問(wèn)題,遇到問(wèn)題找到原因,解決問(wèn)題,只有這樣才能學(xué)到東西,記得我第一次寫(xiě)led的驅(qū)動(dòng),想自己試一下,網(wǎng)上也有人寫(xiě)過(guò)相關(guān)的代碼,可是自己一試,就出了好多的問(wèn)題,那個(gè)led弄了我一天才把led燈點(diǎn)亮。所以不要眼高手低。
還有關(guān)于培訓(xùn),現(xiàn)在的培訓(xùn)機(jī)構(gòu)很多,講的也不錯(cuò),老師也很好,但是有一個(gè)問(wèn)題,太集中了,而且學(xué)生動(dòng)手的機(jī)會(huì)也不太多,記得我們公司還招了一個(gè)在北京某個(gè)培訓(xùn)機(jī)構(gòu)培訓(xùn)半年的員工呢,花了一萬(wàn)多,來(lái)了之后也沒(méi)感覺(jué)有多高,問(wèn)他都學(xué)了什么,也就是我前邊說(shuō)的那些基礎(chǔ)知識(shí),很多的東西還是不知道的,照著書(shū)弄個(gè)helloworld模塊驅(qū)動(dòng)兩天沒(méi)搞定。不是培訓(xùn)不好,但我個(gè)人見(jiàn)解效果并不是很好。記住:只有自己動(dòng)手做過(guò)的東西才是自己的。
現(xiàn)在買(mǎi)一塊開(kāi)發(fā)板很便宜,飛凌的OK6410的開(kāi)發(fā)板就不錯(cuò),源碼完全開(kāi)放,而且資料也很豐富,完全能滿(mǎn)足初學(xué)者學(xué)習(xí)用,有人說(shuō)友善的'板子也不錯(cuò),我個(gè)人覺(jué)得友善的板子不錯(cuò),但是不適合初學(xué)者,因?yàn)樗暮芏嗟臇|西是不給代碼的,用過(guò)友善的板子的同學(xué)經(jīng)常有這樣的痛苦,想學(xué)一個(gè)東西,去找他的代碼的時(shí)候,卻找不到,很多友善提供的代碼中很多的都是封裝好的,只提供給客戶(hù)一個(gè)庫(kù),初學(xué)者想要找代碼的時(shí)候就不知道怎么辦了。
4、不要好高騖遠(yuǎn),要腳踏實(shí)地
對(duì)于初學(xué)者,還有一點(diǎn)小建議,我們拿到一個(gè)開(kāi)發(fā)板,很興奮也很激動(dòng),想法自然也很多,想用開(kāi)發(fā)板實(shí)現(xiàn)自己的這個(gè)想法,實(shí)現(xiàn)那個(gè)想法,然后又不知道從何下手,然后就去論壇中發(fā)一個(gè)貼,“那個(gè)什么什么怎么實(shí)現(xiàn)啊,哪位大俠能詳細(xì)說(shuō)一下啊,跪求!!”然后等著別人去回復(fù)。見(jiàn)沒(méi)人回復(fù)就抱怨。有想法是好的,我們要實(shí)現(xiàn)自己的想法也是有前提的,首先,我們對(duì)這部分知識(shí)了解嗎?如果不了解就去google一下(最好別用百度,不太好用),了解了一些,也就大概知道要怎么做了。如果再遇到問(wèn)題,再去發(fā)貼問(wèn),這樣也顯得咱們有水平。比如自己連串口是什么都不太清楚呢,就問(wèn)串口通信怎么做啊,就是人家把代碼給咱,咱也不明白是怎么回事啊。
5、多看代碼,多寫(xiě)代碼
見(jiàn)多識(shí)廣,熟能生巧。多看代碼,要從代碼中讀出代碼的意思來(lái)。自己平時(shí)也要多寫(xiě)代碼,多練習(xí)(這一點(diǎn)我做的不好,寫(xiě)的少)。
寫(xiě)完已經(jīng)晚上兩點(diǎn)了,思路有些亂,有些也是個(gè)人的見(jiàn)解,在有些人看來(lái)可能是錯(cuò)誤的,每個(gè)人有每個(gè)人的學(xué)習(xí)方法,但是我們的目的只有一個(gè)——希望我們學(xué)到更多的知識(shí)。
嵌入式學(xué)習(xí)心得【2】
還記得老師第一次將一塊天祥的2440開(kāi)發(fā)板放到我面前時(shí),我心里覺(jué)得這太神奇了,好漂亮的板子,怎么弄呢?老師大體給我講了一下,但是以前連51單片機(jī)操作都不熟的我如何記得住老師說(shuō)的呢?板子拿到手里,左手拿不知到怎么開(kāi)始,右手拿也不知道如何入手啊。
然后我決定上網(wǎng)查一查這個(gè)東西如何轉(zhuǎn)起來(lái)呢?搜到了天祥的視頻教程,但其是加密的,唉……我大概就在網(wǎng)上搜了將近一周的時(shí)間,后來(lái)老師過(guò)來(lái)詢(xún)問(wèn)我的板子玩的如何了,我連工作環(huán)境都沒(méi)有搭建起來(lái),
老師說(shuō)我那里有視頻,我覺(jué)得老師啊,你不早說(shuō)啊。
也許老師是故意的,因?yàn)閷⒔恢艿臅r(shí)間我了解了三星公司的芯片S3C2440A,知道了天祥開(kāi)發(fā)板的原理,包括的外設(shè),有了整體的認(rèn)識(shí)。
我拿到視頻后跟著視頻一步一步地開(kāi)始了我的嵌入式之旅...
學(xué)習(xí)鳥(niǎo)網(wǎng)站是免費(fèi)的綜合學(xué)習(xí)網(wǎng)站,提供各行各業(yè)學(xué)習(xí)資料、學(xué)習(xí)資訊供大家學(xué)習(xí)參考,如學(xué)習(xí)資料/生活百科/各行業(yè)論文/中小學(xué)作文/實(shí)用范文實(shí)用文檔等等!
寫(xiě)作基礎(chǔ) | 作文指導(dǎo) |
寫(xiě)作經(jīng)驗(yàn) | 寫(xiě)作方法 |
文學(xué)常識(shí) |
聲明:本網(wǎng)站尊重并保護(hù)知識(shí)產(chǎn)權(quán),根據(jù)《信息網(wǎng)絡(luò)傳播權(quán)保護(hù)條例》,如果我們轉(zhuǎn)載的作品侵犯了您的權(quán)利,請(qǐng)?jiān)谝粋€(gè)月內(nèi)通知我們,我們會(huì)及時(shí)刪除。
蜀ICP備2020033479號(hào)-4 Copyright ? 2016 學(xué)習(xí)鳥(niǎo). 頁(yè)面生成時(shí)間:0.157秒