娇小w搡bbbb搡bbb,《第一次の人妻》,中国成熟妇女毛茸茸,边啃奶头边躁狠狠躁视频免费观看

嵌入式學(xué)習(xí)丨4412開發(fā)板-uboot源碼-匯編-源碼分析(一)嵌入式學(xué)習(xí)丨4412開發(fā)板-uboot源碼-匯

發(fā)布者:chunying最新更新時(shí)間:2025-04-08 來源: cnblogs關(guān)鍵字:4412開發(fā)板  uboot  匯編 手機(jī)看文章 掃描二維碼
隨時(shí)隨地手機(jī)看文章

在第一章中,介紹了迅為4412 的 iROM、啟動(dòng)方式、源碼組成等;在第二章中,介紹uboot 編譯等。通過前面對(duì)編譯的詳細(xì)分析,了解到 uboot 源碼中有以下幾個(gè)文件是非常重要的:
“cpu/arm_cortexa9/start.S”
“board/samsung/smdkc210/lowlevel_init_SCP.S 或者 lowlevel_init_POP.S”
“include/configs/itop_4412_android.h 或者 itop_4412_ubuntu.h”
其中“cpu/arm_cortexa9/start.S”是 uboot 代碼入口文件,分析 uboot 一般是從
“start.S”文件開始,“l(fā)owlevel_init_SCP.S”文件是內(nèi)存初始化、時(shí)鐘初始化和串口初始化
等的文件,start.S 文件在運(yùn)行過程中會(huì)跳到這個(gè)文件中。
“itop_4412_android.h 或者 itop_4412_ubuntu.h”文件是重要的配置頭文件,里面的
宏配置,會(huì)影響以上文件如何編譯和運(yùn)行,包括在下一章節(jié)中 uboot 源碼的 C 語言部分,很
多代碼編譯和運(yùn)行都會(huì)受到這個(gè)頭文件的影響。
本章主要內(nèi)容是,從“start.S”文件開始分析所有匯編代碼,截止于 uboot 開始執(zhí)行 C代碼。其中涉及到很多不常用概念,需要我們?nèi)チ私夂驼莆眨簧婕暗絽R編語法,需要我們?nèi)チ私狻?br/>
3.1 分析 uboot 匯編源碼必要的知識(shí)和學(xué)習(xí)方法匯總
本小節(jié),結(jié)合 datasheet 介紹 4412 的物理地址概念,這部分和單片機(jī)中類似;介紹匯編語法如何學(xué)習(xí)以及要掌握到什么程度;匯編部分調(diào)試方法。

3.1.1 4412 的物理地址和虛擬地址介紹
如果用戶學(xué)習(xí)過迅為的 linux 驅(qū)動(dòng)教程,其中有一期,專門介紹物理地址和虛擬地址的概念。幾乎在所有現(xiàn)代操作系統(tǒng)中,物理地址都是通過 MMU(內(nèi)存管理單元)映射為虛擬地址。但是在 uboot 匯編部分,還是直接操作物理地址的。
物理地址的概念。
MPU 地址總線傳來的地址,由硬件電路控制其具體含義。物理地址中很大一部分是留給內(nèi)存條中的內(nèi)存的。物理地址空間,一部分給內(nèi)存用,一部分給總線用,這是由硬件設(shè)計(jì)來決定的,因此在 32 bits 地址線的處理器中,物理地址空間是 2 的 32 次方,即 4GB,但物理RAM 一般不能上到 4GB,因?yàn)檫€有一部分要給總線用(總線上還掛著別的許多設(shè)備)。
對(duì)于有單片機(jī)基礎(chǔ)的用戶來說,物理地址還是比較好理解,例如在 51 單片機(jī)中,P0.0 表示小燈的輸出寄存器,給這個(gè)寄存器寫 1 小燈滅,寫 0 小燈亮,寄存器 P0.0 的地址就是物理地址。
P0 = 0xfe;//小燈亮
P0 = 0xff;//小燈滅
P0 在 51 寄存器頭文件中,有一個(gè)宏定義它的實(shí)際地址,也就是物理地址。
在 4412 中,物理地址太多了,根本沒有辦法全部介紹,2000 多頁的 datasheet 中大部分都是介紹寄存器,一個(gè)一個(gè)介紹是無法實(shí)現(xiàn)的。但是我們有必要掌握和理解其中的寄
存器框架和典型寄存器。
在 4412datasheet 第三章“Memory Map”中,如下圖所示,這是 4412 全部基地址的描述。

