⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mpu.s

📁 ARM嵌入式系统开发--软件设计与优化随书源代码。开发环境asm+c
💻 S
📖 第 1 页 / 共 2 页
字号:
;  ____________________________________________________________________
; 
;  Copyright (c) 2002, Andrew N. Sloss, Chris Wright and Dominic Symes
;  All rights reserved.
;  ____________________________________________________________________
; 
;  NON-COMMERCIAL USE License
;  
;  Redistribution and use in source and binary forms, with or without 
;  modification, are permitted provided that the following conditions 
;  are met: 
;  
;  1. For NON-COMMERCIAL USE only.
; 
;  2. Redistributions of source code must retain the above copyright 
;     notice, this list of conditions and the following disclaimer. 
; 
;  3. Redistributions in binary form must reproduce the above 
;     copyright notice, this list of conditions and the following 
;     disclaimer in the documentation and/or other materials provided 
;     with the distribution. 
; 
;  4. All advertising materials mentioning features or use of this 
;     software must display the following acknowledgement:
; 
;     This product includes software developed by Andrew N. Sloss,
;     Chris Wright and Dominic Symes. 
; 
;   THIS SOFTWARE IS PROVIDED BY THE CONTRIBUTORS ``AS IS'' AND ANY 
;   EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 
;   IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 
;   PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE CONTRIBUTORS BE 
;   LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, 
;   OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 
;   PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, 
;   OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 
;   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR 
;   TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT 
;   OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY 
;   OF SUCH DAMAGE. 
; 
;  If you have questions about this license or would like a different
;  license please email :
; 
; 	andrew@sloss.net
; 
; 
; ****************************************************************************
; * Simple Little Operating System - mpuSLOS
; ****************************************************************************

; ****************************************************************************
; *
; * Module      : mpu.s
; * Description : provides a set of simple MPU routines
; * Platform    : CM940IAP
; * History     :
; *
; * 4 July 2002 (Independence Day) Andrew N. Sloss 
; * - taken from Chris Wright MPU example
; *
; ****************************************************************************

; ****************************************************************************
; * IMPORT/EXPORT
; ****************************************************************************

   IMPORT MpuPCB_Table

   EXPORT mpuInitFlush
   EXPORT mpuRegionDefine    
   EXPORT mpuRegionStdAccess    
   EXPORT mpuRegionExtAccess    
   EXPORT mpuRegionCB
   EXPORT mpuRegionEnable    
   EXPORT mpuChangeControl    
   EXPORT mpuScheduleRegion2

; ****************************************************************************
; * ROUTINES
; ****************************************************************************

   AREA MPU,CODE,READONLY

mpuInitFlush

   MOV r0, #0x78
   MCR p15, 0x0, r0, c1, c0, 0x0  ;
   MOV r0, #0x0 
   MCR p15, 0x0, r0, c7, c5, 0x0  ; invalidate instruction cache
   MCR p15, 0x0, r0, c7, c6, 0x0  ; invalidate data cache

   MOV pc,lr
   
;-----------------
; Change Control Register Values
; int changeControl(unsigned value, unsigned mask)
;-----------------   

mpuChangeControl
   MVN r2, r1                ; invert mask
   BIC r3, r0, r2            ; clear values that are not masked
   CMP r3, r0
   BNE ErrorControl          ; values outside of mask set 
   MRC p15, 0, r3, c1, c0, 0 ; get control register values
   BIC r3, r3, r1            ; mask off bit that change
   ORR r3, r3, r0            ; set value of bits that change
   MCR p15, 0, r3, c1, c0, 0 ; set control register values
   MOV r0, #0
   MOV pc, lr

;-----------------
; Define Data Region Base and Size
; int mpuRegionDefine(unsigned region, unsigned base, unsigned size)
;-----------------   

mpuRegionDefine

