Du kan inte välja fler än 25 ämnen Ämnen måste starta med en bokstav eller siffra, kan innehålla bindestreck ('-') och vara max 35 tecken långa.

usemihosting.h 1.8KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. #ifndef __USEMIHOSTING_H__
  2. #define __USEMIHOSTING_H__
  3. #include <string.h>
  4. typedef enum {
  5. SYS_CLOSE = 0x02,
  6. SYS_CLOCK = 0x10,
  7. SYS_ELAPSED = 0x30,
  8. SYS_ERRNO = 0x13,
  9. SYS_FLEN = 0x0C,
  10. SYS_GET_CMDLINE = 0x15,
  11. SYS_HEAPINFO = 0x16,
  12. SYS_ISERROR = 0x08,
  13. SYS_ISTTY = 0x09,
  14. SYS_OPEN = 0x01,
  15. SYS_READ = 0x06,
  16. SYS_READC = 0x07,
  17. SYS_REMOVE = 0x0E,
  18. SYS_RENAME = 0x0F,
  19. SYS_SEEK = 0x0A,
  20. SYS_SYSTEM = 0x12,
  21. SYS_TICKFREQ = 0x31,
  22. SYS_TIME = 0x11,
  23. SYS_TMPNAM = 0x0D,
  24. SYS_WRITE = 0x05,
  25. SYS_WRITEC = 0x03,
  26. SYS_WRITE0 = 0x04,
  27. } SemihostFunction_t;
  28. // mode 0 1 2 3 4 5 6 7 8 9 10 11
  29. // ISO C fopen modea r rb r+ r+b w wb w+ w+b a ab a+ a+b
  30. typedef enum {
  31. SYS_OPEN_RO = 0,
  32. SYS_OPEN_ROB = 1,
  33. SYS_OPEN_RW = 2,
  34. SYS_OPEN_RWB = 3,
  35. SYS_OPEN_WO = 4,
  36. SYS_OPEN_WOB = 5,
  37. SYS_OPEN_WA = 6,
  38. SYS_OPEN_WAB = 7,
  39. SYS_OPEN_AC = 8,
  40. SYS_OPEN_AB = 9,
  41. SYS_OPEN_AR = 10,
  42. SYS_OPEN_ARB = 11,
  43. } SemihostOpenMode_t;
  44. __attribute__((naked))
  45. static unsigned int call_semihosting(unsigned int func, void *params)
  46. {
  47. (void) func;
  48. (void) params;
  49. __asm__ volatile("bkpt #0xAB\nbx lr");
  50. }
  51. static inline void write(int fd, const void *p, size_t n)
  52. {
  53. void *params[] = {
  54. (void*) fd,
  55. (void*) p,
  56. (void*) n,
  57. };
  58. call_semihosting(SYS_WRITE, params);
  59. }
  60. static inline int open(const char *path, int mode)
  61. {
  62. void *params[] = {
  63. (void*) path,
  64. (void*) mode,
  65. (void*) strlen(path)
  66. };
  67. return call_semihosting(SYS_OPEN, params);
  68. }
  69. static inline void close(int fd)
  70. {
  71. void *params[] = { (void*) fd };
  72. call_semihosting(SYS_CLOSE, params);
  73. }
  74. static inline void writestr(const char *s)
  75. {
  76. void *params[] = { (void*) s };
  77. call_semihosting(SYS_WRITE0, params);
  78. }
  79. #endif /* __USEMIHOSTING_H__ */