context_iar.asm 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. #include "macdefs.inc"
  2. name OS_Core
  3. COMMON INTVEC:CODE
  4. ;********************************************************************
  5. ;
  6. ; function:
  7. ; description: Trap 0x10 vector used for context switch
  8. ; Right now, all TRAPs to $1x are trated the same way
  9. ;
  10. org 50h
  11. jr OSCtxSW
  12. ;********************************************************************
  13. ;
  14. ; function:
  15. ; description: Timer 40 compare match interrupt used for system
  16. ; tick interrupt
  17. ;
  18. org 0x220
  19. jr OSTickIntr
  20. org 0x0520
  21. jr uarta1_int_r
  22. RSEG CODE(1)
  23. EXTERN rt_thread_switch_interrupt_flag
  24. EXTERN rt_interrupt_from_thread
  25. EXTERN rt_interrupt_to_thread
  26. EXTERN rt_interrupt_enter
  27. EXTERN rt_interrupt_leave
  28. EXTERN rt_tick_increase
  29. EXTERN uarta1_receive_handler
  30. PUBLIC rt_hw_interrupt_disable
  31. PUBLIC rt_hw_interrupt_enable
  32. PUBLIC rt_hw_context_switch_to
  33. PUBLIC OSCtxSW
  34. PUBLIC OS_Restore_CPU_Context
  35. rt_hw_interrupt_disable:
  36. stsr psw, r1
  37. di
  38. jmp [lp]
  39. rt_hw_interrupt_enable:
  40. ldsr r1, psw
  41. jmp [lp]
  42. OS_Restore_CPU_Context:
  43. mov sp, ep
  44. sld.w 4[ep], r2
  45. sld.w 8[ep], r5
  46. sld.w 12[ep],r6
  47. sld.w 16[ep],r7
  48. sld.w 20[ep],r8
  49. sld.w 24[ep],r9
  50. sld.w 28[ep],r10
  51. sld.w 32[ep],r11
  52. sld.w 36[ep],r12
  53. sld.w 40[ep],r13
  54. sld.w 44[ep],r14
  55. sld.w 48[ep],r15
  56. sld.w 52[ep],r16
  57. ;See what was the latest interruption (trap or interrupt)
  58. stsr ecr, r17 ;Move ecr to r17
  59. mov 0x050,r1
  60. cmp r1, r17 ;If latest break was due to TRAP, set EP
  61. be _SetEP
  62. _ClrEP:
  63. mov 0x20, r17 ;Set only ID
  64. ldsr r17, psw
  65. ;Restore caller address
  66. sld.w 56[ep], r1
  67. ldsr r1, EIPC
  68. ;Restore PSW
  69. sld.w 60[ep], r1
  70. andi 0xffdf,r1,r1
  71. ldsr r1, EIPSW
  72. sld.w 0[ep], r1
  73. dispose (8+(4*14)),{r23,r24,r25,r26,r27,r28,r29,r30,r31}
  74. ;Return from interrupt starts new task!
  75. reti
  76. _SetEP:
  77. mov 0x60, r17 ;Set both EIPC and ID bits
  78. ldsr r17, psw
  79. ;Restore caller address
  80. sld.w 56[ep], r1
  81. ldsr r1, EIPC
  82. ;Restore PSW
  83. sld.w 60[ep], r1
  84. andi 0xffdf,r1,r1
  85. ldsr r1, EIPSW
  86. sld.w 0[ep], r1
  87. dispose (8+(4*14)),{r23,r24,r25,r26,r27,r28,r29,r30,r31}
  88. ;Return from interrupt starts new task!
  89. reti
  90. //rseg CODE:CODE
  91. //public rt_hw_context_switch_to
  92. rt_hw_context_switch_to:
  93. ;Load stack pointer of the task to run
  94. ld.w 0[r1], sp ;load sp from struct
  95. ;Restore all Processor registers from stack and return from interrupt
  96. jr OS_Restore_CPU_Context
  97. OSCtxSW:
  98. SAVE_CPU_CTX ;Save all CPU registers
  99. mov rt_interrupt_from_thread, r21
  100. ld.w 0[r21], r21
  101. st.w sp, 0[r21]
  102. mov rt_interrupt_to_thread, r1
  103. ld.w 0[r1], r1
  104. ld.w 0[r1], sp
  105. ;Restore all Processor registers from stack and return from interrupt
  106. jr OS_Restore_CPU_Context
  107. rt_hw_context_switch_interrupt_do:
  108. mov rt_thread_switch_interrupt_flag, r8
  109. mov 0, r9
  110. st.b r9, 0[r8]
  111. mov rt_interrupt_from_thread, r21
  112. ld.w 0[r21], r21
  113. st.w sp, 0[r21]
  114. mov rt_interrupt_to_thread, r1
  115. ld.w 0[r1], r1
  116. ld.w 0[r1], sp
  117. jr OS_Restore_CPU_Context
  118. OSTickIntr:
  119. SAVE_CPU_CTX ;Save current task's registers
  120. jarl rt_interrupt_enter,lp
  121. jarl rt_tick_increase,lp
  122. jarl rt_interrupt_leave,lp
  123. mov rt_thread_switch_interrupt_flag, r8
  124. ld.w 0[r8],r9
  125. cmp 1, r9
  126. be rt_hw_context_switch_interrupt_do
  127. jr OS_Restore_CPU_Context
  128. uarta1_int_r:
  129. SAVE_CPU_CTX ;Save current task's registers
  130. jarl rt_interrupt_enter,lp
  131. jarl uarta1_receive_handler,lp
  132. jarl rt_interrupt_leave,lp
  133. mov rt_thread_switch_interrupt_flag, r8
  134. ld.w 0[r8],r9
  135. cmp 1, r9
  136. be rt_hw_context_switch_interrupt_do
  137. jr OS_Restore_CPU_Context
  138. END