fdsf

Dependents:   sisk_proj_stat MQTT Hello_FXOS8700Q WireFSHandControl ... more

Committer:
grzemich
Date:
Wed Dec 07 23:47:50 2016 +0000
Revision:
0:d7bd7384a37c
dgd

Who changed what in which revision?

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