Adapted to Lora Semtech + Nucleo
Dependents: LoRaWAN-lmic-app LoRaWAN-lmic-app LoRaWAN-test-10secs LoRaPersonalizedDeviceForEverynet ... more
Fork of lwip_ppp_ethernet by
arch/sys_arch.cpp@3:a9e6ba815945, 2015-11-20 (annotated)
- 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?
User | Revision | Line number | New 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" |