以下程序是什么意思: 为啥这个文件是一堆的汇编代码,由于这儿边触及到了底层驱动,这儿既是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位。
;=====================================================================
; 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_Enable
ICache(void)
mrc p15,0,r0,c1,c0,0
orr r0,r0,#R1_I
mcr p15,0,r0,c1,c0,0
MOV_PC_LR
;void MMU_Disable
ICache(void)制止指令Cache
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_Invalidate
ICache(void) ;使无效整个指令cache
EXPORT MMU_Invalidate
ICache
mcr p15,0,r0,c7,c5,0
MOV_PC_LR
;void MMU_Invalidate
ICacheMVA(U32 mva) ;使无效指令cache的某块mva,并把数据(虚拟地址)写到C7
EXPORT MMU_Invalidate
ICacheMVA
;r0=mva
mcr p15,0,r0,c7,c5,1
MOV_PC_LR
;void MMU_Prefetch
ICacheMVA(U32 mva) ;预取指令cache中的某块mva,并把数据(虚拟地址)写到C7
EXPORT MMU_Prefetch
ICacheMVA
;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_Set
ICacheLockdownBase(U32 base) ; 锁指令cache
EXPORT MMU_Set
ICacheLockdownBase
MMU_Set
ICacheLockdownBase
;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密切相关,是一个发动代码,等我下次回来再剖析一遍