新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > S3C2440學習筆記五(2440slib.s源程序的分析)

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

        作者: 時間:2016-11-11 來源:網絡 收藏
        以下程序是什么意思: 為啥這個文件是一堆的匯編代碼,因為這里面涉及到了底層驅動,這里既是CPU的核心控制。涉及到了直接操作的寄存器和高速緩存,實際上和51的CPU是一回事,就是51可以干一件事,他就要干幾十件事,沒有強悍的架構和強大的寄存器和緩存團隊,他就沒法強悍!就跑400M吧,他為了效率加了cp15這個比較高速的協處理器,這個cp15的本質是數據處理中心。只有早期的PC機和現行的ARM還有這個東西,現在的PC機跑得非常快了,不需要CP15這類東西幫忙了。

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

        本文引用地址:http://www.104case.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進行編譯。首先用GBLL定義了全局邏輯

        ;變量HUMBCODE,默認值為0。“[]"相當于C語言中的{},

        ;| 相當于else?

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

        ;定義了代碼段,此代碼段是外部的可以被C程序調用的關于?

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

        EXPORT EnterCritical
        ;用內存單元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的數據域?

        ;指令中有時還有出現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設置CPSR的I位(IRQ)和F位(FIQ)
        ;置位CPSR_IR,即禁止IRQ中斷和FIQ中斷
        ;==============
        ;int SET_IF(void);
        ;The return value is current CPSR.
        EXPORT SET_IF
        SET_IF;僅在特權模式下可用此程序。
        ;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;僅在特權模式下可用此程序。
        ;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;僅在特權模式下可用此程序。
        ;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
        請原諒這里不是原創,只因還在努力學習!
        在ARM的嵌入式應用中,存儲系統是通過協處理器CP15完成的。CP15包含16個32位的寄存器,其編號是0-15。對于CP15協處理器的操作使用mcr和mrc兩條協處理器指令,這兩條指令的記法是從后往錢看:mcr是把r(CPU核寄存器)中的數據傳送到c(協處理器寄存器)中,mrc則是把c(協處理器寄存器)中的數據傳送到r(CPU核寄存器)中。對CP15協處理器的所有操作都是通過CPU寄存器和CP15寄存器之間交換數據完成的。
        寄存器C0,C1。C0的基本作用是ID編碼;C1的基本作用是控制位(可讀可寫)。
        C1的第12位:I(bit[12])。當數據和地址處于分開時,該控制位禁止使能指令cache;其中0是禁止指令cache,1是使能指令cache;如果系統中使能統一的指令cache和數據cache或者系統中不含cache,讀取時該位返回0,寫入時忽略該位。當系統中的指令cache不禁止時,讀取該位時返回1,寫入時忽略該位。當系統中的指令cache不禁止時,讀取時該位返回1,寫入時忽略該位。
        C1的第2位:C(bit[2])。當數據和地址處于分開時,本控制位禁止使能數據cache;如果系統中使用統一的指令cache和數據cache時,該控制位禁止使能整個cache。其中0是禁止cache,1是使能cache;如果系統中不含cache,讀取時該位返回0,寫入時忽略該位。當系統中的cache不能禁止時,讀取時該位返回1,寫入時忽略該位。
        C1的第1位:A(bit)。對于可以選擇是否支持內存訪問時地址對齊檢查的那些系統,本位禁止使能地址對齊檢查功能;0是禁止地址對齊檢查功能,1是使能對齊檢查功能;對齊內存訪問時地址對齊檢查功能不可選擇的那些系統,讀取該位時根據系統是否支持地址功能對齊檢查功能返回0或者1,寫入時忽略該位。
        C1的第0位:M(bit[0])。禁止使能MMU或者PU;其中0是禁止地址對齊檢查功能,1是使能地址對齊檢查功能;如果系統中沒有MMU及PU,讀取時該位返回0,寫入時忽略該位。

        C1的30位設置快速總線模式
        C2的31位模式異步模式
        ;====================================
        ; MMU Cache/TLB/etc on/off functions MMU的緩存,快表等的允許和禁止操作
        ;====================================
        R1_I EQU (1<<12) ;其實匯編也不想想象中那么匯,有事可以看到C的身影
        R1_C EQU (1<<2) ;其實C就是構建在這些匯編之上,一看二看三看有種雜交的感覺
        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
        ;使能數據Cache
        ;void MMU_EnableDCache(void); 當地址Cache和數據Cache分開時,使能數據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); 當地址Cache和數據Cache分開時,禁止數據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) ;設置快速總線模式
        ; 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) ; 設置異步模式
        ; 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:地址轉換表基地址
        ;=========================
        ;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控制指令和數據緩存和寫緩沖區
        它是一個只寫的寄存器。使用MRC指令讀取該寄存器,將產生不可預知效果。
        指令具體格式如下:
        MCR P15,0,,,,
        ,的不同的組合決定指令執行的不同的操作。完成操作將產生的數據寫到Rd,然后寫到C7。
        ;=========================
        ;使無效整個統一的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,并把數據(虛擬地址)寫到C7
        EXPORT MMU_InvalidateICacheMVA
        MMU_InvalidateICacheMVA
        ;r0=mva
        mcr p15,0,r0,c7,c5,1
        MOV_PC_LR
        ;void MMU_PrefetchICacheMVA(U32 mva) ;預取指令cache中的某塊mva,并把數據(虛擬地址)寫到C7
        EXPORT MMU_PrefetchICacheMVA
        MMU_PrefetchICacheMVA
        ;r0=mva
        mcr p15,0,r0,c7,c13,1
        MOV_PC_LR
        ;void MMU_InvalidateDCache(void) ; 使無效整個數據cache
        EXPORT MMU_InvalidateDCache
        MMU_InvalidateDCache
        mcr p15,0,r0,c7,c6,0
        MOV_PC_LR
        ;void MMU_InvalidateDCacheMVA(U32 mva) ; 使無效數據cache的某塊mva,并把數據(虛擬地址)寫到C7
        EXPORT MMU_InvalidateDCacheMVA
        MMU_InvalidateDCacheMVA
        ;r0=mva
        mcr p15,0,r0,c7,c6,1
        MOV_PC_LR
        ;void MMU_CleanDCacheMVA(U32 mva) ; 清空數據cache中的某塊mva,并把數據(虛擬地址)寫到C7
        EXPORT MMU_CleanDCacheMVA
        MMU_CleanDCacheMVA
        ;r0=mva
        mcr p15,0,r0,c7,c10,1
        MOV_PC_LR
        ;void MMU_CleanInvalidateDCacheMVA(U32 mva) ; 清空無效數據cache中的某塊mva,并把數據(虛擬地址)寫到C7
        EXPORT MMU_CleanInvalidateDCacheMVA
        MMU_CleanInvalidateDCacheMVA
        ;r0=mva
        mcr p15,0,r0,c7,c14,1
        MOV_PC_LR
        ;void MMU_CleanDCacheIndex(U32 index) ; 清空數據cache中的某塊Index,并把組號 組內序號寫到C7中
        EXPORT MMU_CleanDCacheIndex
        MMU_CleanDCacheIndex
        ;r0=index
        mcr p15,0,r0,c7,c10,2
        MOV_PC_LR
        ;void MMU_CleanInvalidateDCacheIndex(U32 index) ; 清空將無效數據cache中的某塊Index,并把組號 組內序號寫到C7中
        EXPORT MMU_CleanInvalidateDCacheIndex
        MMU_CleanInvalidateDCacheIndex
        ;r0=index
        mcr p15,0,r0,c7,c14,2
        MOV_PC_LR
        ;void MMU_WaitForInterrupt(void) ; 等待中斷激活,使ARM進入節能狀態,停止執行等待中斷激活。
        ;當異常中斷IRQ或FIQ發生后,該MCR指令進入IRQ或FIQ中斷處理程序執行。
        EXPORT MMU_WaitForInterrupt
        MMU_WaitForInterrupt
        mcr p15,0,r0,c7,c0,4
        MOV_PC_LR
        ;===============
        ; TLB functions 快表TLB功能(C8)
        ; C8控制控制清楚TLB的相關操作。它是一個只寫的寄存器。使用MRC指令讀取該寄存器,將產生不可預知的效果。
        ;指令具體格式如下:
        ;MCR P15,0,,,,
        ;,的不同的組合決定指令執行的不同操作。完成操作將產生的數據寫到Rd,然后寫到C8
        ;===============
        ;使無效整個統一的cache;或者使無效整個數據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 ;調用標記
        mcr p15,0,r0,c8,c5,0
        MOV_PC_LR ;調用返回
        ;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) ; 使無效整個數據cache
        EXPORT MMU_InvalidateDTLB
        MMU_InvalidateDTLB
        mcr p15,0,r0,c8,c6,0
        MOV_PC_LR
        ;void MMU_InvalidateDTLBMVA(U32 mva) ; 使無效數據cache的單個地址變換條目mva,并把虛擬地址返回到C8
        EXPORT MMU_InvalidateDTLBMVA
        MMU_InvalidateDTLBMVA
        ;r0=mva
        mcr p15,0,r0,c8,c6,1
        MOV_PC_LR
        ;=================
        ; Cache lock down 緩存內容鎖定(C9)
        ; Cache內容鎖定,就是將一些關鍵代碼和數據預取到cache后,設置一定的屬性,使發生cache塊替換時,
        ;這些關鍵代碼和數據所在的塊不會被替換。指令具體格式如下:
        ;MCR P15,0,,,,
        ;MCR P15, 0, ,,,
        ;當系統中包含獨立的數據cache和指令cache時,對應于數據cache和指令cache分別有一個獨立的cache內容鎖定寄存器。
        ;=1 選擇指令cache的內容鎖定寄存器
        ;=0 選擇數據cache的內容鎖定寄存器
        ;當系統中使用統一的數據cache和指令cache時,操作數應為0
        ;=================鎖數據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 快表內容鎖存(C10) ; 具體操作同cache鎖存
        ;=================鎖數據快表
        ;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 獲得進程標識符(C13)
        ;============獲得進程標識符
        ;void MMU_SetProcessId(U32 pid)
        EXPORT MMU_SetProcessId
        MMU_SetProcessId
        ;r0= pid
        mcr p15,0,r0,c13,c0,0
        MOV_PC_LR
        END
        這個東東和CP15密切相關,是一個啟動代碼,等我下次回來再分析一遍



        關鍵詞: S3C2440源程

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 永仁县| 梅州市| 梅河口市| 青神县| 古浪县| 东至县| 兴宁市| 大洼县| 常宁市| 靖西县| 丹巴县| 房产| 时尚| 玛纳斯县| 洛川县| 繁昌县| 华安县| 新昌县| 故城县| 南部县| 得荣县| 桐城市| 耿马| 社旗县| 宣武区| 琼海市| 长春市| 丹凤县| 白城市| 苍溪县| 登封市| 沙湾县| 肇东市| 敦煌市| 葫芦岛市| 临沂市| 荔波县| 榕江县| 金塔县| 乌拉特中旗| 梁河县|