takashi kadono / Mbed OS Nucleo446_SSD1331

Dependencies:   ssd1331

Committer:
kadonotakashi
Date:
Wed Oct 10 00:33:53 2018 +0000
Revision:
0:8fdf9a60065b
how to make mbed librry

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kadonotakashi 0:8fdf9a60065b 1 /* Copyright (C) 2012 mbed.org, MIT License
kadonotakashi 0:8fdf9a60065b 2 *
kadonotakashi 0:8fdf9a60065b 3 * Permission is hereby granted, free of charge, to any person obtaining a copy of this software
kadonotakashi 0:8fdf9a60065b 4 * and associated documentation files (the "Software"), to deal in the Software without restriction,
kadonotakashi 0:8fdf9a60065b 5 * including without limitation the rights to use, copy, modify, merge, publish, distribute,
kadonotakashi 0:8fdf9a60065b 6 * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
kadonotakashi 0:8fdf9a60065b 7 * furnished to do so, subject to the following conditions:
kadonotakashi 0:8fdf9a60065b 8 *
kadonotakashi 0:8fdf9a60065b 9 * The above copyright notice and this permission notice shall be included in all copies or
kadonotakashi 0:8fdf9a60065b 10 * substantial portions of the Software.
kadonotakashi 0:8fdf9a60065b 11 *
kadonotakashi 0:8fdf9a60065b 12 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
kadonotakashi 0:8fdf9a60065b 13 * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
kadonotakashi 0:8fdf9a60065b 14 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
kadonotakashi 0:8fdf9a60065b 15 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
kadonotakashi 0:8fdf9a60065b 16 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
kadonotakashi 0:8fdf9a60065b 17 */
kadonotakashi 0:8fdf9a60065b 18 #include <string.h>
kadonotakashi 0:8fdf9a60065b 19
kadonotakashi 0:8fdf9a60065b 20 /* mbed includes */
kadonotakashi 0:8fdf9a60065b 21 #include "mbed_error.h"
kadonotakashi 0:8fdf9a60065b 22 #include "mbed_interface.h"
kadonotakashi 0:8fdf9a60065b 23 #include "mbed_rtos_storage.h"
kadonotakashi 0:8fdf9a60065b 24
kadonotakashi 0:8fdf9a60065b 25 /* lwIP includes. */
kadonotakashi 0:8fdf9a60065b 26 #include "lwip/opt.h"
kadonotakashi 0:8fdf9a60065b 27 #include "lwip/debug.h"
kadonotakashi 0:8fdf9a60065b 28 #include "lwip/def.h"
kadonotakashi 0:8fdf9a60065b 29 #include "lwip/sys.h"
kadonotakashi 0:8fdf9a60065b 30 #include "lwip/mem.h"
kadonotakashi 0:8fdf9a60065b 31
kadonotakashi 0:8fdf9a60065b 32 /* Define the heap ourselves to give us section placement control */
kadonotakashi 0:8fdf9a60065b 33 #ifndef ETHMEM_SECTION
kadonotakashi 0:8fdf9a60065b 34 #if defined(TARGET_LPC4088) || defined(TARGET_LPC4088_DM)
kadonotakashi 0:8fdf9a60065b 35 # if defined (__ICCARM__)
kadonotakashi 0:8fdf9a60065b 36 # define ETHMEM_SECTION
kadonotakashi 0:8fdf9a60065b 37 # elif defined(TOOLCHAIN_GCC_CR)
kadonotakashi 0:8fdf9a60065b 38 # define ETHMEM_SECTION __attribute__((section(".data.$RamPeriph32")))
kadonotakashi 0:8fdf9a60065b 39 # else
kadonotakashi 0:8fdf9a60065b 40 # define ETHMEM_SECTION __attribute__((section("AHBSRAM1"),aligned))
kadonotakashi 0:8fdf9a60065b 41 # endif
kadonotakashi 0:8fdf9a60065b 42 #elif defined(TARGET_LPC1768)
kadonotakashi 0:8fdf9a60065b 43 # if defined (__ICCARM__)
kadonotakashi 0:8fdf9a60065b 44 # define ETHMEM_SECTION
kadonotakashi 0:8fdf9a60065b 45 # elif defined(TOOLCHAIN_GCC_CR)
kadonotakashi 0:8fdf9a60065b 46 # define ETHMEM_SECTION __attribute__((section(".data.$RamPeriph32")))
kadonotakashi 0:8fdf9a60065b 47 # else
kadonotakashi 0:8fdf9a60065b 48 # define ETHMEM_SECTION __attribute__((section("AHBSRAM0"),aligned))
kadonotakashi 0:8fdf9a60065b 49 # endif
kadonotakashi 0:8fdf9a60065b 50 #else
kadonotakashi 0:8fdf9a60065b 51 #define ETHMEM_SECTION
kadonotakashi 0:8fdf9a60065b 52 #endif
kadonotakashi 0:8fdf9a60065b 53 #endif
kadonotakashi 0:8fdf9a60065b 54
kadonotakashi 0:8fdf9a60065b 55 /* LWIP's mem.c doesn't give visibility of its overhead; memory area has to be big
kadonotakashi 0:8fdf9a60065b 56 * enough to hold "MEM_SIZE" (which we specify) plus mem.c's overhead. Have to work
kadonotakashi 0:8fdf9a60065b 57 * it all out here, copying code from mem.c */
kadonotakashi 0:8fdf9a60065b 58 struct mem {
kadonotakashi 0:8fdf9a60065b 59 /** index (-> ram[next]) of the next struct */
kadonotakashi 0:8fdf9a60065b 60 mem_size_t next;
kadonotakashi 0:8fdf9a60065b 61 /** index (-> ram[prev]) of the previous struct */
kadonotakashi 0:8fdf9a60065b 62 mem_size_t prev;
kadonotakashi 0:8fdf9a60065b 63 /** 1: this area is used; 0: this area is unused */
kadonotakashi 0:8fdf9a60065b 64 u8_t used;
kadonotakashi 0:8fdf9a60065b 65 };
kadonotakashi 0:8fdf9a60065b 66
kadonotakashi 0:8fdf9a60065b 67 #define SIZEOF_STRUCT_MEM LWIP_MEM_ALIGN_SIZE(sizeof(struct mem))
kadonotakashi 0:8fdf9a60065b 68 #define MEM_SIZE_ALIGNED LWIP_MEM_ALIGN_SIZE(MEM_SIZE)
kadonotakashi 0:8fdf9a60065b 69
kadonotakashi 0:8fdf9a60065b 70 #if defined (__ICCARM__)
kadonotakashi 0:8fdf9a60065b 71 #pragma location = ".ethusbram"
kadonotakashi 0:8fdf9a60065b 72 #endif
kadonotakashi 0:8fdf9a60065b 73 LWIP_DECLARE_MEMORY_ALIGNED(lwip_ram_heap, MEM_SIZE_ALIGNED + (2U*SIZEOF_STRUCT_MEM)) ETHMEM_SECTION;
kadonotakashi 0:8fdf9a60065b 74
kadonotakashi 0:8fdf9a60065b 75 #if NO_SYS==1
kadonotakashi 0:8fdf9a60065b 76 #include "cmsis.h"
kadonotakashi 0:8fdf9a60065b 77
kadonotakashi 0:8fdf9a60065b 78 /* Saved total time in ms since timer was enabled */
kadonotakashi 0:8fdf9a60065b 79 static volatile u32_t systick_timems;
kadonotakashi 0:8fdf9a60065b 80
kadonotakashi 0:8fdf9a60065b 81 /* Enable systick rate and interrupt */
kadonotakashi 0:8fdf9a60065b 82 void SysTick_Init(void) {
kadonotakashi 0:8fdf9a60065b 83 if (SysTick_Config(SystemCoreClock / 1000)) {
kadonotakashi 0:8fdf9a60065b 84 while (1); /* Capture error */
kadonotakashi 0:8fdf9a60065b 85 }
kadonotakashi 0:8fdf9a60065b 86 }
kadonotakashi 0:8fdf9a60065b 87
kadonotakashi 0:8fdf9a60065b 88 /** \brief SysTick IRQ handler and timebase management
kadonotakashi 0:8fdf9a60065b 89 *
kadonotakashi 0:8fdf9a60065b 90 * This function keeps a timebase for the sysTick that can be
kadonotakashi 0:8fdf9a60065b 91 * used for other functions. It also calls an external function
kadonotakashi 0:8fdf9a60065b 92 * (SysTick_User) that must be defined outside this handler.
kadonotakashi 0:8fdf9a60065b 93 */
kadonotakashi 0:8fdf9a60065b 94 void SysTick_Handler(void) {
kadonotakashi 0:8fdf9a60065b 95 systick_timems++;
kadonotakashi 0:8fdf9a60065b 96 }
kadonotakashi 0:8fdf9a60065b 97
kadonotakashi 0:8fdf9a60065b 98 /* Delay for the specified number of milliSeconds */
kadonotakashi 0:8fdf9a60065b 99 void osDelay(uint32_t ms) {
kadonotakashi 0:8fdf9a60065b 100 uint32_t to = ms + systick_timems;
kadonotakashi 0:8fdf9a60065b 101 while (to > systick_timems);
kadonotakashi 0:8fdf9a60065b 102 }
kadonotakashi 0:8fdf9a60065b 103
kadonotakashi 0:8fdf9a60065b 104 /* Returns the current time in mS. This is needed for the LWIP timers */
kadonotakashi 0:8fdf9a60065b 105 u32_t sys_now(void) {
kadonotakashi 0:8fdf9a60065b 106 return (u32_t) systick_timems;
kadonotakashi 0:8fdf9a60065b 107 }
kadonotakashi 0:8fdf9a60065b 108
kadonotakashi 0:8fdf9a60065b 109 #else
kadonotakashi 0:8fdf9a60065b 110 /* CMSIS-RTOS implementation of the lwip operating system abstraction */
kadonotakashi 0:8fdf9a60065b 111 #include "arch/sys_arch.h"
kadonotakashi 0:8fdf9a60065b 112
kadonotakashi 0:8fdf9a60065b 113 /*---------------------------------------------------------------------------*
kadonotakashi 0:8fdf9a60065b 114 * Routine: sys_mbox_new
kadonotakashi 0:8fdf9a60065b 115 *---------------------------------------------------------------------------*
kadonotakashi 0:8fdf9a60065b 116 * Description:
kadonotakashi 0:8fdf9a60065b 117 * Creates a new mailbox
kadonotakashi 0:8fdf9a60065b 118 * Inputs:
kadonotakashi 0:8fdf9a60065b 119 * sys_mbox_t mbox -- Handle of mailbox
kadonotakashi 0:8fdf9a60065b 120 * int queue_sz -- Size of elements in the mailbox
kadonotakashi 0:8fdf9a60065b 121 * Outputs:
kadonotakashi 0:8fdf9a60065b 122 * err_t -- ERR_OK if message posted, else ERR_MEM
kadonotakashi 0:8fdf9a60065b 123 *---------------------------------------------------------------------------*/
kadonotakashi 0:8fdf9a60065b 124 err_t sys_mbox_new(sys_mbox_t *mbox, int queue_sz) {
kadonotakashi 0:8fdf9a60065b 125 if (queue_sz > MB_SIZE)
kadonotakashi 0:8fdf9a60065b 126 MBED_ERROR1(MBED_MAKE_ERROR(MBED_MODULE_NETWORK_STACK, MBED_ERROR_CODE_INVALID_SIZE), "sys_mbox_new size error\n", queue_sz);
kadonotakashi 0:8fdf9a60065b 127
kadonotakashi 0:8fdf9a60065b 128 memset(mbox, 0, sizeof(*mbox));
kadonotakashi 0:8fdf9a60065b 129
kadonotakashi 0:8fdf9a60065b 130 mbox->attr.cb_mem = &mbox->data;
kadonotakashi 0:8fdf9a60065b 131 mbox->attr.cb_size = sizeof(mbox->data);
kadonotakashi 0:8fdf9a60065b 132 mbox->id = osEventFlagsNew(&mbox->attr);
kadonotakashi 0:8fdf9a60065b 133 if (mbox->id == NULL)
kadonotakashi 0:8fdf9a60065b 134 MBED_ERROR1(MBED_MAKE_ERROR(MBED_MODULE_NETWORK_STACK, MBED_ERROR_CODE_FAILED_OPERATION), "sys_mbox_new create error\n", (u32_t)mbox);
kadonotakashi 0:8fdf9a60065b 135
kadonotakashi 0:8fdf9a60065b 136 osEventFlagsSet(mbox->id, SYS_MBOX_POST_EVENT);
kadonotakashi 0:8fdf9a60065b 137
kadonotakashi 0:8fdf9a60065b 138 return ERR_OK;
kadonotakashi 0:8fdf9a60065b 139 }
kadonotakashi 0:8fdf9a60065b 140
kadonotakashi 0:8fdf9a60065b 141 /*---------------------------------------------------------------------------*
kadonotakashi 0:8fdf9a60065b 142 * Routine: sys_mbox_free
kadonotakashi 0:8fdf9a60065b 143 *---------------------------------------------------------------------------*
kadonotakashi 0:8fdf9a60065b 144 * Description:
kadonotakashi 0:8fdf9a60065b 145 * Deallocates a mailbox. If there are messages still present in the
kadonotakashi 0:8fdf9a60065b 146 * mailbox when the mailbox is deallocated, it is an indication of a
kadonotakashi 0:8fdf9a60065b 147 * programming error in lwIP and the developer should be notified.
kadonotakashi 0:8fdf9a60065b 148 * Inputs:
kadonotakashi 0:8fdf9a60065b 149 * sys_mbox_t *mbox -- Handle of mailbox
kadonotakashi 0:8fdf9a60065b 150 *---------------------------------------------------------------------------*/
kadonotakashi 0:8fdf9a60065b 151 void sys_mbox_free(sys_mbox_t *mbox) {
kadonotakashi 0:8fdf9a60065b 152 if (mbox->post_idx != mbox->fetch_idx)
kadonotakashi 0:8fdf9a60065b 153 MBED_ERROR1(MBED_MAKE_ERROR(MBED_MODULE_NETWORK_STACK, MBED_ERROR_CODE_INVALID_INDEX), "sys_mbox_free error\n", (u32_t)mbox->fetch_idx);
kadonotakashi 0:8fdf9a60065b 154 }
kadonotakashi 0:8fdf9a60065b 155
kadonotakashi 0:8fdf9a60065b 156 /*---------------------------------------------------------------------------*
kadonotakashi 0:8fdf9a60065b 157 * Routine: sys_mbox_post
kadonotakashi 0:8fdf9a60065b 158 *---------------------------------------------------------------------------*
kadonotakashi 0:8fdf9a60065b 159 * Description:
kadonotakashi 0:8fdf9a60065b 160 * Post the "msg" to the mailbox.
kadonotakashi 0:8fdf9a60065b 161 * Inputs:
kadonotakashi 0:8fdf9a60065b 162 * sys_mbox_t mbox -- Handle of mailbox
kadonotakashi 0:8fdf9a60065b 163 * void *msg -- Pointer to data to post
kadonotakashi 0:8fdf9a60065b 164 *---------------------------------------------------------------------------*/
kadonotakashi 0:8fdf9a60065b 165 void sys_mbox_post(sys_mbox_t *mbox, void *msg) {
kadonotakashi 0:8fdf9a60065b 166 osEventFlagsWait(mbox->id, SYS_MBOX_POST_EVENT,
kadonotakashi 0:8fdf9a60065b 167 osFlagsWaitAny | osFlagsNoClear, osWaitForever);
kadonotakashi 0:8fdf9a60065b 168
kadonotakashi 0:8fdf9a60065b 169 int state = osKernelLock();
kadonotakashi 0:8fdf9a60065b 170
kadonotakashi 0:8fdf9a60065b 171 mbox->queue[mbox->post_idx % MB_SIZE] = msg;
kadonotakashi 0:8fdf9a60065b 172 mbox->post_idx += 1;
kadonotakashi 0:8fdf9a60065b 173
kadonotakashi 0:8fdf9a60065b 174 osEventFlagsSet(mbox->id, SYS_MBOX_FETCH_EVENT);
kadonotakashi 0:8fdf9a60065b 175 if (mbox->post_idx - mbox->fetch_idx == MB_SIZE-1)
kadonotakashi 0:8fdf9a60065b 176 osEventFlagsClear(mbox->id, SYS_MBOX_POST_EVENT);
kadonotakashi 0:8fdf9a60065b 177
kadonotakashi 0:8fdf9a60065b 178 osKernelRestoreLock(state);
kadonotakashi 0:8fdf9a60065b 179 }
kadonotakashi 0:8fdf9a60065b 180
kadonotakashi 0:8fdf9a60065b 181 /*---------------------------------------------------------------------------*
kadonotakashi 0:8fdf9a60065b 182 * Routine: sys_mbox_trypost
kadonotakashi 0:8fdf9a60065b 183 *---------------------------------------------------------------------------*
kadonotakashi 0:8fdf9a60065b 184 * Description:
kadonotakashi 0:8fdf9a60065b 185 * Try to post the "msg" to the mailbox. Returns immediately with
kadonotakashi 0:8fdf9a60065b 186 * error if cannot.
kadonotakashi 0:8fdf9a60065b 187 * Inputs:
kadonotakashi 0:8fdf9a60065b 188 * sys_mbox_t mbox -- Handle of mailbox
kadonotakashi 0:8fdf9a60065b 189 * void *msg -- Pointer to data to post
kadonotakashi 0:8fdf9a60065b 190 * Outputs:
kadonotakashi 0:8fdf9a60065b 191 * err_t -- ERR_OK if message posted, else ERR_MEM
kadonotakashi 0:8fdf9a60065b 192 * if not.
kadonotakashi 0:8fdf9a60065b 193 *---------------------------------------------------------------------------*/
kadonotakashi 0:8fdf9a60065b 194 err_t sys_mbox_trypost(sys_mbox_t *mbox, void *msg) {
kadonotakashi 0:8fdf9a60065b 195 uint32_t flags = osEventFlagsWait(mbox->id, SYS_MBOX_POST_EVENT,
kadonotakashi 0:8fdf9a60065b 196 osFlagsWaitAny | osFlagsNoClear, 0);
kadonotakashi 0:8fdf9a60065b 197 if ((flags & osFlagsError) || !(flags & SYS_MBOX_POST_EVENT)) {
kadonotakashi 0:8fdf9a60065b 198 MBED_WARNING1(MBED_MAKE_ERROR(MBED_MODULE_NETWORK_STACK, MBED_ERROR_CODE_FAILED_OPERATION), "sys_mbox_trypost error\n", flags);
kadonotakashi 0:8fdf9a60065b 199 return ERR_MEM;
kadonotakashi 0:8fdf9a60065b 200 }
kadonotakashi 0:8fdf9a60065b 201
kadonotakashi 0:8fdf9a60065b 202 int state = osKernelLock();
kadonotakashi 0:8fdf9a60065b 203
kadonotakashi 0:8fdf9a60065b 204 mbox->queue[mbox->post_idx % MB_SIZE] = msg;
kadonotakashi 0:8fdf9a60065b 205 mbox->post_idx += 1;
kadonotakashi 0:8fdf9a60065b 206
kadonotakashi 0:8fdf9a60065b 207 osEventFlagsSet(mbox->id, SYS_MBOX_FETCH_EVENT);
kadonotakashi 0:8fdf9a60065b 208 if (mbox->post_idx - mbox->fetch_idx == MB_SIZE-1)
kadonotakashi 0:8fdf9a60065b 209 osEventFlagsClear(mbox->id, SYS_MBOX_POST_EVENT);
kadonotakashi 0:8fdf9a60065b 210
kadonotakashi 0:8fdf9a60065b 211 osKernelRestoreLock(state);
kadonotakashi 0:8fdf9a60065b 212 return ERR_OK;
kadonotakashi 0:8fdf9a60065b 213 }
kadonotakashi 0:8fdf9a60065b 214
kadonotakashi 0:8fdf9a60065b 215 /*---------------------------------------------------------------------------*
kadonotakashi 0:8fdf9a60065b 216 * Routine: sys_arch_mbox_fetch
kadonotakashi 0:8fdf9a60065b 217 *---------------------------------------------------------------------------*
kadonotakashi 0:8fdf9a60065b 218 * Description:
kadonotakashi 0:8fdf9a60065b 219 * Blocks the thread until a message arrives in the mailbox, but does
kadonotakashi 0:8fdf9a60065b 220 * not block the thread longer than "timeout" milliseconds (similar to
kadonotakashi 0:8fdf9a60065b 221 * the sys_arch_sem_wait() function). The "msg" argument is a result
kadonotakashi 0:8fdf9a60065b 222 * parameter that is set by the function (i.e., by doing "*msg =
kadonotakashi 0:8fdf9a60065b 223 * ptr"). The "msg" parameter maybe NULL to indicate that the message
kadonotakashi 0:8fdf9a60065b 224 * should be dropped.
kadonotakashi 0:8fdf9a60065b 225 *
kadonotakashi 0:8fdf9a60065b 226 * The return values are the same as for the sys_arch_sem_wait() function:
kadonotakashi 0:8fdf9a60065b 227 * Number of milliseconds spent waiting or SYS_ARCH_TIMEOUT if there was a
kadonotakashi 0:8fdf9a60065b 228 * timeout.
kadonotakashi 0:8fdf9a60065b 229 *
kadonotakashi 0:8fdf9a60065b 230 * Note that a function with a similar name, sys_mbox_fetch(), is
kadonotakashi 0:8fdf9a60065b 231 * implemented by lwIP.
kadonotakashi 0:8fdf9a60065b 232 * Inputs:
kadonotakashi 0:8fdf9a60065b 233 * sys_mbox_t mbox -- Handle of mailbox
kadonotakashi 0:8fdf9a60065b 234 * void **msg -- Pointer to pointer to msg received
kadonotakashi 0:8fdf9a60065b 235 * u32_t timeout -- Number of milliseconds until timeout
kadonotakashi 0:8fdf9a60065b 236 * Outputs:
kadonotakashi 0:8fdf9a60065b 237 * u32_t -- SYS_ARCH_TIMEOUT if timeout, else number
kadonotakashi 0:8fdf9a60065b 238 * of milliseconds until received.
kadonotakashi 0:8fdf9a60065b 239 *---------------------------------------------------------------------------*/
kadonotakashi 0:8fdf9a60065b 240 u32_t sys_arch_mbox_fetch(sys_mbox_t *mbox, void **msg, u32_t timeout) {
kadonotakashi 0:8fdf9a60065b 241 uint32_t start = osKernelGetTickCount();
kadonotakashi 0:8fdf9a60065b 242 uint32_t flags = osEventFlagsWait(mbox->id, SYS_MBOX_FETCH_EVENT,
kadonotakashi 0:8fdf9a60065b 243 osFlagsWaitAny | osFlagsNoClear, (timeout ? timeout : osWaitForever));
kadonotakashi 0:8fdf9a60065b 244 if ((flags & osFlagsError) || !(flags & SYS_MBOX_FETCH_EVENT)) {
kadonotakashi 0:8fdf9a60065b 245 MBED_WARNING1(MBED_MAKE_ERROR(MBED_MODULE_NETWORK_STACK, MBED_ERROR_CODE_TIME_OUT), "sys_arch_mbox_fetch time-out\n", flags);
kadonotakashi 0:8fdf9a60065b 246 return SYS_ARCH_TIMEOUT;
kadonotakashi 0:8fdf9a60065b 247 }
kadonotakashi 0:8fdf9a60065b 248
kadonotakashi 0:8fdf9a60065b 249 int state = osKernelLock();
kadonotakashi 0:8fdf9a60065b 250
kadonotakashi 0:8fdf9a60065b 251 if (msg)
kadonotakashi 0:8fdf9a60065b 252 *msg = mbox->queue[mbox->fetch_idx % MB_SIZE];
kadonotakashi 0:8fdf9a60065b 253 mbox->fetch_idx += 1;
kadonotakashi 0:8fdf9a60065b 254
kadonotakashi 0:8fdf9a60065b 255 osEventFlagsSet(mbox->id, SYS_MBOX_POST_EVENT);
kadonotakashi 0:8fdf9a60065b 256 if (mbox->post_idx == mbox->fetch_idx)
kadonotakashi 0:8fdf9a60065b 257 osEventFlagsClear(mbox->id, SYS_MBOX_FETCH_EVENT);
kadonotakashi 0:8fdf9a60065b 258
kadonotakashi 0:8fdf9a60065b 259 osKernelRestoreLock(state);
kadonotakashi 0:8fdf9a60065b 260 return osKernelGetTickCount() - start;
kadonotakashi 0:8fdf9a60065b 261 }
kadonotakashi 0:8fdf9a60065b 262
kadonotakashi 0:8fdf9a60065b 263 /*---------------------------------------------------------------------------*
kadonotakashi 0:8fdf9a60065b 264 * Routine: sys_arch_mbox_tryfetch
kadonotakashi 0:8fdf9a60065b 265 *---------------------------------------------------------------------------*
kadonotakashi 0:8fdf9a60065b 266 * Description:
kadonotakashi 0:8fdf9a60065b 267 * Similar to sys_arch_mbox_fetch, but if message is not ready
kadonotakashi 0:8fdf9a60065b 268 * immediately, we'll return with SYS_MBOX_EMPTY. On success, 0 is
kadonotakashi 0:8fdf9a60065b 269 * returned.
kadonotakashi 0:8fdf9a60065b 270 * Inputs:
kadonotakashi 0:8fdf9a60065b 271 * sys_mbox_t mbox -- Handle of mailbox
kadonotakashi 0:8fdf9a60065b 272 * void **msg -- Pointer to pointer to msg received
kadonotakashi 0:8fdf9a60065b 273 * Outputs:
kadonotakashi 0:8fdf9a60065b 274 * u32_t -- SYS_MBOX_EMPTY if no messages. Otherwise,
kadonotakashi 0:8fdf9a60065b 275 * return ERR_OK.
kadonotakashi 0:8fdf9a60065b 276 *---------------------------------------------------------------------------*/
kadonotakashi 0:8fdf9a60065b 277 u32_t sys_arch_mbox_tryfetch(sys_mbox_t *mbox, void **msg) {
kadonotakashi 0:8fdf9a60065b 278 uint32_t flags = osEventFlagsWait(mbox->id, SYS_MBOX_FETCH_EVENT,
kadonotakashi 0:8fdf9a60065b 279 osFlagsWaitAny | osFlagsNoClear, 0);
kadonotakashi 0:8fdf9a60065b 280 if ((flags & osFlagsError) || !(flags & SYS_MBOX_FETCH_EVENT)) {
kadonotakashi 0:8fdf9a60065b 281 MBED_WARNING1(MBED_MAKE_ERROR(MBED_MODULE_NETWORK_STACK, MBED_ERROR_CODE_FAILED_OPERATION), "sys_arch_mbox_tryfetch empty\n", flags);
kadonotakashi 0:8fdf9a60065b 282 return SYS_MBOX_EMPTY;
kadonotakashi 0:8fdf9a60065b 283 }
kadonotakashi 0:8fdf9a60065b 284
kadonotakashi 0:8fdf9a60065b 285 int state = osKernelLock();
kadonotakashi 0:8fdf9a60065b 286
kadonotakashi 0:8fdf9a60065b 287 if (msg)
kadonotakashi 0:8fdf9a60065b 288 *msg = mbox->queue[mbox->fetch_idx % MB_SIZE];
kadonotakashi 0:8fdf9a60065b 289 mbox->fetch_idx += 1;
kadonotakashi 0:8fdf9a60065b 290
kadonotakashi 0:8fdf9a60065b 291 osEventFlagsSet(mbox->id, SYS_MBOX_POST_EVENT);
kadonotakashi 0:8fdf9a60065b 292 if (mbox->post_idx == mbox->fetch_idx)
kadonotakashi 0:8fdf9a60065b 293 osEventFlagsClear(mbox->id, SYS_MBOX_FETCH_EVENT);
kadonotakashi 0:8fdf9a60065b 294
kadonotakashi 0:8fdf9a60065b 295 osKernelRestoreLock(state);
kadonotakashi 0:8fdf9a60065b 296 return ERR_OK;
kadonotakashi 0:8fdf9a60065b 297 }
kadonotakashi 0:8fdf9a60065b 298
kadonotakashi 0:8fdf9a60065b 299 /*---------------------------------------------------------------------------*
kadonotakashi 0:8fdf9a60065b 300 * Routine: sys_sem_new
kadonotakashi 0:8fdf9a60065b 301 *---------------------------------------------------------------------------*
kadonotakashi 0:8fdf9a60065b 302 * Description:
kadonotakashi 0:8fdf9a60065b 303 * Creates and returns a new semaphore. The "ucCount" argument specifies
kadonotakashi 0:8fdf9a60065b 304 * the initial state of the semaphore.
kadonotakashi 0:8fdf9a60065b 305 * NOTE: Currently this routine only creates counts of 1 or 0
kadonotakashi 0:8fdf9a60065b 306 * Inputs:
kadonotakashi 0:8fdf9a60065b 307 * sys_sem_t sem -- Handle of semaphore
kadonotakashi 0:8fdf9a60065b 308 * u8_t count -- Initial count of semaphore
kadonotakashi 0:8fdf9a60065b 309 * Outputs:
kadonotakashi 0:8fdf9a60065b 310 * err_t -- ERR_OK if semaphore created
kadonotakashi 0:8fdf9a60065b 311 *---------------------------------------------------------------------------*/
kadonotakashi 0:8fdf9a60065b 312 err_t sys_sem_new(sys_sem_t *sem, u8_t count) {
kadonotakashi 0:8fdf9a60065b 313 memset(sem, 0, sizeof(*sem));
kadonotakashi 0:8fdf9a60065b 314 sem->attr.cb_mem = &sem->data;
kadonotakashi 0:8fdf9a60065b 315 sem->attr.cb_size = sizeof(sem->data);
kadonotakashi 0:8fdf9a60065b 316 sem->id = osSemaphoreNew(UINT16_MAX, count, &sem->attr);
kadonotakashi 0:8fdf9a60065b 317 if (sem->id == NULL)
kadonotakashi 0:8fdf9a60065b 318 MBED_ERROR1(MBED_MAKE_ERROR(MBED_MODULE_NETWORK_STACK, MBED_ERROR_CODE_FAILED_OPERATION), "sys_sem_new create error\n", (u32_t)sem);
kadonotakashi 0:8fdf9a60065b 319
kadonotakashi 0:8fdf9a60065b 320 return ERR_OK;
kadonotakashi 0:8fdf9a60065b 321 }
kadonotakashi 0:8fdf9a60065b 322
kadonotakashi 0:8fdf9a60065b 323 /*---------------------------------------------------------------------------*
kadonotakashi 0:8fdf9a60065b 324 * Routine: sys_arch_sem_wait
kadonotakashi 0:8fdf9a60065b 325 *---------------------------------------------------------------------------*
kadonotakashi 0:8fdf9a60065b 326 * Description:
kadonotakashi 0:8fdf9a60065b 327 * Blocks the thread while waiting for the semaphore to be
kadonotakashi 0:8fdf9a60065b 328 * signaled. If the "timeout" argument is non-zero, the thread should
kadonotakashi 0:8fdf9a60065b 329 * only be blocked for the specified time (measured in
kadonotakashi 0:8fdf9a60065b 330 * milliseconds).
kadonotakashi 0:8fdf9a60065b 331 *
kadonotakashi 0:8fdf9a60065b 332 * If the timeout argument is non-zero, the return value is the number of
kadonotakashi 0:8fdf9a60065b 333 * milliseconds spent waiting for the semaphore to be signaled. If the
kadonotakashi 0:8fdf9a60065b 334 * semaphore wasn't signaled within the specified time, the return value is
kadonotakashi 0:8fdf9a60065b 335 * SYS_ARCH_TIMEOUT. If the thread didn't have to wait for the semaphore
kadonotakashi 0:8fdf9a60065b 336 * (i.e., it was already signaled), the function may return zero.
kadonotakashi 0:8fdf9a60065b 337 *
kadonotakashi 0:8fdf9a60065b 338 * Notice that lwIP implements a function with a similar name,
kadonotakashi 0:8fdf9a60065b 339 * sys_sem_wait(), that uses the sys_arch_sem_wait() function.
kadonotakashi 0:8fdf9a60065b 340 * Inputs:
kadonotakashi 0:8fdf9a60065b 341 * sys_sem_t sem -- Semaphore to wait on
kadonotakashi 0:8fdf9a60065b 342 * u32_t timeout -- Number of milliseconds until timeout
kadonotakashi 0:8fdf9a60065b 343 * Outputs:
kadonotakashi 0:8fdf9a60065b 344 * u32_t -- Time elapsed or SYS_ARCH_TIMEOUT.
kadonotakashi 0:8fdf9a60065b 345 *---------------------------------------------------------------------------*/
kadonotakashi 0:8fdf9a60065b 346 u32_t sys_arch_sem_wait(sys_sem_t *sem, u32_t timeout) {
kadonotakashi 0:8fdf9a60065b 347 u32_t start = osKernelGetTickCount();
kadonotakashi 0:8fdf9a60065b 348
kadonotakashi 0:8fdf9a60065b 349 if (osSemaphoreAcquire(sem->id, (timeout != 0)?(timeout):(osWaitForever)) != osOK) {
kadonotakashi 0:8fdf9a60065b 350 MBED_WARNING1(MBED_MAKE_ERROR(MBED_MODULE_NETWORK_STACK, MBED_ERROR_CODE_TIME_OUT), "sys_arch_sem_wait time out\n", (u32_t)sem);
kadonotakashi 0:8fdf9a60065b 351 return SYS_ARCH_TIMEOUT;
kadonotakashi 0:8fdf9a60065b 352 }
kadonotakashi 0:8fdf9a60065b 353
kadonotakashi 0:8fdf9a60065b 354 return osKernelGetTickCount() - start;
kadonotakashi 0:8fdf9a60065b 355 }
kadonotakashi 0:8fdf9a60065b 356
kadonotakashi 0:8fdf9a60065b 357 /*---------------------------------------------------------------------------*
kadonotakashi 0:8fdf9a60065b 358 * Routine: sys_sem_signal
kadonotakashi 0:8fdf9a60065b 359 *---------------------------------------------------------------------------*
kadonotakashi 0:8fdf9a60065b 360 * Description:
kadonotakashi 0:8fdf9a60065b 361 * Signals (releases) a semaphore
kadonotakashi 0:8fdf9a60065b 362 * Inputs:
kadonotakashi 0:8fdf9a60065b 363 * sys_sem_t sem -- Semaphore to signal
kadonotakashi 0:8fdf9a60065b 364 *---------------------------------------------------------------------------*/
kadonotakashi 0:8fdf9a60065b 365 void sys_sem_signal(sys_sem_t *data) {
kadonotakashi 0:8fdf9a60065b 366 if (osSemaphoreRelease(data->id) != osOK)
kadonotakashi 0:8fdf9a60065b 367 MBED_ERROR1(MBED_MAKE_ERROR(MBED_MODULE_NETWORK_STACK, MBED_ERROR_CODE_SEMAPHORE_UNLOCK_FAILED), "sys_sem_signal error\n", (u32_t)data->id);
kadonotakashi 0:8fdf9a60065b 368 }
kadonotakashi 0:8fdf9a60065b 369
kadonotakashi 0:8fdf9a60065b 370 /*---------------------------------------------------------------------------*
kadonotakashi 0:8fdf9a60065b 371 * Routine: sys_sem_free
kadonotakashi 0:8fdf9a60065b 372 *---------------------------------------------------------------------------*
kadonotakashi 0:8fdf9a60065b 373 * Description:
kadonotakashi 0:8fdf9a60065b 374 * Deallocates a semaphore
kadonotakashi 0:8fdf9a60065b 375 * Inputs:
kadonotakashi 0:8fdf9a60065b 376 * sys_sem_t sem -- Semaphore to free
kadonotakashi 0:8fdf9a60065b 377 *---------------------------------------------------------------------------*/
kadonotakashi 0:8fdf9a60065b 378 void sys_sem_free(sys_sem_t *sem) {}
kadonotakashi 0:8fdf9a60065b 379
kadonotakashi 0:8fdf9a60065b 380 /** Create a new mutex
kadonotakashi 0:8fdf9a60065b 381 * @param mutex pointer to the mutex to create
kadonotakashi 0:8fdf9a60065b 382 * @return a new mutex */
kadonotakashi 0:8fdf9a60065b 383 err_t sys_mutex_new(sys_mutex_t *mutex) {
kadonotakashi 0:8fdf9a60065b 384 memset(mutex, 0, sizeof(*mutex));
kadonotakashi 0:8fdf9a60065b 385 mutex->attr.name = "lwip_mutex";
kadonotakashi 0:8fdf9a60065b 386 mutex->attr.cb_mem = &mutex->data;
kadonotakashi 0:8fdf9a60065b 387 mutex->attr.cb_size = sizeof(mutex->data);
kadonotakashi 0:8fdf9a60065b 388 mutex->id = osMutexNew(&mutex->attr);
kadonotakashi 0:8fdf9a60065b 389 if (mutex->id == NULL) {
kadonotakashi 0:8fdf9a60065b 390 MBED_WARNING1(MBED_MAKE_ERROR(MBED_MODULE_NETWORK_STACK, MBED_ERROR_CODE_FAILED_OPERATION), "sys_mutex_new error\n", (u32_t)mutex);
kadonotakashi 0:8fdf9a60065b 391 return ERR_MEM;
kadonotakashi 0:8fdf9a60065b 392 }
kadonotakashi 0:8fdf9a60065b 393
kadonotakashi 0:8fdf9a60065b 394 return ERR_OK;
kadonotakashi 0:8fdf9a60065b 395 }
kadonotakashi 0:8fdf9a60065b 396
kadonotakashi 0:8fdf9a60065b 397 /** Lock a mutex
kadonotakashi 0:8fdf9a60065b 398 * @param mutex the mutex to lock */
kadonotakashi 0:8fdf9a60065b 399 void sys_mutex_lock(sys_mutex_t *mutex) {
kadonotakashi 0:8fdf9a60065b 400 if (osMutexAcquire(mutex->id, osWaitForever) != osOK)
kadonotakashi 0:8fdf9a60065b 401 MBED_ERROR1(MBED_MAKE_ERROR(MBED_MODULE_NETWORK_STACK, MBED_ERROR_CODE_MUTEX_LOCK_FAILED), "sys_mutex_lock error\n", (u32_t)mutex);
kadonotakashi 0:8fdf9a60065b 402 }
kadonotakashi 0:8fdf9a60065b 403
kadonotakashi 0:8fdf9a60065b 404 /** Unlock a mutex
kadonotakashi 0:8fdf9a60065b 405 * @param mutex the mutex to unlock */
kadonotakashi 0:8fdf9a60065b 406 void sys_mutex_unlock(sys_mutex_t *mutex) {
kadonotakashi 0:8fdf9a60065b 407 if (osMutexRelease(mutex->id) != osOK)
kadonotakashi 0:8fdf9a60065b 408 MBED_ERROR1(MBED_MAKE_ERROR(MBED_MODULE_NETWORK_STACK, MBED_ERROR_CODE_MUTEX_UNLOCK_FAILED), "sys_mutex_unlock error\n", (u32_t)mutex);
kadonotakashi 0:8fdf9a60065b 409 }
kadonotakashi 0:8fdf9a60065b 410
kadonotakashi 0:8fdf9a60065b 411 /** Delete a mutex
kadonotakashi 0:8fdf9a60065b 412 * @param mutex the mutex to delete */
kadonotakashi 0:8fdf9a60065b 413 void sys_mutex_free(sys_mutex_t *mutex) {}
kadonotakashi 0:8fdf9a60065b 414
kadonotakashi 0:8fdf9a60065b 415 /*---------------------------------------------------------------------------*
kadonotakashi 0:8fdf9a60065b 416 * Routine: sys_init
kadonotakashi 0:8fdf9a60065b 417 *---------------------------------------------------------------------------*
kadonotakashi 0:8fdf9a60065b 418 * Description:
kadonotakashi 0:8fdf9a60065b 419 * Initialize sys arch
kadonotakashi 0:8fdf9a60065b 420 *---------------------------------------------------------------------------*/
kadonotakashi 0:8fdf9a60065b 421 osMutexId_t lwip_sys_mutex;
kadonotakashi 0:8fdf9a60065b 422 osMutexAttr_t lwip_sys_mutex_attr;
kadonotakashi 0:8fdf9a60065b 423 mbed_rtos_storage_mutex_t lwip_sys_mutex_data;
kadonotakashi 0:8fdf9a60065b 424
kadonotakashi 0:8fdf9a60065b 425 void sys_init(void) {
kadonotakashi 0:8fdf9a60065b 426 lwip_sys_mutex_attr.name = "lwip_sys_mutex";
kadonotakashi 0:8fdf9a60065b 427 lwip_sys_mutex_attr.cb_mem = &lwip_sys_mutex_data;
kadonotakashi 0:8fdf9a60065b 428 lwip_sys_mutex_attr.cb_size = sizeof(lwip_sys_mutex_data);
kadonotakashi 0:8fdf9a60065b 429 lwip_sys_mutex = osMutexNew(&lwip_sys_mutex_attr);
kadonotakashi 0:8fdf9a60065b 430 if (lwip_sys_mutex == NULL)
kadonotakashi 0:8fdf9a60065b 431 MBED_ERROR(MBED_MAKE_ERROR(MBED_MODULE_NETWORK_STACK, MBED_ERROR_CODE_INITIALIZATION_FAILED), "sys_init error, mutex initialization failed\n");
kadonotakashi 0:8fdf9a60065b 432 }
kadonotakashi 0:8fdf9a60065b 433
kadonotakashi 0:8fdf9a60065b 434 /*---------------------------------------------------------------------------*
kadonotakashi 0:8fdf9a60065b 435 * Routine: sys_jiffies
kadonotakashi 0:8fdf9a60065b 436 *---------------------------------------------------------------------------*
kadonotakashi 0:8fdf9a60065b 437 * Description:
kadonotakashi 0:8fdf9a60065b 438 * Used by PPP as a timestamp-ish value
kadonotakashi 0:8fdf9a60065b 439 *---------------------------------------------------------------------------*/
kadonotakashi 0:8fdf9a60065b 440 u32_t sys_jiffies(void) {
kadonotakashi 0:8fdf9a60065b 441 return osKernelGetTickCount();
kadonotakashi 0:8fdf9a60065b 442 }
kadonotakashi 0:8fdf9a60065b 443
kadonotakashi 0:8fdf9a60065b 444 /*---------------------------------------------------------------------------*
kadonotakashi 0:8fdf9a60065b 445 * Routine: sys_arch_protect
kadonotakashi 0:8fdf9a60065b 446 *---------------------------------------------------------------------------*
kadonotakashi 0:8fdf9a60065b 447 * Description:
kadonotakashi 0:8fdf9a60065b 448 * This optional function does a "fast" critical region protection and
kadonotakashi 0:8fdf9a60065b 449 * returns the previous protection level. This function is only called
kadonotakashi 0:8fdf9a60065b 450 * during very short critical regions. An embedded system which supports
kadonotakashi 0:8fdf9a60065b 451 * ISR-based drivers might want to implement this function by disabling
kadonotakashi 0:8fdf9a60065b 452 * interrupts. Task-based systems might want to implement this by using
kadonotakashi 0:8fdf9a60065b 453 * a mutex or disabling tasking. This function should support recursive
kadonotakashi 0:8fdf9a60065b 454 * calls from the same task or interrupt. In other words,
kadonotakashi 0:8fdf9a60065b 455 * sys_arch_protect() could be called while already protected. In
kadonotakashi 0:8fdf9a60065b 456 * that case the return value indicates that it is already protected.
kadonotakashi 0:8fdf9a60065b 457 *
kadonotakashi 0:8fdf9a60065b 458 * sys_arch_protect() is only required if your port is supporting an
kadonotakashi 0:8fdf9a60065b 459 * operating system.
kadonotakashi 0:8fdf9a60065b 460 * Outputs:
kadonotakashi 0:8fdf9a60065b 461 * sys_prot_t -- Previous protection level (not used here)
kadonotakashi 0:8fdf9a60065b 462 *---------------------------------------------------------------------------*/
kadonotakashi 0:8fdf9a60065b 463 sys_prot_t sys_arch_protect(void) {
kadonotakashi 0:8fdf9a60065b 464 if (osMutexAcquire(lwip_sys_mutex, osWaitForever) != osOK)
kadonotakashi 0:8fdf9a60065b 465 MBED_ERROR(MBED_MAKE_ERROR(MBED_MODULE_NETWORK_STACK, MBED_ERROR_CODE_MUTEX_LOCK_FAILED), "sys_arch_protect error\n");
kadonotakashi 0:8fdf9a60065b 466 return (sys_prot_t) 1;
kadonotakashi 0:8fdf9a60065b 467 }
kadonotakashi 0:8fdf9a60065b 468
kadonotakashi 0:8fdf9a60065b 469 /*---------------------------------------------------------------------------*
kadonotakashi 0:8fdf9a60065b 470 * Routine: sys_arch_unprotect
kadonotakashi 0:8fdf9a60065b 471 *---------------------------------------------------------------------------*
kadonotakashi 0:8fdf9a60065b 472 * Description:
kadonotakashi 0:8fdf9a60065b 473 * This optional function does a "fast" set of critical region
kadonotakashi 0:8fdf9a60065b 474 * protection to the value specified by pval. See the documentation for
kadonotakashi 0:8fdf9a60065b 475 * sys_arch_protect() for more information. This function is only
kadonotakashi 0:8fdf9a60065b 476 * required if your port is supporting an operating system.
kadonotakashi 0:8fdf9a60065b 477 * Inputs:
kadonotakashi 0:8fdf9a60065b 478 * sys_prot_t -- Previous protection level (not used here)
kadonotakashi 0:8fdf9a60065b 479 *---------------------------------------------------------------------------*/
kadonotakashi 0:8fdf9a60065b 480 void sys_arch_unprotect(sys_prot_t p) {
kadonotakashi 0:8fdf9a60065b 481 if (osMutexRelease(lwip_sys_mutex) != osOK)
kadonotakashi 0:8fdf9a60065b 482 MBED_ERROR(MBED_MAKE_ERROR(MBED_MODULE_NETWORK_STACK, MBED_ERROR_CODE_MUTEX_UNLOCK_FAILED), "sys_arch_unprotect error\n");
kadonotakashi 0:8fdf9a60065b 483 }
kadonotakashi 0:8fdf9a60065b 484
kadonotakashi 0:8fdf9a60065b 485 u32_t sys_now(void) {
kadonotakashi 0:8fdf9a60065b 486 return osKernelGetTickCount();
kadonotakashi 0:8fdf9a60065b 487 }
kadonotakashi 0:8fdf9a60065b 488
kadonotakashi 0:8fdf9a60065b 489 void sys_msleep(u32_t ms) {
kadonotakashi 0:8fdf9a60065b 490 osDelay(ms);
kadonotakashi 0:8fdf9a60065b 491 }
kadonotakashi 0:8fdf9a60065b 492
kadonotakashi 0:8fdf9a60065b 493 osThreadId_t lwip_tcpip_thread_id = 0;
kadonotakashi 0:8fdf9a60065b 494
kadonotakashi 0:8fdf9a60065b 495 void sys_tcpip_thread_set(void)
kadonotakashi 0:8fdf9a60065b 496 {
kadonotakashi 0:8fdf9a60065b 497 lwip_tcpip_thread_id = osThreadGetId();
kadonotakashi 0:8fdf9a60065b 498 }
kadonotakashi 0:8fdf9a60065b 499
kadonotakashi 0:8fdf9a60065b 500 bool sys_tcpip_thread_check(void)
kadonotakashi 0:8fdf9a60065b 501 {
kadonotakashi 0:8fdf9a60065b 502 return osThreadGetId() == lwip_tcpip_thread_id;
kadonotakashi 0:8fdf9a60065b 503 }
kadonotakashi 0:8fdf9a60065b 504
kadonotakashi 0:8fdf9a60065b 505 // Keep a pool of thread structures
kadonotakashi 0:8fdf9a60065b 506 static int thread_pool_index = 0;
kadonotakashi 0:8fdf9a60065b 507 static sys_thread_data_t thread_pool[SYS_THREAD_POOL_N];
kadonotakashi 0:8fdf9a60065b 508
kadonotakashi 0:8fdf9a60065b 509 /*---------------------------------------------------------------------------*
kadonotakashi 0:8fdf9a60065b 510 * Routine: sys_thread_new
kadonotakashi 0:8fdf9a60065b 511 *---------------------------------------------------------------------------*
kadonotakashi 0:8fdf9a60065b 512 * Description:
kadonotakashi 0:8fdf9a60065b 513 * Starts a new thread with priority "prio" that will begin its
kadonotakashi 0:8fdf9a60065b 514 * execution in the function "thread()". The "arg" argument will be
kadonotakashi 0:8fdf9a60065b 515 * passed as an argument to the thread() function. The id of the new
kadonotakashi 0:8fdf9a60065b 516 * thread is returned. Both the id and the priority are system
kadonotakashi 0:8fdf9a60065b 517 * dependent.
kadonotakashi 0:8fdf9a60065b 518 * Inputs:
kadonotakashi 0:8fdf9a60065b 519 * char *name -- Name of thread
kadonotakashi 0:8fdf9a60065b 520 * void (*thread)(void *arg) -- Pointer to function to run.
kadonotakashi 0:8fdf9a60065b 521 * void *arg -- Argument passed into function
kadonotakashi 0:8fdf9a60065b 522 * int stacksize -- Required stack amount in bytes
kadonotakashi 0:8fdf9a60065b 523 * int priority -- Thread priority
kadonotakashi 0:8fdf9a60065b 524 * Outputs:
kadonotakashi 0:8fdf9a60065b 525 * sys_thread_t -- Pointer to thread handle.
kadonotakashi 0:8fdf9a60065b 526 *---------------------------------------------------------------------------*/
kadonotakashi 0:8fdf9a60065b 527 #ifndef MBED_TZ_DEFAULT_ACCESS
kadonotakashi 0:8fdf9a60065b 528 #define MBED_TZ_DEFAULT_ACCESS 0
kadonotakashi 0:8fdf9a60065b 529 #endif
kadonotakashi 0:8fdf9a60065b 530
kadonotakashi 0:8fdf9a60065b 531 sys_thread_t sys_thread_new(const char *pcName,
kadonotakashi 0:8fdf9a60065b 532 void (*thread)(void *arg),
kadonotakashi 0:8fdf9a60065b 533 void *arg, int stacksize, int priority) {
kadonotakashi 0:8fdf9a60065b 534 LWIP_DEBUGF(SYS_DEBUG, ("New Thread: %s\n", pcName));
kadonotakashi 0:8fdf9a60065b 535
kadonotakashi 0:8fdf9a60065b 536 if (thread_pool_index >= SYS_THREAD_POOL_N)
kadonotakashi 0:8fdf9a60065b 537 MBED_ERROR1(MBED_MAKE_ERROR(MBED_MODULE_NETWORK_STACK, MBED_ERROR_CODE_THREAD_CREATE_FAILED), "sys_thread_new number error\n", thread_pool_index);
kadonotakashi 0:8fdf9a60065b 538 sys_thread_t t = (sys_thread_t)&thread_pool[thread_pool_index];
kadonotakashi 0:8fdf9a60065b 539 thread_pool_index++;
kadonotakashi 0:8fdf9a60065b 540
kadonotakashi 0:8fdf9a60065b 541 memset(t, 0, sizeof(*t));
kadonotakashi 0:8fdf9a60065b 542 t->attr.name = pcName ? pcName : "lwip_unnamed_thread";
kadonotakashi 0:8fdf9a60065b 543 t->attr.priority = (osPriority_t)priority;
kadonotakashi 0:8fdf9a60065b 544 t->attr.cb_size = sizeof(t->data);
kadonotakashi 0:8fdf9a60065b 545 t->attr.cb_mem = &t->data;
kadonotakashi 0:8fdf9a60065b 546 t->attr.stack_size = stacksize;
kadonotakashi 0:8fdf9a60065b 547 t->attr.stack_mem = malloc(stacksize);
kadonotakashi 0:8fdf9a60065b 548 t->attr.tz_module = MBED_TZ_DEFAULT_ACCESS;
kadonotakashi 0:8fdf9a60065b 549 if (t->attr.stack_mem == NULL) {
kadonotakashi 0:8fdf9a60065b 550 MBED_ERROR1(MBED_MAKE_ERROR(MBED_MODULE_NETWORK_STACK, MBED_ERROR_CODE_OUT_OF_MEMORY), "unable to allocate thread stack\n", stacksize);
kadonotakashi 0:8fdf9a60065b 551 }
kadonotakashi 0:8fdf9a60065b 552 t->id = osThreadNew((osThreadFunc_t)thread, arg, &t->attr);
kadonotakashi 0:8fdf9a60065b 553 if (t->id == NULL)
kadonotakashi 0:8fdf9a60065b 554 MBED_ERROR(MBED_MAKE_ERROR(MBED_MODULE_NETWORK_STACK, MBED_ERROR_CODE_THREAD_CREATE_FAILED), "sys_thread_new create error\n");
kadonotakashi 0:8fdf9a60065b 555
kadonotakashi 0:8fdf9a60065b 556 return t;
kadonotakashi 0:8fdf9a60065b 557 }
kadonotakashi 0:8fdf9a60065b 558
kadonotakashi 0:8fdf9a60065b 559 #endif
kadonotakashi 0:8fdf9a60065b 560
kadonotakashi 0:8fdf9a60065b 561 #ifdef LWIP_DEBUG
kadonotakashi 0:8fdf9a60065b 562
kadonotakashi 0:8fdf9a60065b 563 #include <stdbool.h>
kadonotakashi 0:8fdf9a60065b 564
kadonotakashi 0:8fdf9a60065b 565 #if MBED_CONF_LWIP_USE_MBED_TRACE
kadonotakashi 0:8fdf9a60065b 566 #include "mbed-trace/mbed_trace.h"
kadonotakashi 0:8fdf9a60065b 567
kadonotakashi 0:8fdf9a60065b 568 void lwip_mbed_tracef_debug(const char *fmt, ...)
kadonotakashi 0:8fdf9a60065b 569 {
kadonotakashi 0:8fdf9a60065b 570 va_list ap;
kadonotakashi 0:8fdf9a60065b 571 va_start(ap, fmt);
kadonotakashi 0:8fdf9a60065b 572 mbed_vtracef(TRACE_LEVEL_DEBUG, "lwIP", fmt, ap);
kadonotakashi 0:8fdf9a60065b 573 va_end(ap);
kadonotakashi 0:8fdf9a60065b 574 }
kadonotakashi 0:8fdf9a60065b 575
kadonotakashi 0:8fdf9a60065b 576 void lwip_mbed_tracef_warn(const char *fmt, ...)
kadonotakashi 0:8fdf9a60065b 577 {
kadonotakashi 0:8fdf9a60065b 578 va_list ap;
kadonotakashi 0:8fdf9a60065b 579 va_start(ap, fmt);
kadonotakashi 0:8fdf9a60065b 580 mbed_vtracef(TRACE_LEVEL_WARN, "lwIP", fmt, ap);
kadonotakashi 0:8fdf9a60065b 581 va_end(ap);
kadonotakashi 0:8fdf9a60065b 582 }
kadonotakashi 0:8fdf9a60065b 583
kadonotakashi 0:8fdf9a60065b 584 void lwip_mbed_tracef_error(const char *fmt, ...)
kadonotakashi 0:8fdf9a60065b 585 {
kadonotakashi 0:8fdf9a60065b 586 va_list ap;
kadonotakashi 0:8fdf9a60065b 587 va_start(ap, fmt);
kadonotakashi 0:8fdf9a60065b 588 mbed_vtracef(TRACE_LEVEL_ERROR, "lwIP", fmt, ap);
kadonotakashi 0:8fdf9a60065b 589 va_end(ap);
kadonotakashi 0:8fdf9a60065b 590 }
kadonotakashi 0:8fdf9a60065b 591
kadonotakashi 0:8fdf9a60065b 592 void lwip_mbed_assert_fail(const char *msg, const char *func, const char *file, unsigned int line)
kadonotakashi 0:8fdf9a60065b 593 {
kadonotakashi 0:8fdf9a60065b 594 mbed_tracef(TRACE_LEVEL_ERROR, "lwIP", "Assertion failed: %s, function %s, file %s, line %u.", msg, func, file, line);
kadonotakashi 0:8fdf9a60065b 595 exit(EXIT_FAILURE); // XXX how about abort? mbed_assert uses exit, so follow suit
kadonotakashi 0:8fdf9a60065b 596 }
kadonotakashi 0:8fdf9a60065b 597 #else // MBED_CONF_LWIP_USE_MBED_TRACE
kadonotakashi 0:8fdf9a60065b 598
kadonotakashi 0:8fdf9a60065b 599 /** \brief Displays an error message on assertion
kadonotakashi 0:8fdf9a60065b 600
kadonotakashi 0:8fdf9a60065b 601 This function will display an error message on an assertion
kadonotakashi 0:8fdf9a60065b 602 to the debug output.
kadonotakashi 0:8fdf9a60065b 603
kadonotakashi 0:8fdf9a60065b 604 \param[in] msg Error message to display
kadonotakashi 0:8fdf9a60065b 605 \param[in] line Line number in file with error
kadonotakashi 0:8fdf9a60065b 606 \param[in] file Filename with error
kadonotakashi 0:8fdf9a60065b 607 */
kadonotakashi 0:8fdf9a60065b 608 void assert_printf(char *msg, int line, char *file) {
kadonotakashi 0:8fdf9a60065b 609 if (msg)
kadonotakashi 0:8fdf9a60065b 610 error("%s:%d in file %s\n", msg, line, file);
kadonotakashi 0:8fdf9a60065b 611 else
kadonotakashi 0:8fdf9a60065b 612 error("LWIP ASSERT\n");
kadonotakashi 0:8fdf9a60065b 613 }
kadonotakashi 0:8fdf9a60065b 614 #endif // MBED_CONF_LWIP_USE_MBED_TRACE
kadonotakashi 0:8fdf9a60065b 615
kadonotakashi 0:8fdf9a60065b 616 #if TRACE_TO_ASCII_HEX_DUMP
kadonotakashi 0:8fdf9a60065b 617 void trace_to_ascii_hex_dump(char *prefix, int len, char *data)
kadonotakashi 0:8fdf9a60065b 618 {
kadonotakashi 0:8fdf9a60065b 619 int line_len = 0;
kadonotakashi 0:8fdf9a60065b 620
kadonotakashi 0:8fdf9a60065b 621 for (int i = 0; i < len; i++) {
kadonotakashi 0:8fdf9a60065b 622 if ((line_len % 16) == 0) {
kadonotakashi 0:8fdf9a60065b 623 if (line_len != 0) {
kadonotakashi 0:8fdf9a60065b 624 LWIP_PLATFORM_DIAG(("\n"));
kadonotakashi 0:8fdf9a60065b 625 }
kadonotakashi 0:8fdf9a60065b 626 LWIP_PLATFORM_DIAG(("%s %06x", prefix, line_len));
kadonotakashi 0:8fdf9a60065b 627 }
kadonotakashi 0:8fdf9a60065b 628 line_len++;
kadonotakashi 0:8fdf9a60065b 629 LWIP_PLATFORM_DIAG((" %02x", data[i]));
kadonotakashi 0:8fdf9a60065b 630 }
kadonotakashi 0:8fdf9a60065b 631 LWIP_PLATFORM_DIAG(("\n"));
kadonotakashi 0:8fdf9a60065b 632 }
kadonotakashi 0:8fdf9a60065b 633 #endif
kadonotakashi 0:8fdf9a60065b 634
kadonotakashi 0:8fdf9a60065b 635 #endif /* LWIP_DEBUG */