]> git.sur5r.net Git - freertos/blob - Demo/Common/ethernet/lwIP_130/src/include/lwip/sys.h
Start to re-arrange files to include FreeRTOS+ in main download.
[freertos] / Demo / Common / ethernet / lwIP_130 / src / include / lwip / sys.h
1 /*\r
2  * Copyright (c) 2001-2004 Swedish Institute of Computer Science.\r
3  * All rights reserved.\r
4  *\r
5  * Redistribution and use in source and binary forms, with or without modification,\r
6  * are permitted provided that the following conditions are met:\r
7  *\r
8  * 1. Redistributions of source code must retain the above copyright notice,\r
9  *    this list of conditions and the following disclaimer.\r
10  * 2. Redistributions in binary form must reproduce the above copyright notice,\r
11  *    this list of conditions and the following disclaimer in the documentation\r
12  *    and/or other materials provided with the distribution.\r
13  * 3. The name of the author may not be used to endorse or promote products\r
14  *    derived from this software without specific prior written permission.\r
15  *\r
16  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\r
17  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\r
18  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\r
19  * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\r
20  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT\r
21  * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\r
22  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\r
23  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING\r
24  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\r
25  * OF SUCH DAMAGE.\r
26  *\r
27  * This file is part of the lwIP TCP/IP stack.\r
28  *\r
29  * Author: Adam Dunkels <adam@sics.se>\r
30  *\r
31  */\r
32 #ifndef __LWIP_SYS_H__\r
33 #define __LWIP_SYS_H__\r
34 \r
35 #include "lwip/opt.h"\r
36 \r
37 #ifdef __cplusplus\r
38 extern "C" {\r
39 #endif\r
40 \r
41 #if NO_SYS\r
42 \r
43 /* For a totally minimal and standalone system, we provide null\r
44    definitions of the sys_ functions. */\r
45 typedef u8_t sys_sem_t;\r
46 typedef u8_t sys_mbox_t;\r
47 typedef u8_t sys_prot_t;\r
48 struct sys_timeo {u8_t dummy;};\r
49 \r
50 #define sys_init()\r
51 #define sys_timeout(m,h,a)\r
52 #define sys_untimeout(m,a)\r
53 #define sys_sem_new(c) c\r
54 #define sys_sem_signal(s)\r
55 #define sys_sem_wait(s)\r
56 #define sys_sem_wait_timeout(s,t)\r
57 #define sys_arch_sem_wait(s,t)\r
58 #define sys_sem_free(s)\r
59 #define sys_mbox_new(s) 0\r
60 #define sys_mbox_fetch(m,d)\r
61 #define sys_mbox_tryfetch(m,d)\r
62 #define sys_mbox_post(m,d)\r
63 #define sys_mbox_trypost(m,d)\r
64 #define sys_mbox_free(m)\r
65 \r
66 #define sys_thread_new(n,t,a,s,p)\r
67 \r
68 #else /* NO_SYS */\r
69 \r
70 /** Return code for timeouts from sys_arch_mbox_fetch and sys_arch_sem_wait */\r
71 #define SYS_ARCH_TIMEOUT 0xffffffffUL\r
72 \r
73 /* sys_mbox_tryfetch returns SYS_MBOX_EMPTY if appropriate.\r
74  * For now we use the same magic value, but we allow this to change in future.\r
75  */\r
76 #define SYS_MBOX_EMPTY SYS_ARCH_TIMEOUT\r
77 \r
78 #include "lwip/err.h"\r
79 #include "arch/sys_arch.h"\r
80 \r
81 typedef void (* sys_timeout_handler)(void *arg);\r
82 \r
83 struct sys_timeo {\r
84   struct sys_timeo *next;\r
85   u32_t time;\r
86   sys_timeout_handler h;\r
87   void *arg;\r
88 };\r
89 \r
90 struct sys_timeouts {\r
91   struct sys_timeo *next;\r
92 };\r
93 \r
94 /* sys_init() must be called before anthing else. */\r
95 void sys_init(void);\r
96 \r
97 /*\r
98  * sys_timeout():\r
99  *\r
100  * Schedule a timeout a specified amount of milliseconds in the\r
101  * future. When the timeout occurs, the specified timeout handler will\r
102  * be called. The handler will be passed the "arg" argument when\r
103  * called.\r
104  *\r
105  */\r
106 void sys_timeout(u32_t msecs, sys_timeout_handler h, void *arg);\r
107 void sys_untimeout(sys_timeout_handler h, void *arg);\r
108 struct sys_timeouts *sys_arch_timeouts(void);\r
109 \r
110 /* Semaphore functions. */\r
111 sys_sem_t sys_sem_new(u8_t count);\r
112 void sys_sem_signal(sys_sem_t sem);\r
113 u32_t sys_arch_sem_wait(sys_sem_t sem, u32_t timeout);\r
114 void sys_sem_free(sys_sem_t sem);\r
115 void sys_sem_wait(sys_sem_t sem);\r
116 int sys_sem_wait_timeout(sys_sem_t sem, u32_t timeout);\r
117 \r
118 /* Time functions. */\r
119 #ifndef sys_msleep\r
120 void sys_msleep(u32_t ms); /* only has a (close to) 1 jiffy resolution. */\r
121 #endif\r
122 #ifndef sys_jiffies\r
123 u32_t sys_jiffies(void); /* since power up. */\r
124 #endif\r
125 \r
126 /* Mailbox functions. */\r
127 sys_mbox_t sys_mbox_new(int size);\r
128 void sys_mbox_post(sys_mbox_t mbox, void *msg);\r
129 err_t sys_mbox_trypost(sys_mbox_t mbox, void *msg);\r
130 u32_t sys_arch_mbox_fetch(sys_mbox_t mbox, void **msg, u32_t timeout);\r
131 #ifndef sys_arch_mbox_tryfetch /* Allow port to override with a macro */\r
132 u32_t sys_arch_mbox_tryfetch(sys_mbox_t mbox, void **msg);\r
133 #endif\r
134 /* For now, we map straight to sys_arch implementation. */\r
135 #define sys_mbox_tryfetch(mbox, msg) sys_arch_mbox_tryfetch(mbox, msg)\r
136 void sys_mbox_free(sys_mbox_t mbox);\r
137 void sys_mbox_fetch(sys_mbox_t mbox, void **msg);\r
138 \r
139 /* Thread functions. */\r
140 sys_thread_t sys_thread_new(char *name, void (* thread)(void *arg), void *arg, int stacksize, int prio);\r
141 \r
142 /* The following functions are used only in Unix code, and\r
143    can be omitted when porting the stack. */\r
144 /* Returns the current time in microseconds. */\r
145 unsigned long sys_now(void);\r
146 \r
147 #endif /* NO_SYS */\r
148 \r
149 /* Critical Region Protection */\r
150 /* These functions must be implemented in the sys_arch.c file.\r
151    In some implementations they can provide a more light-weight protection\r
152    mechanism than using semaphores. Otherwise semaphores can be used for\r
153    implementation */\r
154 #ifndef SYS_ARCH_PROTECT\r
155 /** SYS_LIGHTWEIGHT_PROT\r
156  * define SYS_LIGHTWEIGHT_PROT in lwipopts.h if you want inter-task protection\r
157  * for certain critical regions during buffer allocation, deallocation and memory\r
158  * allocation and deallocation.\r
159  */\r
160 #if SYS_LIGHTWEIGHT_PROT\r
161 \r
162 /** SYS_ARCH_DECL_PROTECT\r
163  * declare a protection variable. This macro will default to defining a variable of\r
164  * type sys_prot_t. If a particular port needs a different implementation, then\r
165  * this macro may be defined in sys_arch.h.\r
166  */\r
167 #define SYS_ARCH_DECL_PROTECT(lev) sys_prot_t lev\r
168 /** SYS_ARCH_PROTECT\r
169  * Perform a "fast" protect. This could be implemented by\r
170  * disabling interrupts for an embedded system or by using a semaphore or\r
171  * mutex. The implementation should allow calling SYS_ARCH_PROTECT when\r
172  * already protected. The old protection level is returned in the variable\r
173  * "lev". This macro will default to calling the sys_arch_protect() function\r
174  * which should be implemented in sys_arch.c. If a particular port needs a\r
175  * different implementation, then this macro may be defined in sys_arch.h\r
176  */\r
177 #define SYS_ARCH_PROTECT(lev) lev = sys_arch_protect()\r
178 /** SYS_ARCH_UNPROTECT\r
179  * Perform a "fast" set of the protection level to "lev". This could be\r
180  * implemented by setting the interrupt level to "lev" within the MACRO or by\r
181  * using a semaphore or mutex.  This macro will default to calling the\r
182  * sys_arch_unprotect() function which should be implemented in\r
183  * sys_arch.c. If a particular port needs a different implementation, then\r
184  * this macro may be defined in sys_arch.h\r
185  */\r
186 #define SYS_ARCH_UNPROTECT(lev) sys_arch_unprotect(lev)\r
187 sys_prot_t sys_arch_protect(void);\r
188 void sys_arch_unprotect(sys_prot_t pval);\r
189 \r
190 #else\r
191 \r
192 #define SYS_ARCH_DECL_PROTECT(lev)\r
193 #define SYS_ARCH_PROTECT(lev)\r
194 #define SYS_ARCH_UNPROTECT(lev)\r
195 \r
196 #endif /* SYS_LIGHTWEIGHT_PROT */\r
197 \r
198 #endif /* SYS_ARCH_PROTECT */\r
199 \r
200 /*\r
201  * Macros to set/get and increase/decrease variables in a thread-safe way.\r
202  * Use these for accessing variable that are used from more than one thread.\r
203  */\r
204 \r
205 #ifndef SYS_ARCH_INC\r
206 #define SYS_ARCH_INC(var, val) do { \\r
207                                 SYS_ARCH_DECL_PROTECT(old_level); \\r
208                                 SYS_ARCH_PROTECT(old_level); \\r
209                                 var += val; \\r
210                                 SYS_ARCH_UNPROTECT(old_level); \\r
211                               } while(0)\r
212 #endif /* SYS_ARCH_INC */\r
213 \r
214 #ifndef SYS_ARCH_DEC\r
215 #define SYS_ARCH_DEC(var, val) do { \\r
216                                 SYS_ARCH_DECL_PROTECT(old_level); \\r
217                                 SYS_ARCH_PROTECT(old_level); \\r
218                                 var -= val; \\r
219                                 SYS_ARCH_UNPROTECT(old_level); \\r
220                               } while(0)\r
221 #endif /* SYS_ARCH_DEC */\r
222 \r
223 #ifndef SYS_ARCH_GET\r
224 #define SYS_ARCH_GET(var, ret) do { \\r
225                                 SYS_ARCH_DECL_PROTECT(old_level); \\r
226                                 SYS_ARCH_PROTECT(old_level); \\r
227                                 ret = var; \\r
228                                 SYS_ARCH_UNPROTECT(old_level); \\r
229                               } while(0)\r
230 #endif /* SYS_ARCH_GET */\r
231 \r
232 #ifndef SYS_ARCH_SET\r
233 #define SYS_ARCH_SET(var, val) do { \\r
234                                 SYS_ARCH_DECL_PROTECT(old_level); \\r
235                                 SYS_ARCH_PROTECT(old_level); \\r
236                                 var = val; \\r
237                                 SYS_ARCH_UNPROTECT(old_level); \\r
238                               } while(0)\r
239 #endif /* SYS_ARCH_SET */\r
240 \r
241 \r
242 #ifdef __cplusplus\r
243 }\r
244 #endif\r
245 \r
246 #endif /* __LWIP_SYS_H__ */\r