主要記錄一些硬件架構(gòu)方面的知識(shí)和底層介紹并用形象的比喻進(jìn)行理解;另外對(duì)寄存器和位操作使用困惑的解釋;裸機(jī)模塊的介紹。
目的要求:熟悉某種(S5PV210)開(kāi)發(fā)板的硬件啟動(dòng)流程,能做什么產(chǎn)品,有什么沒(méi)研究過(guò)的,大公司需要的,嵌入式開(kāi)發(fā):通過(guò)手冊(cè)明確做什么功能(哪部分硬件要被設(shè)置),根據(jù)IO口快速找到對(duì)應(yīng)寄存器進(jìn)行設(shè)置使用
開(kāi)發(fā)板通用開(kāi)發(fā)模型與流程
1.芯片手冊(cè)看接口(了解大體結(jié)構(gòu))
2.結(jié)合需求使用相關(guān)模塊(找到對(duì)應(yīng)接口并賦值)
3.使用的注意事項(xiàng)和后期維護(hù)(工程級(jí))
首先提兩個(gè)重要的學(xué)習(xí)方法:1.先自己設(shè)計(jì)一個(gè)認(rèn)為合理的CPU結(jié)構(gòu)(考慮性能 效率 容量);2.最好能找到3D演示效果的CPU結(jié)構(gòu)圖(文檔-TI 爛,瑞星 ON 還好,(瑞芯微的RK3368),三星 舊風(fēng)格)
ARM的體系結(jié)構(gòu)與指令(周期)
8051指令各有1.2.4字節(jié)長(zhǎng)度不等的指令
指令周期:震蕩 機(jī)器 時(shí)間
S5PV210啟動(dòng)過(guò)程
1.當(dāng)上電/復(fù)位時(shí),從0X0地址取指令執(zhí)行.0x0地下被映射到IROM(64K),IROM已經(jīng)samsung固化了一段初始化軟硬件環(huán)境的程序代碼.
2.BL0從啟動(dòng)設(shè)備(flash/SD)中拷貝 BL1代碼到iRAM(BL1代碼最大是16K),BL1現(xiàn)從啟動(dòng)設(shè)備拷貝BL2代碼到IRAM(96K-16k)
3.BL2先初始化外接原DRAM(內(nèi)存)(512M),BL2從啟動(dòng)設(shè)備里面把OS拷貝到DRAM,再跳到OS的開(kāi)始地址那里開(kāi)始運(yùn)行.
4.OS跑到后面,就會(huì)把根文件系統(tǒng)掛起來(lái)(根文件系統(tǒng)文件存在啟動(dòng)設(shè)備里面的)
流水線
三級(jí):中斷處理,線程保護(hù),保存執(zhí)行級(jí)別的內(nèi)容(實(shí)質(zhì)保存計(jì)數(shù)器)
寄存器
方法:用圖加以描述,大腦有一個(gè)清晰的軟件流程,廠商定義好的->理解為什么這樣定義(如何:ARM生產(chǎn)廠商是如何讓某位設(shè)置某個(gè)數(shù)就能產(chǎn)生某種功能的)是中央處理器組成之一,同速,比(L1 L2 DDR2)快
①通過(guò)設(shè)置相對(duì)應(yīng)寄存器來(lái)控制開(kāi)發(fā)板相關(guān)功能
②寄存器(正常工作模式 掉電模式)
特殊功能寄存器[控制引腳,其他為通用] (通過(guò)配置這些寄存器的時(shí)候能夠?qū)崿F(xiàn)對(duì)硬件的控制)
GPA0DRV電流輸出大小能力(區(qū)別高級(jí)和低級(jí)平臺(tái))
CON配置引腳功能 DAT設(shè)置引腳電平/讀取 PUD配置引腳是否使用上下拉電阻
③不同的功能組的操作步驟說(shuō)明(參考源代碼 芯片手冊(cè))
GPIO口(可設(shè)置第二功能)multi-functional port
④GPJ2CON DAT(LED使用到):看數(shù)據(jù)手冊(cè)的描述(功能需要,自己總結(jié)) 組 [芯片所有源代碼參考 看芯片手冊(cè)(猜測(cè))]
位操作
定義:直接對(duì)位進(jìn)行操作
作用:置0初始化 置1取值 左移對(duì)第幾位賦值
取反與或:不能直接寫(xiě)等號(hào)怕影響其他比特位(精準(zhǔn))
例:rGPJ2CON &=~0xF;//不能直接位或:因?yàn)椴恢兰拇嫫魇欠癖皇褂眠^(guò)
快速運(yùn)算2的n次方:左乘右除,例:*256->左移8位
前提:參與|運(yùn)算的兩個(gè)二進(jìn)制位有一個(gè)為 1 時(shí),結(jié)果就為 1
總結(jié):按位與運(yùn)算通常用來(lái)對(duì)某些位清 0,或者保留某些位
按位或運(yùn)算可以用來(lái)將某些位置 1,或者保留某些位。
注意:區(qū)分16進(jìn)制還是2進(jìn)制
學(xué)習(xí)思路:進(jìn)制轉(zhuǎn)換的幾種方法(0xF) 快速取值
http://c.biancheng.net/cpp/html/101.html
匯編與反匯編(dis文件)
生成反匯編:arm-linux-objdump -D start.elf>start.dis
反匯編查看delay作用 點(diǎn)亮LED
http://www.cnblogs.com/klcf0220/archive/2013/06/02/3113783.html
目標(biāo):年薪50萬(wàn) PLC 大小寫(xiě)不敏感 弄個(gè)模板 收集一些案例
基本指令使用(寫(xiě)法:先實(shí)現(xiàn)C代碼 )
小霸王游戲是用什么語(yǔ)言開(kāi)發(fā)的?->C和匯編語(yǔ)言混合編寫(xiě)
0.規(guī)范 文件.S
當(dāng)前匯編是第一個(gè)執(zhí)行 格式必須如下
.text(開(kāi)頭標(biāo)志)
.global _start
_start:
//添加代碼
循環(huán) 函數(shù)
.end(結(jié)尾標(biāo)志)
執(zhí)行:
1.立即數(shù)尋址:標(biāo)志性#
subs r0,r0,#1;r0=r0-1,并影響CPSR標(biāo)志位
mov r0,#0xff000;r0=0xff000