注意上表中,0x4000_0000~0xA000_0000,0xA000_0000~0x0000_0000 這兩個(gè)地址區(qū)間,這兩個(gè)區(qū)間是 DMC 內(nèi)存控制器的尋址地址,也就是內(nèi)存的物理地址。實(shí)際上 4412 最大支持的內(nèi)存可以達(dá)到 3G,32 位處理器理論上可以支持 2 的 32 次方(最大 4G),如上表所示,其中 1G 的地址給了 iROM、iRAM 等等這些 MPU 內(nèi)部寄存器使用,所以 32 位 MPU
是不可能達(dá)到 4G 內(nèi)存的。
現(xiàn)代操作系統(tǒng)普遍采用虛擬內(nèi)存管理(Virtual Memory Management)機(jī)制,這需要MMU(Memory Management Unit)的支持。MMU 通常是 CPU 的一部分,如果處理器沒有 MMU,或者有 MMU 但沒有啟用,CPU 執(zhí)行單元發(fā)出的內(nèi)存地址將直接傳到芯片引腳上,被內(nèi)存芯片物理內(nèi)存)接收,這稱為物理地址(Physical Address),如果處理器啟用了 MMU,CPU 執(zhí)行單元發(fā)出的內(nèi)存地址將被 MMU 截獲,從 CPU 到 MMU 的地址稱為虛擬地址(Virtual Address),而 MMU 將這個(gè)地址翻譯成另一個(gè)地址發(fā)到 CPU 芯片的外部地址引腳上,也就是將虛擬地址映射成物理地址。通過內(nèi)存管理單元,可以實(shí)現(xiàn) 4G 的虛擬內(nèi)存。
在 uboot 代碼中,需要多次用到以上地址的概念,其中內(nèi)存管理單元被開啟或者關(guān)閉,所以有必要先介紹一下這幾個(gè)地址的概念。
3.1.2 關(guān)于匯編語法
如果學(xué)習(xí)過單片機(jī)課程,會(huì)發(fā)現(xiàn)大部分都是使用 C 語言去編碼,匯編使用的非常少了。那么還有必要去學(xué)習(xí)匯編么?其實(shí)是沒有必要的,因?yàn)樵?uboot 中匯編代碼量非常少,以4412 的 uboot 源碼為例,其中有效的匯編代碼不足 200 行,我們根本不需要為了讀懂 200行代碼專門去學(xué)習(xí)一門編程語言。
作者這里建議,首先我們的目標(biāo)是一定要把這些代碼讀明白,如果不明白會(huì)影響后面 C代碼的閱讀,以及 uboot 的移植;其次,我們要弄清楚每一行有效匯編代碼的語法。
現(xiàn)在我們已經(jīng)知道匯編是從“cpu/arm_cortexa9/start.S”這個(gè)文件開始執(zhí)行,那么我們就從第一行代碼的語法開始學(xué)習(xí),代碼執(zhí)行到或者跳到哪一行,我們就學(xué)習(xí)這一行代碼的語法。
在手冊(cè)的附錄部分,我們會(huì)依次介紹匯編代碼中出現(xiàn)的語法,大家也可以通過互聯(lián)網(wǎng)學(xué)習(xí)每一行執(zhí)行的匯編語法。

