vector.s
Upload User: sxwflg
Upload Date: 2017-01-05
Package Size: 5914k
Code Size: 7k
Category:

Embeded Linux

Development Platform:

Others

  1. USERMODE EQU 0x10
  2. FIQMODE EQU 0x11
  3. IRQMODE EQU 0x12
  4. SVCMODE EQU 0x13
  5. ABORTMODE EQU 0x17
  6. UNDEFMODE EQU 0x1B
  7. MODEMASK  EQU 0x1F
  8. I_BIT EQU 0x80
  9. F_BIT EQU 0x40
  10. T_BIT EQU 0x20
  11. NOINT      EQU 0xc0
  12. ;**********************************************************
  13. ;检查是否使用tasm.exe进行编译
  14.  GBLL    THUMBCODE
  15.     [ {CONFIG} = 16
  16. THUMBCODE SETL {TRUE}
  17.     CODE32
  18.     |   
  19. THUMBCODE SETL {FALSE}
  20.     ]
  21.     [ THUMBCODE
  22.     CODE32   ;for start-up code for Thumb mode
  23.     ]
  24.     
  25. MACRO
  26. MOV_PC_LR
  27. [ THUMBCODE
  28.      bx lr
  29. |
  30. mov pc, lr
  31. ]
  32. MEND
  33.       
  34. ;******************************************************
  35. AREA reset, CODE, READONLY
  36. ENTRY
  37. EXPORT __ENTRY
  38. __ENTRY
  39. ResetEntry
  40. b SYS_RST_HANDLER
  41. b UDF_INS_HANDLER
  42. b SWI_SVC_HANDLER
  43. b INS_ABT_HANDLER
  44. b DAT_ABT_HANDLER
  45. b .
  46. b IRQ_SVC_HANDLER
  47. b FIQ_SVC_HANDLER
  48. ;******************************************************
  49. MACRO
  50. $HandlerLabel HANDLER $HandleLabel
  51. $HandlerLabel
  52. sub sp,sp,#4        ;decrement sp(to store jump address)
  53. stmfd sp!,{r0}        ;PUSH the work register to stack(lr does not push because it return to original address)
  54. ldr     r0,=$HandleLabel;load the address of HandleXXX to r0
  55. ldr     r0,[r0]         ;load the contents(service routine start address) of HandleXXX
  56. str     r0,[sp,#4]      ;store the contents(ISR) of HandleXXX to stack
  57. ldmfd   sp!,{r0,pc}     ;POP the work register and pc(jump to ISR)
  58. MEND
  59. ;UDF_INS_HANDLER
  60. ; stmfd sp!, {r0-r3, lr}
  61. ; ldr r0, =UdfInsVector
  62. ; mov lr, pc
  63. ; ldr pc, [r0]
  64. ; ldmfd sp!, {r0-r3, pc}^
  65. ;SWI_SVC_HANDLER
  66. ; stmfd sp!, {r0-r3, lr}
  67. ; ldr r0, =SwiSvcVector
  68. ; mov lr, pc
  69. ; ldr pc, [r0]
  70. ; ldmfd sp!, {r0-r3, pc}^
  71. ;INS_ABT_HANDLER
  72. ; sub lr, lr, #4
  73. ; stmfd sp!, {r0-r3, lr}
  74. ; ldr r0, =InsAbtVector
  75. ; mov lr, pc
  76. ; ldr pc, [r0]
  77. ; ldmfd sp!, {r0-r3, pc}^
  78. ;DAT_ABT_HANDLER
  79. ; sub lr, lr, #4
  80. ; stmfd sp!, {r0-r3, lr}
  81. ; ldr r0, =DatAbtVector
  82. ; mov lr, pc
  83. ; ldr pc, [r0]
  84. ; ldmfd sp!, {r0-r3, pc}^
  85. ;IRQ_SVC_HANDLER
  86. ; sub lr, lr, #4
  87. ; stmfd sp!, {r0-r12, lr}
  88. ; mrs r0, spsr
  89. ; stmfd sp!, {r0}
  90. ; ldr r0, =IrqSvcVector
  91. ; ldr pc, [r0]
  92. ;FIQ_SVC_HANDLER
  93. ; sub lr, lr, #4
  94. ; stmfd sp!, {r0-r12, lr}
  95. ; mrs r0, spsr
  96. ; stmfd sp!, {r0}
  97. ; ldr r0, =FiqSvcVector
  98. ; ldr pc, [r0]
  99. UDF_INS_HANDLER HANDLER UdfInsVector
  100. SWI_SVC_HANDLER HANDLER SwiSvcVector
  101. INS_ABT_HANDLER HANDLER InsAbtVector
  102. DAT_ABT_HANDLER HANDLER DatAbtVector
  103. IRQ_SVC_HANDLER HANDLER IrqSvcVector
  104. FIQ_SVC_HANDLER HANDLER FiqSvcVector
  105. ;*******************************************************
  106. SYS_RST_HANDLER
  107. mrs r0, cpsr ;enter svc mode and disable irq,fiq
  108. bic r0, r0, #MODEMASK
  109. orr r0, r0, #(SVCMODE :OR: I_BIT :OR: F_BIT)
  110. msr cpsr_c, r0
  111. ; IMPORT InitSystem
  112. b InitSystem
  113. InitSystem_exit
  114. ;****************************************************
  115. ;初始化堆栈
  116. ;Do not use DRAM,such as stmfd,ldmfd......
  117. ;SVCstack is initialized before
  118. ;Under toolkit ver 2.50, 'msr cpsr,r1' can be used instead of 'msr cpsr_cxsf,r1'
  119. mrs r0, cpsr
  120. bic r0, r0, #(MODEMASK|NOINT)
  121. orr r1, r0, #UNDEFMODE|NOINT
  122. msr cpsr_cxsf, r1 ;UndefMode
  123. ldr sp, =UndefStack
  124. orr r1, r0, #ABORTMODE|NOINT
  125. msr cpsr_cxsf, r1 ;AbortMode
  126. ldr sp, =AbortStack
  127. orr r1, r0, #IRQMODE|NOINT
  128. msr cpsr_cxsf, r1 ;IRQMode
  129. ldr sp, =IRQStack
  130. orr r1, r0, #FIQMODE|NOINT
  131. msr cpsr_cxsf, r1 ;FIQMode
  132. ldr sp, =FIQStack
  133. ; orr r1, r0, #SVCMODE ;enable irq,fiq
  134. orr r1, r0, #SVCMODE|NOINT ;disable irq, fiq
  135. msr cpsr_cxsf,r1 ;SVCMode
  136. ldr sp, =SVCStack
  137. ;USER mode is not initialized.
  138. ;未初始化用户模式栈,程序使用SVC模式
  139. ;****************************************************
  140. adr r0, ResetEntry
  141. ldr r2, BaseOfROM
  142. cmp r0, r2
  143. ldreq r0, TopOfROM
  144. beq InitRam
  145. ldr r3, TopOfROM
  146. 0
  147. ldmia r0!, {r4-r7}
  148. stmia r2!, {r4-r7}
  149. cmp r2, r3
  150. bcc %B0
  151. sub r2, r2, r3
  152. sub r0, r0, r2
  153. InitRam
  154. ldr r2, BaseOfBSS
  155. ldr r3, BaseOfZero
  156. 0
  157. cmp r2, r3
  158. ldrcc r1, [r0], #4
  159. strcc r1, [r2], #4
  160. bcc %B0
  161. mov r0, #0
  162. ldr r3, EndOfBSS
  163. 1
  164. cmp r2, r3
  165. strcc r0, [r2], #4
  166. bcc %B1
  167. ;****************************************************
  168. ;设置IQR处理程序入口, 在配置好RAM后设置
  169. ; IMPORT IRQ_SERVICE
  170. ldr r0, =IrqSvcVector
  171. ldr r1, =IRQ_SERVICE
  172. str r1, [r0]
  173. ;****************************************************
  174. _main
  175. __main
  176. EXPORT _main
  177. EXPORT __main
  178. ; IMPORT PortInit
  179. ; IMPORT TimerInit
  180. ; IMPORT LedDisp
  181. ; bl PortInit
  182. ; ldr r0, =0x1d20014
  183. ; ldr r1, [r0]
  184. ;0
  185. ; bic r1, r1, #0xe
  186. ; str r1, [r0]
  187. ; mov r2, #0x100000
  188. ;1
  189. ; subs r2, r2, #1
  190. ; bne %B1
  191. ; orr r1, r1, #0xe
  192. ; str r1, [r0]
  193. ; mov r2, #0x100000
  194. ;2
  195. ; subs r2, r2, #1
  196. ; bne %B2
  197. ; b %B0
  198. ; bl TimerInit
  199. ;1
  200. ; bl LedDisp
  201. ; b %B1
  202. ldr lr, GotoMain
  203. MOV_PC_LR
  204. GBLS MainEntry
  205. MainEntry SETS "Main"
  206. IMPORT $MainEntry
  207. GotoMain DCD $MainEntry
  208. EXPORT DisableInt
  209. DisableInt
  210. mrs r0, cpsr
  211. orr r0, r0, #NOINT
  212. msr cpsr_cf, r0
  213. MOV_PC_LR
  214. EXPORT EnableInt
  215. EnableInt
  216. mrs r0, cpsr
  217. bic r0, r0, #NOINT
  218. msr cpsr_cf, r0
  219. MOV_PC_LR
  220. ;save cpsr and disable int, r0 = address to save cpsr
  221. EXPORT EnterCritical
  222. EnterCritical   
  223. mrs r1, cpsr
  224. str r1, [r0]
  225. orr r1, r1, #NOINT
  226. msr cpsr_cxsf, r1
  227. MOV_PC_LR
  228. ;restore cpsr, r0 = address to restore cpsr
  229. EXPORT ExitCritical
  230. ExitCritical
  231. ldr r1, [r0]
  232. msr cpsr_cxsf, r1
  233. MOV_PC_LR
  234. EXPORT outportb
  235. outportb strb r0, [r1]
  236. MOV_PC_LR
  237. EXPORT outportw
  238. outportw strh r0, [r1]
  239. MOV_PC_LR
  240. EXPORT outportl
  241. outportl str r0, [r1]
  242. MOV_PC_LR
  243. EXPORT inportb
  244. inportb ldrb r0, [r0]
  245. MOV_PC_LR
  246. EXPORT inportw
  247. inportw ldrh r0, [r0]
  248. MOV_PC_LR
  249. EXPORT inportl
  250. inportl ldr r0, [r0]
  251. MOV_PC_LR
  252. ;***********************************************
  253. IMPORT |Image$$RO$$Base| ; ROM code start
  254. IMPORT |Image$$RO$$Limit| ; RAM data starts after ROM program
  255. IMPORT |Image$$RW$$Base| ; Pre-initialised variables
  256. IMPORT |Image$$ZI$$Base| ; uninitialised variables
  257. IMPORT |Image$$ZI$$Limit| ; End of variable RAM space
  258. BaseOfROM DCD |Image$$RO$$Base|
  259. TopOfROM DCD |Image$$RO$$Limit|
  260. BaseOfBSS DCD |Image$$RW$$Base|
  261. BaseOfZero DCD |Image$$ZI$$Base|
  262. EndOfBSS DCD |Image$$ZI$$Limit|
  263. ;***********************************************
  264. ; IMPORT UserStack
  265. ; IMPORT SVCStack
  266. ; IMPORT UndefStack
  267. ; IMPORT AbortStack
  268. ; IMPORT IRQStack
  269. ; IMPORT FIQStack
  270. ; IMPORT SysRstVector
  271. ; IMPORT UdfInsVector
  272. ; IMPORT SwiSvcVector
  273. ; IMPORT InsAbtVector
  274. ; IMPORT DatAbtVector
  275. ; IMPORT ReservedVector
  276. ; IMPORT IrqSvcVector
  277. ; IMPORT FiqSvcVector
  278. ;***********************************************
  279. END