RTOS.H
上传用户:sunrenlu
上传日期:2022-06-13
资源大小:1419k
文件大小:11k
源码类别:

操作系统开发

开发平台:

DOS

  1. #ifndef RTOS_H
  2. #define RTOS_H
  3. #define ERTOS_VER 0x20010920
  4. /*
  5.  * eRTOS - embedded development system
  6.  *
  7.  * Copyright (c) 1988, 1999 Erick Engelke
  8.  * All Rights Reserved
  9.  */
  10. /**************************************************************************/
  11. /* INCLUDES                                                               */
  12. /**************************************************************************/
  13. #include <time.h>
  14. #include <dos.h>
  15. #if defined(__TURBOC__) || defined(__BORLANDC__)
  16.   #include <cpujmp.h>
  17. #elif defined(__DJGPP__)
  18.   #include <setjmp.h>
  19.   #include <dpmi.h>
  20. #endif
  21. /**************************************************************************/
  22. /* FLAGS                                                                  */
  23. /**************************************************************************/
  24. #define USE_WINDOW
  25. #ifdef USE_WINDOW
  26. #include <conio.h>
  27. #endif
  28. /**************************************************************************/
  29. /* DEFINES                                                                */
  30. /**************************************************************************/
  31. #if defined(__DJGPP__)
  32.     /* DJGPP does not understand type interrupt */
  33. #define interrupt
  34. #endif
  35. #ifndef __WATT_TCP_H  /* Watt-32 */
  36. typedef unsigned char BYTE;
  37. typedef unsigned short WORD;
  38. typedef unsigned long  DWORD;
  39. #endif
  40. #define TSTAT_DEAD      0       /* thread does not exist */
  41. #define TSTAT_RUNNING   1       /* current thread */
  42. #define TSTAT_WILL_RUN  2       /* on the run queue */
  43. #define TSTAT_WAITING   3       /* waiting, not on run queue */
  44. #define TSTAT_CRITICAL  4       /* waiting on critical section */
  45. #define THS_THREAD  0x0001  /* is a thread */
  46. #define THS_SLEEP   0x0002  /* see th_waketime */
  47. #define THS_SYNC    0x0004  /* see th_syncptr */
  48. #define THS_MESG    0x0008  /* waiting for a message */
  49. /* thread sorting for kaddthread */
  50. #define TS_PRIORITY 0x0001  /* order by priority */
  51. #define TS_SOON     0x0002  /* order by next timer */
  52. #define TS_NOSORT   0x0000
  53. #define TH_SIG      0x7f53
  54. #define MEM_STARTSIG 0x532f29ec
  55. #define MEM_ENDSIG   0x2958dacb
  56. /**************************************************************************/
  57. /* STRUCTURES                                                             */
  58. /**************************************************************************/
  59. /*--------------------------------------------------------------------*/
  60. /* messaging                                                          */
  61. /*--------------------------------------------------------------------*/
  62. typedef struct _msg_x {
  63.     struct _msg_x *m_next;
  64.     int     m_value;
  65.     DWORD   m_data;
  66. } msg_x;
  67. /*--------------------------------------------------------------------*/
  68. /* allocs                                                             */
  69. /*--------------------------------------------------------------------*/
  70. typedef struct _mem_x {
  71.     DWORD   mem_startsig;
  72.     WORD    mem_size;
  73.     WORD    mem_mbz;
  74.     void   *mem_thread;     /* create thread */
  75.     BYTE    mem_data[1];
  76. } mem_x;
  77. /*--------------------------------------------------------------------*/
  78. /* threads                                                            */
  79. /*--------------------------------------------------------------------*/
  80. typedef struct _thread_x {
  81.     WORD    th_sig;
  82.     struct _thread_x *th_prev;
  83.     struct _thread_x *th_next;
  84.     struct _thread_x **th_head;
  85.     struct _thread_x *th_parent;    /* creator thread */
  86.     WORD     th_inkernel;
  87.     char    *th_name;
  88.     WORD     th_status;
  89.     BYTE     th_priority;    /* lower is better 0-7f 80 means blocked */
  90.     BYTE     th_main;        /* 1 for main */
  91.     DWORD    th_waketime;    /* 0, or some real time */
  92.     WORD     th_waketime2;   /* second half of 48 bit timer */
  93.     BYTE    *th_syncptr;     /* synchronization byte */
  94. #if defined(__TURBOC__) || defined(__BORLANDC__)
  95.     struct __cpu_jmp_buf  th_ptr;
  96. #elif defined(__DJGPP__)
  97.     struct __jmp_buf  th_ptr;
  98. #endif
  99.     DWORD    th_ptrsig;
  100.     BYTE    *th_stack;
  101. #if defined(__TURBOC__)||defined(__BORLANDC__)
  102.     WORD     th_stacklen;
  103. #elif defined(__DJGPP__)
  104.     DWORD    th_stacklen;
  105. #endif
  106.     void   (*th_fn)(DWORD);        /* function to call on first execution */
  107.     DWORD    th_fnarg;
  108.     WORD     th_messagewait;    /* particular message for which we are waiting */
  109.     msg_x   *th_messagelist;
  110.     msg_x   *th_messagetail;    /* points to last added message */
  111.     struct _crit_x  *th_crit;
  112.     struct _bq_str  *th_bq;
  113.     /* kwindow attributes */
  114.     int      th_left, th_right, th_top, th_bottom, th_x, th_y;
  115.     struct _crit_x  *th_critical;       /* crticial section */
  116.     /* messaging on exit if th_value != 0 */
  117.     struct _thread_x *th_end_thread;
  118.     int     th_end_value;
  119.     DWORD   th_end_data;
  120. } thread_x;
  121. /*--------------------------------------------------------------------*/
  122. /* critical sections                                                  */
  123. /*--------------------------------------------------------------------*/
  124. typedef struct _crit_x {
  125.     thread_x *cs_blocked;
  126.     thread_x *cs_active;
  127.     WORD cs_depth;
  128. } crit_x;
  129. /*--------------------------------------------------------------------*/
  130. /* byte queues                                                        */
  131. /*--------------------------------------------------------------------*/
  132. typedef struct _bq_str {
  133.     WORD    bq_size;
  134.     WORD    bq_head;    /* new bytes go here */
  135.     WORD    bq_tail;    /* next to read is here */
  136.     BYTE   *bq_queue;
  137.     thread_x *bq_sendwait;   /* thread waiting to send a byte */
  138.     thread_x *bq_recvwait;   /* thread waiting to receive a byte */
  139.     thread_x *bq_msg_waiting;   /* tell if data waiting */
  140.     thread_x *bq_msg_avail;     /* tell if room available */
  141. } bq_str;
  142. /*--------------------------------------------------------------------*/
  143. /**************************************************************************/
  144. /* MESSAGES                                                               */
  145. /**************************************************************************/
  146. #define EMSG_BQ_WAITING  0x0001  /* byte waiting in byte queue */
  147. #define EMSG_BQ_AVAIL    0x0002  /* byte space available for writing */
  148. #define EMSG_THREAD_DEAD 0x0003
  149. #define EMSG_TIMER       0x0004  /* wake up */
  150. #define EMSG_RESERVED    0x01ff  /* last of the reserved messages */
  151. #define EMSG_USER        0x0200  /* start of user defined messages */
  152. /**************************************************************************/
  153. /* VARIABLES                                                              */
  154. /**************************************************************************/
  155. extern volatile int kinisr;
  156. extern int kcheckstacksig;
  157. extern int _fastdos;
  158. extern thread_x *krun;  /* running list */
  159. extern thread_x *kwait; /* waiting list */
  160. extern thread_x *kdye; /* dying list */
  161. extern thread_x *kmainthread; /* main thread */
  162. extern int kusewindows;
  163. extern DWORD ktime;    /* system timer */
  164. extern WORD ktime2;
  165. extern DWORD kupticks;  /* clock ticks we've been up */
  166. extern thread_x *kcurthread;
  167. extern WORD kpreemptive;
  168. extern volatile WORD kblocked;
  169. extern int kdebug;
  170. #if !defined(__DJGPP__)
  171. #define k_temp_block()   _asm { pushf ; cli }
  172. #define k_temp_unblock() _asm { popf }
  173. #endif
  174. extern void (*k_user_int8)(void);
  175. extern int kctrlbreak;      /* set to zero if we want to disable ctrl break */
  176. /**************************************************************************/
  177. /* CODE                                                                   */
  178. /**************************************************************************/
  179. void dos_enter( void );
  180. void dos_exit( void );
  181. void kblock(void);
  182. void kunblock(void);
  183. void rt_cpu_block( WORD *p );
  184. void rt_cpu_unblock( WORD *p );
  185. void rt_timerfreq( WORD persec );
  186. void rt_restoretimer( void );
  187. // mimick settime()
  188. void rt_settime( struct time *timep);
  189. // mimick stime
  190. void rt_stime( time_t *t );
  191. int rt_thread_status( thread_x *t );
  192.     /* returns TSTAT_DEAD, TSTAT_RUNNING (curthread), TSTAT_WILL_RUN, TSTAT_WAITING */
  193. DWORD kcorefree( void );
  194. void *kcalloc( WORD n, WORD size );
  195. char *kstrdup( const char *s );
  196. void kfree( void *p );
  197. void *krealloc( void *p, WORD size );
  198. void kmessage_on_exit( void *thread, int value, DWORD data );
  199. int ksendmessage( void *thread , int value, DWORD data );
  200. /* non-blocking version */
  201. int kgetmessage( int *value, DWORD *data );
  202. int kreadmessage( int *value, DWORD *data );
  203. void kwritemessage( void *thread , int value, DWORD data );
  204. void kreadspecialmessage( int value );
  205. DWORD knumthreads( void );
  206. /* add this to new list */
  207. void kaddthread( thread_x **head, thread_x *t,  int howsort );
  208. void ksuspendhow( thread_x *t, thread_x **newlist );
  209. void ksuspend( thread_x *t );
  210. void kresume( thread_x *t);
  211. void kdestroythread( thread_x *t );
  212. void kfinaldeath( thread_x *t );
  213. char *kthreadname( void );
  214. /*
  215.  * sync_test - attempt to set a byte to 1
  216.  */
  217. BYTE sync_test( void *p );
  218. void rt_nextthread(void);
  219. void rt_halt( char *msg );  /* message is optional */
  220. void xrt_yield( char *file, int line );
  221. #define rt_yield() xrt_yield( __FILE__, __LINE__ )
  222. void interrupt kintswitch();
  223. void rt_exit(void);
  224. void rt_init(DWORD msgcount );
  225. void rt_setpriority( thread_x *t, BYTE priority );
  226. void *rt_newthread( void (*ptr)(), DWORD arg, WORD stklength,
  227.         BYTE priority, char *name );
  228. int rt_stackused( thread_x * t );
  229. void xrt_sleep( DWORD ms, char *s, int linnum );
  230. #define rt_sleep( ms )  xrt_sleep( ms, __FILE__, __LINE__  )
  231. void kwindow( int left, int top, int right, int bottom );
  232. crit_x *cs_alloc( void );
  233. void cs_new( crit_x **cs );
  234. void cs_free( crit_x *x );
  235. void cs_enter( crit_x *cs );
  236. void cs_exit( crit_x *cs );
  237. /* bqueue.c */
  238. bq_str *bq_alloc( int queuesize );
  239. void bq_free( bq_str *bq );
  240. void bq_writebyte( bq_str *bq, BYTE b );
  241. int bq_readbyte( bq_str *bq, BYTE *b );
  242. void bq_sendbyte( bq_str *bq, BYTE b );
  243. int bq_getbyte( bq_str *bq, BYTE *b );
  244. void bq_msg( bq_str *bq, int msgtype );
  245. WORD bq_readcount( bq_str *bq );
  246. #if defined(__DJGPP__)
  247.   typedef struct irq_handler_info {
  248.           _go32_dpmi_seginfo old_handler;
  249.           _go32_dpmi_seginfo new_handler;
  250.         } irq_handler_info;
  251.   irq_handler_info *rt_enableirq (int irq, void (*isr)());
  252.   void              rt_disableirq (int irq, irq_handler_info *info);
  253. #else
  254.   void interrupt (far *rt_enableirq (int irq, void interrupt (*isr)() ))();
  255.   void                 rt_disableirq (int irq, void interrupt (*oldisr)() );
  256. #endif
  257. void rt_eoi( int irq );
  258. #endif