3.1.3 uboot 匯編代碼初始化串口之前的簡易調(diào)試方法
在前面教程中我們介紹過,從 A9 開始,開發(fā)板一般都不配 jtag,jtag 價(jià)格昂貴,在 A9之前,由于引導(dǎo)程序 uboot 必須通過 jtag 來燒寫,但是在 A9 處理器上,大部分都是支持 tf卡引導(dǎo),這樣可以免去 jtag 的費(fèi)用,燒寫變的簡單高效。
那么沒有 jtag,對(duì)于 uboot 的調(diào)試,我們沒法單步調(diào)試,如果有一行代碼我們不是很確定到底執(zhí)行了沒,或者跳到哪一行。如果代碼已經(jīng)執(zhí)行到串口初始化階段,當(dāng)然是可以通過串口打印字符來實(shí)現(xiàn),在串口初始化之前,其實(shí)可以通過控制 LED 燈來跟蹤代碼。
以下是開發(fā)板上兩個(gè)小燈控制的代碼,可以將小燈點(diǎn)亮。
點(diǎn)亮 LED2 燈:
ldr r0, =0x11000104 /* GPL2(0) */
ldr r1, =0x00000001 /* GPL2(0 output high) */
str r1, [r0]
ldr r0, =0x11000100 /* GPL2(0) */
ldr r1, =0x00000001 /* GPL2(0 output high) */
str r1, [r0]
點(diǎn)亮 LED3:
ldr r0, =0x11000060
ldr r1, =0x00000010
str r1, [r0]
ldr r0, =0x11000064
ldr r1, =0x00000002
str r1, [r0]
這里簡單介紹下這幾行匯編代碼的含義。
ldr r0, =0x11000104
ldr 是將 0x11000104 值賦給 r0 寄存器。這個(gè)值地址為 GPL2DAT。
ldr r1, =0x00000001
ldr 是取 0x11000104 地址的值賦給 r1 寄存器。
str r1, [r0]
str 是將 r1 的值寫入到 r0 數(shù)值對(duì)應(yīng)物理地址寄存器中。將 0x00000001 寫入到
0x11000104 地址寄存器中,0x11000104 地址是 GPL2DAT 寄存器。
ldr r0, =0x11000100 /* GPL2(0) */
ldr r1, =0x00000001 /* GPL2(0 output high) */
str r1, [r0]
將 0x00000001 寫入到 0x11000100 地址寄存器中,0x11000100 地址是 GPL2CON 寄存器。執(zhí)行這兩步就可以將 LED2 點(diǎn)亮。
點(diǎn)亮 LED3 和點(diǎn)亮 LED2 類似。
在串口初始化之前可以通過點(diǎn)燈來實(shí)現(xiàn)調(diào)試,串口初始化之后可以通過打印字符來跟蹤調(diào)試代碼。

關(guān)鍵字:4412開發(fā)板  uboot  匯編 引用地址:嵌入式學(xué)習(xí)丨4412開發(fā)板-uboot源碼-匯編-源碼分析(一)嵌入式學(xué)習(xí)丨4412開發(fā)板-uboot源碼-匯

上一篇:迅為IMX6ULL開發(fā)板-主頻和時(shí)鐘配置例程(二)
下一篇:Linux系統(tǒng)編程篇丨迅為IMX6ULL-對(duì)應(yīng)視頻講解

推薦閱讀最新更新時(shí)間:2025-05-28 05:15

