LwIP with PPP & Ethernet integration

Dependents:   NetworkingCoreLib

This is the mbed port of the LwIP stack: http://savannah.nongnu.org/projects/lwip/

It includes contributed content from NXP's port for LPCxxxx devices: http://www.lpcware.com/content/project/lightweight-ip-lwip-networking-stack

Licence

LwIP is licenced under the BSD licence:

Copyright (c) 2001-2004 Swedish Institute of Computer Science. 
All rights reserved. 
Redistribution and use in source and binary forms, with or without modification, 
are permitted provided that the following conditions are met: 
1. Redistributions of source code must retain the above copyright notice, 
this list of conditions and the following disclaimer. 
2. Redistributions in binary form must reproduce the above copyright notice, 
this list of conditions and the following disclaimer in the documentation 
and/or other materials provided with the distribution. 
3. The name of the author may not be used to endorse or promote products 
derived from this software without specific prior written permission. 
THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED 
WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT 
SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT 
OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 
IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY 
OF SUCH DAMAGE.
Committer:
donatien
Date:
Fri May 25 08:56:35 2012 +0000
Revision:
2:1a87f74b8e3b
Parent:
0:8e01dca41002
Removed compilation of EMAC driver when using PPP

Who changed what in which revision?

UserRevisionLine numberNew contents of line
donatien 0:8e01dca41002 1 /* sysarch.cpp */
donatien 0:8e01dca41002 2 /*
donatien 0:8e01dca41002 3 Copyright (C) 2012 ARM Limited.
donatien 0:8e01dca41002 4
donatien 0:8e01dca41002 5 Permission is hereby granted, free of charge, to any person obtaining a copy of
donatien 0:8e01dca41002 6 this software and associated documentation files (the "Software"), to deal in
donatien 0:8e01dca41002 7 the Software without restriction, including without limitation the rights to
donatien 0:8e01dca41002 8 use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
donatien 0:8e01dca41002 9 of the Software, and to permit persons to whom the Software is furnished to do
donatien 0:8e01dca41002 10 so, subject to the following conditions:
donatien 0:8e01dca41002 11
donatien 0:8e01dca41002 12 The above copyright notice and this permission notice shall be included in all
donatien 0:8e01dca41002 13 copies or substantial portions of the Software.
donatien 0:8e01dca41002 14
donatien 0:8e01dca41002 15 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
donatien 0:8e01dca41002 16 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
donatien 0:8e01dca41002 17 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
donatien 0:8e01dca41002 18 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
donatien 0:8e01dca41002 19 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
donatien 0:8e01dca41002 20 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
donatien 0:8e01dca41002 21 SOFTWARE.
donatien 0:8e01dca41002 22 */
donatien 0:8e01dca41002 23
donatien 0:8e01dca41002 24 #define __DEBUG__ 0
donatien 0:8e01dca41002 25 #ifndef __MODULE__
donatien 0:8e01dca41002 26 #define __MODULE__ "sys_arch.cpp"
donatien 0:8e01dca41002 27 #endif
donatien 0:8e01dca41002 28
donatien 0:8e01dca41002 29 extern "C"
donatien 0:8e01dca41002 30 {
donatien 0:8e01dca41002 31 #include "lwip/opt.h"
donatien 0:8e01dca41002 32 #include "lwip/def.h"
donatien 0:8e01dca41002 33 #include "lwip/sys.h"
donatien 0:8e01dca41002 34 #include "lwip/arch.h"
donatien 0:8e01dca41002 35 #include "cc.h"
donatien 0:8e01dca41002 36 #include "sys_arch.h"
donatien 0:8e01dca41002 37 }
donatien 0:8e01dca41002 38
donatien 0:8e01dca41002 39 #include "core/fwk.h"
donatien 0:8e01dca41002 40 #include "rtos.h"
donatien 0:8e01dca41002 41 #include "mbed.h" //From mbed library
donatien 0:8e01dca41002 42
donatien 0:8e01dca41002 43 /*
donatien 0:8e01dca41002 44 From http://lwip.wikia.com/wiki/Porting_for_an_OS:
donatien 0:8e01dca41002 45
donatien 0:8e01dca41002 46 The sys_arch provides semaphores and mailboxes to lwIP. For the full
donatien 0:8e01dca41002 47 lwIP functionality, multiple threads support can be implemented in the
donatien 0:8e01dca41002 48 sys_arch, but this is not required for the basic lwIP functionality.
donatien 0:8e01dca41002 49 */
donatien 0:8e01dca41002 50
donatien 0:8e01dca41002 51 extern "C"
donatien 0:8e01dca41002 52 /*
donatien 0:8e01dca41002 53 The file is .cpp to be able to use the C++ abstraction of Mutexes, Semaphores, etc.
donatien 0:8e01dca41002 54 however it should be linked in a C-fashion
donatien 0:8e01dca41002 55 */
donatien 0:8e01dca41002 56 {
donatien 0:8e01dca41002 57
donatien 0:8e01dca41002 58 #if SYS_LIGHTWEIGHT_PROT == 0
donatien 0:8e01dca41002 59 #error "SYS_LIGHTWEIGHT_PROT must be set"
donatien 0:8e01dca41002 60 #endif
donatien 0:8e01dca41002 61
donatien 0:8e01dca41002 62 #if SYS_LIGHTWEIGHT_PROT
donatien 0:8e01dca41002 63 //Critical regions protection
donatien 0:8e01dca41002 64 static Mutex sys_arch_protect_mtx;
donatien 0:8e01dca41002 65
donatien 0:8e01dca41002 66 sys_prot_t sys_arch_protect(void)
donatien 0:8e01dca41002 67 {
donatien 0:8e01dca41002 68
donatien 0:8e01dca41002 69 sys_arch_protect_mtx.lock();
donatien 0:8e01dca41002 70
donatien 0:8e01dca41002 71 return 0;
donatien 0:8e01dca41002 72 }
donatien 0:8e01dca41002 73
donatien 0:8e01dca41002 74 void sys_arch_unprotect(sys_prot_t pval)
donatien 0:8e01dca41002 75 {
donatien 0:8e01dca41002 76
donatien 0:8e01dca41002 77 LWIP_UNUSED_ARG(pval);
donatien 0:8e01dca41002 78 sys_arch_protect_mtx.unlock();
donatien 0:8e01dca41002 79
donatien 0:8e01dca41002 80 }
donatien 0:8e01dca41002 81 #endif
donatien 0:8e01dca41002 82
donatien 0:8e01dca41002 83 //Mutexes
donatien 0:8e01dca41002 84
donatien 0:8e01dca41002 85 /** Create a new mutex
donatien 0:8e01dca41002 86 * @param mutex pointer to the mutex to create
donatien 0:8e01dca41002 87 * @return a new mutex */
donatien 0:8e01dca41002 88 err_t sys_mutex_new(sys_mutex_t *pMtx)
donatien 0:8e01dca41002 89 {
donatien 0:8e01dca41002 90
donatien 0:8e01dca41002 91 SYS_ARCH_DECL_PROTECT(lev);
donatien 0:8e01dca41002 92 DBG("Trying to create new mutex");
donatien 0:8e01dca41002 93
donatien 0:8e01dca41002 94 SYS_ARCH_PROTECT(lev); //Protect this section
donatien 0:8e01dca41002 95 pMtx->pMtx = new Mutex();
donatien 0:8e01dca41002 96 SYS_ARCH_UNPROTECT(lev);
donatien 0:8e01dca41002 97
donatien 0:8e01dca41002 98 if(pMtx->pMtx == NULL)
donatien 0:8e01dca41002 99 {
donatien 0:8e01dca41002 100 DBG("No mem");
donatien 0:8e01dca41002 101
donatien 0:8e01dca41002 102 return ERR_MEM;
donatien 0:8e01dca41002 103 }
donatien 0:8e01dca41002 104
donatien 0:8e01dca41002 105 pMtx->valid = true;
donatien 0:8e01dca41002 106
donatien 0:8e01dca41002 107 DBG("mutex created OK");
donatien 0:8e01dca41002 108
donatien 0:8e01dca41002 109 return ERR_OK; //Return the semaphore
donatien 0:8e01dca41002 110 }
donatien 0:8e01dca41002 111
donatien 0:8e01dca41002 112 /** Lock a mutex
donatien 0:8e01dca41002 113 * @param mutex the mutex to lock */
donatien 0:8e01dca41002 114 void sys_mutex_lock(sys_mutex_t *pMtx)
donatien 0:8e01dca41002 115 {
donatien 0:8e01dca41002 116
donatien 0:8e01dca41002 117 ((Mutex*)(pMtx->pMtx))->lock();
donatien 0:8e01dca41002 118
donatien 0:8e01dca41002 119 }
donatien 0:8e01dca41002 120
donatien 0:8e01dca41002 121 /** Unlock a mutex
donatien 0:8e01dca41002 122 * @param mutex the mutex to unlock */
donatien 0:8e01dca41002 123 void sys_mutex_unlock(sys_mutex_t *pMtx)
donatien 0:8e01dca41002 124 {
donatien 0:8e01dca41002 125
donatien 0:8e01dca41002 126 ((Mutex*)(pMtx->pMtx))->unlock();
donatien 0:8e01dca41002 127
donatien 0:8e01dca41002 128 }
donatien 0:8e01dca41002 129
donatien 0:8e01dca41002 130 /** Delete a mutex
donatien 0:8e01dca41002 131 * @param mutex the mutex to delete */
donatien 0:8e01dca41002 132 void sys_mutex_free(sys_mutex_t *pMtx)
donatien 0:8e01dca41002 133 {
donatien 0:8e01dca41002 134
donatien 0:8e01dca41002 135 SYS_ARCH_DECL_PROTECT(lev);
donatien 0:8e01dca41002 136 SYS_ARCH_PROTECT(lev); //Protect this section
donatien 0:8e01dca41002 137 delete ((Mutex*)(pMtx->pMtx));
donatien 0:8e01dca41002 138 SYS_ARCH_UNPROTECT(lev);
donatien 0:8e01dca41002 139
donatien 0:8e01dca41002 140 }
donatien 0:8e01dca41002 141
donatien 0:8e01dca41002 142 /** Check if a mutex is valid/allocated: return 1 for valid, 0 for invalid */
donatien 0:8e01dca41002 143 int sys_mutex_valid(sys_mutex_t *pMtx)
donatien 0:8e01dca41002 144 {
donatien 0:8e01dca41002 145
donatien 0:8e01dca41002 146 if (pMtx->pMtx != NULL)
donatien 0:8e01dca41002 147 {
donatien 0:8e01dca41002 148
donatien 0:8e01dca41002 149 return pMtx->valid;
donatien 0:8e01dca41002 150 }
donatien 0:8e01dca41002 151
donatien 0:8e01dca41002 152 return false;
donatien 0:8e01dca41002 153 }
donatien 0:8e01dca41002 154
donatien 0:8e01dca41002 155 /** Set a mutex invalid so that sys_mutex_valid returns 0 */
donatien 0:8e01dca41002 156 void sys_mutex_set_invalid(sys_mutex_t *pMtx)
donatien 0:8e01dca41002 157 {
donatien 0:8e01dca41002 158
donatien 0:8e01dca41002 159 pMtx->valid = false;
donatien 0:8e01dca41002 160
donatien 0:8e01dca41002 161 }
donatien 0:8e01dca41002 162
donatien 0:8e01dca41002 163 //Semaphores
donatien 0:8e01dca41002 164
donatien 0:8e01dca41002 165 /*
donatien 0:8e01dca41002 166 The implementation reserves a pool of semaphores that can be used by
donatien 0:8e01dca41002 167 LwIP in order to only use static allocation
donatien 0:8e01dca41002 168 */
donatien 0:8e01dca41002 169
donatien 0:8e01dca41002 170 //static sys_sem sys_sem_pool[LWIP_SEMAPHORES_COUNT] = { 0 };
donatien 0:8e01dca41002 171
donatien 0:8e01dca41002 172 /*
donatien 0:8e01dca41002 173 Creates and returns a new semaphore. The count argument specifies the
donatien 0:8e01dca41002 174 initial state of the semaphore. Returns the semaphore, or SYS_SEM_NULL
donatien 0:8e01dca41002 175 on error.
donatien 0:8e01dca41002 176 */
donatien 0:8e01dca41002 177 err_t sys_sem_new_mul(sys_sem_t *pSem, u8_t size, u8_t count)
donatien 0:8e01dca41002 178 {
donatien 0:8e01dca41002 179
donatien 0:8e01dca41002 180 SYS_ARCH_DECL_PROTECT(lev);
donatien 0:8e01dca41002 181 DBG("Trying to create new semaphore of size=%d", size);
donatien 0:8e01dca41002 182
donatien 0:8e01dca41002 183 SYS_ARCH_PROTECT(lev); //Protect this section
donatien 0:8e01dca41002 184 pSem->pSphre = new Semaphore(size);
donatien 0:8e01dca41002 185 SYS_ARCH_UNPROTECT(lev);
donatien 0:8e01dca41002 186 if(pSem->pSphre == NULL)
donatien 0:8e01dca41002 187 {
donatien 0:8e01dca41002 188 ERR("Failed!");
donatien 0:8e01dca41002 189 return ERR_MEM;
donatien 0:8e01dca41002 190 }
donatien 0:8e01dca41002 191
donatien 0:8e01dca41002 192 while(count < size)
donatien 0:8e01dca41002 193 {
donatien 0:8e01dca41002 194 ((Semaphore*)(pSem->pSphre))->wait();
donatien 0:8e01dca41002 195 count++;
donatien 0:8e01dca41002 196 }
donatien 0:8e01dca41002 197 pSem->valid = true;
donatien 0:8e01dca41002 198
donatien 0:8e01dca41002 199
donatien 0:8e01dca41002 200 return ERR_OK; //Return the semaphore
donatien 0:8e01dca41002 201 }
donatien 0:8e01dca41002 202
donatien 0:8e01dca41002 203
donatien 0:8e01dca41002 204 /*
donatien 0:8e01dca41002 205 Creates and returns a new semaphore. The count argument specifies the
donatien 0:8e01dca41002 206 initial state of the semaphore. Returns the semaphore, or SYS_SEM_NULL
donatien 0:8e01dca41002 207 on error.
donatien 0:8e01dca41002 208 */
donatien 0:8e01dca41002 209 err_t sys_sem_new(sys_sem_t *pSem, u8_t count)
donatien 0:8e01dca41002 210 {
donatien 0:8e01dca41002 211
donatien 0:8e01dca41002 212 SYS_ARCH_DECL_PROTECT(lev);
donatien 0:8e01dca41002 213 DBG("Trying to create new semaphore of count=%d", count);
donatien 0:8e01dca41002 214
donatien 0:8e01dca41002 215 SYS_ARCH_PROTECT(lev); //Protect this section
donatien 0:8e01dca41002 216 pSem->pSphre = new Semaphore(1);
donatien 0:8e01dca41002 217 SYS_ARCH_UNPROTECT(lev);
donatien 0:8e01dca41002 218 if(pSem->pSphre == NULL)
donatien 0:8e01dca41002 219 {
donatien 0:8e01dca41002 220 ERR("Failed!");
donatien 0:8e01dca41002 221 return ERR_MEM;
donatien 0:8e01dca41002 222 }
donatien 0:8e01dca41002 223
donatien 0:8e01dca41002 224 if(!count)
donatien 0:8e01dca41002 225 {
donatien 0:8e01dca41002 226 ((Semaphore*)(pSem->pSphre))->wait();
donatien 0:8e01dca41002 227 }
donatien 0:8e01dca41002 228 pSem->valid = true;
donatien 0:8e01dca41002 229
donatien 0:8e01dca41002 230
donatien 0:8e01dca41002 231 return ERR_OK; //Return the semaphore
donatien 0:8e01dca41002 232 }
donatien 0:8e01dca41002 233
donatien 0:8e01dca41002 234 /*
donatien 0:8e01dca41002 235 Frees a semaphore created by sys_sem_new. Since these two functions
donatien 0:8e01dca41002 236 provide the entry and exit point for all semaphores used by lwIP, you
donatien 0:8e01dca41002 237 have great flexibility in how these are allocated and deallocated (for
donatien 0:8e01dca41002 238 example, from the heap, a memory pool, a semaphore pool, etc).
donatien 0:8e01dca41002 239 */
donatien 0:8e01dca41002 240 void sys_sem_free(sys_sem_t *pSem)
donatien 0:8e01dca41002 241 {
donatien 0:8e01dca41002 242 SYS_ARCH_DECL_PROTECT(lev);
donatien 0:8e01dca41002 243 DBG("Deleting semaphore");
donatien 0:8e01dca41002 244 SYS_ARCH_PROTECT(lev); //Protect this section
donatien 0:8e01dca41002 245 delete ((Semaphore*)(pSem->pSphre));
donatien 0:8e01dca41002 246 SYS_ARCH_UNPROTECT(lev);
donatien 0:8e01dca41002 247
donatien 0:8e01dca41002 248 }
donatien 0:8e01dca41002 249
donatien 0:8e01dca41002 250 /*
donatien 0:8e01dca41002 251 Signals (or releases) a semaphore.
donatien 0:8e01dca41002 252 */
donatien 0:8e01dca41002 253 void sys_sem_signal(sys_sem_t* pSem)
donatien 0:8e01dca41002 254 {
donatien 0:8e01dca41002 255
donatien 0:8e01dca41002 256 ((Semaphore*)(pSem->pSphre))->release(); //Produce (i.e. release) a resource
donatien 0:8e01dca41002 257
donatien 0:8e01dca41002 258 }
donatien 0:8e01dca41002 259
donatien 0:8e01dca41002 260 /*
donatien 0:8e01dca41002 261 Blocks the thread while waiting for the semaphore to be signaled. The
donatien 0:8e01dca41002 262 timeout parameter specifies how many milliseconds the function should
donatien 0:8e01dca41002 263 block before returning; if the function times out, it should return
donatien 0:8e01dca41002 264 SYS_ARCH_TIMEOUT. If timeout=0, then the function should block
donatien 0:8e01dca41002 265 indefinitely. If the function acquires the semaphore, it should return
donatien 0:8e01dca41002 266 how many milliseconds expired while waiting for the semaphore. The
donatien 0:8e01dca41002 267 function may return 0 if the semaphore was immediately available.
donatien 0:8e01dca41002 268 */
donatien 0:8e01dca41002 269 u32_t sys_arch_sem_wait(sys_sem_t* pSem, u32_t timeout)
donatien 0:8e01dca41002 270 {
donatien 0:8e01dca41002 271
donatien 0:8e01dca41002 272 int ret;
donatien 0:8e01dca41002 273 Timer t;
donatien 0:8e01dca41002 274 uint32_t timeout_sphre;
donatien 0:8e01dca41002 275 int time_spent;
donatien 0:8e01dca41002 276
donatien 0:8e01dca41002 277 timeout_sphre = (timeout != 0) ? timeout : osWaitForever /*block indefinitely*/;
donatien 0:8e01dca41002 278
donatien 0:8e01dca41002 279 t.start();
donatien 0:8e01dca41002 280 ret = ((Semaphore*)(pSem->pSphre))->wait(timeout_sphre);
donatien 0:8e01dca41002 281 if(ret == 0)
donatien 0:8e01dca41002 282 {
donatien 0:8e01dca41002 283
donatien 0:8e01dca41002 284 return SYS_ARCH_TIMEOUT;
donatien 0:8e01dca41002 285 }
donatien 0:8e01dca41002 286 time_spent = t.read_ms();
donatien 0:8e01dca41002 287
donatien 0:8e01dca41002 288 return time_spent;
donatien 0:8e01dca41002 289 }
donatien 0:8e01dca41002 290
donatien 0:8e01dca41002 291 /** Check if a sempahore is valid/allocated: return 1 for valid, 0 for invalid */
donatien 0:8e01dca41002 292 int sys_sem_valid(sys_sem_t *pSem)
donatien 0:8e01dca41002 293 {
donatien 0:8e01dca41002 294
donatien 0:8e01dca41002 295 if (pSem->pSphre != NULL)
donatien 0:8e01dca41002 296 {
donatien 0:8e01dca41002 297
donatien 0:8e01dca41002 298 return (pSem->valid);
donatien 0:8e01dca41002 299 }
donatien 0:8e01dca41002 300
donatien 0:8e01dca41002 301 return false;
donatien 0:8e01dca41002 302 }
donatien 0:8e01dca41002 303
donatien 0:8e01dca41002 304 /** Set a semaphore invalid so that sys_sem_valid returns 0 */
donatien 0:8e01dca41002 305 void sys_sem_set_invalid(sys_sem_t *pSem)
donatien 0:8e01dca41002 306 {
donatien 0:8e01dca41002 307
donatien 0:8e01dca41002 308 pSem->valid = false;
donatien 0:8e01dca41002 309
donatien 0:8e01dca41002 310 }
donatien 0:8e01dca41002 311
donatien 0:8e01dca41002 312 //Mailboxes
donatien 0:8e01dca41002 313
donatien 0:8e01dca41002 314 /*
donatien 0:8e01dca41002 315 The implementation reserves a pool of mailboxes of generic (void*) type that can be used by
donatien 0:8e01dca41002 316 LwIP in order to only use static allocation
donatien 0:8e01dca41002 317 */
donatien 0:8e01dca41002 318
donatien 0:8e01dca41002 319 #define QUEUE_SIZE 8
donatien 0:8e01dca41002 320 #define SYS_MBOX_SIZE QUEUE_SIZE
donatien 0:8e01dca41002 321 #if 0
donatien 0:8e01dca41002 322 /*
donatien 0:8e01dca41002 323 Returns a new mailbox, or SYS_MBOX_NULL on error.
donatien 0:8e01dca41002 324 */
donatien 0:8e01dca41002 325 err_t sys_mbox_new(sys_mbox_t *pMbox, int size)
donatien 0:8e01dca41002 326 {
donatien 0:8e01dca41002 327
donatien 0:8e01dca41002 328 SYS_ARCH_DECL_PROTECT(lev);
donatien 0:8e01dca41002 329 ERR("Trying to create new queue of size %d", size);
donatien 0:8e01dca41002 330
donatien 0:8e01dca41002 331 SYS_ARCH_PROTECT(lev); //Protect this section
donatien 0:8e01dca41002 332 if(size > QUEUE_SIZE)
donatien 0:8e01dca41002 333 {
donatien 0:8e01dca41002 334 ERR("Queue size > QUEUE_SIZE");
donatien 0:8e01dca41002 335 }
donatien 0:8e01dca41002 336 pMbox->pQueue = new Queue<void,QUEUE_SIZE>();
donatien 0:8e01dca41002 337 SYS_ARCH_UNPROTECT(lev);
donatien 0:8e01dca41002 338 if(pMbox->pQueue == NULL)
donatien 0:8e01dca41002 339 {
donatien 0:8e01dca41002 340
donatien 0:8e01dca41002 341 return ERR_MEM;
donatien 0:8e01dca41002 342 }
donatien 0:8e01dca41002 343 pMbox->valid = true;
donatien 0:8e01dca41002 344
donatien 0:8e01dca41002 345
donatien 0:8e01dca41002 346 return ERR_OK; //Return the mailbox
donatien 0:8e01dca41002 347 }
donatien 0:8e01dca41002 348
donatien 0:8e01dca41002 349 /*
donatien 0:8e01dca41002 350 Deallocates a mailbox. If there are messages still present in the
donatien 0:8e01dca41002 351 mailbox when the mailbox is deallocated, it is an indication of a
donatien 0:8e01dca41002 352 programming error in lwIP and the developer should be notified.
donatien 0:8e01dca41002 353 */
donatien 0:8e01dca41002 354 void sys_mbox_free(sys_mbox_t* pMbox)
donatien 0:8e01dca41002 355 {
donatien 0:8e01dca41002 356 ERR("WHY??");
donatien 0:8e01dca41002 357
donatien 0:8e01dca41002 358 SYS_ARCH_DECL_PROTECT(lev);
donatien 0:8e01dca41002 359 SYS_ARCH_PROTECT(lev); //Protect this section
donatien 0:8e01dca41002 360 delete ((Queue<void,QUEUE_SIZE>*)(pMbox->pQueue));
donatien 0:8e01dca41002 361 SYS_ARCH_UNPROTECT(lev);
donatien 0:8e01dca41002 362
donatien 0:8e01dca41002 363 }
donatien 0:8e01dca41002 364
donatien 0:8e01dca41002 365 /*
donatien 0:8e01dca41002 366 Posts the "msg" to the mailbox.
donatien 0:8e01dca41002 367 */
donatien 0:8e01dca41002 368 void sys_mbox_post(sys_mbox_t* pMbox, void *msg)
donatien 0:8e01dca41002 369 {
donatien 0:8e01dca41002 370
donatien 0:8e01dca41002 371 if(msg == NULL)
donatien 0:8e01dca41002 372 {
donatien 0:8e01dca41002 373 ERR("NULL");
donatien 0:8e01dca41002 374 Thread::wait(100);
donatien 0:8e01dca41002 375 }
donatien 0:8e01dca41002 376
donatien 0:8e01dca41002 377 ((Queue<void,QUEUE_SIZE>*)(pMbox->pQueue))->put(msg, osWaitForever);
donatien 0:8e01dca41002 378
donatien 0:8e01dca41002 379 }
donatien 0:8e01dca41002 380
donatien 0:8e01dca41002 381 /*
donatien 0:8e01dca41002 382 Blocks the thread until a message arrives in the mailbox, but does not
donatien 0:8e01dca41002 383 block the thread longer than timeout milliseconds (similar to the
donatien 0:8e01dca41002 384 sys_arch_sem_wait() function). The msg argument is a pointer to the
donatien 0:8e01dca41002 385 message in the mailbox and may be NULL to indicate that the message
donatien 0:8e01dca41002 386 should be dropped. This should return either SYS_ARCH_TIMEOUT or the
donatien 0:8e01dca41002 387 number of milliseconds elapsed waiting for a message.
donatien 0:8e01dca41002 388 */
donatien 0:8e01dca41002 389 u32_t sys_arch_mbox_fetch(sys_mbox_t* pMbox, void **msg, u32_t timeout)
donatien 0:8e01dca41002 390 {
donatien 0:8e01dca41002 391 Timer t;
donatien 0:8e01dca41002 392 uint32_t timeout_queue;
donatien 0:8e01dca41002 393 int time_spent;
donatien 0:8e01dca41002 394 osEvent evt;
donatien 0:8e01dca41002 395
donatien 0:8e01dca41002 396 timeout_queue = (timeout != 0) ? timeout : osWaitForever /*block indefinitely*/;
donatien 0:8e01dca41002 397
donatien 0:8e01dca41002 398 t.start();
donatien 0:8e01dca41002 399 evt = ((Queue<void,QUEUE_SIZE>*)(pMbox->pQueue))->get(timeout_queue);
donatien 0:8e01dca41002 400 if(evt.status != osEventMessage)
donatien 0:8e01dca41002 401 {
donatien 0:8e01dca41002 402 return SYS_ARCH_TIMEOUT;
donatien 0:8e01dca41002 403 }
donatien 0:8e01dca41002 404 time_spent = t.read_ms();
donatien 0:8e01dca41002 405 if(msg!=NULL)
donatien 0:8e01dca41002 406 {
donatien 0:8e01dca41002 407 *msg = evt.value.p;
donatien 0:8e01dca41002 408 }
donatien 0:8e01dca41002 409 else
donatien 0:8e01dca41002 410 {
donatien 0:8e01dca41002 411 ERR("Dropped");
donatien 0:8e01dca41002 412 Thread::wait(100);
donatien 0:8e01dca41002 413 }
donatien 0:8e01dca41002 414 return time_spent;
donatien 0:8e01dca41002 415 }
donatien 0:8e01dca41002 416
donatien 0:8e01dca41002 417 /*
donatien 0:8e01dca41002 418 This is similar to sys_arch_mbox_fetch, however if a message is not
donatien 0:8e01dca41002 419 present in the mailbox, it immediately returns with the code
donatien 0:8e01dca41002 420 SYS_MBOX_EMPTY. On success 0 is returned with msg pointing to the
donatien 0:8e01dca41002 421 message retrieved from the mailbox.
donatien 0:8e01dca41002 422 */
donatien 0:8e01dca41002 423 u32_t sys_arch_mbox_tryfetch(sys_mbox_t* pMbox, void **msg)
donatien 0:8e01dca41002 424 {
donatien 0:8e01dca41002 425
donatien 0:8e01dca41002 426 osEvent evt;
donatien 0:8e01dca41002 427
donatien 0:8e01dca41002 428 evt = ((Queue<void,QUEUE_SIZE>*)(pMbox->pQueue))->get(0);
donatien 0:8e01dca41002 429 if(evt.status != osEventMessage)
donatien 0:8e01dca41002 430 {
donatien 0:8e01dca41002 431 return SYS_MBOX_EMPTY;
donatien 0:8e01dca41002 432 }
donatien 0:8e01dca41002 433 if(msg!=NULL)
donatien 0:8e01dca41002 434 {
donatien 0:8e01dca41002 435 *msg = evt.value.p;
donatien 0:8e01dca41002 436 }
donatien 0:8e01dca41002 437 else
donatien 0:8e01dca41002 438 {
donatien 0:8e01dca41002 439 ERR("Dropped");
donatien 0:8e01dca41002 440 Thread::wait(100);
donatien 0:8e01dca41002 441 }
donatien 0:8e01dca41002 442
donatien 0:8e01dca41002 443 return ERR_OK;
donatien 0:8e01dca41002 444 }
donatien 0:8e01dca41002 445
donatien 0:8e01dca41002 446 /*
donatien 0:8e01dca41002 447 Tries to post a message to mbox by polling (no timeout).
donatien 0:8e01dca41002 448 */
donatien 0:8e01dca41002 449 #define X() do{(*((volatile uint32_t *)0x40024048))=__LINE__;}while(0)
donatien 0:8e01dca41002 450 #define D(d) do{(*((volatile uint32_t *)0x4002404C))=d;}while(0)
donatien 0:8e01dca41002 451 err_t sys_mbox_trypost(sys_mbox_t* pMbox, void *msg)
donatien 0:8e01dca41002 452 {
donatien 0:8e01dca41002 453 int ret;
donatien 0:8e01dca41002 454
donatien 0:8e01dca41002 455 if(msg == NULL)
donatien 0:8e01dca41002 456 {
donatien 0:8e01dca41002 457 ERR("NULL");
donatien 0:8e01dca41002 458 Thread::wait(100);
donatien 0:8e01dca41002 459 }
donatien 0:8e01dca41002 460
donatien 0:8e01dca41002 461 ret = ((Queue<void,QUEUE_SIZE>*)(pMbox->pQueue))->put(msg,0);
donatien 0:8e01dca41002 462 if(ret != osOK)
donatien 0:8e01dca41002 463 {
donatien 0:8e01dca41002 464 ERR("FULL");
donatien 0:8e01dca41002 465 return ERR_MEM;
donatien 0:8e01dca41002 466 }
donatien 0:8e01dca41002 467
donatien 0:8e01dca41002 468 return ERR_OK;
donatien 0:8e01dca41002 469 }
donatien 0:8e01dca41002 470
donatien 0:8e01dca41002 471 /** Check if an mbox is valid/allocated: return 1 for valid, 0 for invalid */
donatien 0:8e01dca41002 472 int sys_mbox_valid(sys_mbox_t *pMbox)
donatien 0:8e01dca41002 473 {
donatien 0:8e01dca41002 474
donatien 0:8e01dca41002 475 if (pMbox->pQueue != NULL)
donatien 0:8e01dca41002 476 {
donatien 0:8e01dca41002 477
donatien 0:8e01dca41002 478 return (pMbox->valid);
donatien 0:8e01dca41002 479 }
donatien 0:8e01dca41002 480
donatien 0:8e01dca41002 481 return false;
donatien 0:8e01dca41002 482 }
donatien 0:8e01dca41002 483
donatien 0:8e01dca41002 484 /** Set an mbox invalid so that sys_mbox_valid returns 0 */
donatien 0:8e01dca41002 485 void sys_mbox_set_invalid(sys_mbox_t *pMbox)
donatien 0:8e01dca41002 486 {
donatien 0:8e01dca41002 487
donatien 0:8e01dca41002 488 pMbox->valid = false;
donatien 0:8e01dca41002 489
donatien 0:8e01dca41002 490 }
donatien 0:8e01dca41002 491 #else
donatien 0:8e01dca41002 492
donatien 0:8e01dca41002 493 /** Check if an mbox is valid/allocated: return 1 for valid, 0 for invalid */
donatien 0:8e01dca41002 494 int sys_mbox_valid(sys_mbox_t *pMbox)
donatien 0:8e01dca41002 495 {
donatien 0:8e01dca41002 496 return (pMbox->valid);
donatien 0:8e01dca41002 497 }
donatien 0:8e01dca41002 498
donatien 0:8e01dca41002 499 /** Set an mbox invalid so that sys_mbox_valid returns 0 */
donatien 0:8e01dca41002 500 void sys_mbox_set_invalid(sys_mbox_t *pMbox)
donatien 0:8e01dca41002 501 {
donatien 0:8e01dca41002 502 pMbox->valid = false;
donatien 0:8e01dca41002 503 }
donatien 0:8e01dca41002 504
donatien 0:8e01dca41002 505 /*-----------------------------------------------------------------------------------*/
donatien 0:8e01dca41002 506 err_t
donatien 0:8e01dca41002 507 sys_mbox_new(sys_mbox_t* mb, int size)
donatien 0:8e01dca41002 508 {
donatien 0:8e01dca41002 509 LWIP_UNUSED_ARG(size);
donatien 0:8e01dca41002 510
donatien 0:8e01dca41002 511 mb->first = mb->last = 0;
donatien 0:8e01dca41002 512 sys_sem_new(&mb->not_empty, 0);
donatien 0:8e01dca41002 513 sys_sem_new(&mb->not_full, 0);
donatien 0:8e01dca41002 514 sys_sem_new(&mb->mutex, 1);
donatien 0:8e01dca41002 515 mb->wait_send = 0;
donatien 0:8e01dca41002 516 mb->valid=true;
donatien 0:8e01dca41002 517
donatien 0:8e01dca41002 518 return ERR_OK;
donatien 0:8e01dca41002 519 }
donatien 0:8e01dca41002 520 /*-----------------------------------------------------------------------------------*/
donatien 0:8e01dca41002 521 void
donatien 0:8e01dca41002 522 sys_mbox_free(sys_mbox_t* mb)
donatien 0:8e01dca41002 523 {
donatien 0:8e01dca41002 524 if ((mb != NULL)) {
donatien 0:8e01dca41002 525 sys_arch_sem_wait(&mb->mutex, 0);
donatien 0:8e01dca41002 526
donatien 0:8e01dca41002 527 sys_sem_free(&mb->not_empty);
donatien 0:8e01dca41002 528 sys_sem_free(&mb->not_full);
donatien 0:8e01dca41002 529 sys_sem_free(&mb->mutex);
donatien 0:8e01dca41002 530 //mb->not_empty = mb->not_full = mb->mutex = NULL;
donatien 0:8e01dca41002 531 mb->valid=false;
donatien 0:8e01dca41002 532 /* LWIP_DEBUGF("sys_mbox_free: mbox 0x%lx\n", mbox); */
donatien 0:8e01dca41002 533 }
donatien 0:8e01dca41002 534 }
donatien 0:8e01dca41002 535 /*-----------------------------------------------------------------------------------*/
donatien 0:8e01dca41002 536 err_t
donatien 0:8e01dca41002 537 sys_mbox_trypost(sys_mbox_t* mb, void *msg)
donatien 0:8e01dca41002 538 {
donatien 0:8e01dca41002 539 u8_t first;
donatien 0:8e01dca41002 540 LWIP_ASSERT("invalid mbox", (mb != NULL) );
donatien 0:8e01dca41002 541
donatien 0:8e01dca41002 542 sys_arch_sem_wait(&mb->mutex, 0);
donatien 0:8e01dca41002 543
donatien 0:8e01dca41002 544 LWIP_DEBUGF(SYS_DEBUG, ("sys_mbox_trypost: mbox %p msg %p\n",
donatien 0:8e01dca41002 545 (void *)mb, (void *)msg));
donatien 0:8e01dca41002 546
donatien 0:8e01dca41002 547 if ((mb->last + 1) >= (mb->first + SYS_MBOX_SIZE)) {
donatien 0:8e01dca41002 548 sys_sem_signal(&mb->mutex);
donatien 0:8e01dca41002 549 return ERR_MEM;
donatien 0:8e01dca41002 550 }
donatien 0:8e01dca41002 551
donatien 0:8e01dca41002 552 mb->msgs[mb->last % SYS_MBOX_SIZE] = msg;
donatien 0:8e01dca41002 553
donatien 0:8e01dca41002 554 if (mb->last == mb->first) {
donatien 0:8e01dca41002 555 first = 1;
donatien 0:8e01dca41002 556 } else {
donatien 0:8e01dca41002 557 first = 0;
donatien 0:8e01dca41002 558 }
donatien 0:8e01dca41002 559
donatien 0:8e01dca41002 560 mb->last++;
donatien 0:8e01dca41002 561
donatien 0:8e01dca41002 562 if (first) {
donatien 0:8e01dca41002 563 sys_sem_signal(&mb->not_empty);
donatien 0:8e01dca41002 564 }
donatien 0:8e01dca41002 565
donatien 0:8e01dca41002 566 sys_sem_signal(&mb->mutex);
donatien 0:8e01dca41002 567
donatien 0:8e01dca41002 568 return ERR_OK;
donatien 0:8e01dca41002 569 }
donatien 0:8e01dca41002 570 /*-----------------------------------------------------------------------------------*/
donatien 0:8e01dca41002 571 void
donatien 0:8e01dca41002 572 sys_mbox_post(sys_mbox_t* mb, void *msg)
donatien 0:8e01dca41002 573 {
donatien 0:8e01dca41002 574 u8_t first;
donatien 0:8e01dca41002 575 LWIP_ASSERT("invalid mbox", (mb != NULL));
donatien 0:8e01dca41002 576
donatien 0:8e01dca41002 577 sys_arch_sem_wait(&mb->mutex, 0);
donatien 0:8e01dca41002 578
donatien 0:8e01dca41002 579 LWIP_DEBUGF(SYS_DEBUG, ("sys_mbox_post: mbox %p msg %p\n", (void *)mb, (void *)msg));
donatien 0:8e01dca41002 580
donatien 0:8e01dca41002 581 while ((mb->last + 1) >= (mb->first + SYS_MBOX_SIZE)) {
donatien 0:8e01dca41002 582 mb->wait_send++;
donatien 0:8e01dca41002 583 sys_sem_signal(&mb->mutex);
donatien 0:8e01dca41002 584 sys_arch_sem_wait(&mb->not_full, 0);
donatien 0:8e01dca41002 585 sys_arch_sem_wait(&mb->mutex, 0);
donatien 0:8e01dca41002 586 mb->wait_send--;
donatien 0:8e01dca41002 587 }
donatien 0:8e01dca41002 588
donatien 0:8e01dca41002 589 mb->msgs[mb->last % SYS_MBOX_SIZE] = msg;
donatien 0:8e01dca41002 590
donatien 0:8e01dca41002 591 if (mb->last == mb->first) {
donatien 0:8e01dca41002 592 first = 1;
donatien 0:8e01dca41002 593 } else {
donatien 0:8e01dca41002 594 first = 0;
donatien 0:8e01dca41002 595 }
donatien 0:8e01dca41002 596
donatien 0:8e01dca41002 597 mb->last++;
donatien 0:8e01dca41002 598
donatien 0:8e01dca41002 599 if (first) {
donatien 0:8e01dca41002 600 sys_sem_signal(&mb->not_empty);
donatien 0:8e01dca41002 601 }
donatien 0:8e01dca41002 602
donatien 0:8e01dca41002 603 sys_sem_signal(&mb->mutex);
donatien 0:8e01dca41002 604 }
donatien 0:8e01dca41002 605 /*-----------------------------------------------------------------------------------*/
donatien 0:8e01dca41002 606 u32_t
donatien 0:8e01dca41002 607 sys_arch_mbox_tryfetch(sys_mbox_t* mb, void **msg)
donatien 0:8e01dca41002 608 {
donatien 0:8e01dca41002 609 LWIP_ASSERT("invalid mbox", (mb != NULL));
donatien 0:8e01dca41002 610
donatien 0:8e01dca41002 611 sys_arch_sem_wait(&mb->mutex, 0);
donatien 0:8e01dca41002 612
donatien 0:8e01dca41002 613 if (mb->first == mb->last) {
donatien 0:8e01dca41002 614 sys_sem_signal(&mb->mutex);
donatien 0:8e01dca41002 615 return SYS_MBOX_EMPTY;
donatien 0:8e01dca41002 616 }
donatien 0:8e01dca41002 617
donatien 0:8e01dca41002 618 if (msg != NULL) {
donatien 0:8e01dca41002 619 LWIP_DEBUGF(SYS_DEBUG, ("sys_mbox_tryfetch: mbox %p msg %p\n", (void *)mb, *msg));
donatien 0:8e01dca41002 620 *msg = mb->msgs[mb->first % SYS_MBOX_SIZE];
donatien 0:8e01dca41002 621 }
donatien 0:8e01dca41002 622 else{
donatien 0:8e01dca41002 623 LWIP_DEBUGF(SYS_DEBUG, ("sys_mbox_tryfetch: mbox %p, null msg\n", (void *)mb));
donatien 0:8e01dca41002 624 }
donatien 0:8e01dca41002 625
donatien 0:8e01dca41002 626 mb->first++;
donatien 0:8e01dca41002 627
donatien 0:8e01dca41002 628 if (mb->wait_send) {
donatien 0:8e01dca41002 629 sys_sem_signal(&mb->not_full);
donatien 0:8e01dca41002 630 }
donatien 0:8e01dca41002 631
donatien 0:8e01dca41002 632 sys_sem_signal(&mb->mutex);
donatien 0:8e01dca41002 633
donatien 0:8e01dca41002 634 return 0;
donatien 0:8e01dca41002 635 }
donatien 0:8e01dca41002 636 /*-----------------------------------------------------------------------------------*/
donatien 0:8e01dca41002 637 u32_t
donatien 0:8e01dca41002 638 sys_arch_mbox_fetch(sys_mbox_t* mb, void **msg, u32_t timeout)
donatien 0:8e01dca41002 639 {
donatien 0:8e01dca41002 640 u32_t time_needed = 0;
donatien 0:8e01dca41002 641 LWIP_ASSERT("invalid mbox", (mb != NULL));
donatien 0:8e01dca41002 642
donatien 0:8e01dca41002 643 /* The mutex lock is quick so we don't bother with the timeout
donatien 0:8e01dca41002 644 stuff here. */
donatien 0:8e01dca41002 645 sys_arch_sem_wait(&mb->mutex, 0);
donatien 0:8e01dca41002 646
donatien 0:8e01dca41002 647 while (mb->first == mb->last) {
donatien 0:8e01dca41002 648 sys_sem_signal(&mb->mutex);
donatien 0:8e01dca41002 649
donatien 0:8e01dca41002 650 /* We block while waiting for a mail to arrive in the mailbox. We
donatien 0:8e01dca41002 651 must be prepared to timeout. */
donatien 0:8e01dca41002 652 if (timeout != 0) {
donatien 0:8e01dca41002 653 time_needed = sys_arch_sem_wait(&mb->not_empty, timeout);
donatien 0:8e01dca41002 654
donatien 0:8e01dca41002 655 if (time_needed == SYS_ARCH_TIMEOUT) {
donatien 0:8e01dca41002 656 return SYS_ARCH_TIMEOUT;
donatien 0:8e01dca41002 657 }
donatien 0:8e01dca41002 658 } else {
donatien 0:8e01dca41002 659 sys_arch_sem_wait(&mb->not_empty, 0);
donatien 0:8e01dca41002 660 }
donatien 0:8e01dca41002 661 sys_arch_sem_wait(&mb->mutex, 0);
donatien 0:8e01dca41002 662 }
donatien 0:8e01dca41002 663
donatien 0:8e01dca41002 664 if (msg != NULL) {
donatien 0:8e01dca41002 665 LWIP_DEBUGF(SYS_DEBUG, ("sys_mbox_fetch: mbox %p msg %p\n", (void *)mb, *msg));
donatien 0:8e01dca41002 666 *msg = mb->msgs[mb->first % SYS_MBOX_SIZE];
donatien 0:8e01dca41002 667 }
donatien 0:8e01dca41002 668 else{
donatien 0:8e01dca41002 669 LWIP_DEBUGF(SYS_DEBUG, ("sys_mbox_fetch: mbox %p, null msg\n", (void *)mb));
donatien 0:8e01dca41002 670 }
donatien 0:8e01dca41002 671
donatien 0:8e01dca41002 672 mb->first++;
donatien 0:8e01dca41002 673
donatien 0:8e01dca41002 674 if (mb->wait_send) {
donatien 0:8e01dca41002 675 sys_sem_signal(&mb->not_full);
donatien 0:8e01dca41002 676 }
donatien 0:8e01dca41002 677
donatien 0:8e01dca41002 678 sys_sem_signal(&mb->mutex);
donatien 0:8e01dca41002 679
donatien 0:8e01dca41002 680 return time_needed;
donatien 0:8e01dca41002 681 }
donatien 0:8e01dca41002 682
donatien 0:8e01dca41002 683 #endif
donatien 0:8e01dca41002 684
donatien 0:8e01dca41002 685 //Threads and timeout lists
donatien 0:8e01dca41002 686
donatien 0:8e01dca41002 687 /*
donatien 0:8e01dca41002 688 The implementation reserves a pool of threads that can be used by
donatien 0:8e01dca41002 689 LwIP in order to only use static allocation
donatien 0:8e01dca41002 690 */
donatien 0:8e01dca41002 691
donatien 0:8e01dca41002 692 //sys_thread_t* lwip_system_threads = NULL; //Linked list of active threads
donatien 0:8e01dca41002 693 //struct sys_timeo* lwip_system_timeouts = NULL; // Default timeouts list for lwIP
donatien 0:8e01dca41002 694
donatien 0:8e01dca41002 695 /*
donatien 0:8e01dca41002 696 Instanciates a thread for LwIP:
donatien 0:8e01dca41002 697 name is the thread name. thread(arg) is the call made as the thread's
donatien 0:8e01dca41002 698 entry point. stacksize is the recommended stack size for this thread.
donatien 0:8e01dca41002 699 prio is the priority that lwIP asks for. Stack size(s) and priority(ies)
donatien 0:8e01dca41002 700 are defined in lwipopts.h.
donatien 0:8e01dca41002 701 */
donatien 0:8e01dca41002 702
donatien 0:8e01dca41002 703 struct sys_thread
donatien 0:8e01dca41002 704 {
donatien 0:8e01dca41002 705 Thread* pTask;
donatien 0:8e01dca41002 706 //struct sys_timeo* timeouts;
donatien 0:8e01dca41002 707 struct sys_thread* next;
donatien 0:8e01dca41002 708 };
donatien 0:8e01dca41002 709 struct sys_thread* lwip_system_threads = NULL; //Linked list of active threads
donatien 0:8e01dca41002 710
donatien 0:8e01dca41002 711 sys_thread_t sys_thread_new(const char *name, lwip_thread_fn fn, void *arg, int stacksize, int prio)
donatien 0:8e01dca41002 712 {
donatien 0:8e01dca41002 713 SYS_ARCH_DECL_PROTECT(lev);
donatien 0:8e01dca41002 714 SYS_ARCH_PROTECT(lev); //Protect this section
donatien 0:8e01dca41002 715 struct sys_thread* pT = new struct sys_thread;
donatien 0:8e01dca41002 716 SYS_ARCH_UNPROTECT(lev);
donatien 0:8e01dca41002 717 if(pT==NULL)
donatien 0:8e01dca41002 718 {
donatien 0:8e01dca41002 719 ERR("No mem");
donatien 0:8e01dca41002 720 return;
donatien 0:8e01dca41002 721 }
donatien 0:8e01dca41002 722
donatien 0:8e01dca41002 723 SYS_ARCH_PROTECT(lev); //Protect this section
donatien 0:8e01dca41002 724
donatien 0:8e01dca41002 725 //Link in list
donatien 0:8e01dca41002 726 pT->next = lwip_system_threads;
donatien 0:8e01dca41002 727 lwip_system_threads = pT;
donatien 0:8e01dca41002 728
donatien 0:8e01dca41002 729
donatien 0:8e01dca41002 730 SYS_ARCH_UNPROTECT(lev); //Protect this section
donatien 0:8e01dca41002 731
donatien 0:8e01dca41002 732 DBG("Trying to create new thread of stacksize %d and prio %d", stacksize, prio);
donatien 0:8e01dca41002 733
donatien 0:8e01dca41002 734 //Must be done at the very end because the task will start immediately
donatien 0:8e01dca41002 735 SYS_ARCH_PROTECT(lev);
donatien 0:8e01dca41002 736 pT->pTask = new Thread((void (*)(void const *argument))fn, arg, (osPriority)prio /*FIXME*/, stacksize);
donatien 0:8e01dca41002 737 SYS_ARCH_UNPROTECT(lev);
donatien 0:8e01dca41002 738
donatien 0:8e01dca41002 739 DBG("pT->pTask=%p", pT->pTask);
donatien 0:8e01dca41002 740 if(pT->pTask == NULL)
donatien 0:8e01dca41002 741 {
donatien 0:8e01dca41002 742 SYS_ARCH_PROTECT(lev);
donatien 0:8e01dca41002 743
donatien 0:8e01dca41002 744 //Unlink
donatien 0:8e01dca41002 745 if(pT == lwip_system_threads)
donatien 0:8e01dca41002 746 {
donatien 0:8e01dca41002 747 lwip_system_threads = pT->next;
donatien 0:8e01dca41002 748 }
donatien 0:8e01dca41002 749 else
donatien 0:8e01dca41002 750 {
donatien 0:8e01dca41002 751 struct sys_thread* pLT = lwip_system_threads;
donatien 0:8e01dca41002 752 while(pLT->next != pT)
donatien 0:8e01dca41002 753 {
donatien 0:8e01dca41002 754 pLT = pLT->next;
donatien 0:8e01dca41002 755 }
donatien 0:8e01dca41002 756 pLT->next = pT->next;
donatien 0:8e01dca41002 757 }
donatien 0:8e01dca41002 758 SYS_ARCH_UNPROTECT(lev); //Release protection
donatien 0:8e01dca41002 759 SYS_ARCH_PROTECT(lev);
donatien 0:8e01dca41002 760 delete pT;
donatien 0:8e01dca41002 761 SYS_ARCH_UNPROTECT(lev);
donatien 0:8e01dca41002 762 ERR("No mem");
donatien 0:8e01dca41002 763 return;
donatien 0:8e01dca41002 764 }
donatien 0:8e01dca41002 765
donatien 0:8e01dca41002 766 DBG("Thread OK");
donatien 0:8e01dca41002 767 return; //Return the thread
donatien 0:8e01dca41002 768 }
donatien 0:8e01dca41002 769 #if 0
donatien 0:8e01dca41002 770 struct sys_timeouts *sys_arch_timeouts(void) {
donatien 0:8e01dca41002 771 struct sys_timeo* timeouts;
donatien 0:8e01dca41002 772
donatien 0:8e01dca41002 773 SYS_ARCH_DECL_PROTECT(lev);
donatien 0:8e01dca41002 774
donatien 0:8e01dca41002 775 timeouts = &lwip_system_timeouts; //If there is no match, just return the system-wide default version
donatien 0:8e01dca41002 776
donatien 0:8e01dca41002 777 SYS_ARCH_PROTECT(lev); //Protect this section
donatien 0:8e01dca41002 778
donatien 0:8e01dca41002 779 sys_thread_t pT = lwip_system_threads;
donatien 0:8e01dca41002 780
donatien 0:8e01dca41002 781 // Search the threads list for the thread that is currently running
donatien 0:8e01dca41002 782 for ( ; pT!=NULL; pT=pT->next)
donatien 0:8e01dca41002 783 {
donatien 0:8e01dca41002 784 if ( Task::isCurrent(pT->pTask) )
donatien 0:8e01dca41002 785 {
donatien 0:8e01dca41002 786 timeouts = pT->timeouts;
donatien 0:8e01dca41002 787 }
donatien 0:8e01dca41002 788 }
donatien 0:8e01dca41002 789
donatien 0:8e01dca41002 790 SYS_ARCH_UNPROTECT(lev); //Release protection
donatien 0:8e01dca41002 791
donatien 0:8e01dca41002 792 return timeouts;
donatien 0:8e01dca41002 793 }
donatien 0:8e01dca41002 794 #endif
donatien 0:8e01dca41002 795 /*
donatien 0:8e01dca41002 796 Architecture-specific initialization.
donatien 0:8e01dca41002 797 */
donatien 0:8e01dca41002 798 static Timer sys_jiffies_timer;
donatien 0:8e01dca41002 799
donatien 0:8e01dca41002 800 void sys_init(void)
donatien 0:8e01dca41002 801 {
donatien 0:8e01dca41002 802 sys_jiffies_timer.start();
donatien 0:8e01dca41002 803 }
donatien 0:8e01dca41002 804
donatien 0:8e01dca41002 805 /*
donatien 0:8e01dca41002 806 Used by PPP as a timestamp-ish value.
donatien 0:8e01dca41002 807 */
donatien 0:8e01dca41002 808 u32_t sys_jiffies(void)
donatien 0:8e01dca41002 809 {
donatien 0:8e01dca41002 810 static u32_t jiffies = 0;
donatien 0:8e01dca41002 811 jiffies += 1 + sys_jiffies_timer.read_ms()/10;
donatien 0:8e01dca41002 812 sys_jiffies_timer.reset();
donatien 0:8e01dca41002 813
donatien 0:8e01dca41002 814 return jiffies;
donatien 0:8e01dca41002 815 }
donatien 0:8e01dca41002 816
donatien 0:8e01dca41002 817 /**
donatien 0:8e01dca41002 818 * Sleep for some ms. Timeouts are NOT processed while sleeping.
donatien 0:8e01dca41002 819 *
donatien 0:8e01dca41002 820 * @param ms number of milliseconds to sleep
donatien 0:8e01dca41002 821 */
donatien 0:8e01dca41002 822 //Change DG, arch specific
donatien 0:8e01dca41002 823 void
donatien 0:8e01dca41002 824 sys_msleep(u32_t ms)
donatien 0:8e01dca41002 825 {
donatien 0:8e01dca41002 826 Thread::wait(ms);
donatien 0:8e01dca41002 827 }
donatien 0:8e01dca41002 828
donatien 0:8e01dca41002 829 } //extern "C"