Adapted to Lora Semtech + Nucleo

Dependencies:   DebugLib

Dependents:   LoRaWAN-lmic-app LoRaWAN-lmic-app LoRaWAN-test-10secs LoRaPersonalizedDeviceForEverynet ... more

Fork of lwip_ppp_ethernet by Donatien Garnier

Committer:
pnysten
Date:
Fri Nov 20 12:30:58 2015 +0000
Revision:
3:a9e6ba815945
Parent:
0:8e01dca41002
Adapted to Nucleo, LoRa Semtech

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"