uboot段相關(guān)變量
在分析relocate_code函數(shù)之前,先來總結(jié)一下相關(guān)的uboot段相關(guān)變量,這些段的地址在uboot代碼重定位的時(shí)候需要用到,將uboot源碼進(jìn)行編譯后,會(huì)在源碼根目錄生成u-boot.lds鏈接文件和u-boot.map內(nèi)存映射文件,通過這兩個(gè)文件,可以尋找到uboot段的地址 在上面尋找到的變量值中,除了_start和__image_copy_start值不會(huì)該變,當(dāng)修改了uboot的源碼或改變了編譯條件,其他的變量都可能會(huì)發(fā)生改變,因此分析時(shí),一定要以實(shí)際編譯時(shí)進(jìn)行uboot分析。 relocate_code函數(shù) relocate_code函數(shù)會(huì)傳入一個(gè)參數(shù),該參數(shù)為gd- relocaddr,也就是uboot
[單片機(jī)]
<font color='red'>uboot</font>段相關(guān)變量
迅為-IMX6Q開發(fā)-非設(shè)備樹uboot-修改默認(rèn)環(huán)境變量
iTOP-iMX6 開發(fā)板燒寫好之后,默認(rèn)是 android 系統(tǒng) 9.7 寸屏幕的系統(tǒng)參數(shù)和屏幕參數(shù)。如下圖。本文檔主要介紹如何修改默認(rèn)啟動(dòng)參數(shù)。 70.1 重要的環(huán)境變量 比較重要的環(huán)境變量或者說經(jīng)常使用的環(huán)境變量,已經(jīng)在上圖中的紅色方框中。 主要是:bootsystem、lcdtype 和 bootargs。這些參數(shù)都可以在 uboot 源碼中進(jìn)行設(shè)置。具體文件為:“iTOP-iMX6_android4.4.2/bootable/bootloader/uboot-imx/lib_arm/board.c”文件。 70.2 默認(rèn)啟動(dòng)系統(tǒng)設(shè)置 默認(rèn)啟動(dòng)系統(tǒng)參數(shù)是:bootsystem。打開“board.c”文件。搜索關(guān)鍵詞“b
[單片機(jī)]
迅為-IMX6Q開發(fā)-非設(shè)備樹<font color='red'>uboot</font>-修改默認(rèn)環(huán)境變量
[uboot] (第五章)uboot流程——uboot啟動(dòng)流程
一、uboot說明 1、uboot要做的事情 CPU初始剛上電的狀態(tài)。需要小心的設(shè)置好很多狀態(tài),包括cpu狀態(tài)、中斷狀態(tài)、MMU狀態(tài)等等。其次,就是要根據(jù)硬件資源進(jìn)行板級(jí)的初始化,代碼重定向等等。最后,就是進(jìn)入命令行狀態(tài),等待處理命令。 在armv7架構(gòu)的uboot,主要需要做如下事情 arch級(jí)的初始化 關(guān)閉中斷,設(shè)置svc模式 禁用MMU、TLB 關(guān)鍵寄存器的設(shè)置,包括時(shí)鐘、看門狗的寄存器 板級(jí)的初始化 堆棧環(huán)境的設(shè)置 代碼重定向之前的板級(jí)初始化,包括串口、定時(shí)器、環(huán)境變量、I2CSPI等等的初始化 進(jìn)行代碼重定向 代碼重定向之后的板級(jí)初始化,包括板級(jí)代碼中定義的初始化操作、emmc、nand flash、網(wǎng)絡(luò)、
[單片機(jī)]
ARM匯編教程(3): ARM指令集
ARM與Thumb ARM 處理器有兩種主要的運(yùn)行狀態(tài),ARM 和 Thumb。這些狀態(tài)與特權(quán)級(jí)別無關(guān)。例如,以 SVC 模式運(yùn)行的代碼可以是 ARM 或 Thumb。這兩種狀態(tài)的主要區(qū)別在于指令集,ARM 狀態(tài)下的指令始終是 32 位的,而 Thumb 狀態(tài)下的指令是 16 位的(但也可以是 32 位的)。 ARM 版本的調(diào)用約定非常混亂,并非所有 ARM 版本都支持相同的 Thumb 指令集。在某些時(shí)候,ARM 引入了增強(qiáng)的 Thumb 指令集(Thumbv2),它允許 32 位 Thumb 指令甚至條件執(zhí)行,這在之前的版本中是不可能的。為了在 Thumb 狀態(tài)下使用條件執(zhí)行,引入了“it”指令。然而,這條指令在后來的版本
[單片機(jī)]
Keil下ARM匯編程序建立與調(diào)試簡介
1. 新建工程 選擇目標(biāo)處理器 比如:SAMSUNG /S3C2410 2. 新建文件 保存SAVE 3. 把文件添加入工程 或者雙擊組文件夾,選擇你保存的文件 4. 設(shè)置工程屬性 5. 編輯代碼 6. build 7. debug 8. 調(diào)試方法簡介 窗口1匯編代碼編輯窗口 窗口2單步調(diào)試工作欄,也可以按快捷鍵F11或F10 窗口3 是程序執(zhí)行時(shí)的寄存器窗口,Supervisor 高黑,說明當(dāng)前CPU處于Supervisor工作模式,(CPU的工作模式介紹參考博文:arm處理器工作模式)Current代表當(dāng)前模式下各個(gè)寄
[單片機(jī)]
Keil下ARM<font color='red'>匯編</font>程序建立與調(diào)試簡介
匯編語言與C51語言實(shí)現(xiàn)跑馬燈實(shí)驗(yàn)的比較
  當(dāng)前開發(fā) 單片機(jī) 應(yīng)用系統(tǒng)程序主要應(yīng)用匯編語言和C51語言,采用匯編語言編寫可直接操縱系統(tǒng)的硬件資源,能編寫出高效運(yùn)行的程序代碼,程序運(yùn)行速度快。而采用C51語言編寫可改善程序的可讀性和可移植性,利于產(chǎn)品的更新?lián)Q代,大大加快了單片機(jī)應(yīng)用程序的開發(fā)速度。下面通過一個(gè)簡單的實(shí)驗(yàn)--跑馬燈實(shí)驗(yàn)來分析一下這兩種語言的差別。用AT89C5l實(shí)現(xiàn)的跑馬燈實(shí)驗(yàn)的原理圖如xia 圖所示。   跑馬燈實(shí)驗(yàn)的原理圖用匯編語言編寫程序來實(shí)現(xiàn),程序如下: ORG 0 000H LJP START//轉(zhuǎn)入主程序 ORG 0040H START:MOV SP,#60H//設(shè)置 堆棧指針 OV A,# 0 F
