<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

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

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

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

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

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

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

          ;寄存器和存儲管理單元(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就是構建在這些匯編之上,一看二看三看有種雜交的感覺
          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:地址轉換表基地址
          ;=========================
          ;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 ;調用標記
          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) ; 使無效整個數(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ū)

          關閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();