3.寄存器間接尋址 標(biāo)志性[] --【PPT】ARM的指令庫(kù)
4.偏移尋址-左右移
5.基址變址尋址:原來(lái)地址再次改變地址 !重復(fù)之前的動(dòng)作
6.壓棧指令 push {r0,r1,r2} push{r0-r2} 使用場(chǎng)景:有可能使用到這幾個(gè)寄存器先保護(hù)起來(lái)到內(nèi)存當(dāng)中;//r0-14都可以
出棧指令 從內(nèi)存當(dāng)中恢復(fù)寄存器 pop{r0-r2}
7.比較指令 CMP CMN TST TEQ 需要背(不需要加s,能夠直接影響CPSR標(biāo)志位) ZXCV是什么?
8.代碼優(yōu)化等級(jí)影響延時(shí)真實(shí)值(推薦二級(jí)優(yōu)化)-編譯器會(huì)影響同樣代碼的質(zhì)量
9.匯編調(diào)用C語(yǔ)言 匯編調(diào)用匯編 C語(yǔ)言調(diào)用匯編 extern 超過(guò)4個(gè)參數(shù)用棧傳遞(4個(gè)及內(nèi)都是依次用r0-3)-慢 uboot啟動(dòng)內(nèi)核會(huì)調(diào)用空函數(shù)theKernel
extern關(guān)鍵字用法:https://blog.csdn.net/xingjiarong/article/details/47656339
10.相關(guān)筆記
//配置GPJ2_0~GPJ2_3引腳為輸出模式
//使用模型:r0儲(chǔ)存轉(zhuǎn)換后的值,r1為真實(shí)地址值
//r2存儲(chǔ)臨時(shí)更改值
//ldr萬(wàn)能加載-數(shù)值 地址和寄存器,mov不能加載數(shù)值 0 x 1 2 3
ldr r1,=rGPJ2CON //int *r1 = 0xE0200280
ldr r0,[r1] //r0 = *r1
ldr r2,=0xFFFF
bic r0,r0,r2 //bic低4位清0
ldr r2,=0x1111 //對(duì)上面使用過(guò)的重新賦值,不會(huì)影響
orr r0,r0,r2 //簡(jiǎn)寫(xiě):博客園 跑馬燈 嵌入式 即刻出發(fā)
str r0,[r1] //*r1 = r0
//堆棧大小 中級(jí)嵌入式考證 試題 要求:會(huì)看和改 UBoot源代碼

