ソースの整理中ですが、利用はできます。

Dependencies:   EthernetInterface HttpServer TextLCD mbed-rpc mbed-rtos mbed Socket lwip-eth lwip-sys lwip

Committer:
yueee_yt
Date:
Wed Mar 12 04:19:54 2014 +0000
Revision:
0:7766f6712673
???????????????

Who changed what in which revision?

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