[單片機(jī)]
<font color='red'>匯編</font>語言與C51語言實(shí)現(xiàn)跑馬燈實(shí)驗(yàn)的比較
ARM-Linux匯編到ADS匯編轉(zhuǎn)換需要注意的問題
最近那些課比較麻今天拿出一段nand準(zhǔn)備在ADS下搭建調(diào)試環(huán)境,發(fā)現(xiàn)兩家的匯編代碼有但不兼容,需要修改一下.現(xiàn)在羅列一下我主要修改的地方,其他很多可能沒遇到,大家還是自己查一查文檔吧。 1、修改頭 如arm-linux匯編頭: .text .global_start _start: 修改為ads版本: AREA nand1, CODE,READONLY ENTRY 注意AREA和ENTRY前面都有tab空格,否則編譯出錯(cuò)。 2、修改段標(biāo)志 去掉arm-linux匯編中的:號(hào)即可在ads中使用。 3、ads需要加上ENTRY和END指令表示程序入口和結(jié)束標(biāo)志 4、ADS中的C語言混編 與arm-l
[單片機(jī)]
ARM-Linux<font color='red'>匯編</font>到ADS<font color='red'>匯編</font>轉(zhuǎn)換需要注意的問題
ARM匯編指令集之六——程序狀態(tài)寄存器訪問指令
1、 MRS指令 MRS指令的格式為: MRS{條件} 通用寄存器,程序狀態(tài)寄存器(CPSR或SPSR) MRS指令用于將程序狀態(tài)寄存器的內(nèi)容傳送到通用寄存器中。該指令一般用在以下兩種情況: Ⅰ.當(dāng)需要改變程序狀態(tài)寄存器的內(nèi)容時(shí),可用MRS將程序狀態(tài)寄存器的內(nèi)容讀入通用寄存器,修改后再寫回程序狀態(tài)寄存器。 Ⅱ.當(dāng)在異常處理或進(jìn)程切換時(shí),需要保存程序狀態(tài)寄存器的值,可先用該指令讀出程序狀態(tài)寄存器的值,然后保存。 指令示例: MRS R0,CPSR ;傳送CPSR的內(nèi)容到R0 MRS R0,SPSR ;傳送SPSR的內(nèi)容到R0 2、 MSR指令 MSR指令的格式為:
[單片機(jī)]
小廣播
設(shè)計(jì)資源 培訓(xùn) 開發(fā)板 精華推薦

最新單片機(jī)文章

 
EEWorld訂閱號(hào)

 
EEWorld服務(wù)號(hào)

 
汽車開發(fā)圈

 
機(jī)器人開發(fā)圈

電子工程世界版權(quán)所有 京ICP證060456號(hào) 京ICP備10001474號(hào)-1 電信業(yè)務(wù)審批[2006]字第258號(hào)函 京公網(wǎng)安備 11010802033920號(hào) Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 石城县| 甘肃省| 苏尼特左旗| 东乡县| 濮阳县| 武鸣县| 田阳县| 金湖县| 云林县| 老河口市| 松阳县| 祁门县| 永昌县| 晋中市| 景宁| 建平县| 昌都县| 右玉县| 监利县| 景泰县| 义乌市| 商城县| 西林县| 琼海市| 弥渡县| 哈巴河县| 荆门市| 水富县| 沙湾县| 张家川| 平阳县| 长乐市| 清丰县| 晴隆县| 思南县| 绥宁县| 滕州市| 富阳市| 浑源县| 湟源县| 那坡县|