新聞中心

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

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

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

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

本文引用地址:http://butianyuan.cn/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
;函數(shù)返回宏定義
AREA |C$$code|, CODE, READONLY

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

;寄存器和存儲管理單元(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設置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
請原諒這里不是原創(chuàng),只因還在努力學習!
在ARM的嵌入式應用中,存儲系統(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])。當數(shù)據(jù)和地址處于分開時,該控制位禁止使能指令cache;其中0是禁止指令cache,1是使能指令cache;如果系統(tǒng)中使能統(tǒng)一的指令cache和數(shù)據(jù)cache或者系統(tǒng)中不含cache,讀取時該位返回0,寫入時忽略該位。當系統(tǒng)中的指令cache不禁止時,讀取該位時返回1,寫入時忽略該位。當系統(tǒng)中的指令cache不禁止時,讀取時該位返回1,寫入時忽略該位。
C1的第2位:C(bit[2])。當數(shù)據(jù)和地址處于分開時,本控制位禁止使能數(shù)據(jù)cache;如果系統(tǒng)中使用統(tǒng)一的指令cache和數(shù)據(jù)cache時,該控制位禁止使能整個cache。其中0是禁止cache,1是使能cache;如果系統(tǒng)中不含cache,讀取時該位返回0,寫入時忽略該位。當系統(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位設置快速總線模式
C2的31位模式異步模式
;====================================
; MMU Cache/TLB/etc on/off functions MMU的緩存,快表等的允許和禁止操作
;====================================
R1_I EQU (1<<12) ;其實匯編也不想想象中那么匯,有事可以看到C的身影
R1_C EQU (1<<2) ;其實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); 當?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); 當?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) ;設置快速總線模式
; 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:地址轉(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)生不可預知效果。
指令具體格式如下:
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) ;預取指令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進入節(jié)能狀態(tài),停止執(zhí)行等待中斷激活。
;當異常中斷IRQ或FIQ發(fā)生后,該MCR指令進入IRQ或FIQ中斷處理程序執(zhí)行。
EXPORT MMU_WaitForInterrupt
MMU_WaitForInterrupt
mcr p15,0,r0,c7,c0,4
MOV_PC_LR
;===============
; TLB functions 快表TLB功能(C8)
; C8控制控制清楚TLB的相關操作。它是一個只寫的寄存器。使用MRC指令讀取該寄存器,將產(chǎn)生不可預知的效果。
;指令具體格式如下:
;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)用標記
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)容鎖定,就是將一些關鍵代碼和數(shù)據(jù)預取到cache后,設置一定的屬性,使發(fā)生cache塊替換時,
;這些關鍵代碼和數(shù)據(jù)所在的塊不會被替換。指令具體格式如下:
;MCR P15,0,,,,
;MCR P15, 0, ,,,
;當系統(tǒng)中包含獨立的數(shù)據(jù)cache和指令cache時,對應于數(shù)據(jù)cache和指令cache分別有一個獨立的cache內(nèi)容鎖定寄存器。
;=1 選擇指令cache的內(nèi)容鎖定寄存器
;=0 選擇數(shù)據(jù)cache的內(nèi)容鎖定寄存器
;當系統(tǒng)中使用統(tǒng)一的數(shù)據(jù)cache和指令cache時,操作數(shù)應為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 獲得進程標識符(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源程

評論


技術專區(qū)

關閉