freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

arm處理器系統(tǒng)初始化過(guò)程-資料下載頁(yè)

2025-06-29 08:42本頁(yè)面
  

【正文】 MACROMOVEQ_PC_LR//這個(gè)是帶“相等”條件的子程序返回。和上面說(shuō)的類似。 [ THUMBCODE bxeq lr | moveq pc,lr ]MEND在宏定義下面的handlexxx HANDLER handlexxx都會(huì)展成以下的程序段,這段程序主要把中斷服務(wù)程序的入口地址傳送給pc,在程序的用34字空間來(lái)存放中斷服務(wù)程序的入口地址,每個(gè)字空間都會(huì)有一個(gè)標(biāo)號(hào),以handlerxxx開(kāi)頭的。MACRO$HandlerLabel HANDLER $HandleLabel$HandlerLabelsub sp,sp,4 //先預(yù)留空間,為了存儲(chǔ)跳轉(zhuǎn)地址。stmfd sp!,{r0} //把工作寄存器按入堆棧。ldr r0,=$HandleLabelldr r0,[r0] //這兩句的功能是把中斷程序的入口地址先放在中間變量r0處。str r0,[sp,4]//把中斷服務(wù)程序的入口地址按入堆棧。 ldmfd sp!,{r0,pc}//最后把堆棧中的中斷程序入口地址彈給pc寄存器,這樣就可以執(zhí)行相應(yīng)的中斷服務(wù)程序了。 MENDS3C2440有兩種中斷模式:一種有中斷向量表的,一種則沒(méi)有。有表的話實(shí)時(shí)性比較好。當(dāng)一個(gè)外部中斷0發(fā)生后,程序自動(dòng)跳轉(zhuǎn)到地址0x20 處,0x20地址單元的指令為“l(fā)dr pc, = HandlerEINT0”,因此程序跳轉(zhuǎn)到HandlerEINT0處執(zhí)行這個(gè)宏操作,就是把外部中斷地址賦給PC。一個(gè)arm程序是由R0,RW,ZI三個(gè)段組成。其中R0為代碼段,RW是已經(jīng)初始化的全局變量,ZI是未初始化的全局變量,BOOTLOADER要將RW段復(fù)制到RAM中并將ZI段清零。編譯器使用下列段來(lái)記錄各段的起始地址和結(jié)束地址|Image$$RO$$Base| 。 RO 段起始地址|Image$$RO$$Limit| 。 RO 段結(jié)束地址加1|Image$$RW$$Base| 。 RW 段起始地址|Image$$RW$$Limit| 。 RW 段結(jié)束地址加1|Image$$ZI$$Base| 。 ZI 段起始地址|Image$$ZI$$Limit| 。 ZI 段結(jié)束地址加1這些標(biāo)號(hào)的值是通過(guò)編譯器的設(shè)定來(lái)確定的如編譯軟件中對(duì)robase 和rwbase 的設(shè)定,例如robase=0xc000000 rwbase=0xc5f0000,在這里用IMPORT 偽指令( 和c 語(yǔ)言的extren 一樣) 引入|Image$$RO$$Base|,|Image$$RO$$Limit|...等比較古怪的變量是編譯器生成的。RO, RW, ZI 這三個(gè)段都保存在Flash 中,但RW,ZI 在Flash 中的地址肯定不是程序運(yùn)行時(shí)變量所存儲(chǔ)的位置,因此我們的程序在初始化時(shí)應(yīng)該把Flash 中的RW,ZI 拷貝到RAM 的對(duì)應(yīng)位置。這些變量是通過(guò)ADS 的工程設(shè)置里面設(shè)定的RO Base 和RW Base 設(shè)定的,最終由編譯腳本和連接程序?qū)氤绦?IMPORT |Image$$RO$$Base|IMPORT |Image$$RO$$Limit|IMPORT |Image$$RW$$Base|IMPORT |Image$$ZI$$Base|IMPORT |Image$$ZI$$Limit|引入外部變量mmu的快速總線模式和同步總線模式兩個(gè)變量IMPORT MMU_SetAsyncBusModeIMPORT MMU_SetFastBusMode我們所熟知的main函數(shù)IMPORT Main把鏡像從Nandflash拷貝到SDRAM的函數(shù)IMPORT RdNF2SDRAM定義arm匯編程序段,段名叫init段,為只讀段 AREA Init,CODE,READONLY ENTRY EXPORT __ENTRY//導(dǎo)出__ENTRY標(biāo)號(hào)__ENTRYResetEntryASSERT :DEF:ENDIAN_CHANGE//判斷模式改變是否定義過(guò)(ASSERT是偽指令,:DEF:lable判斷l(xiāng)able是否定義過(guò)了)[ ENDIAN_CHANGE ASSERT :DEF:ENTRY_BUS_WIDTH//判斷是否定義了總線寬度 [ ENTRY_BUS_WIDTH=32//如果存儲(chǔ)器是32位的總線寬度 b ChangeBigEndian 。DCD 0xea000007 ] [ ENTRY_BUS_WIDTH=16//如果存儲(chǔ)器是16位的總線寬度 andeq r14,r7,r0,lsl 20 。DCD 0x0007ea00 ] [ ENTRY_BUS_WIDTH=8//如果是存儲(chǔ)器是8位總線寬度 streq r0,[r0,r10,ror 1] 。DCD 0x070000ea ]|//如果總線寬度沒(méi)有定義的話,就直接跳轉(zhuǎn)到復(fù)位中斷 b ResetHandler//程序執(zhí)行的地跳跳轉(zhuǎn)指令]b HandlerUndef 。handler for Undefined modeb HandlerSWI 。handler for SWI interruptb HandlerPabort 。handler for PAbortb HandlerDabort 。handler for DAbortb . 。reservedb HandlerIRQ 。handler for IRQ interruptb HandlerFIQ 。handler for FIQ interrupt。@0x20b EnterPWDN 。 Must be @0x20.//進(jìn)入powerdown模式以上8條跳轉(zhuǎn)指令,是8個(gè)異常中斷處理向量,一定要按照順序排好,據(jù)我了解,每次出現(xiàn)異常的話,是由硬件自行查表的。HandlerFIQ HANDLER HandleFIQHandlerIRQ HANDLER HandleIRQHandlerUndef HANDLER HandleUndefHandlerSWI HANDLER HandleSWIHandlerDabort HANDLER HandleDabortHandlerPabort HANDLER HandlePabort下面這段程序很重要,他是實(shí)現(xiàn)第二次查表的程序。arm把所有中斷都?xì)w為一個(gè)IRQ和一個(gè)FIRQ中斷異常,我們?yōu)榱艘谰唧w的中斷,從而才可以跳到中斷對(duì)應(yīng)的中斷服務(wù)程序。IsrIRQsub sp,sp,4 //保留pc寄存器的值stmfd sp!,{r8r9}//把r8 r9按入堆棧ldr r9,=INTOFFSET//把中斷偏移INTOFFSET的地址裝入r9里面ldr r9,[r9]//取出INTOFFSET單元里面的值給r9ldr r8,=HandleEINT0//向量表的入口地址賦給r8add r8,r8,r9,lsl 2//求出具體中斷向量的地址ldr r8,[r8]//中斷向量里面存儲(chǔ)的中斷服務(wù)程序的入口地址賦給r8str r8,[sp,8]//按入堆棧ldmfd sp!,{r8r9,pc}//堆棧彈出,跳轉(zhuǎn)到相應(yīng)的中斷服務(wù)程序LTORG//聲明文字池板子上電后就,程序就執(zhí)行0x00處的b ResetHandlerResetHandlerldr r0,=WTCON //關(guān)閉看門狗 ldr r1,=0x0str r1,[r0]ldr r0,=INTMSKldr r1,=0xffffffff //關(guān)閉所有中斷str r1,[r0]ldr r0,=INTSUBMSKldr r1,=0x7fff //關(guān)閉所有子中斷str r1,[r0][ {FALSE} 。rGPFDAT = (rGPFDAT amp。 ~(0xf4)) | ((~data amp。 0xf)4)。 。 Led_Display ldr r0,=GPBCON ldr r1,=0x155500 str r1,[r0]//使GPB10~GPB4為輸出口,GPB3~GPB0為輸入口 ldr r0,=GPBDAT ldr r1,=0x0 str r1,[r0]//使GPB10~GPB4輸出為低電平,GPB3~GPB0輸入為低電平]通過(guò)數(shù)據(jù)手冊(cè)可以發(fā)現(xiàn),當(dāng)輸出為1時(shí),LED滅,反之亦然。LOCKTIME是pll的lock time計(jì)數(shù)器。為了減少pll的lock time,調(diào)整LOCKTIME寄存器。ldr r0,=LOCKTIMEldr r1,=0xffffff//賦給這個(gè)值后,UPLL和MPLL的locktime的值都會(huì)設(shè)定好了。具體為什么是設(shè)定這個(gè)值,你就去問(wèn)問(wèn)三星公司吧,我也不太懂。str r1,[r0]說(shuō) 到這里,大家可能不太懂。我就在這里細(xì)說(shuō)一下吧。這個(gè)涉及到arm9的時(shí)鐘模塊的知識(shí)。arm9有個(gè)時(shí)鐘控制邏輯,它可以產(chǎn)生cpu的FCLK時(shí)鐘、 AHB總線外圍接口器件的HCLK時(shí)鐘以及APB總線外圍接口器件的PCLK時(shí)鐘。arm9有兩個(gè)鎖相環(huán)PLL,一個(gè)用于FCLK、HCLK、HCLK。 一個(gè)用于USB模塊。這兩個(gè)PLL我們分別稱之為MPLL和UPLL。在系統(tǒng)復(fù)位之后,PLL按照默認(rèn)的配置進(jìn)行操作,由于認(rèn)為它這時(shí)是一個(gè)不穩(wěn)定的狀 態(tài),所以這時(shí)用外部時(shí)鐘作為FCLK時(shí)鐘的輸出。只有當(dāng)向PLLCON寄存器設(shè)置相應(yīng)的值后,PLL就會(huì)按照軟件設(shè)置的頻率運(yùn)行了。這時(shí)就換成使用PLL 的輸出作為FCLK了。對(duì)于FCLK先后不是有兩次不同時(shí)鐘作為輸入,這樣就余姚一個(gè)適應(yīng)的時(shí)間,這個(gè)時(shí)間的設(shè)定就是我們這里在LOCKTIME寄存器里 面設(shè)置的常數(shù)啦。[ PLL_ON_START//設(shè)置CLKDIVN的值在PLL鎖存時(shí)間之后有效。 ldr r0,=CLKDIVN ldr r1,=CLKDIV_VAL 。 0=1:1:1, 1=1:1:2, 2=1:2:2, 3=1:2:4, 4=1:4:4, 5=1:4:8, 6=1:3:3, 7=1:3:6. str r1,[r0]可以看出是對(duì)FCLK、PCLK以及HCLK三者的比率設(shè)置。只要通過(guò)對(duì)CLKDIVN執(zhí)行操作就可以得到相應(yīng)需要的比率了。 [ CLKDIV_VAL1 //如果 Fclk:Hclk不是1:1的話執(zhí)行下面 mrc p15,0,r0,c1,c0,0 orr r0,r0,0xc0000000。R1_nF:OR:R1_iA mcr p15,0,r0,c1,c0,0 | mrc p15,0,r0,c1,c0,0 bic r0,r0,0xc0000000。R1_iA:OR:R1_nF mcr p15,0,r0,c1,c0,0 ] 這里可以看出,如果FCLK:HCLK不是1:1的關(guān)系的話,就要轉(zhuǎn)成異步總線模式。反之,如果是這個(gè)比例關(guān)系的話,就轉(zhuǎn)成快速總線模式。 ldr r0,=UPLLCON//對(duì)UPLL進(jìn)行配置 ldr r1,=((U_MDIV12)+(U_PDIV4)+U_SDIV)//這里就是非常熟悉的PMS啦,F(xiàn)in = , UCLK = 48MHz str r1,[r0] nop 。 Caution: After UPLL setting, at least 7clocks delay must be inserted for setting hardware be pleted. nop nop nop nop nop nop ldr r0,=MPLLCON//對(duì)MPLL進(jìn)行配置 ldr r1,=((M_MDIV12)+(M_PDIV4)+M_SDIV) 。Fin = , FCLK = 400MHz str r1,[r0]]ldr r1,=GSTATUS2ldr r0,[r1]tst r0,0x2判斷是否是從休眠模式喚醒的,對(duì)GSTATUS2[2]的檢測(cè)就可以判斷出是否從休眠模式喚醒的。bne WAKEUP_SLEEP//如果是的話就跳轉(zhuǎn)。EXPORT StartPointAfterSleepWakeUp//定義一個(gè)外部的StartPointAfterSleepWakeUpStartPointAfterSleepWakeUp adrl r0, SMRDATA ldr r1,=BWSCON add r2, r0, 52 0 ldr r3, [r0], 4 str r3, [r1], 4 cmp r2, r0 bne %B0這段代碼的作用就是設(shè)置存儲(chǔ)控制器。在代碼的后面有一個(gè)SMRDATA的數(shù)據(jù)區(qū),用r0來(lái)定義它的起始地址,用r2來(lái)定義它的結(jié)束地址。,就是把內(nèi)存的數(shù)據(jù)賦給這13個(gè)存儲(chǔ)控制器里面的。ldr r0,=GPFCONldr r1,=0x0str r1,[r0]//對(duì)GPF設(shè)置為輸入的功能ldr r0,=GPFUPldr r1,=0xffstr r1,[r0]//禁止上拉電阻ldr r1,=GPFDATldr r0,[r1]bic r0,r0,(0x1e1)//bic是r0與(0x1e1)的反碼按位相與。tst r0,0x1//這里就是測(cè)試最后一位是否為0,為0時(shí)說(shuō)明是有按鍵按下了。bne %F1//當(dāng)按鍵0沒(méi)有被按下的時(shí)候,就跳轉(zhuǎn)啦。這段代碼是檢測(cè)EINT0是否被按下了。ldr r0,=GPFCONldr
點(diǎn)擊復(fù)制文檔內(nèi)容
環(huán)評(píng)公示相關(guān)推薦
文庫(kù)吧 www.dybbs8.com
備案圖鄂ICP備17016276號(hào)-1