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

📄 mpu.s

📁 ARM嵌入式系统开发--软件设计与优化随书源代码。开发环境asm+c
💻 S
📖 第 1 页 / 共 2 页
字号:
   MCR p15, 0, r3, c5, c0, 3  @ set ext access permissions

   MOV r0, #0                 @ success
   MOV pc, lr                 @ region set return

@ ;-----------------
@ ; Set Cache and Buffer for Instruction and Data Regions
@ ; mpuRegionCB(unsigned region, unsigned CB)
@ ;-----------------   

mpuRegionCB:
   CMP r0, #0x7               @ check if region is in range
   CMPLE r1, #0x7             @ check if CCB in range
   BHI  OutOfRange            @ jump to the error handler
   MOV r2, #1                 @ set bit mask 1 bit

setBuffer:
   MRC p15, 0, r3, c3, c0, 0  @ get buffer info
   BIC r3, r3, r2, lsl r0     @ clear buffer bit
   BIC r12, r1, #0x6          @ clear I D cache part of CB   
   ORR r3, r3, r12, lsl r0    @ set buffer bit
   MCR p15, 0, r3, c3, c0, 0  @ set buffer bit for region

setDCache:
   MRC p15, 0, r3, c2, c0, 0  @ get D cache info
   BIC r3, r3, r2, lsl r0     @ clear D cache bit
   MOV r1, r1, lsr #1         @ drop buffer bit move D cache in position
   BIC r12, r1, #0x2          @ clear I cache part of CB   
   ORR r3, r3, r1, lsl r0     @ set D cache bit
   MCR p15, 0, r3, c2, c0, 0  @ set D cache for region

setICache:
   MRC p15, 0, r3, c2, c0, 1  @ get I cache info
   BIC r3, r3, r2, lsl r0     @ clear I cache bit
   MOV r1, r1, lsr #1         @ drop D cache bit move I cache in position
   ORR r3, r3, r1, lsl r0     @ set I cache bit
   MCR p15, 0, r3, c2, c0, 1  @ set I cache for region


  MOV r0, #0                 @ success
  MOV pc, lr                 @ return

@ ;-----------------
@ ; Enable Region
@ ; int mpuRegionEnable(unsigned region, unsigned enable)
@ ;-----------------

