retarget.c
上传用户:zbk8730
上传日期:2017-08-10
资源大小:12168k
文件大小:3k
源码类别:

uCOS

开发平台:

C/C++

  1. /****************************************************************
  2.  NAME: retarget.c
  3.  DESC: console I/O redirection, heap base, stack base. 
  4.  HISTORY:
  5.  Jan.01.2002:purnnamu: first draft. rewrite 'retarget.c' from ARM.
  6.  Jul.30.2002:purnnamu: first draft for S3C2420X. 
  7.  Nov.29.2003:junon: first draft for S3C2440. 
  8.  ****************************************************************/
  9. #include <stdio.h>
  10. #include "option.h"
  11. #include "2440lib.h"
  12. #if ADS10==TRUE
  13. #include <rt_misc.h>
  14. #endif
  15. #if USE_MAIN
  16. #if SEMIHOSTING
  17.     #ifdef __thumb
  18.     /* Thumb Semihosting SWI */
  19.     #define SemiSWI 0xAB
  20.     #else
  21.     /* ARM Semihosting SWI */
  22.     #define SemiSWI 0x123456
  23.     #endif
  24. /* Exit */
  25. __swi(SemiSWI) void _Exit(unsigned op, unsigned except);
  26. #define Exit() _Exit (0x18,0x20026)
  27. #endif //SEMIHOSTING
  28. #if !SEMIHOSTING
  29. struct __FILE { int handle;   /* Add whatever you need here */};
  30. FILE __stdout;
  31. FILE __stdin;
  32. //NOTE.
  33. // 1. If __FILE is redefined by user, the fgetc(),fputc(),ferror(),defined by user,are used.
  34. // 2. __stdout,__stdin should be redefined .
  35. #endif //!SEMIHOSTING
  36. #if !SEMIHOSTING
  37. // If the semihosting is not used, 
  38. // redefine fputc(),fgetc(),ferror() for printf/scanf through UART
  39. int fputc(int ch, FILE *f)
  40. {
  41.     /* Place your implementation of fputc here */
  42.     /* e.g. write a character to a UART, or to the debugger console with SWI WriteC */
  43.     Uart_SendByte(ch);
  44.     return ch;
  45. }
  46. int ferror(FILE *f)
  47. {   /* Your implementation of ferror */
  48.     return EOF;
  49. }
  50. int fgetc(FILE *f)
  51. {
  52.     char ch;
  53.     ch=Uart_Getch();
  54.     
  55.     Uart_SendByte(ch);
  56.     if(ch=='b')Uart_SendString(" b");
  57.     
  58.     return ch;
  59. }
  60. void _ttywrch(int ch)
  61. {
  62.     Uart_SendByte(ch);
  63. }
  64. #endif //!SEMIHOSTING
  65. void _sys_exit(int return_code)
  66. {
  67. #if !SEMIHOSTING
  68.     while(1);
  69. #else    
  70.     Exit();         /* for debugging */
  71. label:  goto label; /* endless loop */
  72. #endif
  73. }
  74. extern unsigned int Image$$ZI$$Limit;
  75. __value_in_regs struct __initial_stackheap __user_initial_stackheap(
  76.         unsigned R0, unsigned SP, unsigned R2, unsigned SL)
  77. {
  78.     struct __initial_stackheap config;
  79.     
  80.     config.heap_base = (unsigned int)&Image$$ZI$$Limit;
  81.     config.stack_base = SP; //SP has the current mode sp register value.
  82.     return config;
  83. }
  84. #endif //USE_MAIN
  85. /*
  86. To place heap_base directly above the ZI area, use e.g:
  87.     extern unsigned int Image$$ZI$$Limit;
  88.     config.heap_base = (unsigned int)&Image$$ZI$$Limit;
  89. (or &Image$$region_name$$ZI$$Limit for scatterloaded images)
  90. To specify the limits for the heap & stack, use e.g:
  91.     config.heap_limit = SL;
  92.     config.stack_limit = SL;
  93. */