ARM:.text 代碼段 sub減法指令 push壓棧
用得比較多的指令:bl調(diào)用(帶指令的跳轉(zhuǎn)-函數(shù)指針也可以) Load加載寄存器值(指令) Store存儲(chǔ)指令 STR改寫(xiě)寄存器值 ldr/str bx跳轉(zhuǎn)指令
遠(yuǎn)程更新管理:不帶操作系統(tǒng)的網(wǎng)絡(luò)下載 flash分區(qū) bootloader(初始化網(wǎng)絡(luò)模塊)-匯編實(shí)現(xiàn)
精簡(jiǎn)指令集依賴庫(kù)的實(shí)現(xiàn)(不要寫(xiě)太多除法-用左右移)
寫(xiě)代碼:CPSR是什么 翻譯C語(yǔ)言來(lái)寫(xiě)匯編
匯編代碼:標(biāo)志位
反匯編:可獲取程序執(zhí)行地址,看到指令和寄存器,不同工作模式(類似Linux的權(quán)限)
*ARM一上電默認(rèn)是管理模式(方便設(shè)置各種模式堆和棧)
重要:ARM工作流程(1.上電設(shè)置DDR2 *.外部中斷模式(識(shí)別然后跳轉(zhuǎn)到對(duì)應(yīng)的堆和棧地址[燒錯(cuò)代碼等,不同模式對(duì)應(yīng)不同堆棧地址]))
0.設(shè)置類模式
管理(最高權(quán)限)設(shè)置各種模式堆和棧
1.正常工作類模式(用戶和系統(tǒng)模式,同一級(jí)別)
2.異常類模式
未定義(當(dāng)前指令未定義,例:單片機(jī)代碼燒到ARM);
中止(取指令或數(shù)據(jù)出錯(cuò));
普通(外部)中斷IRQ(定時(shí)器 串口 SPI 外部引腳中斷等)[ARM自動(dòng)切換到該模式];快速中斷FIQ()[原理:壓棧數(shù)少]
http://www.eepw.com.cn/article/201611/318203.htm
注意:以下不能任意賦值,代碼自動(dòng)計(jì)算(不需要操作)
R13
R14子程序鏈接寄存器
R15->PC值記錄當(dāng)前程序位置
CPSR當(dāng)前程序狀態(tài)寄存器
SPSR
*現(xiàn)場(chǎng)保護(hù)->追蹤指令
跳轉(zhuǎn)指令

中斷與現(xiàn)場(chǎng)保護(hù)恢復(fù)
軟中斷:內(nèi)核機(jī)制觸發(fā)事件引起 硬中斷由外設(shè)引起
視頻-教師機(jī)(16:10左右具體過(guò)程描述) 5.26 14:23
何為中斷 http://www.21ic.com/jichuzhishi/mcu/interrupt/2013-02-28/159436.html
學(xué)習(xí)問(wèn)題:電子入門讀物推薦-對(duì)中斷,定時(shí)器這些由來(lái)不清楚
掌握移位操作(可記常用場(chǎng)景的設(shè)置,例:標(biāo)志位寫(xiě)1清0) 與單片機(jī)區(qū)別
外部中斷引腳變?yōu)榈诙δ芤_ 觸發(fā)方式 中斷處理函數(shù) 使能開(kāi)關(guān)
分類數(shù)量與優(yōu)先級(jí)
自動(dòng)跳轉(zhuǎn)(由硬件實(shí)現(xiàn))
IRQ中斷處理相關(guān)內(nèi)容
1.現(xiàn)場(chǎng)保護(hù)(普通中斷r0-12,14,cpsr)[新一代硬件可自動(dòng)完成]
2.判斷中斷源:檢查當(dāng)前是哪個(gè)硬件觸發(fā)中斷
3.跳轉(zhuǎn)到該硬件中斷服務(wù)函數(shù)執(zhí)行 (除了這里其他都是匯編)
4.現(xiàn)場(chǎng)恢復(fù)(r0-12,pc,cpsr...原來(lái)地方)
總中斷打開(kāi)(7設(shè)置為0值)
現(xiàn)場(chǎng)恢復(fù):0-12 14恢復(fù) cpsr從spsr恢復(fù)
保護(hù):0-12 14 cpsr從spsr保存
不同VIC(2用到音頻中斷)用到不同的中斷
VIC0->定時(shí)器 中斷號(hào)與寄存器關(guān)系

