新闻中心

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位。

本文引用地址://m.amcfsurvey.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源程

评论


技术专区

关闭