Some quick code to use UDP-only (no TCP) with mBed. Echos received packets and sends packets when a button is pressed

Dependencies:   mbed

Committer:
pehrhovey
Date:
Sun Mar 14 00:54:12 2010 +0000
Revision:
0:a548a085de55

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
pehrhovey 0:a548a085de55 1 /**
pehrhovey 0:a548a085de55 2 * @file
pehrhovey 0:a548a085de55 3 * lwIP Operating System abstraction
pehrhovey 0:a548a085de55 4 *
pehrhovey 0:a548a085de55 5 */
pehrhovey 0:a548a085de55 6
pehrhovey 0:a548a085de55 7 /*
pehrhovey 0:a548a085de55 8 * Copyright (c) 2001-2004 Swedish Institute of Computer Science.
pehrhovey 0:a548a085de55 9 * All rights reserved.
pehrhovey 0:a548a085de55 10 *
pehrhovey 0:a548a085de55 11 * Redistribution and use in source and binary forms, with or without modification,
pehrhovey 0:a548a085de55 12 * are permitted provided that the following conditions are met:
pehrhovey 0:a548a085de55 13 *
pehrhovey 0:a548a085de55 14 * 1. Redistributions of source code must retain the above copyright notice,
pehrhovey 0:a548a085de55 15 * this list of conditions and the following disclaimer.
pehrhovey 0:a548a085de55 16 * 2. Redistributions in binary form must reproduce the above copyright notice,
pehrhovey 0:a548a085de55 17 * this list of conditions and the following disclaimer in the documentation
pehrhovey 0:a548a085de55 18 * and/or other materials provided with the distribution.
pehrhovey 0:a548a085de55 19 * 3. The name of the author may not be used to endorse or promote products
pehrhovey 0:a548a085de55 20 * derived from this software without specific prior written permission.
pehrhovey 0:a548a085de55 21 *
pehrhovey 0:a548a085de55 22 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
pehrhovey 0:a548a085de55 23 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
pehrhovey 0:a548a085de55 24 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
pehrhovey 0:a548a085de55 25 * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
pehrhovey 0:a548a085de55 26 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
pehrhovey 0:a548a085de55 27 * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
pehrhovey 0:a548a085de55 28 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
pehrhovey 0:a548a085de55 29 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
pehrhovey 0:a548a085de55 30 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
pehrhovey 0:a548a085de55 31 * OF SUCH DAMAGE.
pehrhovey 0:a548a085de55 32 *
pehrhovey 0:a548a085de55 33 * This file is part of the lwIP TCP/IP stack.
pehrhovey 0:a548a085de55 34 *
pehrhovey 0:a548a085de55 35 * Author: Adam Dunkels <adam@sics.se>
pehrhovey 0:a548a085de55 36 *
pehrhovey 0:a548a085de55 37 */
pehrhovey 0:a548a085de55 38
pehrhovey 0:a548a085de55 39 #include "lwip/opt.h"
pehrhovey 0:a548a085de55 40
pehrhovey 0:a548a085de55 41 #if (NO_SYS == 0) /* don't build if not configured for use in lwipopts.h */
pehrhovey 0:a548a085de55 42
pehrhovey 0:a548a085de55 43 #include "lwip/sys.h"
pehrhovey 0:a548a085de55 44 #include "lwip/def.h"
pehrhovey 0:a548a085de55 45 #include "lwip/memp.h"
pehrhovey 0:a548a085de55 46 #include "lwip/tcpip.h"
pehrhovey 0:a548a085de55 47
pehrhovey 0:a548a085de55 48 /**
pehrhovey 0:a548a085de55 49 * Struct used for sys_sem_wait_timeout() to tell wether the time
pehrhovey 0:a548a085de55 50 * has run out or the semaphore has really become available.
pehrhovey 0:a548a085de55 51 */
pehrhovey 0:a548a085de55 52 struct sswt_cb
pehrhovey 0:a548a085de55 53 {
pehrhovey 0:a548a085de55 54 s16_t timeflag;
pehrhovey 0:a548a085de55 55 sys_sem_t *psem;
pehrhovey 0:a548a085de55 56 };
pehrhovey 0:a548a085de55 57
pehrhovey 0:a548a085de55 58 /**
pehrhovey 0:a548a085de55 59 * Wait (forever) for a message to arrive in an mbox.
pehrhovey 0:a548a085de55 60 * While waiting, timeouts (for this thread) are processed.
pehrhovey 0:a548a085de55 61 *
pehrhovey 0:a548a085de55 62 * @param mbox the mbox to fetch the message from
pehrhovey 0:a548a085de55 63 * @param msg the place to store the message
pehrhovey 0:a548a085de55 64 */
pehrhovey 0:a548a085de55 65 void
pehrhovey 0:a548a085de55 66 sys_mbox_fetch(sys_mbox_t mbox, void **msg)
pehrhovey 0:a548a085de55 67 {
pehrhovey 0:a548a085de55 68 u32_t time_needed;
pehrhovey 0:a548a085de55 69 struct sys_timeouts *timeouts;
pehrhovey 0:a548a085de55 70 struct sys_timeo *tmptimeout;
pehrhovey 0:a548a085de55 71 sys_timeout_handler h;
pehrhovey 0:a548a085de55 72 void *arg;
pehrhovey 0:a548a085de55 73
pehrhovey 0:a548a085de55 74 again:
pehrhovey 0:a548a085de55 75 timeouts = sys_arch_timeouts();
pehrhovey 0:a548a085de55 76
pehrhovey 0:a548a085de55 77 if (!timeouts || !timeouts->next) {
pehrhovey 0:a548a085de55 78 UNLOCK_TCPIP_CORE();
pehrhovey 0:a548a085de55 79 time_needed = sys_arch_mbox_fetch(mbox, msg, 0);
pehrhovey 0:a548a085de55 80 LOCK_TCPIP_CORE();
pehrhovey 0:a548a085de55 81 } else {
pehrhovey 0:a548a085de55 82 if (timeouts->next->time > 0) {
pehrhovey 0:a548a085de55 83 UNLOCK_TCPIP_CORE();
pehrhovey 0:a548a085de55 84 time_needed = sys_arch_mbox_fetch(mbox, msg, timeouts->next->time);
pehrhovey 0:a548a085de55 85 LOCK_TCPIP_CORE();
pehrhovey 0:a548a085de55 86 } else {
pehrhovey 0:a548a085de55 87 time_needed = SYS_ARCH_TIMEOUT;
pehrhovey 0:a548a085de55 88 }
pehrhovey 0:a548a085de55 89
pehrhovey 0:a548a085de55 90 if (time_needed == SYS_ARCH_TIMEOUT) {
pehrhovey 0:a548a085de55 91 /* If time == SYS_ARCH_TIMEOUT, a timeout occured before a message
pehrhovey 0:a548a085de55 92 could be fetched. We should now call the timeout handler and
pehrhovey 0:a548a085de55 93 deallocate the memory allocated for the timeout. */
pehrhovey 0:a548a085de55 94 tmptimeout = timeouts->next;
pehrhovey 0:a548a085de55 95 timeouts->next = tmptimeout->next;
pehrhovey 0:a548a085de55 96 h = tmptimeout->h;
pehrhovey 0:a548a085de55 97 arg = tmptimeout->arg;
pehrhovey 0:a548a085de55 98 memp_free(MEMP_SYS_TIMEOUT, tmptimeout);
pehrhovey 0:a548a085de55 99 if (h != NULL) {
pehrhovey 0:a548a085de55 100 LWIP_DEBUGF(SYS_DEBUG, ("smf calling h=%p(%p)\n", (void*)&h, arg));
pehrhovey 0:a548a085de55 101 h(arg);
pehrhovey 0:a548a085de55 102 }
pehrhovey 0:a548a085de55 103
pehrhovey 0:a548a085de55 104 /* We try again to fetch a message from the mbox. */
pehrhovey 0:a548a085de55 105 goto again;
pehrhovey 0:a548a085de55 106 } else {
pehrhovey 0:a548a085de55 107 /* If time != SYS_ARCH_TIMEOUT, a message was received before the timeout
pehrhovey 0:a548a085de55 108 occured. The time variable is set to the number of
pehrhovey 0:a548a085de55 109 milliseconds we waited for the message. */
pehrhovey 0:a548a085de55 110 if (time_needed < timeouts->next->time) {
pehrhovey 0:a548a085de55 111 timeouts->next->time -= time_needed;
pehrhovey 0:a548a085de55 112 } else {
pehrhovey 0:a548a085de55 113 timeouts->next->time = 0;
pehrhovey 0:a548a085de55 114 }
pehrhovey 0:a548a085de55 115 }
pehrhovey 0:a548a085de55 116 }
pehrhovey 0:a548a085de55 117 }
pehrhovey 0:a548a085de55 118
pehrhovey 0:a548a085de55 119 /**
pehrhovey 0:a548a085de55 120 * Wait (forever) for a semaphore to become available.
pehrhovey 0:a548a085de55 121 * While waiting, timeouts (for this thread) are processed.
pehrhovey 0:a548a085de55 122 *
pehrhovey 0:a548a085de55 123 * @param sem semaphore to wait for
pehrhovey 0:a548a085de55 124 */
pehrhovey 0:a548a085de55 125 void
pehrhovey 0:a548a085de55 126 sys_sem_wait(sys_sem_t sem)
pehrhovey 0:a548a085de55 127 {
pehrhovey 0:a548a085de55 128 u32_t time_needed;
pehrhovey 0:a548a085de55 129 struct sys_timeouts *timeouts;
pehrhovey 0:a548a085de55 130 struct sys_timeo *tmptimeout;
pehrhovey 0:a548a085de55 131 sys_timeout_handler h;
pehrhovey 0:a548a085de55 132 void *arg;
pehrhovey 0:a548a085de55 133
pehrhovey 0:a548a085de55 134 again:
pehrhovey 0:a548a085de55 135
pehrhovey 0:a548a085de55 136 timeouts = sys_arch_timeouts();
pehrhovey 0:a548a085de55 137
pehrhovey 0:a548a085de55 138 if (!timeouts || !timeouts->next) {
pehrhovey 0:a548a085de55 139 sys_arch_sem_wait(sem, 0);
pehrhovey 0:a548a085de55 140 } else {
pehrhovey 0:a548a085de55 141 if (timeouts->next->time > 0) {
pehrhovey 0:a548a085de55 142 time_needed = sys_arch_sem_wait(sem, timeouts->next->time);
pehrhovey 0:a548a085de55 143 } else {
pehrhovey 0:a548a085de55 144 time_needed = SYS_ARCH_TIMEOUT;
pehrhovey 0:a548a085de55 145 }
pehrhovey 0:a548a085de55 146
pehrhovey 0:a548a085de55 147 if (time_needed == SYS_ARCH_TIMEOUT) {
pehrhovey 0:a548a085de55 148 /* If time == SYS_ARCH_TIMEOUT, a timeout occured before a message
pehrhovey 0:a548a085de55 149 could be fetched. We should now call the timeout handler and
pehrhovey 0:a548a085de55 150 deallocate the memory allocated for the timeout. */
pehrhovey 0:a548a085de55 151 tmptimeout = timeouts->next;
pehrhovey 0:a548a085de55 152 timeouts->next = tmptimeout->next;
pehrhovey 0:a548a085de55 153 h = tmptimeout->h;
pehrhovey 0:a548a085de55 154 arg = tmptimeout->arg;
pehrhovey 0:a548a085de55 155 memp_free(MEMP_SYS_TIMEOUT, tmptimeout);
pehrhovey 0:a548a085de55 156 if (h != NULL) {
pehrhovey 0:a548a085de55 157 LWIP_DEBUGF(SYS_DEBUG, ("ssw h=%p(%p)\n", (void*)&h, (void *)arg));
pehrhovey 0:a548a085de55 158 h(arg);
pehrhovey 0:a548a085de55 159 }
pehrhovey 0:a548a085de55 160
pehrhovey 0:a548a085de55 161 /* We try again to fetch a message from the mbox. */
pehrhovey 0:a548a085de55 162 goto again;
pehrhovey 0:a548a085de55 163 } else {
pehrhovey 0:a548a085de55 164 /* If time != SYS_ARCH_TIMEOUT, a message was received before the timeout
pehrhovey 0:a548a085de55 165 occured. The time variable is set to the number of
pehrhovey 0:a548a085de55 166 milliseconds we waited for the message. */
pehrhovey 0:a548a085de55 167 if (time_needed < timeouts->next->time) {
pehrhovey 0:a548a085de55 168 timeouts->next->time -= time_needed;
pehrhovey 0:a548a085de55 169 } else {
pehrhovey 0:a548a085de55 170 timeouts->next->time = 0;
pehrhovey 0:a548a085de55 171 }
pehrhovey 0:a548a085de55 172 }
pehrhovey 0:a548a085de55 173 }
pehrhovey 0:a548a085de55 174 }
pehrhovey 0:a548a085de55 175
pehrhovey 0:a548a085de55 176 /**
pehrhovey 0:a548a085de55 177 * Create a one-shot timer (aka timeout). Timeouts are processed in the
pehrhovey 0:a548a085de55 178 * following cases:
pehrhovey 0:a548a085de55 179 * - while waiting for a message using sys_mbox_fetch()
pehrhovey 0:a548a085de55 180 * - while waiting for a semaphore using sys_sem_wait() or sys_sem_wait_timeout()
pehrhovey 0:a548a085de55 181 * - while sleeping using the inbuilt sys_msleep()
pehrhovey 0:a548a085de55 182 *
pehrhovey 0:a548a085de55 183 * @param msecs time in milliseconds after that the timer should expire
pehrhovey 0:a548a085de55 184 * @param h callback function to call when msecs have elapsed
pehrhovey 0:a548a085de55 185 * @param arg argument to pass to the callback function
pehrhovey 0:a548a085de55 186 */
pehrhovey 0:a548a085de55 187 void
pehrhovey 0:a548a085de55 188 sys_timeout(u32_t msecs, sys_timeout_handler h, void *arg)
pehrhovey 0:a548a085de55 189 {
pehrhovey 0:a548a085de55 190 struct sys_timeouts *timeouts;
pehrhovey 0:a548a085de55 191 struct sys_timeo *timeout, *t;
pehrhovey 0:a548a085de55 192
pehrhovey 0:a548a085de55 193 timeout = memp_malloc(MEMP_SYS_TIMEOUT);
pehrhovey 0:a548a085de55 194 if (timeout == NULL) {
pehrhovey 0:a548a085de55 195 LWIP_ASSERT("sys_timeout: timeout != NULL", timeout != NULL);
pehrhovey 0:a548a085de55 196 return;
pehrhovey 0:a548a085de55 197 }
pehrhovey 0:a548a085de55 198 timeout->next = NULL;
pehrhovey 0:a548a085de55 199 timeout->h = h;
pehrhovey 0:a548a085de55 200 timeout->arg = arg;
pehrhovey 0:a548a085de55 201 timeout->time = msecs;
pehrhovey 0:a548a085de55 202
pehrhovey 0:a548a085de55 203 timeouts = sys_arch_timeouts();
pehrhovey 0:a548a085de55 204
pehrhovey 0:a548a085de55 205 LWIP_DEBUGF(SYS_DEBUG, ("sys_timeout: %p msecs=%"U32_F" h=%p arg=%p\n",
pehrhovey 0:a548a085de55 206 (void *)timeout, msecs, (void*)&h, (void *)arg));
pehrhovey 0:a548a085de55 207
pehrhovey 0:a548a085de55 208 if (timeouts == NULL) {
pehrhovey 0:a548a085de55 209 LWIP_ASSERT("sys_timeout: timeouts != NULL", timeouts != NULL);
pehrhovey 0:a548a085de55 210 return;
pehrhovey 0:a548a085de55 211 }
pehrhovey 0:a548a085de55 212
pehrhovey 0:a548a085de55 213 if (timeouts->next == NULL) {
pehrhovey 0:a548a085de55 214 timeouts->next = timeout;
pehrhovey 0:a548a085de55 215 return;
pehrhovey 0:a548a085de55 216 }
pehrhovey 0:a548a085de55 217
pehrhovey 0:a548a085de55 218 if (timeouts->next->time > msecs) {
pehrhovey 0:a548a085de55 219 timeouts->next->time -= msecs;
pehrhovey 0:a548a085de55 220 timeout->next = timeouts->next;
pehrhovey 0:a548a085de55 221 timeouts->next = timeout;
pehrhovey 0:a548a085de55 222 } else {
pehrhovey 0:a548a085de55 223 for(t = timeouts->next; t != NULL; t = t->next) {
pehrhovey 0:a548a085de55 224 timeout->time -= t->time;
pehrhovey 0:a548a085de55 225 if (t->next == NULL || t->next->time > timeout->time) {
pehrhovey 0:a548a085de55 226 if (t->next != NULL) {
pehrhovey 0:a548a085de55 227 t->next->time -= timeout->time;
pehrhovey 0:a548a085de55 228 }
pehrhovey 0:a548a085de55 229 timeout->next = t->next;
pehrhovey 0:a548a085de55 230 t->next = timeout;
pehrhovey 0:a548a085de55 231 break;
pehrhovey 0:a548a085de55 232 }
pehrhovey 0:a548a085de55 233 }
pehrhovey 0:a548a085de55 234 }
pehrhovey 0:a548a085de55 235 }
pehrhovey 0:a548a085de55 236
pehrhovey 0:a548a085de55 237 /**
pehrhovey 0:a548a085de55 238 * Go through timeout list (for this task only) and remove the first matching
pehrhovey 0:a548a085de55 239 * entry, even though the timeout has not triggered yet.
pehrhovey 0:a548a085de55 240 *
pehrhovey 0:a548a085de55 241 * @note This function only works as expected if there is only one timeout
pehrhovey 0:a548a085de55 242 * calling 'h' in the list of timeouts.
pehrhovey 0:a548a085de55 243 *
pehrhovey 0:a548a085de55 244 * @param h callback function that would be called by the timeout
pehrhovey 0:a548a085de55 245 * @param arg callback argument that would be passed to h
pehrhovey 0:a548a085de55 246 */
pehrhovey 0:a548a085de55 247 void
pehrhovey 0:a548a085de55 248 sys_untimeout(sys_timeout_handler h, void *arg)
pehrhovey 0:a548a085de55 249 {
pehrhovey 0:a548a085de55 250 struct sys_timeouts *timeouts;
pehrhovey 0:a548a085de55 251 struct sys_timeo *prev_t, *t;
pehrhovey 0:a548a085de55 252
pehrhovey 0:a548a085de55 253 timeouts = sys_arch_timeouts();
pehrhovey 0:a548a085de55 254
pehrhovey 0:a548a085de55 255 if (timeouts == NULL) {
pehrhovey 0:a548a085de55 256 LWIP_ASSERT("sys_untimeout: timeouts != NULL", timeouts != NULL);
pehrhovey 0:a548a085de55 257 return;
pehrhovey 0:a548a085de55 258 }
pehrhovey 0:a548a085de55 259 if (timeouts->next == NULL) {
pehrhovey 0:a548a085de55 260 return;
pehrhovey 0:a548a085de55 261 }
pehrhovey 0:a548a085de55 262
pehrhovey 0:a548a085de55 263 for (t = timeouts->next, prev_t = NULL; t != NULL; prev_t = t, t = t->next) {
pehrhovey 0:a548a085de55 264 if ((t->h == h) && (t->arg == arg)) {
pehrhovey 0:a548a085de55 265 /* We have a match */
pehrhovey 0:a548a085de55 266 /* Unlink from previous in list */
pehrhovey 0:a548a085de55 267 if (prev_t == NULL)
pehrhovey 0:a548a085de55 268 timeouts->next = t->next;
pehrhovey 0:a548a085de55 269 else
pehrhovey 0:a548a085de55 270 prev_t->next = t->next;
pehrhovey 0:a548a085de55 271 /* If not the last one, add time of this one back to next */
pehrhovey 0:a548a085de55 272 if (t->next != NULL)
pehrhovey 0:a548a085de55 273 t->next->time += t->time;
pehrhovey 0:a548a085de55 274 memp_free(MEMP_SYS_TIMEOUT, t);
pehrhovey 0:a548a085de55 275 return;
pehrhovey 0:a548a085de55 276 }
pehrhovey 0:a548a085de55 277 }
pehrhovey 0:a548a085de55 278 return;
pehrhovey 0:a548a085de55 279 }
pehrhovey 0:a548a085de55 280
pehrhovey 0:a548a085de55 281 /**
pehrhovey 0:a548a085de55 282 * Timeout handler function for sys_sem_wait_timeout()
pehrhovey 0:a548a085de55 283 *
pehrhovey 0:a548a085de55 284 * @param arg struct sswt_cb* used to signal a semaphore and end waiting.
pehrhovey 0:a548a085de55 285 */
pehrhovey 0:a548a085de55 286 static void
pehrhovey 0:a548a085de55 287 sswt_handler(void *arg)
pehrhovey 0:a548a085de55 288 {
pehrhovey 0:a548a085de55 289 struct sswt_cb *sswt_cb = (struct sswt_cb *) arg;
pehrhovey 0:a548a085de55 290
pehrhovey 0:a548a085de55 291 /* Timeout. Set flag to TRUE and signal semaphore */
pehrhovey 0:a548a085de55 292 sswt_cb->timeflag = 1;
pehrhovey 0:a548a085de55 293 sys_sem_signal(*(sswt_cb->psem));
pehrhovey 0:a548a085de55 294 }
pehrhovey 0:a548a085de55 295
pehrhovey 0:a548a085de55 296 /**
pehrhovey 0:a548a085de55 297 * Wait for a semaphore with timeout (specified in ms)
pehrhovey 0:a548a085de55 298 *
pehrhovey 0:a548a085de55 299 * @param sem semaphore to wait
pehrhovey 0:a548a085de55 300 * @param timeout timeout in ms (0: wait forever)
pehrhovey 0:a548a085de55 301 * @return 0 on timeout, 1 otherwise
pehrhovey 0:a548a085de55 302 */
pehrhovey 0:a548a085de55 303 int
pehrhovey 0:a548a085de55 304 sys_sem_wait_timeout(sys_sem_t sem, u32_t timeout)
pehrhovey 0:a548a085de55 305 {
pehrhovey 0:a548a085de55 306 struct sswt_cb sswt_cb;
pehrhovey 0:a548a085de55 307
pehrhovey 0:a548a085de55 308 sswt_cb.psem = &sem;
pehrhovey 0:a548a085de55 309 sswt_cb.timeflag = 0;
pehrhovey 0:a548a085de55 310
pehrhovey 0:a548a085de55 311 /* If timeout is zero, then just wait forever */
pehrhovey 0:a548a085de55 312 if (timeout > 0) {
pehrhovey 0:a548a085de55 313 /* Create a timer and pass it the address of our flag */
pehrhovey 0:a548a085de55 314 sys_timeout(timeout, sswt_handler, &sswt_cb);
pehrhovey 0:a548a085de55 315 }
pehrhovey 0:a548a085de55 316 sys_sem_wait(sem);
pehrhovey 0:a548a085de55 317 /* Was it a timeout? */
pehrhovey 0:a548a085de55 318 if (sswt_cb.timeflag) {
pehrhovey 0:a548a085de55 319 /* timeout */
pehrhovey 0:a548a085de55 320 return 0;
pehrhovey 0:a548a085de55 321 } else {
pehrhovey 0:a548a085de55 322 /* Not a timeout. Remove timeout entry */
pehrhovey 0:a548a085de55 323 sys_untimeout(sswt_handler, &sswt_cb);
pehrhovey 0:a548a085de55 324 return 1;
pehrhovey 0:a548a085de55 325 }
pehrhovey 0:a548a085de55 326 }
pehrhovey 0:a548a085de55 327
pehrhovey 0:a548a085de55 328 /**
pehrhovey 0:a548a085de55 329 * Sleep for some ms. Timeouts are processed while sleeping.
pehrhovey 0:a548a085de55 330 *
pehrhovey 0:a548a085de55 331 * @param ms number of milliseconds to sleep
pehrhovey 0:a548a085de55 332 */
pehrhovey 0:a548a085de55 333 void
pehrhovey 0:a548a085de55 334 sys_msleep(u32_t ms)
pehrhovey 0:a548a085de55 335 {
pehrhovey 0:a548a085de55 336 sys_sem_t delaysem = sys_sem_new(0);
pehrhovey 0:a548a085de55 337
pehrhovey 0:a548a085de55 338 sys_sem_wait_timeout(delaysem, ms);
pehrhovey 0:a548a085de55 339
pehrhovey 0:a548a085de55 340 sys_sem_free(delaysem);
pehrhovey 0:a548a085de55 341 }
pehrhovey 0:a548a085de55 342
pehrhovey 0:a548a085de55 343
pehrhovey 0:a548a085de55 344 #endif /* NO_SYS */