存儲(chǔ)類型 大小端模式
大端:tcp socket 低字節(jié)放高地址
小端:
GEC-A8沒(méi)有L3緩存
時(shí)鐘源
HCLK VCLK-LCD
芯片手冊(cè)Timing時(shí)間參數(shù)
異常處理結(jié)構(gòu) 中斷向量 視頻-教師機(jī)(16:30左右具體過(guò)程描述)

中斷入口地址 自動(dòng)指向 硬件指定(圖上的向量地址)-軟件不能修改
上電復(fù)位:PC 指向0x00000000地址
ARM啟動(dòng)方式與流程 (1、芯片支持的啟動(dòng)方式2、地址布局3、啟動(dòng)流程)教師機(jī)10:50啟動(dòng)流程講解
啟動(dòng)方式:具體采用哪種取決于OM0、OM1兩個(gè)引腳的狀態(tài)
http://blog.csdn.net/a627088424/article/details/9149671
http://blog.csdn.net/ly56086566/article/details/4814310
0.不論是arm的何種處理器,其都是從0x0 0地址處開(kāi)始執(zhí)行程序
啟動(dòng)流程圖
1.初始化 400M時(shí)鐘
BootLoader介紹與作用
UBoot源碼結(jié)構(gòu)與注釋 http://blog.csdn.net/reille/article/details/6554038
1.bootloader的作用是初始化必要的硬件,引導(dǎo)內(nèi)核啟動(dòng)
*硬件映射(向量中斷):
中斷
預(yù)備知識(shí):看門狗 ADT 定時(shí)器等位數(shù)指的是計(jì)數(shù)值位數(shù),區(qū)別于CPU的位長(zhǎng);(字長(zhǎng)/時(shí)長(zhǎng)又是什么?)
###1.ADC(模數(shù)轉(zhuǎn)換模塊)
使用遵循以下步驟:
###2.PWM(32位)
###3.watchdog看門狗
看門狗就是定期的查看芯片內(nèi)部的情況,一旦發(fā)生錯(cuò)誤就向芯片發(fā)出
重啟信號(hào)的電路??撮T狗命令在程序的中斷中擁有最高的優(yōu)先級(jí);
作用:嵌入式系統(tǒng)受干擾([偶然的]電源波動(dòng) 電磁干擾 硬件異常)而跑飛/死機(jī)造成不能
正常工作用來(lái)重啟系統(tǒng)(從故障恢復(fù))[提高系統(tǒng)穩(wěn)定性(單片機(jī)沒(méi)有)];
使用遵循以下步驟:
看門狗使用(與中斷有關(guān))注意:
公式:t_watchdog = 1/(PCLK/(Prescaler value+1)/Division_factor) //頻率值
與所需時(shí)間比對(duì)獲得WTDAT的值 (Hz = 1/T) 第一分頻值自己設(shè)定,二(4選1)
打開(kāi)看門狗(分開(kāi)處理) 記得喂狗
其它介紹
是一個(gè)定時(shí)器電路,一般有一個(gè)輸入,叫喂狗
(kicking the dog or service the dog),一個(gè)輸出到MCU的RST端,MCU正常工作的
時(shí)候,每隔一段時(shí)間輸出一個(gè)信號(hào)到喂狗端,給 WDT 清零,如果超過(guò)規(guī)定的時(shí)間不喂
狗,(一般在程序跑飛時(shí)),WDT 定時(shí)超過(guò),就會(huì)給出一個(gè)復(fù)位信號(hào)到MCU,使MCU復(fù)位. 防止MCU死機(jī). 看門狗的作用就是防止程序發(fā)生死循環(huán),或者說(shuō)程序跑飛。
工作原理:在系統(tǒng)運(yùn)行以后也就啟動(dòng)了看門狗的計(jì)數(shù)器,看門狗就開(kāi)始自動(dòng)計(jì)數(shù),如果
到了一定的時(shí)間還不去清看門狗,那么看門狗計(jì)數(shù)器就會(huì)溢出從而引起看門狗中斷,造
成系統(tǒng)復(fù)位,所以在使用有看門狗的芯片時(shí)要注意清看門狗
硬件看門狗是利用了一個(gè)定時(shí)器,來(lái)監(jiān)控主程序的運(yùn)行,也就是說(shuō)在主程序的運(yùn)行過(guò)程
中,我們要在定時(shí)時(shí)間到之前對(duì)定時(shí)器進(jìn)行復(fù)位。如果出現(xiàn)死循環(huán),或者說(shuō)PC指針不能
回來(lái),那么定時(shí)時(shí)間到后就會(huì)使單片機(jī)復(fù)位。常用的WDT芯片如MAX813,5045,IMP 813等,價(jià)格4~10元不等。
單片機(jī)32個(gè)IO口(51不帶看門狗,52可能帶) 51單片機(jī)(高)電平復(fù)位:51單片機(jī)是由
reset引腳控制復(fù)位的,與高電平相接24個(gè)震蕩周期后,芯片進(jìn)入復(fù)位狀態(tài)
相關(guān)書(shū)籍收集
0.匯編語(yǔ)言:基于x86處理器
1.匯編語(yǔ)言第三版 王爽 匯編書(shū)目 http://bbs.csdn.net/topics/330122713
2.計(jì)算機(jī)組成與嵌入式系統(tǒng)(原書(shū)第六版)
Computer Organization and Design, 4th Ed, D. A. Patterson and J. L. Hennessy CSDN
3.國(guó)內(nèi)或豆瓣評(píng)分8.0上的書(shū)(照建議的讀和學(xué),遇到問(wèn)題逐步解決[論壇 群])
課堂筆記
①指令和數(shù)據(jù)存放在存儲(chǔ)器(內(nèi)存-"創(chuàng)見(jiàn)"4G)
②按鍵加上拉電阻:引腳防止懸空(積累電荷會(huì)損壞器件) 電流喜歡流向阻值小的地方
(面試)單片機(jī)io接口加上拉電阻起一個(gè)嵌位灌流的作用,提高驅(qū)動(dòng)同時(shí)也限制電流,電阻的選擇根據(jù)io口的接口電路選擇。關(guān)于這個(gè)你可以看看吳鑒鷹吧里面關(guān)于上啦電阻的文章!按鍵使用上拉電阻起到如上所說(shuō)得作用,還有一個(gè)可以消除按鍵抖動(dòng),加上拉會(huì)改變上升下降沿的反應(yīng)速度!具體的可以參考吳鑒鷹貼吧里面文章
課外知識(shí)補(bǔ)充
1.DSP(數(shù)字信號(hào)處理)一般是給自動(dòng)化電子等專業(yè)的研究生博士研究算法的(機(jī)械專業(yè)不包括),有專門的浮點(diǎn)運(yùn)算單元。
2.存儲(chǔ)器(指令)指令決定寄存器(數(shù)據(jù)),(地址)存放在哪?
3.USB很少人懂,CISC/RISC 傅里葉變換 哈夫曼編碼 JPEG編解碼
4.晶振12M與11.0592MHz區(qū)別:12定時(shí)器
5.蘋(píng)果基于ARM框架進(jìn)行改造的A系列性能了解
6.代碼規(guī)范-變量放前面(部分編譯器不支持放后面)
UBoot要4.4.1編譯器才能編譯通過(guò)
7.如何挑選CPU:架構(gòu) 主頻 二級(jí)緩存越大越好,這也是為什么賽揚(yáng)系列的CPU主頻雖然比較高,但是在實(shí)際應(yīng)中卻沒(méi)有奔騰系列要好的原因(二級(jí)緩存對(duì)于AMD來(lái)說(shuō)就不像英特爾那么重要,因?yàn)锳MD除了有二級(jí)緩存之外還有三級(jí)緩存) 工藝(發(fā)熱和穩(wěn)定性) 核心數(shù)(玩游戲還是首選英特爾的CPU,因?yàn)樵趩魏诵阅苌嫌⑻貭柋華MD要強(qiáng),不過(guò)價(jià)格要貴許多)
8.notepad++ 視圖可查看函數(shù)列表
手冊(cè)閱讀筆記
地址(內(nèi)存 寄存器):29/2095地址分布圖
面試會(huì)問(wèn)到的一些問(wèn)題
1.看圖識(shí)結(jié)構(gòu)(選型 知道性能 成本等)
辨別依據(jù):總線的關(guān)系
2.8051指令周期(微機(jī))
物理相關(guān)
按鍵消抖 http://www.cnblogs.com/tanr-study/p/4617291.html
好的方案:定時(shí)器掃描按鍵 系統(tǒng)睡眠10毫秒usleep(10*10000)代替延時(shí):掛起
智能手環(huán)-單片機(jī)(操作系統(tǒng)函數(shù)用睡眠函數(shù),不可以用延時(shí),裸機(jī)沒(méi)有睡眠函數(shù)->定時(shí)器掃描按鍵) 大學(xué)生代碼->工程師代碼