mpuRegionEnable:
   CMP r0, #7                 @ check if region is in range
   CMPLE r1, #1
   BHI  OutOfRange            @ ERROR handler

   MOV r2, r0                 @ r3 = region
   MOV r0, #0                 @ set function success
   MOV     r12, pc            @ Load address of jump table
   LDR     pc, [r12,r2,LSL#2] @ Jump to the routine
EnableJumpTable:
   .word   enableRegion0
   .word   enableRegion1
   .word   enableRegion2
   .word   enableRegion3
   .word   enableRegion4
   .word   enableRegion5
   .word   enableRegion6
   .word   enableRegion7

enableRegion0:                @ set region 0 enable
   MRC p15, 0, r3, c6, c0, 0  @ get D region 0 base and size
   BIC r3, r3, #1             @ clear D region enable       
   ORR r3, r3, r1             @ set enable or disable D region 
   MCR p15, 0, r3, c6, c0, 0  @ set D region 0 enable

   MRC p15, 0, r3, c6, c0, 1  @ get region 0 base and size
   BIC r3, r3, #1             @ clear D region enable       
   ORR r3, r3, r1             @ set I enable or disable region 
   MCR p15, 0, r3, c6, c0, 1  @ set I region 0 enable
   MOV pc, lr                 @ region set return

enableRegion1:                @ define D region disables region
   MRC p15, 0, r3, c6, c1, 0  @ get D region 1 base and size
   BIC r3, r3, #1             @ clear D region enable       
   ORR r3, r3, r1             @ set enable or disable D region 
   MCR p15, 0, r3, c6, c1, 0  @ set D region 1 enable

   MRC p15, 0, r3, c6, c1, 1  @ get I region 1 base and size
   BIC r3, r3, #1             @ clear D region enable       
   ORR r3, r3, r1             @ set enable or disable I region 
   MCR p15, 0, r3, c6, c1, 1  @ set I region 1 enable
   MOV pc, lr                 @ region set return

enableRegion2:                @ define region disables region
   MRC p15, 0, r3, c6, c2, 0  @ get D region 2 base and size
   BIC r3, r3, #1             @ clear D region enable       
   ORR r3, r3, r1             @ set enable or disable D region 
   MCR p15, 0, r3, c6, c2, 0  @ set D region 2 enable

   MRC p15, 0, r3, c6, c2, 1  @ get I region 2 base and size
   BIC r3, r3, #1             @ clear D region enable       
   ORR r3, r3, r1             @ set enable or disable I region 
   MCR p15, 0, r3, c6, c2, 1  @ set I region 2 enable
   MOV pc, lr                 @ region set return

enableRegion3:                @ define region disables region
   MRC p15, 0, r3, c6, c3, 0  @ get D region 3 base and size
   BIC r3, r3, #1             @ clear D region enable       
   ORR r3, r3, r1             @ set enable or disable D region 
   MCR p15, 0, r3, c6, c3, 0  @ set D region 3 enable

   MRC p15, 0, r3, c6, c3, 1  @ get region 3 base and size
   BIC r3, r3, #1             @ clear D region enable       
   ORR r3, r3, r1             @ set enable or disable I region 
   MCR p15, 0, r3, c6, c3, 1  @ set I region 3 enable
   MOV pc, lr                 @ region set return

enableRegion4:                @ define region disables region
   MRC p15, 0, r3, c6, c4, 0  @ get D region 4 base and size
   BIC r3, r3, #1             @ clear D region enable       
   ORR r3, r3, r1             @ set enable or disable D region 
   MCR p15, 0, r3, c6, c4, 0  @ set D  region 4 enable

   MRC p15, 0, r3, c6, c4, 1  @ get I region 4 base and size
   BIC r3, r3, #1             @ clear D region enable       
   ORR r3, r3, r1             @ set enable or disable I region 
   MCR p15, 0, r3, c6, c4, 1  @ set I region 4 enable
   MOV pc, lr                 @ region set return

enableRegion5:                @ define region disables region
   MRC p15, 0, r3, c6, c5, 0  @ get D region 5 base and size
   BIC r3, r3, #1             @ clear D region enable       
   ORR r3, r3, r1             @ set enable or disable D region 
   MCR p15, 0, r3, c6, c5, 0  @ set region 5 enable

   MRC p15, 0, r3, c6, c5, 1  @ get I region 5 base and size
   BIC r3, r3, #1             @ clear D region enable       
   ORR r3, r3, r1             @ set enable or disable I region 
   MCR p15, 0, r3, c6, c5, 1  @ set I region 5 enable
   MOV pc, lr                 @ region set return

enableRegion6:                @ define region disables region
   MRC p15, 0, r3, c6, c6, 0  @ get D region 6 base and size
   BIC r3, r3, #1             @ clear D region enable       
   ORR r3, r3, r1             @ set enable or disable D region 
   MCR p15, 0, r3, c6, c6, 0  @ set D region 6 enable

   MRC p15, 0, r3, c6, c6, 1  @ get I region 6 base and size
   BIC r3, r3, #1             @ clear I region enable       
   ORR r3, r3, r1             @ set enable or disable I region 
   MCR p15, 0, r3, c6, c6, 1  @ set I region 6 enable
   MOV pc, lr                 @ region set return

enableRegion7:                @ define region disables region
   MRC p15, 0, r3, c6, c7, 0  @ get D region 7 base and size
   BIC r3, r3, #1             @ clear D region enable       
   ORR r3, r3, r1             @ set enable or disable D region 
   MCR p15, 0, r3, c6, c7, 0  @ set D region 7 enable

   MRC p15, 0, r3, c6, c7, 1  @ get I region 7 base and size
   BIC r3, r3, #1             @ clear I region enable       
   ORR r3, r3, r1             @ set enable or disable I region 
   MCR p15, 0, r3, c6, c7, 1  @ set I region 7 enable
   MOV pc, lr                 @ region set return

OutOfRange:
   B OutOfRange               @ loop at error for debugging

ErrorControl:
   B ErrorControl
ErrorPermission:              @ Error Permission =4
   B ErrorPermission          @ debug test
   ADD r0, r0, #1
ErrorSize:                    @ Error  Size = 3
   ADD r0, r0, #1
ErrorAddress:                 @ Error  Address unaligned = 2
   ADD r0, r0, #1
ErrorRegion:                  @ Error  Region not valid = 1
   ADD r0, r0, #1
   MOV pc, lr

@ /* -------------------------------------------------------
@  *
@  * Change Region 2 (called from the context switch)
@  * 
@  * fn: mpuRegionDefine (region, PCB[0], PCB[1]);
@  * fn: mpuRegionStdAccess (region, PCB[2]);
@  * fn: mpuRegionCB (region, PCB[3]);
@  * fn: mpuRegionEnable (region, PCB[4]);
@  * 
@  * -------------------------------------------------------
@  */

mpuScheduleRegion2:

@ /* -------------------------------------------------------
@  *
@  * Change Region 2 (called from the context switch) to a 
@  * new task...
@  * 
@  * Register r0 points to the new identifier...
@  *
@  * fn: mpuRegionDefine (region2, PCB[0], PCB[1]);
@  * fn: mpuRegionStdAccess (region2, PCB[2]);
@  * fn: mpuRegionCB (region2, PCB[3]);
@  * fn: mpuRegionEnable (region2, PCB[4]);
@  * 
@  * -------------------------------------------------------
@  */

     STMFD    sp!,{r0-r4,r12,lr}   @ save context
     LDR      r1,=MpuPCB_Table
     LDR      r4,[r1,r0,LSL#2]     @ r4= new PCB address
  
@ --------------------------------------------------------
@  define the new region ... 
@ --------------------------------------------------------

     MOV     r0,#2                 @ parameter 1 region2
     LDR     r1,[r4]               @ parameter 2 RegionTable[0]
     LDR     r2,[r4,#4]            @ parameter 3 RegionTable[1]
     BL      mpuRegionDefine  	 

@ --------------------------------------------------------
@ define standard access permissions ...
@ --------------------------------------------------------

     MOV     r0,#2                 @ parameter 1 region2
     LDR     r1,[r4,#8]            @ parameter 2 RegionTable[2]
     BL      mpuRegionStdAccess       

@ --------------------------------------------------------
@ cache and write through ...
@ --------------------------------------------------------

     MOV     r0,#2                 @ parameter 1 region2
     LDR     r1,[r4,#12]           @ parameter 2 RegionTable[3]
     BL      mpuRegionCB          

@ --------------------------------------------------------
@ enable new region ...
@ --------------------------------------------------------

     MOV     r0,#2                 @ parameter 1 region2
     LDR     r1,[r4,#16]           @ parameter 2 RegionTable[4]
     BL      mpuRegionEnable          

@ --------------------------------------------------------
@ restore context and return to scheduler ...
@ --------------------------------------------------------  

     LDMFD   sp!,{r0-r4,r12,pc}
     .end

⌨️ 快捷键说明

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