在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<menu id="6qfwx"><li id="6qfwx"></li></menu>
    1. <menu id="6qfwx"><dl id="6qfwx"></dl></menu>

      <label id="6qfwx"><ol id="6qfwx"></ol></label><menu id="6qfwx"></menu><object id="6qfwx"><strike id="6qfwx"><noscript id="6qfwx"></noscript></strike></object>
        1. <center id="6qfwx"><dl id="6qfwx"></dl></center>

            新聞中心

            EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > S3C2440學(xué)習(xí)筆記五(2440slib.s源程序的分析)

            S3C2440學(xué)習(xí)筆記五(2440slib.s源程序的分析)

            作者: 時間:2016-11-11 來源:網(wǎng)絡(luò) 收藏
            以下程序是什么意思: 為啥這個文件是一堆的匯編代碼,因?yàn)檫@里面涉及到了底層驅(qū)動,這里既是CPU的核心控制。涉及到了直接操作的寄存器和高速緩存,實(shí)際上和51的CPU是一回事,就是51可以干一件事,他就要干幾十件事,沒有強(qiáng)悍的架構(gòu)和強(qiáng)大的寄存器和緩存團(tuán)隊(duì),他就沒法強(qiáng)悍!就跑400M吧,他為了效率加了cp15這個比較高速的協(xié)處理器,這個cp15的本質(zhì)是數(shù)據(jù)處理中心。只有早期的PC機(jī)和現(xiàn)行的ARM還有這個東西,現(xiàn)在的PC機(jī)跑得非??炝?,不需要CP15這類東西幫忙了。

            補(bǔ)充一點(diǎn)是,CP15可以理解為MMU,它主要的工作是地址映射,也就是給CPU提供地址。SDRAM一般為32M或64M,但是對于32位的CPU,可以管理4G的空間。那么就把這個4G的空間分成4096份,每一份1M,那么32位地址變成一個組合,14位+18位。

            本文引用地址:http://www.biyoush.com/article/201611/316993.htm
            ;=====================================================================
            ; File Name : 2440slib.s
            ; Function : GT2440 (Assembly)
            ; Revision : 1.0
            ;=====================================================================
            ;Interrupt, FIQ/IRQ disable禁止中斷FIQ/IRQ
            NOINT EQU 0xc0 ; 1100 0000---->CPSR
            ;Check if tasm.exe(armasm -16 ...@ADS 1.0) is used.
            GBLL THUMBCODE
            [ {CONFIG} = 16
            THUMBCODE SETL {TRUE}
            CODE32
            |
            THUMBCODE SETL {FALSE}
            ]

            ;這段指令判斷是否是THUMBCODE指令集,是的話就要用

            ;ADS的tasm.exe進(jìn)行編譯。首先用GBLL定義了全局邏輯

            ;變量HUMBCODE,默認(rèn)值為0。“[]"相當(dāng)于C語言中的{},

            ;| 相當(dāng)于else?

            MACRO
            MOV_PC_LR
            [ THUMBCODE
            bx lr
            |
            mov pc,lr
            ]
            MEND
            ;函數(shù)返回宏定義
            AREA |C$$code|, CODE, READONLY

            ;定義了代碼段,此代碼段是外部的可以被C程序調(diào)用的關(guān)于?

            ;寄存器和存儲管理單元(MMU)操作函數(shù)。?

            EXPORT EnterCritical
            ;用內(nèi)存單元r0存儲CPSR?
            EnterCritical
            mrs r1, cpsr
            str r1, [r0]
            orr r1, r1, #NOINT
            msr cpsr_cxsf, r1
            MOV_PC_LR
            ;restore cpsr, r0 = address to restore cpsr
            EXPORT ExitCritical
            ExitCritical
            ldr r1, [r0]
            msr cpsr_cxsf, r1
            MOV_PC_LR

            ;這里的cxsf表示從低到高分別占用的4個8bit的數(shù)據(jù)域?

            ;指令中有時還有出現(xiàn)cpsr_cf, cpsr_all, cpsr_c等,這里:?

            c 指CPSR中的control field ( PSR[7:0])?

            f 指flag field (PSR[31:24])?

            x 指extend field (PSR[15:8])?

            s 指status field ( PSR[23:16])?

            ;其中cpsr的位表示為:?

            31 30 29 28--- 7 6 - 4 3 2 1 0?

            N Z C V I F M4M3M2 M1 M0

            ;==============
            ; CPSR I,F bit設(shè)置CPSR的I位(IRQ)和F位(FIQ)
            ;置位CPSR_IR,即禁止IRQ中斷和FIQ中斷
            ;==============
            ;int SET_IF(void);
            ;The return value is current CPSR.
            EXPORT SET_IF
            SET_IF;僅在特權(quán)模式下可用此程序。
            ;This function works only if the processor is in previliged mode.
            mrs r0,cpsr
            mov r1,r0
            orr r1,r1,#NOINT
            msr cpsr_cxsf,r1
            MOV_PC_LR
            ;void WR_IF(int cpsrValue);寫值到CPSR
            EXPORT WR_IF
            WR_IF;僅在特權(quán)模式下可用此程序。
            ;This function works only if the processor is in previliged mode.
            msr cpsr_cxsf,r0
            MOV_PC_LR
            ;void CLR_IF(void);清CPSR_IR,即允許IRQ中斷和FIQ中斷
            EXPORT CLR_IF
            CLR_IF;僅在特權(quán)模式下可用此程序。
            ;This function works only if the processor is in previliged mode.
            mrs r0,cpsr
            bic r0,r0,#NOINT
            msr cpsr_cxsf,r0
            MOV_PC_LR
            EXPORT outportw
            outportw strh r0, [r1]
            MOV_PC_LR
            EXPORT inportw
            inportw ldrh r0, [r0]
            MOV_PC_LR
            請?jiān)忂@里不是原創(chuàng),只因還在努力學(xué)習(xí)!
            在ARM的嵌入式應(yīng)用中,存儲系統(tǒng)是通過協(xié)處理器CP15完成的。CP15包含16個32位的寄存器,其編號是0-15。對于CP15協(xié)處理器的操作使用mcr和mrc兩條協(xié)處理器指令,這兩條指令的記法是從后往錢看:mcr是把r(CPU核寄存器)中的數(shù)據(jù)傳送到c(協(xié)處理器寄存器)中,mrc則是把c(協(xié)處理器寄存器)中的數(shù)據(jù)傳送到r(CPU核寄存器)中。對CP15協(xié)處理器的所有操作都是通過CPU寄存器和CP15寄存器之間交換數(shù)據(jù)完成的。
            寄存器C0,C1。C0的基本作用是ID編碼;C1的基本作用是控制位(可讀可寫)。
            C1的第12位:I(bit[12])。當(dāng)數(shù)據(jù)和地址處于分開時,該控制位禁止使能指令cache;其中0是禁止指令cache,1是使能指令cache;如果系統(tǒng)中使能統(tǒng)一的指令cache和數(shù)據(jù)cache或者系統(tǒng)中不含cache,讀取時該位返回0,寫入時忽略該位。當(dāng)系統(tǒng)中的指令cache不禁止時,讀取該位時返回1,寫入時忽略該位。當(dāng)系統(tǒng)中的指令cache不禁止時,讀取時該位返回1,寫入時忽略該位。
            C1的第2位:C(bit[2])。當(dāng)數(shù)據(jù)和地址處于分開時,本控制位禁止使能數(shù)據(jù)cache;如果系統(tǒng)中使用統(tǒng)一的指令cache和數(shù)據(jù)cache時,該控制位禁止使能整個cache。其中0是禁止cache,1是使能cache;如果系統(tǒng)中不含cache,讀取時該位返回0,寫入時忽略該位。當(dāng)系統(tǒng)中的cache不能禁止時,讀取時該位返回1,寫入時忽略該位。
            C1的第1位:A(bit)。對于可以選擇是否支持內(nèi)存訪問時地址對齊檢查的那些系統(tǒng),本位禁止使能地址對齊檢查功能;0是禁止地址對齊檢查功能,1是使能對齊檢查功能;對齊內(nèi)存訪問時地址對齊檢查功能不可選擇的那些系統(tǒng),讀取該位時根據(jù)系統(tǒng)是否支持地址功能對齊檢查功能返回0或者1,寫入時忽略該位。
            C1的第0位:M(bit[0])。禁止使能MMU或者PU;其中0是禁止地址對齊檢查功能,1是使能地址對齊檢查功能;如果系統(tǒng)中沒有MMU及PU,讀取時該位返回0,寫入時忽略該位。

            C1的30位設(shè)置快速總線模式
            C2的31位模式異步模式
            ;====================================
            ; MMU Cache/TLB/etc on/off functions MMU的緩存,快表等的允許和禁止操作
            ;====================================
            R1_I EQU (1<<12) ;其實(shí)匯編也不想想象中那么匯,有事可以看到C的身影
            R1_C EQU (1<<2) ;其實(shí)C就是構(gòu)建在這些匯編之上,一看二看三看有種雜交的感覺
            R1_A EQU (1<<1)
            R1_M EQU (1)
            R1_iA EQU (1<<31)
            R1_nF EQU (1<<30)
            ;使能命令Cache
            ;void MMU_EnableICache(void)
            EXPORT MMU_EnableICache
            MMU_EnableICache
            mrc p15,0,r0,c1,c0,0
            orr r0,r0,#R1_I
            mcr p15,0,r0,c1,c0,0
            MOV_PC_LR
            ;void MMU_DisableICache(void)禁止命令Cache
            EXPORT MMU_DisableICache
            MMU_DisableICache
            mrc p15,0,r0,c1,c0,0
            bic r0,r0,#R1_I
            mcr p15,0,r0,c1,c0,0
            MOV_PC_LR
            ;使能數(shù)據(jù)Cache
            ;void MMU_EnableDCache(void); 當(dāng)?shù)刂稢ache和數(shù)據(jù)Cache分開時,使能數(shù)據(jù)Cache,反之使能整個Cache。
            EXPORT MMU_EnableDCache
            MMU_EnableDCache
            mrc p15,0,r0,c1,c0,0
            orr r0,r0,#R1_C
            mcr p15,0,r0,c1,c0,0
            MOV_PC_LR
            ;void MMU_DisableDCache(void); 當(dāng)?shù)刂稢ache和數(shù)據(jù)Cache分開時,禁止數(shù)據(jù)Cache,反之禁止整個Cache。
            EXPORT MMU_DisableDCache
            MMU_DisableDCache
            mrc p15,0,r0,c1,c0,0
            bic r0,r0,#R1_C
            mcr p15,0,r0,c1,c0,0
            MOV_PC_LR
            ;使能地址對齊檢查功能
            ;void MMU_EnableAlignFault(void)
            EXPORT MMU_EnableAlignFault
            MMU_EnableAlignFault
            mrc p15,0,r0,c1,c0,0
            orr r0,r0,#R1_A
            mcr p15,0,r0,c1,c0,0
            MOV_PC_LR
            ;void MMU_DisableAlignFault(void) ;禁止地址對齊檢查功能
            EXPORT MMU_DisableAlignFault
            MMU_DisableAlignFault
            mrc p15,0,r0,c1,c0,0
            bic r0,r0,#R1_A
            mcr p15,0,r0,c1,c0,0
            MOV_PC_LR
            ;void MMU_EnableMMU(void) ; 使能MMU
            EXPORT MMU_EnableMMU
            MMU_EnableMMU
            mrc p15,0,r0,c1,c0,0
            orr r0,r0,#R1_M
            mcr p15,0,r0,c1,c0,0
            MOV_PC_LR
            ;void MMU_DisableMMU(void) ;禁止MMU
            EXPORT MMU_DisableMMU
            MMU_DisableMMU
            mrc p15,0,r0,c1,c0,0
            bic r0,r0,#R1_M
            mcr p15,0,r0,c1,c0,0
            MOV_PC_LR
            ;void MMU_SetFastBusMode(void) ;設(shè)置快速總線模式
            ; FCLK:HCLK= 1:1
            EXPORT MMU_SetFastBusMode
            MMU_SetFastBusMode
            mrc p15,0,r0,c1,c0,0
            bic r0,r0,#R1_iA:OR:R1_nF
            mcr p15,0,r0,c1,c0,0
            MOV_PC_LR
            ;void MMU_SetAsyncBusMode(void) ; 設(shè)置異步模式
            ; FCLK:HCLK= 1:2
            EXPORT MMU_SetAsyncBusMode
            MMU_SetAsyncBusMode
            mrc p15,0,r0,c1,c0,0
            orr r0,r0,#R1_nF:OR:R1_iA
            mcr p15,0,r0,c1,c0,0
            MOV_PC_LR
            ;=========================
            ; Set TTBase C2:地址轉(zhuǎn)換表基地址
            ;=========================
            ;void MMU_SetTTBase(int base)
            EXPORT MMU_SetTTBase
            MMU_SetTTBase
            ;ro=TTBase
            mcr p15,0,r0,c2,c0,0
            MOV_PC_LR
            ;=========================
            ; Set Domain 域訪問控制位
            ;=========================
            ;寫控制位到C3
            ;void MMU_SetDomain(int domain)
            EXPORT MMU_SetDomain
            MMU_SetDomain
            ;ro=domain
            mcr p15,0,r0,c3,c0,0
            MOV_PC_LR
            ;=========================
            ; ICache/DCache functions
            C7控制指令和數(shù)據(jù)緩存和寫緩沖區(qū)
            它是一個只寫的寄存器。使用MRC指令讀取該寄存器,將產(chǎn)生不可預(yù)知效果。
            指令具體格式如下:
            MCR P15,0,,,,
            ,的不同的組合決定指令執(zhí)行的不同的操作。完成操作將產(chǎn)生的數(shù)據(jù)寫到Rd,然后寫到C7。
            ;=========================
            ;使無效整個統(tǒng)一的cache
            ;void MMU_InvalidateIDCache(void)
            EXPORT MMU_InvalidateIDCache
            MMU_InvalidateIDCache
            mcr p15,0,r0,c7,c7,0
            MOV_PC_LR
            ;void MMU_InvalidateICache(void) ;使無效整個指令cache
            EXPORT MMU_InvalidateICache
            MMU_InvalidateICache
            mcr p15,0,r0,c7,c5,0
            MOV_PC_LR
            ;void MMU_InvalidateICacheMVA(U32 mva) ;使無效指令cache的某塊mva,并把數(shù)據(jù)(虛擬地址)寫到C7
            EXPORT MMU_InvalidateICacheMVA
            MMU_InvalidateICacheMVA
            ;r0=mva
            mcr p15,0,r0,c7,c5,1
            MOV_PC_LR
            ;void MMU_PrefetchICacheMVA(U32 mva) ;預(yù)取指令cache中的某塊mva,并把數(shù)據(jù)(虛擬地址)寫到C7
            EXPORT MMU_PrefetchICacheMVA
            MMU_PrefetchICacheMVA
            ;r0=mva
            mcr p15,0,r0,c7,c13,1
            MOV_PC_LR
            ;void MMU_InvalidateDCache(void) ; 使無效整個數(shù)據(jù)cache
            EXPORT MMU_InvalidateDCache
            MMU_InvalidateDCache
            mcr p15,0,r0,c7,c6,0
            MOV_PC_LR
            ;void MMU_InvalidateDCacheMVA(U32 mva) ; 使無效數(shù)據(jù)cache的某塊mva,并把數(shù)據(jù)(虛擬地址)寫到C7
            EXPORT MMU_InvalidateDCacheMVA
            MMU_InvalidateDCacheMVA
            ;r0=mva
            mcr p15,0,r0,c7,c6,1
            MOV_PC_LR
            ;void MMU_CleanDCacheMVA(U32 mva) ; 清空數(shù)據(jù)cache中的某塊mva,并把數(shù)據(jù)(虛擬地址)寫到C7
            EXPORT MMU_CleanDCacheMVA
            MMU_CleanDCacheMVA
            ;r0=mva
            mcr p15,0,r0,c7,c10,1
            MOV_PC_LR
            ;void MMU_CleanInvalidateDCacheMVA(U32 mva) ; 清空無效數(shù)據(jù)cache中的某塊mva,并把數(shù)據(jù)(虛擬地址)寫到C7
            EXPORT MMU_CleanInvalidateDCacheMVA
            MMU_CleanInvalidateDCacheMVA
            ;r0=mva
            mcr p15,0,r0,c7,c14,1
            MOV_PC_LR
            ;void MMU_CleanDCacheIndex(U32 index) ; 清空數(shù)據(jù)cache中的某塊Index,并把組號 組內(nèi)序號寫到C7中
            EXPORT MMU_CleanDCacheIndex
            MMU_CleanDCacheIndex
            ;r0=index
            mcr p15,0,r0,c7,c10,2
            MOV_PC_LR
            ;void MMU_CleanInvalidateDCacheIndex(U32 index) ; 清空將無效數(shù)據(jù)cache中的某塊Index,并把組號 組內(nèi)序號寫到C7中
            EXPORT MMU_CleanInvalidateDCacheIndex
            MMU_CleanInvalidateDCacheIndex
            ;r0=index
            mcr p15,0,r0,c7,c14,2
            MOV_PC_LR
            ;void MMU_WaitForInterrupt(void) ; 等待中斷激活,使ARM進(jìn)入節(jié)能狀態(tài),停止執(zhí)行等待中斷激活。
            ;當(dāng)異常中斷IRQ或FIQ發(fā)生后,該MCR指令進(jìn)入IRQ或FIQ中斷處理程序執(zhí)行。
            EXPORT MMU_WaitForInterrupt
            MMU_WaitForInterrupt
            mcr p15,0,r0,c7,c0,4
            MOV_PC_LR
            ;===============
            ; TLB functions 快表TLB功能(C8)
            ; C8控制控制清楚TLB的相關(guān)操作。它是一個只寫的寄存器。使用MRC指令讀取該寄存器,將產(chǎn)生不可預(yù)知的效果。
            ;指令具體格式如下:
            ;MCR P15,0,,,,
            ;,的不同的組合決定指令執(zhí)行的不同操作。完成操作將產(chǎn)生的數(shù)據(jù)寫到Rd,然后寫到C8
            ;===============
            ;使無效整個統(tǒng)一的cache;或者使無效整個數(shù)據(jù)cache和指令cache
            ;voic MMU_InvalidateTLB(void)
            EXPORT MMU_InvalidateTLB
            MMU_InvalidateTLB
            mcr p15,0,r0,c8,c7,0
            MOV_PC_LR
            ;void MMU_InvalidateITLB(void) ;使無效整個指令cache
            EXPORT MMU_InvalidateITLB ;供外部使用(*個人理解*)
            MMU_InvalidateITLB ;調(diào)用標(biāo)記
            mcr p15,0,r0,c8,c5,0
            MOV_PC_LR ;調(diào)用返回
            ;void MMU_InvalidateITLBMVA(U32 mva) ; 使無效指令cache的單個地址變換條目mva,并把虛擬地址返回到C8
            EXPORT MMU_InvalidateITLBMVA
            MMU_InvalidateITLBMVA
            ;ro=mva
            mcr p15,0,r0,c8,c5,1
            MOV_PC_LR
            ;void MMU_InvalidateDTLB(void) ; 使無效整個數(shù)據(jù)cache
            EXPORT MMU_InvalidateDTLB
            MMU_InvalidateDTLB
            mcr p15,0,r0,c8,c6,0
            MOV_PC_LR
            ;void MMU_InvalidateDTLBMVA(U32 mva) ; 使無效數(shù)據(jù)cache的單個地址變換條目mva,并把虛擬地址返回到C8
            EXPORT MMU_InvalidateDTLBMVA
            MMU_InvalidateDTLBMVA
            ;r0=mva
            mcr p15,0,r0,c8,c6,1
            MOV_PC_LR
            ;=================
            ; Cache lock down 緩存內(nèi)容鎖定(C9)
            ; Cache內(nèi)容鎖定,就是將一些關(guān)鍵代碼和數(shù)據(jù)預(yù)取到cache后,設(shè)置一定的屬性,使發(fā)生cache塊替換時,
            ;這些關(guān)鍵代碼和數(shù)據(jù)所在的塊不會被替換。指令具體格式如下:
            ;MCR P15,0,,,,
            ;MCR P15, 0, ,,,
            ;當(dāng)系統(tǒng)中包含獨(dú)立的數(shù)據(jù)cache和指令cache時,對應(yīng)于數(shù)據(jù)cache和指令cache分別有一個獨(dú)立的cache內(nèi)容鎖定寄存器。
            ;=1 選擇指令cache的內(nèi)容鎖定寄存器
            ;=0 選擇數(shù)據(jù)cache的內(nèi)容鎖定寄存器
            ;當(dāng)系統(tǒng)中使用統(tǒng)一的數(shù)據(jù)cache和指令cache時,操作數(shù)應(yīng)為0
            ;=================鎖數(shù)據(jù)cache
            ;void MMU_SetDCacheLockdownBase(U32 base)
            EXPORT MMU_SetDCacheLockdownBase
            MMU_SetDCacheLockdownBase
            ;r0= victim & lockdown base
            mcr p15,0,r0,c9,c0,0
            MOV_PC_LR
            ;void MMU_SetICacheLockdownBase(U32 base) ; 鎖指令cache
            EXPORT MMU_SetICacheLockdownBase
            MMU_SetICacheLockdownBase
            ;r0= victim & lockdown base
            mcr p15,0,r0,c9,c0,1
            MOV_PC_LR
            ;=================
            ; TLB lock down 快表內(nèi)容鎖存(C10) ; 具體操作同cache鎖存
            ;=================鎖數(shù)據(jù)快表
            ;void MMU_SetDTLBLockdown(U32 baseVictim)
            EXPORT MMU_SetDTLBLockdown
            MMU_SetDTLBLockdown
            ;r0= baseVictim
            mcr p15,0,r0,c10,c0,0
            MOV_PC_LR
            ;void MMU_SetITLBLockdown(U32 baseVictim) ; 鎖指令快表
            EXPORT MMU_SetITLBLockdown
            MMU_SetITLBLockdown
            ;r0= baseVictim
            mcr p15,0,r0,c10,c0,1
            MOV_PC_LR
            ;============
            ; Process ID 獲得進(jìn)程標(biāo)識符(C13)
            ;============獲得進(jìn)程標(biāo)識符
            ;void MMU_SetProcessId(U32 pid)
            EXPORT MMU_SetProcessId
            MMU_SetProcessId
            ;r0= pid
            mcr p15,0,r0,c13,c0,0
            MOV_PC_LR
            END
            這個東東和CP15密切相關(guān),是一個啟動代碼,等我下次回來再分析一遍



            關(guān)鍵詞: S3C2440源程

            評論


            技術(shù)專區(qū)

            關(guān)閉