mpuRegionDefineErrorCheck
   CMP r2, #11                ; check if size value too small (<11)
   BLO ErrorSize              ; ERROR: region size to small
   CMPHI r2, #31              ; check if size value too large (>31)
   BHI ErrorSize              ; ERROR: region size too large

   ADD r12, r2, #1            ; adjust multiple of size (off by one)
   MOV r3, r1, lsr r12        ; clear trailing zeros part1
   MOV r3, r3, lsl r12        ; clear trailing zeros part2
   CMP r1, r3                 ; check if Address is aligned on size
   BHI ErrorAddress           ; ERROR: address is not aligned

   ORR r3, r3, r2, lsl #1     ; combine size and base address
   MOV r12, r0                ; clear r0 for return value
   MOV r0 , #0			         ; set return value to zero
   CMP r12, #8                ; check if region is in range
   ADDLO pc, pc, r12, lsl #4  ; branch to base and size routine 
                              ; lsl value (940T=#4 740/946=#3)
   B  ErrorRegion             ; ERROR: Region to large, pad for jump

defineRegion0                 ; defining region disables region
   MCR p15, 0, r3, c6, c0, 0  ; set Dregion base and size
   MCR p15, 0, r3, c6, c0, 1  ; set Iregion base and size, 940T only
   MOV pc, lr                 ; region set return
   NOP                        ; pad for jump, remove in 740T/946ES

defineRegion1                 ; defining region disables region
   MCR p15, 0, r3, c6, c1, 0  ; set Dregion base and size
   MCR p15, 0, r3, c6, c1, 1  ; set Iregion base and size, 940T only
   MOV pc, lr                 ; region set return
   NOP                        ; pad for jump, remove in 740T/946ES

defineRegion2                 ; defining region disables region
   MCR p15, 0, r3, c6, c2, 0  ; set Dregion base and size
   MCR p15, 0, r3, c6, c2, 1  ; set Iregion base and size, 940T only
   MOV pc, lr                 ; region set return
   NOP                        ; pad for jump, remove in 740T/946ES

defineRegion3                 ; defining region disables region
   MCR p15, 0, r3, c6, c3, 0  ; set Dregion base and size
   MCR p15, 0, r3, c6, c3, 1  ; set Iregion base and size, 940T only
   MOV pc, lr                 ; region set return
   NOP                        ; pad for jump, remove in 740T/946ES

defineRegion4                 ; defining region disables region
   MCR p15, 0, r3, c6, c4, 0  ; set Dregion base and size
   MCR p15, 0, r3, c6, c4, 1  ; set Iregion base and size, 940T only
   MOV pc, lr                 ; region set return
   NOP                        ; pad for jump, remove in 740T/946ES

defineRegion5                 ; defining region disables region
   MCR p15, 0, r3, c6, c5, 0  ; set Dregion base and size
   MCR p15, 0, r3, c6, c5, 1  ; set Iregion base and size, 940T only
   MOV pc, lr                 ; region set return
   NOP                        ; pad for jump, remove in 740T/946ES

defineRegion6                 ; defining region disables region
   MCR p15, 0, r3, c6, c6, 0  ; set Dregion base and size
   MCR p15, 0, r3, c6, c6, 1  ; set Iregion base and size, 940T only
   MOV pc, lr                 ; region set return
   NOP                        ; pad for jump, remove in 740T/946ES

defineRegion7                 ; defining region disables region
   MCR p15, 0, r3, c6, c7, 0  ; set Dregion base and size
   MCR p15, 0, r3, c6, c7, 1  ; set Iregion base and size, 940T only
   MOV pc, lr                 ; region set return


;-----------------
; Define Access Permissions 
; int mpuRegionStdAccess(unsigned region, unsigned ap)
;-----------------   

mpuRegionStdAccess
   CMP r0, #0x7               ; check if region is in range
   BHI ErrorRegion            ; ERROR: Region out of Range
   TST r1, #0xCC              ; check extended permission use
   BNE ErrorPermission        ; ERROR: Use of Extended Permissions
   MOV r0, r0, lsl #1         ; double region number ap is 2bits
   MOV r2, #3                 ; set mask 2 bits wide

setStdDAP
   MRC p15, 0, r3, c5, c0, 0  ; get D access permissions
   BIC r3, r3, r2, lsl r0     ; clear D ap bits
   AND r12, r1, #0x3          ; clear all except std D AP bits   
   ORR r3, r3, r12, lsl r0    ; set std D AP bits
   MCR p15, 0, r3, c5, c0, 0  ; set std access permissions

setStdIAP
   MRC p15, 0, r3, c5, c0, 1  ; get I access permissions
   BIC r3, r3, r2, lsl r0     ; clear I ap bits
   MOV r1, r1, lsr #4         ; shift I AP bits in position
   AND r12, r1, #0x3          ; clear all except std I AP bits   
   ORR r3, r3, r12, lsl r0    ; set std D AP bits
   MCR p15, 0, r3, c5, c0, 1  ; set std access permissions

   MOV r0, #0                 ; success
   MOV pc, lr                 ; region set return
;-----------------
; Define Access Permissions 
; int mpuRegionExtAccess(unsigned region, unsigned ap)
;-----------------   

mpuRegionExtAccess
   CMP r0, #0x7               ; check if region is in range
   BHI ErrorRegion            ; ERROR: Region out of Range
   TST r1, #0x88              ; check unpredictable ext permission
   BNE ErrorPermission        ; ERROR: unpredicable use Ext Permissions

   MOV r12, #4
   TEQ r12, r1, lsr #4        ; check inst permission 0x100 unpredicable
   MOV r12, #7
   TEQNE r12, r1, lsr #4      ; check inst permission 0x111 unpredicable
   BEQ ErrorPermission        ; ERROR: unpredicable use Ext Permissions

   AND r12, r1, #0xf
   TEQ r12, #4                ; check data permission 0x100 unpredicable
   TEQNE r12, #7              ; check data permission 0x111 unpredicable
   BEQ ErrorPermission        ; ERROR: unpredicable use Ext Permissions
                              ; 
   MOV r0, r0, lsl #1         ; double region number ap is 2bits
   MOV r2, #3                 ; set mask 2 bits wide

setExtDAP
   MRC p15, 0, r3, c5, c0, 2  ; get D access permissions
   BIC r3, r3, r2, lsl r0     ; clear D ap bits
   AND r12, r1, #0xf          ; clear all except ext D AP bits   
   ORR r3, r3, r12, lsl r0    ; set ext D AP bits
   MCR p15, 0, r3, c5, c0, 2  ; set ext access permissions

setExtIAP
   MRC p15, 0, r3, c5, c0, 3  ; get I access permissions
   BIC r3, r3, r2, lsl r0     ; clear I ap bits
   MOV r1, r1, lsr #4         ; shift I AP bits in position
   ORR r3, r3, r12, lsl r0    ; set ext D AP bits

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -