local fork (temporary)

Dependents:   VodafoneUSBModem_bleedingedge2

Fork of lwip-sys by mbed official

Committer:
donatien
Date:
Mon Jul 16 14:46:19 2012 +0000
Revision:
5:5ca31173e0aa
Parent:
4:dd37867293e7
Child:
6:2ace1ff71ae6
Fixed sys_arch.c for compatibility with mbed-rtos rev. 1 +; If you need to stick to using mbed-rtos rev. 0 do NOT update or the compilation will fail

Who changed what in which revision?

UserRevisionLine numberNew contents of line
donatien 4:dd37867293e7 1 /* Copyright (C) 2012 mbed.org, MIT License
donatien 4:dd37867293e7 2 *
donatien 4:dd37867293e7 3 * Permission is hereby granted, free of charge, to any person obtaining a copy of this software
donatien 4:dd37867293e7 4 * and associated documentation files (the "Software"), to deal in the Software without restriction,
donatien 4:dd37867293e7 5 * including without limitation the rights to use, copy, modify, merge, publish, distribute,
donatien 4:dd37867293e7 6 * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
donatien 4:dd37867293e7 7 * furnished to do so, subject to the following conditions:
donatien 4:dd37867293e7 8 *
donatien 4:dd37867293e7 9 * The above copyright notice and this permission notice shall be included in all copies or
donatien 4:dd37867293e7 10 * substantial portions of the Software.
donatien 4:dd37867293e7 11 *
donatien 4:dd37867293e7 12 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
donatien 4:dd37867293e7 13 * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
donatien 4:dd37867293e7 14 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
donatien 4:dd37867293e7 15 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
donatien 4:dd37867293e7 16 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
donatien 4:dd37867293e7 17 */
donatien 4:dd37867293e7 18 #include <string.h>
donatien 4:dd37867293e7 19
donatien 4:dd37867293e7 20 /* mbed includes */
donatien 4:dd37867293e7 21 #include "error.h"
donatien 4:dd37867293e7 22 #include "mbed_interface.h"
donatien 4:dd37867293e7 23 #include "us_ticker_api.h"
donatien 4:dd37867293e7 24
donatien 4:dd37867293e7 25 /* lwIP includes. */
donatien 4:dd37867293e7 26 #include "lwip/opt.h"
donatien 4:dd37867293e7 27 #include "lwip/debug.h"
donatien 4:dd37867293e7 28 #include "lwip/def.h"
donatien 4:dd37867293e7 29 #include "lwip/sys.h"
donatien 4:dd37867293e7 30 #include "lwip/mem.h"
donatien 4:dd37867293e7 31
donatien 4:dd37867293e7 32 #if NO_SYS==1
donatien 4:dd37867293e7 33 #include "cmsis.h"
donatien 4:dd37867293e7 34
donatien 4:dd37867293e7 35 /* Saved total time in ms since timer was enabled */
donatien 4:dd37867293e7 36 static volatile u32_t systick_timems;
donatien 4:dd37867293e7 37
donatien 4:dd37867293e7 38 /* Enable systick rate and interrupt */
donatien 4:dd37867293e7 39 void SysTick_Init(void) {
donatien 4:dd37867293e7 40 if (SysTick_Config(SystemCoreClock / 1000)) {
donatien 4:dd37867293e7 41 while (1); /* Capture error */
donatien 4:dd37867293e7 42 }
donatien 4:dd37867293e7 43 }
donatien 4:dd37867293e7 44
donatien 4:dd37867293e7 45 /** \brief SysTick IRQ handler and timebase management
donatien 4:dd37867293e7 46 *
donatien 4:dd37867293e7 47 * This function keeps a timebase for the sysTick that can be
donatien 4:dd37867293e7 48 * used for other functions. It also calls an external function
donatien 4:dd37867293e7 49 * (SysTick_User) that must be defined outside this handler.
donatien 4:dd37867293e7 50 */
donatien 4:dd37867293e7 51 void SysTick_Handler(void) {
donatien 4:dd37867293e7 52 systick_timems++;
donatien 4:dd37867293e7 53 }
donatien 4:dd37867293e7 54
donatien 4:dd37867293e7 55 /* Delay for the specified number of milliSeconds */
donatien 4:dd37867293e7 56 void osDelay(uint32_t ms) {
donatien 4:dd37867293e7 57 uint32_t to = ms + systick_timems;
donatien 4:dd37867293e7 58 while (to > systick_timems);
donatien 4:dd37867293e7 59 }
donatien 4:dd37867293e7 60
donatien 4:dd37867293e7 61 /* Returns the current time in mS. This is needed for the LWIP timers */
donatien 4:dd37867293e7 62 u32_t sys_now(void) {
donatien 4:dd37867293e7 63 return (u32_t) systick_timems;
donatien 4:dd37867293e7 64 }
donatien 4:dd37867293e7 65
donatien 4:dd37867293e7 66 #else
donatien 4:dd37867293e7 67 /* CMSIS-RTOS implementation of the lwip operating system abstraction */
donatien 4:dd37867293e7 68 #include "arch/sys_arch.h"
donatien 4:dd37867293e7 69
donatien 4:dd37867293e7 70 // #include "us_ticker_api.h" -> Not yet public
donatien 4:dd37867293e7 71 extern uint32_t us_ticker_read(void);
donatien 4:dd37867293e7 72
donatien 4:dd37867293e7 73 /*---------------------------------------------------------------------------*
donatien 4:dd37867293e7 74 * Routine: sys_mbox_new
donatien 4:dd37867293e7 75 *---------------------------------------------------------------------------*
donatien 4:dd37867293e7 76 * Description:
donatien 4:dd37867293e7 77 * Creates a new mailbox
donatien 4:dd37867293e7 78 * Inputs:
donatien 4:dd37867293e7 79 * sys_mbox_t mbox -- Handle of mailbox
donatien 4:dd37867293e7 80 * int queue_sz -- Size of elements in the mailbox
donatien 4:dd37867293e7 81 * Outputs:
donatien 4:dd37867293e7 82 * err_t -- ERR_OK if message posted, else ERR_MEM
donatien 4:dd37867293e7 83 *---------------------------------------------------------------------------*/
donatien 4:dd37867293e7 84 err_t sys_mbox_new(sys_mbox_t *mbox, int queue_sz) {
donatien 4:dd37867293e7 85 if (queue_sz > MB_SIZE)
donatien 4:dd37867293e7 86 error("sys_mbox_new size error\n");
donatien 4:dd37867293e7 87
donatien 4:dd37867293e7 88 #ifdef CMSIS_OS_RTX
donatien 4:dd37867293e7 89 memset(mbox->queue, 0, sizeof(mbox->queue));
donatien 4:dd37867293e7 90 mbox->def.pool = mbox->queue;
donatien 4:dd37867293e7 91 mbox->def.queue_sz = queue_sz;
donatien 4:dd37867293e7 92 #endif
donatien 4:dd37867293e7 93 mbox->id = osMessageCreate(&mbox->def, NULL);
donatien 4:dd37867293e7 94 return (mbox->id == NULL) ? (ERR_MEM) : (ERR_OK);
donatien 4:dd37867293e7 95 }
donatien 4:dd37867293e7 96
donatien 4:dd37867293e7 97 /*---------------------------------------------------------------------------*
donatien 4:dd37867293e7 98 * Routine: sys_mbox_free
donatien 4:dd37867293e7 99 *---------------------------------------------------------------------------*
donatien 4:dd37867293e7 100 * Description:
donatien 4:dd37867293e7 101 * Deallocates a mailbox. If there are messages still present in the
donatien 4:dd37867293e7 102 * mailbox when the mailbox is deallocated, it is an indication of a
donatien 4:dd37867293e7 103 * programming error in lwIP and the developer should be notified.
donatien 4:dd37867293e7 104 * Inputs:
donatien 4:dd37867293e7 105 * sys_mbox_t *mbox -- Handle of mailbox
donatien 4:dd37867293e7 106 *---------------------------------------------------------------------------*/
donatien 4:dd37867293e7 107 void sys_mbox_free(sys_mbox_t *mbox) {
donatien 4:dd37867293e7 108 osEvent event = osMessageGet(mbox->id, 0);
donatien 4:dd37867293e7 109 if (event.status == osEventMessage)
donatien 4:dd37867293e7 110 error("sys_mbox_free error\n");
donatien 4:dd37867293e7 111 }
donatien 4:dd37867293e7 112
donatien 4:dd37867293e7 113 /*---------------------------------------------------------------------------*
donatien 4:dd37867293e7 114 * Routine: sys_mbox_post
donatien 4:dd37867293e7 115 *---------------------------------------------------------------------------*
donatien 4:dd37867293e7 116 * Description:
donatien 4:dd37867293e7 117 * Post the "msg" to the mailbox.
donatien 4:dd37867293e7 118 * Inputs:
donatien 4:dd37867293e7 119 * sys_mbox_t mbox -- Handle of mailbox
donatien 4:dd37867293e7 120 * void *msg -- Pointer to data to post
donatien 4:dd37867293e7 121 *---------------------------------------------------------------------------*/
donatien 4:dd37867293e7 122 void sys_mbox_post(sys_mbox_t *mbox, void *msg) {
donatien 4:dd37867293e7 123 if (osMessagePut(mbox->id, (uint32_t)msg, osWaitForever) != osOK)
donatien 4:dd37867293e7 124 error("sys_mbox_post error\n");
donatien 4:dd37867293e7 125 }
donatien 4:dd37867293e7 126
donatien 4:dd37867293e7 127 /*---------------------------------------------------------------------------*
donatien 4:dd37867293e7 128 * Routine: sys_mbox_trypost
donatien 4:dd37867293e7 129 *---------------------------------------------------------------------------*
donatien 4:dd37867293e7 130 * Description:
donatien 4:dd37867293e7 131 * Try to post the "msg" to the mailbox. Returns immediately with
donatien 4:dd37867293e7 132 * error if cannot.
donatien 4:dd37867293e7 133 * Inputs:
donatien 4:dd37867293e7 134 * sys_mbox_t mbox -- Handle of mailbox
donatien 4:dd37867293e7 135 * void *msg -- Pointer to data to post
donatien 4:dd37867293e7 136 * Outputs:
donatien 4:dd37867293e7 137 * err_t -- ERR_OK if message posted, else ERR_MEM
donatien 4:dd37867293e7 138 * if not.
donatien 4:dd37867293e7 139 *---------------------------------------------------------------------------*/
donatien 4:dd37867293e7 140 err_t sys_mbox_trypost(sys_mbox_t *mbox, void *msg) {
donatien 4:dd37867293e7 141 osStatus status = osMessagePut(mbox->id, (uint32_t)msg, 0);
donatien 4:dd37867293e7 142 return (status == osOK) ? (ERR_OK) : (ERR_MEM);
donatien 4:dd37867293e7 143 }
donatien 4:dd37867293e7 144
donatien 4:dd37867293e7 145 /*---------------------------------------------------------------------------*
donatien 4:dd37867293e7 146 * Routine: sys_arch_mbox_fetch
donatien 4:dd37867293e7 147 *---------------------------------------------------------------------------*
donatien 4:dd37867293e7 148 * Description:
donatien 4:dd37867293e7 149 * Blocks the thread until a message arrives in the mailbox, but does
donatien 4:dd37867293e7 150 * not block the thread longer than "timeout" milliseconds (similar to
donatien 4:dd37867293e7 151 * the sys_arch_sem_wait() function). The "msg" argument is a result
donatien 4:dd37867293e7 152 * parameter that is set by the function (i.e., by doing "*msg =
donatien 4:dd37867293e7 153 * ptr"). The "msg" parameter maybe NULL to indicate that the message
donatien 4:dd37867293e7 154 * should be dropped.
donatien 4:dd37867293e7 155 *
donatien 4:dd37867293e7 156 * The return values are the same as for the sys_arch_sem_wait() function:
donatien 4:dd37867293e7 157 * Number of milliseconds spent waiting or SYS_ARCH_TIMEOUT if there was a
donatien 4:dd37867293e7 158 * timeout.
donatien 4:dd37867293e7 159 *
donatien 4:dd37867293e7 160 * Note that a function with a similar name, sys_mbox_fetch(), is
donatien 4:dd37867293e7 161 * implemented by lwIP.
donatien 4:dd37867293e7 162 * Inputs:
donatien 4:dd37867293e7 163 * sys_mbox_t mbox -- Handle of mailbox
donatien 4:dd37867293e7 164 * void **msg -- Pointer to pointer to msg received
donatien 4:dd37867293e7 165 * u32_t timeout -- Number of milliseconds until timeout
donatien 4:dd37867293e7 166 * Outputs:
donatien 4:dd37867293e7 167 * u32_t -- SYS_ARCH_TIMEOUT if timeout, else number
donatien 4:dd37867293e7 168 * of milliseconds until received.
donatien 4:dd37867293e7 169 *---------------------------------------------------------------------------*/
donatien 4:dd37867293e7 170 u32_t sys_arch_mbox_fetch(sys_mbox_t *mbox, void **msg, u32_t timeout) {
donatien 4:dd37867293e7 171 u32_t start = us_ticker_read();
donatien 4:dd37867293e7 172
donatien 4:dd37867293e7 173 osEvent event = osMessageGet(mbox->id, (timeout != 0)?(timeout):(osWaitForever));
donatien 4:dd37867293e7 174 if (event.status != osEventMessage)
donatien 4:dd37867293e7 175 return SYS_ARCH_TIMEOUT;
donatien 4:dd37867293e7 176
donatien 4:dd37867293e7 177 *msg = (void *)event.value.v;
donatien 4:dd37867293e7 178
donatien 4:dd37867293e7 179 return (us_ticker_read() - start) / 1000;
donatien 4:dd37867293e7 180 }
donatien 4:dd37867293e7 181
donatien 4:dd37867293e7 182 /*---------------------------------------------------------------------------*
donatien 4:dd37867293e7 183 * Routine: sys_arch_mbox_tryfetch
donatien 4:dd37867293e7 184 *---------------------------------------------------------------------------*
donatien 4:dd37867293e7 185 * Description:
donatien 4:dd37867293e7 186 * Similar to sys_arch_mbox_fetch, but if message is not ready
donatien 4:dd37867293e7 187 * immediately, we'll return with SYS_MBOX_EMPTY. On success, 0 is
donatien 4:dd37867293e7 188 * returned.
donatien 4:dd37867293e7 189 * Inputs:
donatien 4:dd37867293e7 190 * sys_mbox_t mbox -- Handle of mailbox
donatien 4:dd37867293e7 191 * void **msg -- Pointer to pointer to msg received
donatien 4:dd37867293e7 192 * Outputs:
donatien 4:dd37867293e7 193 * u32_t -- SYS_MBOX_EMPTY if no messages. Otherwise,
donatien 4:dd37867293e7 194 * return ERR_OK.
donatien 4:dd37867293e7 195 *---------------------------------------------------------------------------*/
donatien 4:dd37867293e7 196 u32_t sys_arch_mbox_tryfetch(sys_mbox_t *mbox, void **msg) {
donatien 4:dd37867293e7 197 osEvent event = osMessageGet(mbox->id, 0);
donatien 4:dd37867293e7 198 if (event.status != osEventMessage)
donatien 4:dd37867293e7 199 return SYS_MBOX_EMPTY;
donatien 4:dd37867293e7 200
donatien 4:dd37867293e7 201 *msg = (void *)event.value.v;
donatien 4:dd37867293e7 202
donatien 4:dd37867293e7 203 return ERR_OK;
donatien 4:dd37867293e7 204 }
donatien 4:dd37867293e7 205
donatien 4:dd37867293e7 206 /*---------------------------------------------------------------------------*
donatien 4:dd37867293e7 207 * Routine: sys_sem_new
donatien 4:dd37867293e7 208 *---------------------------------------------------------------------------*
donatien 4:dd37867293e7 209 * Description:
donatien 4:dd37867293e7 210 * Creates and returns a new semaphore. The "ucCount" argument specifies
donatien 4:dd37867293e7 211 * the initial state of the semaphore.
donatien 4:dd37867293e7 212 * NOTE: Currently this routine only creates counts of 1 or 0
donatien 4:dd37867293e7 213 * Inputs:
donatien 4:dd37867293e7 214 * sys_sem_t sem -- Handle of semaphore
donatien 4:dd37867293e7 215 * u8_t count -- Initial count of semaphore
donatien 4:dd37867293e7 216 * Outputs:
donatien 4:dd37867293e7 217 * err_t -- ERR_OK if semaphore created
donatien 4:dd37867293e7 218 *---------------------------------------------------------------------------*/
donatien 4:dd37867293e7 219 err_t sys_sem_new(sys_sem_t *sem, u8_t count) {
donatien 4:dd37867293e7 220 #ifdef CMSIS_OS_RTX
donatien 4:dd37867293e7 221 memset(sem->data, 0, sizeof(uint32_t)*2);
donatien 4:dd37867293e7 222 sem->def.semaphore = sem->data;
donatien 4:dd37867293e7 223 #endif
donatien 4:dd37867293e7 224 // We cannot initialize the semaphore to 0
donatien 4:dd37867293e7 225 sem->id = osSemaphoreCreate(&sem->def, (count ? count : 1));
donatien 4:dd37867293e7 226 if (sem->id == NULL)
donatien 4:dd37867293e7 227 error("sys_sem_new create error\n");
donatien 4:dd37867293e7 228
donatien 4:dd37867293e7 229 // We cannot initialize the semaphore to 0
donatien 4:dd37867293e7 230 if (count == 0) {
donatien 4:dd37867293e7 231 if (osSemaphoreWait(sem->id, osWaitForever) < 1)
donatien 4:dd37867293e7 232 error("sys_sem_new wait error\n");
donatien 4:dd37867293e7 233 }
donatien 4:dd37867293e7 234
donatien 4:dd37867293e7 235 return ERR_OK;
donatien 4:dd37867293e7 236 }
donatien 4:dd37867293e7 237
donatien 4:dd37867293e7 238 /*---------------------------------------------------------------------------*
donatien 4:dd37867293e7 239 * Routine: sys_arch_sem_wait
donatien 4:dd37867293e7 240 *---------------------------------------------------------------------------*
donatien 4:dd37867293e7 241 * Description:
donatien 4:dd37867293e7 242 * Blocks the thread while waiting for the semaphore to be
donatien 4:dd37867293e7 243 * signaled. If the "timeout" argument is non-zero, the thread should
donatien 4:dd37867293e7 244 * only be blocked for the specified time (measured in
donatien 4:dd37867293e7 245 * milliseconds).
donatien 4:dd37867293e7 246 *
donatien 4:dd37867293e7 247 * If the timeout argument is non-zero, the return value is the number of
donatien 4:dd37867293e7 248 * milliseconds spent waiting for the semaphore to be signaled. If the
donatien 4:dd37867293e7 249 * semaphore wasn't signaled within the specified time, the return value is
donatien 4:dd37867293e7 250 * SYS_ARCH_TIMEOUT. If the thread didn't have to wait for the semaphore
donatien 4:dd37867293e7 251 * (i.e., it was already signaled), the function may return zero.
donatien 4:dd37867293e7 252 *
donatien 4:dd37867293e7 253 * Notice that lwIP implements a function with a similar name,
donatien 4:dd37867293e7 254 * sys_sem_wait(), that uses the sys_arch_sem_wait() function.
donatien 4:dd37867293e7 255 * Inputs:
donatien 4:dd37867293e7 256 * sys_sem_t sem -- Semaphore to wait on
donatien 4:dd37867293e7 257 * u32_t timeout -- Number of milliseconds until timeout
donatien 4:dd37867293e7 258 * Outputs:
donatien 4:dd37867293e7 259 * u32_t -- Time elapsed or SYS_ARCH_TIMEOUT.
donatien 4:dd37867293e7 260 *---------------------------------------------------------------------------*/
donatien 4:dd37867293e7 261 u32_t sys_arch_sem_wait(sys_sem_t *sem, u32_t timeout) {
donatien 4:dd37867293e7 262 u32_t start = us_ticker_read();
donatien 4:dd37867293e7 263
donatien 4:dd37867293e7 264 if (osSemaphoreWait(sem->id, (timeout != 0)?(timeout):(osWaitForever)) < 1)
donatien 4:dd37867293e7 265 return SYS_ARCH_TIMEOUT;
donatien 4:dd37867293e7 266
donatien 4:dd37867293e7 267 return (us_ticker_read() - start) / 1000;
donatien 4:dd37867293e7 268 }
donatien 4:dd37867293e7 269
donatien 4:dd37867293e7 270 /*---------------------------------------------------------------------------*
donatien 4:dd37867293e7 271 * Routine: sys_sem_signal
donatien 4:dd37867293e7 272 *---------------------------------------------------------------------------*
donatien 4:dd37867293e7 273 * Description:
donatien 4:dd37867293e7 274 * Signals (releases) a semaphore
donatien 4:dd37867293e7 275 * Inputs:
donatien 4:dd37867293e7 276 * sys_sem_t sem -- Semaphore to signal
donatien 4:dd37867293e7 277 *---------------------------------------------------------------------------*/
donatien 4:dd37867293e7 278 void sys_sem_signal(sys_sem_t *data) {
donatien 4:dd37867293e7 279 if (osSemaphoreRelease(data->id) != osOK)
donatien 4:dd37867293e7 280 mbed_die(); /* Can be called by ISR do not use printf */
donatien 4:dd37867293e7 281 }
donatien 4:dd37867293e7 282
donatien 4:dd37867293e7 283 /*---------------------------------------------------------------------------*
donatien 4:dd37867293e7 284 * Routine: sys_sem_free
donatien 4:dd37867293e7 285 *---------------------------------------------------------------------------*
donatien 4:dd37867293e7 286 * Description:
donatien 4:dd37867293e7 287 * Deallocates a semaphore
donatien 4:dd37867293e7 288 * Inputs:
donatien 4:dd37867293e7 289 * sys_sem_t sem -- Semaphore to free
donatien 4:dd37867293e7 290 *---------------------------------------------------------------------------*/
donatien 4:dd37867293e7 291 void sys_sem_free(sys_sem_t *sem) {}
donatien 4:dd37867293e7 292
donatien 4:dd37867293e7 293 /** Create a new mutex
donatien 4:dd37867293e7 294 * @param mutex pointer to the mutex to create
donatien 4:dd37867293e7 295 * @return a new mutex */
donatien 4:dd37867293e7 296 err_t sys_mutex_new(sys_mutex_t *mutex) {
donatien 4:dd37867293e7 297 #ifdef CMSIS_OS_RTX
donatien 4:dd37867293e7 298 memset(mutex->data, 0, sizeof(int32_t)*3);
donatien 4:dd37867293e7 299 mutex->def.mutex = mutex->data;
donatien 4:dd37867293e7 300 #endif
donatien 4:dd37867293e7 301 mutex->id = osMutexCreate(&mutex->def);
donatien 4:dd37867293e7 302 if (mutex->id == NULL)
donatien 4:dd37867293e7 303 return ERR_MEM;
donatien 4:dd37867293e7 304
donatien 4:dd37867293e7 305 return ERR_OK;
donatien 4:dd37867293e7 306 }
donatien 4:dd37867293e7 307
donatien 4:dd37867293e7 308 /** Lock a mutex
donatien 4:dd37867293e7 309 * @param mutex the mutex to lock */
donatien 4:dd37867293e7 310 void sys_mutex_lock(sys_mutex_t *mutex) {
donatien 4:dd37867293e7 311 if (osMutexWait(mutex->id, osWaitForever) != osOK)
donatien 4:dd37867293e7 312 error("sys_mutex_lock error\n");
donatien 4:dd37867293e7 313 }
donatien 4:dd37867293e7 314
donatien 4:dd37867293e7 315 /** Unlock a mutex
donatien 4:dd37867293e7 316 * @param mutex the mutex to unlock */
donatien 4:dd37867293e7 317 void sys_mutex_unlock(sys_mutex_t *mutex) {
donatien 4:dd37867293e7 318 if (osMutexRelease(mutex->id) != osOK)
donatien 4:dd37867293e7 319 error("sys_mutex_unlock error\n");
donatien 4:dd37867293e7 320 }
donatien 4:dd37867293e7 321
donatien 4:dd37867293e7 322 /** Delete a mutex
donatien 4:dd37867293e7 323 * @param mutex the mutex to delete */
donatien 4:dd37867293e7 324 void sys_mutex_free(sys_mutex_t *mutex) {}
donatien 4:dd37867293e7 325
donatien 4:dd37867293e7 326 static u32_t us_ticker_start;
donatien 4:dd37867293e7 327
donatien 4:dd37867293e7 328 /*---------------------------------------------------------------------------*
donatien 4:dd37867293e7 329 * Routine: sys_init
donatien 4:dd37867293e7 330 *---------------------------------------------------------------------------*
donatien 4:dd37867293e7 331 * Description:
donatien 4:dd37867293e7 332 * Initialize sys arch
donatien 4:dd37867293e7 333 *---------------------------------------------------------------------------*/
donatien 4:dd37867293e7 334 osMutexId lwip_sys_mutex;
donatien 4:dd37867293e7 335 osMutexDef(lwip_sys_mutex);
donatien 4:dd37867293e7 336
donatien 4:dd37867293e7 337 void sys_init(void) {
donatien 4:dd37867293e7 338 lwip_sys_mutex = osMutexCreate(osMutex(lwip_sys_mutex));
donatien 4:dd37867293e7 339 if (lwip_sys_mutex == NULL)
donatien 4:dd37867293e7 340 error("sys_init error\n");
donatien 4:dd37867293e7 341
donatien 4:dd37867293e7 342 us_ticker_start = us_ticker_read();
donatien 4:dd37867293e7 343 }
donatien 4:dd37867293e7 344
donatien 4:dd37867293e7 345 /*---------------------------------------------------------------------------*
donatien 4:dd37867293e7 346 * Routine: sys_jiffies
donatien 4:dd37867293e7 347 *---------------------------------------------------------------------------*
donatien 4:dd37867293e7 348 * Description:
donatien 4:dd37867293e7 349 * Used by PPP as a timestamp-ish value
donatien 4:dd37867293e7 350 *---------------------------------------------------------------------------*/
donatien 4:dd37867293e7 351 u32_t sys_jiffies(void)
donatien 4:dd37867293e7 352 {
donatien 4:dd37867293e7 353 static u32_t jiffies = 0;
donatien 4:dd37867293e7 354 u32_t us_ticker_read_val = us_ticker_read();
donatien 4:dd37867293e7 355 jiffies += 1 + (us_ticker_read_val - us_ticker_start)/10000;
donatien 4:dd37867293e7 356 us_ticker_start = us_ticker_read_val;
donatien 4:dd37867293e7 357
donatien 4:dd37867293e7 358 return jiffies;
donatien 4:dd37867293e7 359 }
donatien 4:dd37867293e7 360
donatien 4:dd37867293e7 361
donatien 4:dd37867293e7 362 /*---------------------------------------------------------------------------*
donatien 4:dd37867293e7 363 * Routine: sys_arch_protect
donatien 4:dd37867293e7 364 *---------------------------------------------------------------------------*
donatien 4:dd37867293e7 365 * Description:
donatien 4:dd37867293e7 366 * This optional function does a "fast" critical region protection and
donatien 4:dd37867293e7 367 * returns the previous protection level. This function is only called
donatien 4:dd37867293e7 368 * during very short critical regions. An embedded system which supports
donatien 4:dd37867293e7 369 * ISR-based drivers might want to implement this function by disabling
donatien 4:dd37867293e7 370 * interrupts. Task-based systems might want to implement this by using
donatien 4:dd37867293e7 371 * a mutex or disabling tasking. This function should support recursive
donatien 4:dd37867293e7 372 * calls from the same task or interrupt. In other words,
donatien 4:dd37867293e7 373 * sys_arch_protect() could be called while already protected. In
donatien 4:dd37867293e7 374 * that case the return value indicates that it is already protected.
donatien 4:dd37867293e7 375 *
donatien 4:dd37867293e7 376 * sys_arch_protect() is only required if your port is supporting an
donatien 4:dd37867293e7 377 * operating system.
donatien 4:dd37867293e7 378 * Outputs:
donatien 4:dd37867293e7 379 * sys_prot_t -- Previous protection level (not used here)
donatien 4:dd37867293e7 380 *---------------------------------------------------------------------------*/
donatien 4:dd37867293e7 381 sys_prot_t sys_arch_protect(void) {
donatien 4:dd37867293e7 382 if (osMutexWait(lwip_sys_mutex, osWaitForever) != osOK)
donatien 4:dd37867293e7 383 error("sys_arch_protect error\n");
donatien 4:dd37867293e7 384 return (sys_prot_t) 1;
donatien 4:dd37867293e7 385 }
donatien 4:dd37867293e7 386
donatien 4:dd37867293e7 387 /*---------------------------------------------------------------------------*
donatien 4:dd37867293e7 388 * Routine: sys_arch_unprotect
donatien 4:dd37867293e7 389 *---------------------------------------------------------------------------*
donatien 4:dd37867293e7 390 * Description:
donatien 4:dd37867293e7 391 * This optional function does a "fast" set of critical region
donatien 4:dd37867293e7 392 * protection to the value specified by pval. See the documentation for
donatien 4:dd37867293e7 393 * sys_arch_protect() for more information. This function is only
donatien 4:dd37867293e7 394 * required if your port is supporting an operating system.
donatien 4:dd37867293e7 395 * Inputs:
donatien 4:dd37867293e7 396 * sys_prot_t -- Previous protection level (not used here)
donatien 4:dd37867293e7 397 *---------------------------------------------------------------------------*/
donatien 4:dd37867293e7 398 void sys_arch_unprotect(sys_prot_t p) {
donatien 4:dd37867293e7 399 if (osMutexRelease(lwip_sys_mutex) != osOK)
donatien 4:dd37867293e7 400 error("sys_arch_unprotect error\n");
donatien 4:dd37867293e7 401 }
donatien 4:dd37867293e7 402
donatien 4:dd37867293e7 403 u32_t sys_now(void) {
donatien 4:dd37867293e7 404 return us_ticker_read() / 1000;
donatien 4:dd37867293e7 405 }
donatien 4:dd37867293e7 406
donatien 4:dd37867293e7 407 void sys_msleep(u32_t ms) {
donatien 4:dd37867293e7 408 osDelay(ms);
donatien 4:dd37867293e7 409 }
donatien 4:dd37867293e7 410
donatien 4:dd37867293e7 411 // Keep a pool of thread structures
donatien 4:dd37867293e7 412 static int thread_pool_index = 0;
donatien 4:dd37867293e7 413 static sys_thread_data_t thread_pool[SYS_THREAD_POOL_N];
donatien 4:dd37867293e7 414
donatien 4:dd37867293e7 415 /*---------------------------------------------------------------------------*
donatien 4:dd37867293e7 416 * Routine: sys_thread_new
donatien 4:dd37867293e7 417 *---------------------------------------------------------------------------*
donatien 4:dd37867293e7 418 * Description:
donatien 4:dd37867293e7 419 * Starts a new thread with priority "prio" that will begin its
donatien 4:dd37867293e7 420 * execution in the function "thread()". The "arg" argument will be
donatien 4:dd37867293e7 421 * passed as an argument to the thread() function. The id of the new
donatien 4:dd37867293e7 422 * thread is returned. Both the id and the priority are system
donatien 4:dd37867293e7 423 * dependent.
donatien 4:dd37867293e7 424 * Inputs:
donatien 4:dd37867293e7 425 * char *name -- Name of thread
donatien 4:dd37867293e7 426 * void (*thread)(void *arg) -- Pointer to function to run.
donatien 4:dd37867293e7 427 * void *arg -- Argument passed into function
donatien 4:dd37867293e7 428 * int stacksize -- Required stack amount in bytes
donatien 4:dd37867293e7 429 * int priority -- Thread priority
donatien 4:dd37867293e7 430 * Outputs:
donatien 4:dd37867293e7 431 * sys_thread_t -- Pointer to thread handle.
donatien 4:dd37867293e7 432 *---------------------------------------------------------------------------*/
donatien 4:dd37867293e7 433 sys_thread_t sys_thread_new(const char *pcName,
donatien 4:dd37867293e7 434 void (*thread)(void *arg),
donatien 4:dd37867293e7 435 void *arg, int stacksize, int priority) {
donatien 4:dd37867293e7 436 LWIP_DEBUGF(SYS_DEBUG, ("New Thread: %s\n", pcName));
donatien 4:dd37867293e7 437
donatien 4:dd37867293e7 438 if (thread_pool_index >= SYS_THREAD_POOL_N)
donatien 4:dd37867293e7 439 error("sys_thread_new number error\n");
donatien 4:dd37867293e7 440 sys_thread_t t = (sys_thread_t)&thread_pool[thread_pool_index];
donatien 4:dd37867293e7 441 thread_pool_index++;
donatien 4:dd37867293e7 442
donatien 4:dd37867293e7 443 #ifdef CMSIS_OS_RTX
donatien 4:dd37867293e7 444 t->def.pthread = (os_pthread)thread;
donatien 4:dd37867293e7 445 t->def.tpriority = (osPriority)priority;
donatien 4:dd37867293e7 446 t->def.stacksize = stacksize;
donatien 5:5ca31173e0aa 447 t->def.stack_pointer = (unsigned char*) malloc(stacksize); //Note DG: I don't think that malloc is always thread-safe, this could lead to memory corruption in some cases
donatien 5:5ca31173e0aa 448 if (t->def.stack_pointer == NULL)
donatien 5:5ca31173e0aa 449 {
donatien 5:5ca31173e0aa 450 error("Error allocating the stack memory");
donatien 5:5ca31173e0aa 451 }
donatien 4:dd37867293e7 452 #endif
donatien 4:dd37867293e7 453 t->id = osThreadCreate(&t->def, arg);
donatien 4:dd37867293e7 454 if (t->id == NULL)
donatien 4:dd37867293e7 455 error("sys_thread_new create error\n");
donatien 4:dd37867293e7 456
donatien 4:dd37867293e7 457 return t;
donatien 4:dd37867293e7 458 }
donatien 4:dd37867293e7 459
donatien 4:dd37867293e7 460 #endif
donatien 4:dd37867293e7 461
donatien 4:dd37867293e7 462 #ifdef LWIP_DEBUG
donatien 4:dd37867293e7 463
donatien 4:dd37867293e7 464 /** \brief Displays an error message on assertion
donatien 4:dd37867293e7 465
donatien 4:dd37867293e7 466 This function will display an error message on an assertion
donatien 4:dd37867293e7 467 to the debug output.
donatien 4:dd37867293e7 468
donatien 4:dd37867293e7 469 \param[in] msg Error message to display
donatien 4:dd37867293e7 470 \param[in] line Line number in file with error
donatien 4:dd37867293e7 471 \param[in] file Filename with error
donatien 4:dd37867293e7 472 */
donatien 4:dd37867293e7 473 void assert_printf(char *msg, int line, char *file) {
donatien 4:dd37867293e7 474 if (msg)
donatien 4:dd37867293e7 475 error("%s:%d in file %s\n", msg, line, file);
donatien 4:dd37867293e7 476 else
donatien 4:dd37867293e7 477 error("LWIP ASSERT\n");
donatien 4:dd37867293e7 478 }
donatien 4:dd37867293e7 479
donatien 4:dd37867293e7 480 #endif /* LWIP_DEBUG */