mcf5xxx.c
上传用户:dongxin
上传日期:2022-06-22
资源大小:370k
文件大小:7k
源码类别:

uCOS

开发平台:

Others

  1. /*
  2.  * File: mcf5xxx.c
  3.  * Purpose: Generic high-level routines for ColdFire processors
  4.  *
  5.  * Notes:
  6.  */
  7. #include "support_common.h"
  8. #include <stdio.h>
  9. #ifdef __cplusplus
  10. extern "C" {
  11. #endif
  12. int __call_static_initializers(void);
  13. #ifdef __cplusplus
  14. }
  15. #endif
  16. /********************************************************************
  17.  * MCF5xxx ASM utility functions
  18.  */
  19. asm void mcf5xxx_wr_vbr(unsigned long) { /* Set VBR */
  20. move.l 4(SP),D0
  21.     movec d0,VBR 
  22. nop
  23. rts
  24. }
  25. /********************************************************************
  26.  * MCF5xxx startup copy functions:
  27.  *
  28.  * Set VBR and performs data initialization.
  29.  * The following symbols should be defined in the lcf:
  30.  * __DATA_ROM
  31.  * __DATA_RAM
  32.  * __DATA_END
  33.  * __BSS_START
  34.  * __BSS_END
  35.  * __VECTOR_RAM
  36.  *
  37.  * VECTOR_TABLE must be defined to the start of the VECTOR_TABLE in the code
  38.  * In case VECTOR_TABLE address is different from __VECTOR_RAM,
  39.  * the vector table is copied from VECTOR_TABLE to __VECTOR_RAM.
  40.  * In any case VBR is set to __VECTOR_RAM.
  41.  */ 
  42. void mcf5xxx_startup(void)
  43. {
  44. /*
  45.  * Memory map definitions from linker command files used by mcf5xxx_startup
  46.  */
  47. extern __declspec(system) uint8 __DATA_ROM[];
  48. extern __declspec(system) uint8 __DATA_RAM[];
  49. extern __declspec(system) uint8 __DATA_END[];
  50. extern __declspec(system) uint8 __BSS_START[];
  51. extern __declspec(system) uint8 __BSS_END[];
  52. extern __declspec(system) uint32 VECTOR_TABLE[];
  53. extern __declspec(system) uint32 __VECTOR_RAM[];
  54. register uint32 n;
  55. register uint8 *dp, *sp;
  56. /* 
  57.      * Copy the vector table to RAM 
  58.      */
  59. if (__VECTOR_RAM != VECTOR_TABLE)
  60. {
  61. for (n = 0; n < 256; n++)
  62. __VECTOR_RAM[n] = VECTOR_TABLE[n];
  63. }
  64. mcf5xxx_wr_vbr((uint32)__VECTOR_RAM);
  65. /* 
  66.  * Move initialized data from ROM to RAM. 
  67.  */
  68. if (__DATA_ROM != __DATA_RAM)
  69. {
  70. dp = (uint8 *)__DATA_RAM;
  71. sp = (uint8 *)__DATA_ROM;
  72. n = __DATA_END - __DATA_RAM;
  73. while (n--)
  74. *dp++ = *sp++;
  75. }
  76.  
  77. /* 
  78.  * Zero uninitialized data 
  79.  */
  80. if (__BSS_START != __BSS_END)
  81. {
  82. sp = (uint8 *)__BSS_START;
  83. n = __BSS_END - __BSS_START;
  84. while (n--)
  85. *sp++ = 0;
  86. }
  87.     /*
  88.  * Initialize static C++ objects
  89.  */
  90. __call_static_initializers();
  91. }
  92. /***********************************************************************
  93.  *
  94.  * This is the exception handler for all defined exceptions.  Most
  95.  * exceptions do nothing, but some of the more important ones are
  96.  * handled to some extent.
  97.  *
  98.  * Called by asm_exception_handler 
  99.  *
  100.  * The ColdFire family of processors has a simplified exception stack
  101.  * frame that looks like the following:
  102.  *
  103.  *              3322222222221111 111111
  104.  *              1098765432109876 5432109876543210
  105.  *           8 +----------------+----------------+
  106.  *             |         Program Counter         |
  107.  *           4 +----------------+----------------+
  108.  *             |FS/Fmt/Vector/FS|      SR        |
  109.  *   SP -->  0 +----------------+----------------+
  110.  *
  111.  * The stack self-aligns to a 4-byte boundary at an exception, with
  112.  * the FS/Fmt/Vector/FS field indicating the size of the adjustment
  113.  * (SP += 0,1,2,3 bytes).
  114.  */
  115. #define MCF5XXX_RD_SF_FORMAT(PTR)
  116. ((*((uint16 *)(PTR)) >> 12) & 0x00FF)
  117. #define MCF5XXX_RD_SF_VECTOR(PTR)
  118. ((*((uint16 *)(PTR)) >>  2) & 0x00FF)
  119. #define MCF5XXX_RD_SF_FS(PTR)
  120. ( ((*((uint16 *)(PTR)) & 0x0C00) >> 8) | (*((uint16 *)(PTR)) & 0x0003) )
  121. #define MCF5XXX_SF_SR(PTR) *((uint16 *)(PTR)+1)
  122. #define MCF5XXX_SF_PC(PTR) *((uint32 *)(PTR)+1)
  123. #define MCF5XXX_EXCEPTFMT  "%s -- PC = %#08Xn"
  124. void mcf5xxx_exception_handler(void *framep) 
  125. {
  126. switch (MCF5XXX_RD_SF_FORMAT(framep))
  127. {
  128. case 4:
  129. case 5:
  130. case 6:
  131. case 7:
  132. break;
  133. default:
  134. printf(MCF5XXX_EXCEPTFMT,"Illegal stack type", MCF5XXX_SF_PC(framep));
  135. break;
  136. }
  137. switch (MCF5XXX_RD_SF_VECTOR(framep))
  138. {
  139. case 2:
  140. printf(MCF5XXX_EXCEPTFMT, "Access Error", MCF5XXX_SF_PC(framep));
  141. switch (MCF5XXX_RD_SF_FS(framep))
  142. {
  143. case 4:
  144. printf("Error on instruction fetchn");
  145. break;
  146. case 8:
  147. printf("Error on operand writen");
  148. break;
  149. case 9:
  150. printf("Attempted write to write-protected spacen");
  151. break;
  152. case 12:
  153. printf("Error on operand readn");
  154. break;
  155. default:
  156. printf("Reserved Fault Status Encodingn");
  157. break;
  158. }
  159. break;
  160. case 3:
  161. printf(MCF5XXX_EXCEPTFMT, "Address Error", MCF5XXX_SF_PC(framep));
  162. switch (MCF5XXX_RD_SF_FS(framep))
  163. {
  164. case 4:
  165. printf("Error on instruction fetchn");
  166. break;
  167. case 8:
  168. printf("Error on operand writen");
  169. break;
  170. case 9:
  171. printf("Attempted write to write-protected spacen");
  172. break;
  173. case 12:
  174. printf("Error on operand readn");
  175. break;
  176. default:
  177. printf("Reserved Fault Status Encodingn");
  178. break;
  179. }
  180. break;
  181. case 4:
  182. printf(MCF5XXX_EXCEPTFMT, "Illegal instruction", MCF5XXX_SF_PC(framep));
  183. break;
  184. case 8:
  185. printf(MCF5XXX_EXCEPTFMT, "Privilege violation", MCF5XXX_SF_PC(framep));
  186. break;
  187. case 9:
  188. printf(MCF5XXX_EXCEPTFMT, "Trace Exception", MCF5XXX_SF_PC(framep));
  189. break;
  190. case 10:
  191. printf(MCF5XXX_EXCEPTFMT, "Unimplemented A-Line Instruction", 
  192. MCF5XXX_SF_PC(framep));
  193. break;
  194. case 11:
  195. printf(MCF5XXX_EXCEPTFMT, "Unimplemented F-Line Instruction", 
  196. MCF5XXX_SF_PC(framep));
  197. break;
  198. case 12:
  199. printf(MCF5XXX_EXCEPTFMT, "Debug Interrupt", MCF5XXX_SF_PC(framep));
  200. break;
  201. case 14:
  202. printf(MCF5XXX_EXCEPTFMT, "Format Error", MCF5XXX_SF_PC(framep));
  203. break;
  204. case 15:
  205. printf(MCF5XXX_EXCEPTFMT, "Unitialized Interrupt", MCF5XXX_SF_PC(framep));
  206. break;
  207. case 24:
  208. printf(MCF5XXX_EXCEPTFMT, "Spurious Interrupt", MCF5XXX_SF_PC(framep));
  209. break;
  210. case 25:
  211. case 26:
  212. case 27:
  213. case 28:
  214. case 29:
  215. case 30:
  216. case 31:
  217. printf("Autovector interrupt level %dn",
  218. MCF5XXX_RD_SF_VECTOR(framep) - 24);
  219. break;
  220. case 32:
  221. case 33:
  222. case 34:
  223. case 35:
  224. case 36:
  225. case 37:
  226. case 38:
  227. case 39:
  228. case 40:
  229. case 41:
  230. case 42:
  231. case 43:
  232. case 44:
  233. case 45:
  234. case 46:
  235. case 47:
  236. printf("TRAP #%dn", MCF5XXX_RD_SF_VECTOR(framep) - 32);
  237. break;
  238. case 5:
  239. case 6:
  240. case 7:
  241. case 13:
  242. case 16:
  243. case 17:
  244. case 18:
  245. case 19:
  246. case 20:
  247. case 21:
  248. case 22:
  249. case 23:
  250. case 48:
  251. case 49:
  252. case 50:
  253. case 51:
  254. case 52:
  255. case 53:
  256. case 54:
  257. case 55:
  258. case 56:
  259. case 57:
  260. case 58:
  261. case 59:
  262. case 60:
  263. case 61:
  264. case 62:
  265. case 63:
  266. printf("Reserved: #%dn", MCF5XXX_RD_SF_VECTOR(framep));
  267. break;
  268. default:
  269.             derivative_handle_interrupt(MCF5XXX_RD_SF_VECTOR(framep));
  270. break;
  271. }
  272. }