TI's CC3100 websocket camera demo with Arducam mini ov5642 and freertos. Should work with other M3's. Work in progress test demo.
oslib/osi.h@1:e448e81c416f, 2015-09-11 (annotated)
- Committer:
- dflet
- Date:
- Fri Sep 11 15:38:33 2015 +0000
- Revision:
- 1:e448e81c416f
- Parent:
- 0:400d8e75a8d0
Removed some debud.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
dflet | 0:400d8e75a8d0 | 1 | //***************************************************************************** |
dflet | 0:400d8e75a8d0 | 2 | // osi.h |
dflet | 0:400d8e75a8d0 | 3 | // |
dflet | 0:400d8e75a8d0 | 4 | // MACRO and Function prototypes for TI-RTOS and Free-RTOS API calls |
dflet | 0:400d8e75a8d0 | 5 | // |
dflet | 0:400d8e75a8d0 | 6 | // Copyright (C) 2014 Texas Instruments Incorporated - http://www.ti.com/ |
dflet | 0:400d8e75a8d0 | 7 | // |
dflet | 0:400d8e75a8d0 | 8 | // |
dflet | 0:400d8e75a8d0 | 9 | // Redistribution and use in source and binary forms, with or without |
dflet | 0:400d8e75a8d0 | 10 | // modification, are permitted provided that the following conditions |
dflet | 0:400d8e75a8d0 | 11 | // are met: |
dflet | 0:400d8e75a8d0 | 12 | // |
dflet | 0:400d8e75a8d0 | 13 | // Redistributions of source code must retain the above copyright |
dflet | 0:400d8e75a8d0 | 14 | // notice, this list zof conditions and the following disclaimer. |
dflet | 0:400d8e75a8d0 | 15 | // |
dflet | 0:400d8e75a8d0 | 16 | // Redistributions in binary form must reproduce the above copyright |
dflet | 0:400d8e75a8d0 | 17 | // notice, this list of conditions and the following disclaimer in the |
dflet | 0:400d8e75a8d0 | 18 | // documentation and/or other materials provided with the |
dflet | 0:400d8e75a8d0 | 19 | // distribution. |
dflet | 0:400d8e75a8d0 | 20 | // |
dflet | 0:400d8e75a8d0 | 21 | // Neither the name of Texas Instruments Incorporated nor the names of |
dflet | 0:400d8e75a8d0 | 22 | // its contributors may be used to endorse or promote products derived |
dflet | 0:400d8e75a8d0 | 23 | // from this software without specific prior written permission. |
dflet | 0:400d8e75a8d0 | 24 | // |
dflet | 0:400d8e75a8d0 | 25 | // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
dflet | 0:400d8e75a8d0 | 26 | // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
dflet | 0:400d8e75a8d0 | 27 | // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
dflet | 0:400d8e75a8d0 | 28 | // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
dflet | 0:400d8e75a8d0 | 29 | // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
dflet | 0:400d8e75a8d0 | 30 | // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
dflet | 0:400d8e75a8d0 | 31 | // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
dflet | 0:400d8e75a8d0 | 32 | // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
dflet | 0:400d8e75a8d0 | 33 | // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
dflet | 0:400d8e75a8d0 | 34 | // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
dflet | 0:400d8e75a8d0 | 35 | // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
dflet | 0:400d8e75a8d0 | 36 | // |
dflet | 0:400d8e75a8d0 | 37 | //***************************************************************************** |
dflet | 0:400d8e75a8d0 | 38 | |
dflet | 0:400d8e75a8d0 | 39 | #ifndef __OSI_H__ |
dflet | 0:400d8e75a8d0 | 40 | #define __OSI_H__ |
dflet | 0:400d8e75a8d0 | 41 | |
dflet | 0:400d8e75a8d0 | 42 | #ifdef __cplusplus |
dflet | 0:400d8e75a8d0 | 43 | extern "C" { |
dflet | 0:400d8e75a8d0 | 44 | #endif |
dflet | 0:400d8e75a8d0 | 45 | |
dflet | 0:400d8e75a8d0 | 46 | #include <string.h> |
dflet | 0:400d8e75a8d0 | 47 | #include "portable.h" |
dflet | 0:400d8e75a8d0 | 48 | |
dflet | 0:400d8e75a8d0 | 49 | #define OSI_WAIT_FOREVER (0xFFFFFFFF) |
dflet | 0:400d8e75a8d0 | 50 | |
dflet | 0:400d8e75a8d0 | 51 | #define OSI_NO_WAIT (0) |
dflet | 0:400d8e75a8d0 | 52 | |
dflet | 0:400d8e75a8d0 | 53 | #ifndef SPAWN_TASK_STACK |
dflet | 0:400d8e75a8d0 | 54 | #define STACK_LEN (2048) /*Stack Size*/ |
dflet | 0:400d8e75a8d0 | 55 | #else |
dflet | 0:400d8e75a8d0 | 56 | #define STACK_LEN (SPAWN_TASK_STACK) |
dflet | 0:400d8e75a8d0 | 57 | #endif |
dflet | 0:400d8e75a8d0 | 58 | |
dflet | 0:400d8e75a8d0 | 59 | typedef enum |
dflet | 0:400d8e75a8d0 | 60 | { |
dflet | 0:400d8e75a8d0 | 61 | OSI_OK = 0, |
dflet | 0:400d8e75a8d0 | 62 | OSI_FAILURE = -1, |
dflet | 0:400d8e75a8d0 | 63 | OSI_OPERATION_FAILED = -2, |
dflet | 0:400d8e75a8d0 | 64 | OSI_ABORTED = -3, |
dflet | 0:400d8e75a8d0 | 65 | OSI_INVALID_PARAMS = -4, |
dflet | 0:400d8e75a8d0 | 66 | OSI_MEMORY_ALLOCATION_FAILURE = -5, |
dflet | 0:400d8e75a8d0 | 67 | OSI_TIMEOUT = -6, |
dflet | 0:400d8e75a8d0 | 68 | OSI_EVENTS_IN_USE = -7, |
dflet | 0:400d8e75a8d0 | 69 | OSI_EVENT_OPEARTION_FAILURE = -8 |
dflet | 0:400d8e75a8d0 | 70 | }OsiReturnVal_e; |
dflet | 0:400d8e75a8d0 | 71 | |
dflet | 0:400d8e75a8d0 | 72 | //#define ENTER_CRITICAL_SECTION osi_EnterCritical() |
dflet | 0:400d8e75a8d0 | 73 | //#define EXIT_CRITICAL_SECTION osi_ExitCritical() |
dflet | 0:400d8e75a8d0 | 74 | |
dflet | 0:400d8e75a8d0 | 75 | typedef void* OsiMsgQ_t; |
dflet | 0:400d8e75a8d0 | 76 | |
dflet | 0:400d8e75a8d0 | 77 | /*! |
dflet | 0:400d8e75a8d0 | 78 | \brief type definition for a time value |
dflet | 0:400d8e75a8d0 | 79 | |
dflet | 0:400d8e75a8d0 | 80 | \note On each porting or platform the type could be whatever is needed - integer, pointer to structure etc. |
dflet | 0:400d8e75a8d0 | 81 | */ |
dflet | 0:400d8e75a8d0 | 82 | typedef uint32_t OsiTime_t; |
dflet | 0:400d8e75a8d0 | 83 | //typedef unsigned long OsiTime_t; |
dflet | 0:400d8e75a8d0 | 84 | /*! |
dflet | 0:400d8e75a8d0 | 85 | \brief type definition for a sync object container |
dflet | 0:400d8e75a8d0 | 86 | |
dflet | 0:400d8e75a8d0 | 87 | Sync object is object used to synchronize between two threads or thread and interrupt handler. |
dflet | 0:400d8e75a8d0 | 88 | One thread is waiting on the object and the other thread send a signal, which then |
dflet | 0:400d8e75a8d0 | 89 | release the waiting thread. |
dflet | 0:400d8e75a8d0 | 90 | The signal must be able to be sent from interrupt context. |
dflet | 0:400d8e75a8d0 | 91 | This object is generally implemented by binary semaphore or events. |
dflet | 0:400d8e75a8d0 | 92 | |
dflet | 0:400d8e75a8d0 | 93 | \note On each porting or platform the type could be whatever is needed - integer, structure etc. |
dflet | 0:400d8e75a8d0 | 94 | */ |
dflet | 0:400d8e75a8d0 | 95 | //typedef unsigned int OsiSyncObj_t; |
dflet | 0:400d8e75a8d0 | 96 | typedef void * OsiSyncObj_t; |
dflet | 0:400d8e75a8d0 | 97 | |
dflet | 0:400d8e75a8d0 | 98 | /*! |
dflet | 0:400d8e75a8d0 | 99 | \brief type definition for a locking object container |
dflet | 0:400d8e75a8d0 | 100 | |
dflet | 0:400d8e75a8d0 | 101 | Locking object are used to protect a resource from mutual accesses of two or more threads. |
dflet | 0:400d8e75a8d0 | 102 | The locking object should support re-entrant locks by a signal thread. |
dflet | 0:400d8e75a8d0 | 103 | This object is generally implemented by mutex semaphore |
dflet | 0:400d8e75a8d0 | 104 | |
dflet | 0:400d8e75a8d0 | 105 | \note On each porting or platform the type could be whatever is needed - integer, structure etc. |
dflet | 0:400d8e75a8d0 | 106 | */ |
dflet | 0:400d8e75a8d0 | 107 | //typedef unsigned int OsiLockObj_t; |
dflet | 0:400d8e75a8d0 | 108 | typedef void * OsiLockObj_t; |
dflet | 0:400d8e75a8d0 | 109 | |
dflet | 0:400d8e75a8d0 | 110 | /*! |
dflet | 0:400d8e75a8d0 | 111 | \brief type definition for a spawn entry callback |
dflet | 0:400d8e75a8d0 | 112 | |
dflet | 0:400d8e75a8d0 | 113 | the spawn mechanism enable to run a function on different context. |
dflet | 0:400d8e75a8d0 | 114 | This mechanism allow to transfer the execution context from interrupt context to thread context |
dflet | 0:400d8e75a8d0 | 115 | or changing the context from an unknown user thread to general context. |
dflet | 0:400d8e75a8d0 | 116 | The implementation of the spawn mechanism depends on the user's system requirements and could varies |
dflet | 0:400d8e75a8d0 | 117 | from implementation of serialized execution using single thread to creating thread per call |
dflet | 0:400d8e75a8d0 | 118 | |
dflet | 0:400d8e75a8d0 | 119 | \note The stack size of the execution thread must be at least of TBD bytes! |
dflet | 0:400d8e75a8d0 | 120 | */ |
dflet | 0:400d8e75a8d0 | 121 | typedef void (*P_OSI_SPAWN_ENTRY)(void* pValue); |
dflet | 0:400d8e75a8d0 | 122 | |
dflet | 0:400d8e75a8d0 | 123 | typedef void (*P_OSI_EVENT_HANDLER)(void* pValue); |
dflet | 0:400d8e75a8d0 | 124 | |
dflet | 0:400d8e75a8d0 | 125 | typedef void (*P_OSI_TASK_ENTRY)(void* pValue); |
dflet | 0:400d8e75a8d0 | 126 | |
dflet | 0:400d8e75a8d0 | 127 | typedef void (*P_OSI_INTR_ENTRY)(void); |
dflet | 0:400d8e75a8d0 | 128 | |
dflet | 0:400d8e75a8d0 | 129 | typedef void* OsiTaskHandle; |
dflet | 0:400d8e75a8d0 | 130 | |
dflet | 0:400d8e75a8d0 | 131 | /*! |
dflet | 0:400d8e75a8d0 | 132 | \brief This function registers an interrupt in NVIC table |
dflet | 0:400d8e75a8d0 | 133 | |
dflet | 0:400d8e75a8d0 | 134 | The sync object is used for synchronization between different thread or ISR and |
dflet | 0:400d8e75a8d0 | 135 | a thread. |
dflet | 0:400d8e75a8d0 | 136 | |
dflet | 0:400d8e75a8d0 | 137 | \param iIntrNum - Interrupt number to register |
dflet | 0:400d8e75a8d0 | 138 | \param pEntry - Pointer to the interrupt handler |
dflet | 0:400d8e75a8d0 | 139 | |
dflet | 0:400d8e75a8d0 | 140 | \return upon successful creation the function should return 0 |
dflet | 0:400d8e75a8d0 | 141 | Otherwise, a negative value indicating the error code shall be returned |
dflet | 0:400d8e75a8d0 | 142 | \note |
dflet | 0:400d8e75a8d0 | 143 | \warning |
dflet | 0:400d8e75a8d0 | 144 | */ |
dflet | 0:400d8e75a8d0 | 145 | OsiReturnVal_e osi_InterruptRegister(int iIntrNum,P_OSI_INTR_ENTRY pEntry,unsigned char ucPriority); |
dflet | 0:400d8e75a8d0 | 146 | |
dflet | 0:400d8e75a8d0 | 147 | /*! |
dflet | 0:400d8e75a8d0 | 148 | \brief This function De-registers an interrupt in NVIC table |
dflet | 0:400d8e75a8d0 | 149 | |
dflet | 0:400d8e75a8d0 | 150 | \param iIntrNum - Interrupt number to register |
dflet | 0:400d8e75a8d0 | 151 | \param pEntry - Pointer to the interrupt handler |
dflet | 0:400d8e75a8d0 | 152 | |
dflet | 0:400d8e75a8d0 | 153 | \return upon successful creation the function should return Positive number |
dflet | 0:400d8e75a8d0 | 154 | Otherwise, a negative value indicating the error code shall be returned |
dflet | 0:400d8e75a8d0 | 155 | \note |
dflet | 0:400d8e75a8d0 | 156 | \warning |
dflet | 0:400d8e75a8d0 | 157 | */ |
dflet | 0:400d8e75a8d0 | 158 | void osi_InterruptDeRegister(int iIntrNum); |
dflet | 0:400d8e75a8d0 | 159 | |
dflet | 0:400d8e75a8d0 | 160 | |
dflet | 0:400d8e75a8d0 | 161 | /*! |
dflet | 0:400d8e75a8d0 | 162 | \brief This function creates a sync object |
dflet | 0:400d8e75a8d0 | 163 | |
dflet | 0:400d8e75a8d0 | 164 | The sync object is used for synchronization between different thread or ISR and |
dflet | 0:400d8e75a8d0 | 165 | a thread. |
dflet | 0:400d8e75a8d0 | 166 | |
dflet | 0:400d8e75a8d0 | 167 | \param pSyncObj - pointer to the sync object control block |
dflet | 0:400d8e75a8d0 | 168 | |
dflet | 0:400d8e75a8d0 | 169 | \return upon successful creation the function should return 0 |
dflet | 0:400d8e75a8d0 | 170 | Otherwise, a negative value indicating the error code shall be returned |
dflet | 0:400d8e75a8d0 | 171 | \note |
dflet | 0:400d8e75a8d0 | 172 | \warning |
dflet | 0:400d8e75a8d0 | 173 | */ |
dflet | 0:400d8e75a8d0 | 174 | OsiReturnVal_e osi_SyncObjCreate(OsiSyncObj_t* pSyncObj); |
dflet | 0:400d8e75a8d0 | 175 | |
dflet | 0:400d8e75a8d0 | 176 | |
dflet | 0:400d8e75a8d0 | 177 | /*! |
dflet | 0:400d8e75a8d0 | 178 | \brief This function deletes a sync object |
dflet | 0:400d8e75a8d0 | 179 | |
dflet | 0:400d8e75a8d0 | 180 | \param pSyncObj - pointer to the sync object control block |
dflet | 0:400d8e75a8d0 | 181 | |
dflet | 0:400d8e75a8d0 | 182 | \return upon successful deletion the function should return 0 |
dflet | 0:400d8e75a8d0 | 183 | Otherwise, a negative value indicating the error code shall be returned |
dflet | 0:400d8e75a8d0 | 184 | \note |
dflet | 0:400d8e75a8d0 | 185 | \warning |
dflet | 0:400d8e75a8d0 | 186 | */ |
dflet | 0:400d8e75a8d0 | 187 | OsiReturnVal_e osi_SyncObjDelete(OsiSyncObj_t* pSyncObj); |
dflet | 0:400d8e75a8d0 | 188 | |
dflet | 0:400d8e75a8d0 | 189 | /*! |
dflet | 0:400d8e75a8d0 | 190 | \brief This function generates a sync signal for the object. |
dflet | 0:400d8e75a8d0 | 191 | |
dflet | 0:400d8e75a8d0 | 192 | All suspended threads waiting on this sync object are resumed |
dflet | 0:400d8e75a8d0 | 193 | |
dflet | 0:400d8e75a8d0 | 194 | \param pSyncObj - pointer to the sync object control block |
dflet | 0:400d8e75a8d0 | 195 | |
dflet | 0:400d8e75a8d0 | 196 | \return upon successful signalling the function should return 0 |
dflet | 0:400d8e75a8d0 | 197 | Otherwise, a negative value indicating the error code shall be returned |
dflet | 0:400d8e75a8d0 | 198 | \note the function could be called from ISR context |
dflet | 0:400d8e75a8d0 | 199 | \warning |
dflet | 0:400d8e75a8d0 | 200 | */ |
dflet | 0:400d8e75a8d0 | 201 | OsiReturnVal_e osi_SyncObjSignal(OsiSyncObj_t* pSyncObj); |
dflet | 0:400d8e75a8d0 | 202 | |
dflet | 0:400d8e75a8d0 | 203 | /*! |
dflet | 0:400d8e75a8d0 | 204 | \brief This function generates a sync signal for the object. |
dflet | 0:400d8e75a8d0 | 205 | from ISR context. |
dflet | 0:400d8e75a8d0 | 206 | |
dflet | 0:400d8e75a8d0 | 207 | All suspended threads waiting on this sync object are resumed |
dflet | 0:400d8e75a8d0 | 208 | |
dflet | 0:400d8e75a8d0 | 209 | \param pSyncObj - pointer to the sync object control block |
dflet | 0:400d8e75a8d0 | 210 | |
dflet | 0:400d8e75a8d0 | 211 | \return upon successful signalling the function should return 0 |
dflet | 0:400d8e75a8d0 | 212 | Otherwise, a negative value indicating the error code shall be returned |
dflet | 0:400d8e75a8d0 | 213 | \note the function is called from ISR context |
dflet | 0:400d8e75a8d0 | 214 | \warning |
dflet | 0:400d8e75a8d0 | 215 | */ |
dflet | 0:400d8e75a8d0 | 216 | OsiReturnVal_e osi_SyncObjSignalFromISR(OsiSyncObj_t* pSyncObj); |
dflet | 0:400d8e75a8d0 | 217 | |
dflet | 0:400d8e75a8d0 | 218 | /*! |
dflet | 0:400d8e75a8d0 | 219 | \brief This function waits for a sync signal of the specific sync object |
dflet | 0:400d8e75a8d0 | 220 | |
dflet | 0:400d8e75a8d0 | 221 | \param pSyncObj - pointer to the sync object control block |
dflet | 0:400d8e75a8d0 | 222 | \param Timeout - numeric value specifies the maximum number of mSec to |
dflet | 0:400d8e75a8d0 | 223 | stay suspended while waiting for the sync signal |
dflet | 0:400d8e75a8d0 | 224 | Currently, the simple link driver uses only two values: |
dflet | 0:400d8e75a8d0 | 225 | - OSI_WAIT_FOREVER |
dflet | 0:400d8e75a8d0 | 226 | - OSI_NO_WAIT |
dflet | 0:400d8e75a8d0 | 227 | |
dflet | 0:400d8e75a8d0 | 228 | \return upon successful reception of the signal within the timeout window return 0 |
dflet | 0:400d8e75a8d0 | 229 | Otherwise, a negative value indicating the error code shall be returned |
dflet | 0:400d8e75a8d0 | 230 | \note |
dflet | 0:400d8e75a8d0 | 231 | \warning |
dflet | 0:400d8e75a8d0 | 232 | */ |
dflet | 0:400d8e75a8d0 | 233 | OsiReturnVal_e osi_SyncObjWait(OsiSyncObj_t* pSyncObj , OsiTime_t Timeout); |
dflet | 0:400d8e75a8d0 | 234 | |
dflet | 0:400d8e75a8d0 | 235 | /*! |
dflet | 0:400d8e75a8d0 | 236 | \brief This function clears a sync object |
dflet | 0:400d8e75a8d0 | 237 | |
dflet | 0:400d8e75a8d0 | 238 | \param pSyncObj - pointer to the sync object control block |
dflet | 0:400d8e75a8d0 | 239 | |
dflet | 0:400d8e75a8d0 | 240 | \return upon successful clearing the function should return 0 |
dflet | 0:400d8e75a8d0 | 241 | Otherwise, a negative value indicating the error code shall be returned |
dflet | 0:400d8e75a8d0 | 242 | \note |
dflet | 0:400d8e75a8d0 | 243 | \warning |
dflet | 0:400d8e75a8d0 | 244 | */ |
dflet | 0:400d8e75a8d0 | 245 | OsiReturnVal_e osi_SyncObjClear(OsiSyncObj_t* pSyncObj); |
dflet | 0:400d8e75a8d0 | 246 | |
dflet | 0:400d8e75a8d0 | 247 | /*! |
dflet | 0:400d8e75a8d0 | 248 | \brief This function creates a locking object. |
dflet | 0:400d8e75a8d0 | 249 | |
dflet | 0:400d8e75a8d0 | 250 | The locking object is used for protecting a shared resources between different |
dflet | 0:400d8e75a8d0 | 251 | threads. |
dflet | 0:400d8e75a8d0 | 252 | |
dflet | 0:400d8e75a8d0 | 253 | \param pLockObj - pointer to the locking object control block |
dflet | 0:400d8e75a8d0 | 254 | |
dflet | 0:400d8e75a8d0 | 255 | \return upon successful creation the function should return 0 |
dflet | 0:400d8e75a8d0 | 256 | Otherwise, a negative value indicating the error code shall be returned |
dflet | 0:400d8e75a8d0 | 257 | \note |
dflet | 0:400d8e75a8d0 | 258 | \warning |
dflet | 0:400d8e75a8d0 | 259 | */ |
dflet | 0:400d8e75a8d0 | 260 | OsiReturnVal_e osi_LockObjCreate(OsiLockObj_t* pLockObj); |
dflet | 0:400d8e75a8d0 | 261 | |
dflet | 0:400d8e75a8d0 | 262 | /*! |
dflet | 0:400d8e75a8d0 | 263 | \brief This function deletes a locking object. |
dflet | 0:400d8e75a8d0 | 264 | |
dflet | 0:400d8e75a8d0 | 265 | \param pLockObj - pointer to the locking object control block |
dflet | 0:400d8e75a8d0 | 266 | |
dflet | 0:400d8e75a8d0 | 267 | \return upon successful deletion the function should return 0 |
dflet | 0:400d8e75a8d0 | 268 | Otherwise, a negative value indicating the error code shall be returned |
dflet | 0:400d8e75a8d0 | 269 | \note |
dflet | 0:400d8e75a8d0 | 270 | \warning |
dflet | 0:400d8e75a8d0 | 271 | */ |
dflet | 0:400d8e75a8d0 | 272 | OsiReturnVal_e osi_LockObjDelete(OsiLockObj_t* pLockObj); |
dflet | 0:400d8e75a8d0 | 273 | |
dflet | 0:400d8e75a8d0 | 274 | /*! |
dflet | 0:400d8e75a8d0 | 275 | \brief This function locks a locking object. |
dflet | 0:400d8e75a8d0 | 276 | |
dflet | 0:400d8e75a8d0 | 277 | All other threads that call this function before this thread calls |
dflet | 0:400d8e75a8d0 | 278 | the osi_LockObjUnlock would be suspended |
dflet | 0:400d8e75a8d0 | 279 | |
dflet | 0:400d8e75a8d0 | 280 | \param pLockObj - pointer to the locking object control block |
dflet | 0:400d8e75a8d0 | 281 | \param Timeout - numeric value specifies the maximum number of mSec to |
dflet | 0:400d8e75a8d0 | 282 | stay suspended while waiting for the locking object |
dflet | 0:400d8e75a8d0 | 283 | Currently, the simple link driver uses only two values: |
dflet | 0:400d8e75a8d0 | 284 | - OSI_WAIT_FOREVER |
dflet | 0:400d8e75a8d0 | 285 | - OSI_NO_WAIT |
dflet | 0:400d8e75a8d0 | 286 | |
dflet | 0:400d8e75a8d0 | 287 | |
dflet | 0:400d8e75a8d0 | 288 | \return upon successful reception of the locking object the function should return 0 |
dflet | 0:400d8e75a8d0 | 289 | Otherwise, a negative value indicating the error code shall be returned |
dflet | 0:400d8e75a8d0 | 290 | \note |
dflet | 0:400d8e75a8d0 | 291 | \warning |
dflet | 0:400d8e75a8d0 | 292 | */ |
dflet | 0:400d8e75a8d0 | 293 | OsiReturnVal_e osi_LockObjLock(OsiLockObj_t* pLockObj , OsiTime_t Timeout); |
dflet | 0:400d8e75a8d0 | 294 | |
dflet | 0:400d8e75a8d0 | 295 | /*! |
dflet | 0:400d8e75a8d0 | 296 | \brief This function unlock a locking object. |
dflet | 0:400d8e75a8d0 | 297 | |
dflet | 0:400d8e75a8d0 | 298 | \param pLockObj - pointer to the locking object control block |
dflet | 0:400d8e75a8d0 | 299 | |
dflet | 0:400d8e75a8d0 | 300 | \return upon successful unlocking the function should return 0 |
dflet | 0:400d8e75a8d0 | 301 | Otherwise, a negative value indicating the error code shall be returned |
dflet | 0:400d8e75a8d0 | 302 | \note |
dflet | 0:400d8e75a8d0 | 303 | \warning |
dflet | 0:400d8e75a8d0 | 304 | */ |
dflet | 0:400d8e75a8d0 | 305 | OsiReturnVal_e osi_LockObjUnlock(OsiLockObj_t* pLockObj); |
dflet | 0:400d8e75a8d0 | 306 | |
dflet | 0:400d8e75a8d0 | 307 | |
dflet | 0:400d8e75a8d0 | 308 | /*! |
dflet | 0:400d8e75a8d0 | 309 | \brief This function call the pEntry callback from a different context |
dflet | 0:400d8e75a8d0 | 310 | |
dflet | 0:400d8e75a8d0 | 311 | \param pEntry - pointer to the entry callback function |
dflet | 0:400d8e75a8d0 | 312 | |
dflet | 0:400d8e75a8d0 | 313 | \param pValue - pointer to any type of memory structure that would be |
dflet | 0:400d8e75a8d0 | 314 | passed to pEntry callback from the execution thread. |
dflet | 0:400d8e75a8d0 | 315 | |
dflet | 0:400d8e75a8d0 | 316 | \param flags - execution flags - reserved for future usage |
dflet | 0:400d8e75a8d0 | 317 | |
dflet | 0:400d8e75a8d0 | 318 | \return upon successful registration of the spawn the function should return 0 |
dflet | 0:400d8e75a8d0 | 319 | (the function is not blocked till the end of the execution of the function |
dflet | 0:400d8e75a8d0 | 320 | and could be returned before the execution is actually completed) |
dflet | 0:400d8e75a8d0 | 321 | Otherwise, a negative value indicating the error code shall be returned |
dflet | 0:400d8e75a8d0 | 322 | \note |
dflet | 0:400d8e75a8d0 | 323 | \warning |
dflet | 0:400d8e75a8d0 | 324 | */ |
dflet | 0:400d8e75a8d0 | 325 | /*! |
dflet | 0:400d8e75a8d0 | 326 | \brief This function creates a Task. |
dflet | 0:400d8e75a8d0 | 327 | |
dflet | 0:400d8e75a8d0 | 328 | Creates a new Task and add it to the last of tasks that are ready to run |
dflet | 0:400d8e75a8d0 | 329 | |
dflet | 0:400d8e75a8d0 | 330 | \param pEntry - pointer to the Task Function |
dflet | 0:400d8e75a8d0 | 331 | \param pcName - Task Name String |
dflet | 0:400d8e75a8d0 | 332 | \param usStackDepth - Stack Size Stack Size in 32-bit long words |
dflet | 0:400d8e75a8d0 | 333 | \param pvParameters - pointer to structure to be passed to the Task Function |
dflet | 0:400d8e75a8d0 | 334 | \param uxPriority - Task Priority |
dflet | 0:400d8e75a8d0 | 335 | |
dflet | 0:400d8e75a8d0 | 336 | \return upon successful unlocking the function should return 0 |
dflet | 0:400d8e75a8d0 | 337 | Otherwise, a negative value indicating the error code shall be returned |
dflet | 0:400d8e75a8d0 | 338 | \note |
dflet | 0:400d8e75a8d0 | 339 | \warning |
dflet | 0:400d8e75a8d0 | 340 | */ |
dflet | 0:400d8e75a8d0 | 341 | OsiReturnVal_e osi_TaskCreate(P_OSI_TASK_ENTRY pEntry,const signed char * const pcName,unsigned short usStackDepth,void *pvParameters,uint32_t uxPriority,OsiTaskHandle *pTaskHandle); |
dflet | 0:400d8e75a8d0 | 342 | |
dflet | 0:400d8e75a8d0 | 343 | /*! |
dflet | 0:400d8e75a8d0 | 344 | \brief This function Deletes a Task. |
dflet | 0:400d8e75a8d0 | 345 | |
dflet | 0:400d8e75a8d0 | 346 | Deletes a Task and remove it from list of running task |
dflet | 0:400d8e75a8d0 | 347 | |
dflet | 0:400d8e75a8d0 | 348 | \param pTaskHandle - Task Handle |
dflet | 0:400d8e75a8d0 | 349 | |
dflet | 0:400d8e75a8d0 | 350 | \note |
dflet | 0:400d8e75a8d0 | 351 | \warning |
dflet | 0:400d8e75a8d0 | 352 | */ |
dflet | 0:400d8e75a8d0 | 353 | void osi_TaskDelete(OsiTaskHandle* pTaskHandle); |
dflet | 0:400d8e75a8d0 | 354 | |
dflet | 0:400d8e75a8d0 | 355 | /*! |
dflet | 0:400d8e75a8d0 | 356 | \brief This function call the pEntry callback from a different context |
dflet | 0:400d8e75a8d0 | 357 | |
dflet | 0:400d8e75a8d0 | 358 | \param pEntry - pointer to the entry callback function |
dflet | 0:400d8e75a8d0 | 359 | |
dflet | 0:400d8e75a8d0 | 360 | \param pValue - pointer to any type of memory structure that would be |
dflet | 0:400d8e75a8d0 | 361 | passed to pEntry callback from the execution thread. |
dflet | 0:400d8e75a8d0 | 362 | |
dflet | 0:400d8e75a8d0 | 363 | \param flags - execution flags - reserved for future usage |
dflet | 0:400d8e75a8d0 | 364 | |
dflet | 0:400d8e75a8d0 | 365 | \return upon successful registration of the spawn the function should return 0 |
dflet | 0:400d8e75a8d0 | 366 | (the function is not blocked till the end of the execution of the function |
dflet | 0:400d8e75a8d0 | 367 | and could be returned before the execution is actually completed) |
dflet | 0:400d8e75a8d0 | 368 | Otherwise, a negative value indicating the error code shall be returned |
dflet | 0:400d8e75a8d0 | 369 | \note |
dflet | 0:400d8e75a8d0 | 370 | \warning |
dflet | 0:400d8e75a8d0 | 371 | */ |
dflet | 0:400d8e75a8d0 | 372 | OsiReturnVal_e osi_Spawn(P_OSI_SPAWN_ENTRY pEntry , void* pValue , uint32_t flags); |
dflet | 0:400d8e75a8d0 | 373 | |
dflet | 0:400d8e75a8d0 | 374 | |
dflet | 0:400d8e75a8d0 | 375 | /******************************************************************************* |
dflet | 0:400d8e75a8d0 | 376 | |
dflet | 0:400d8e75a8d0 | 377 | This function creates a message queue that is typically used for inter thread |
dflet | 0:400d8e75a8d0 | 378 | communication. |
dflet | 0:400d8e75a8d0 | 379 | |
dflet | 0:400d8e75a8d0 | 380 | Parameters: |
dflet | 0:400d8e75a8d0 | 381 | |
dflet | 0:400d8e75a8d0 | 382 | pMsgQ - pointer to the message queue control block |
dflet | 0:400d8e75a8d0 | 383 | pMsgQName - pointer to the name of the message queue |
dflet | 0:400d8e75a8d0 | 384 | MsgSize - the size of the message. |
dflet | 0:400d8e75a8d0 | 385 | |
dflet | 0:400d8e75a8d0 | 386 | NOTICE: THE MESSGAE SIZE MUST BE SMALLER THAN 16 |
dflet | 0:400d8e75a8d0 | 387 | |
dflet | 0:400d8e75a8d0 | 388 | MaxMsgs - maximum number of messages. |
dflet | 0:400d8e75a8d0 | 389 | |
dflet | 0:400d8e75a8d0 | 390 | Please note that this function allocates the entire memory required |
dflet | 0:400d8e75a8d0 | 391 | for the maximum number of messages (MsgSize * MaxMsgs). |
dflet | 0:400d8e75a8d0 | 392 | |
dflet | 0:400d8e75a8d0 | 393 | ********************************************************************************/ |
dflet | 0:400d8e75a8d0 | 394 | OsiReturnVal_e osi_MsgQCreate(OsiMsgQ_t* pMsgQ , |
dflet | 0:400d8e75a8d0 | 395 | char* pMsgQName, |
dflet | 0:400d8e75a8d0 | 396 | uint32_t MsgSize, |
dflet | 0:400d8e75a8d0 | 397 | uint32_t MaxMsgs); |
dflet | 0:400d8e75a8d0 | 398 | |
dflet | 0:400d8e75a8d0 | 399 | /******************************************************************************* |
dflet | 0:400d8e75a8d0 | 400 | |
dflet | 0:400d8e75a8d0 | 401 | This function deletes a specific message queue. |
dflet | 0:400d8e75a8d0 | 402 | All threads suspended waiting for a message from this queue are resumed with |
dflet | 0:400d8e75a8d0 | 403 | an error return value. |
dflet | 0:400d8e75a8d0 | 404 | |
dflet | 0:400d8e75a8d0 | 405 | Parameters: |
dflet | 0:400d8e75a8d0 | 406 | |
dflet | 0:400d8e75a8d0 | 407 | pMsgQ - pointer to the message queue control block |
dflet | 0:400d8e75a8d0 | 408 | |
dflet | 0:400d8e75a8d0 | 409 | ********************************************************************************/ |
dflet | 0:400d8e75a8d0 | 410 | OsiReturnVal_e osi_MsgQDelete(OsiMsgQ_t* pMsgQ); |
dflet | 0:400d8e75a8d0 | 411 | |
dflet | 0:400d8e75a8d0 | 412 | |
dflet | 0:400d8e75a8d0 | 413 | /******************************************************************************* |
dflet | 0:400d8e75a8d0 | 414 | |
dflet | 0:400d8e75a8d0 | 415 | This function writes a message to a specific message queue. |
dflet | 0:400d8e75a8d0 | 416 | |
dflet | 0:400d8e75a8d0 | 417 | Notice that the message is copied to the queue from the memory area specified |
dflet | 0:400d8e75a8d0 | 418 | by pMsg pointer. |
dflet | 0:400d8e75a8d0 | 419 | |
dflet | 0:400d8e75a8d0 | 420 | -------------------------------------------------------------------------------- |
dflet | 0:400d8e75a8d0 | 421 | THIS FUNCTION COULD BE CALLED FROM ISR AS LONG AS THE TIMEOUT PARAMETER IS |
dflet | 0:400d8e75a8d0 | 422 | SET TO "OSI_NO_WAIT" |
dflet | 0:400d8e75a8d0 | 423 | -------------------------------------------------------------------------------- |
dflet | 0:400d8e75a8d0 | 424 | |
dflet | 0:400d8e75a8d0 | 425 | Parameters: |
dflet | 0:400d8e75a8d0 | 426 | |
dflet | 0:400d8e75a8d0 | 427 | pMsgQ - pointer to the message queue control block |
dflet | 0:400d8e75a8d0 | 428 | pMsg - pointer to the message |
dflet | 0:400d8e75a8d0 | 429 | Timeout - numeric value specifies the maximum number of mSec to stay |
dflet | 0:400d8e75a8d0 | 430 | suspended while waiting for available space for the message |
dflet | 0:400d8e75a8d0 | 431 | |
dflet | 0:400d8e75a8d0 | 432 | ********************************************************************************/ |
dflet | 0:400d8e75a8d0 | 433 | OsiReturnVal_e osi_MsgQWrite(OsiMsgQ_t* pMsgQ, void* pMsg , OsiTime_t Timeout); |
dflet | 0:400d8e75a8d0 | 434 | |
dflet | 0:400d8e75a8d0 | 435 | |
dflet | 0:400d8e75a8d0 | 436 | /******************************************************************************* |
dflet | 0:400d8e75a8d0 | 437 | |
dflet | 0:400d8e75a8d0 | 438 | This function retrieves a message from the specified message queue. The |
dflet | 0:400d8e75a8d0 | 439 | retrieved message is copied from the queue into the memory area specified by |
dflet | 0:400d8e75a8d0 | 440 | the pMsg pointer |
dflet | 0:400d8e75a8d0 | 441 | |
dflet | 0:400d8e75a8d0 | 442 | Parameters: |
dflet | 0:400d8e75a8d0 | 443 | |
dflet | 0:400d8e75a8d0 | 444 | pMsgQ - pointer to the message queue control block |
dflet | 0:400d8e75a8d0 | 445 | pMsg - pointer that specify the location where to copy the message |
dflet | 0:400d8e75a8d0 | 446 | Timeout - numeric value specifies the maximum number of mSec to stay |
dflet | 0:400d8e75a8d0 | 447 | suspended while waiting for a message to be available |
dflet | 0:400d8e75a8d0 | 448 | |
dflet | 0:400d8e75a8d0 | 449 | ********************************************************************************/ |
dflet | 0:400d8e75a8d0 | 450 | OsiReturnVal_e osi_MsgQRead(OsiMsgQ_t* pMsgQ, void* pMsg , OsiTime_t Timeout); |
dflet | 0:400d8e75a8d0 | 451 | |
dflet | 0:400d8e75a8d0 | 452 | /*! |
dflet | 0:400d8e75a8d0 | 453 | \brief This function starts the OS Scheduler |
dflet | 0:400d8e75a8d0 | 454 | \param - void |
dflet | 0:400d8e75a8d0 | 455 | \return - void |
dflet | 0:400d8e75a8d0 | 456 | \note |
dflet | 0:400d8e75a8d0 | 457 | \warning |
dflet | 0:400d8e75a8d0 | 458 | */ |
dflet | 0:400d8e75a8d0 | 459 | void osi_start(void); |
dflet | 0:400d8e75a8d0 | 460 | |
dflet | 0:400d8e75a8d0 | 461 | /*! |
dflet | 0:400d8e75a8d0 | 462 | \brief Allocates Memory on Heap |
dflet | 0:400d8e75a8d0 | 463 | \param Size - Size of the Buffer to be allocated |
dflet | 0:400d8e75a8d0 | 464 | \sa |
dflet | 0:400d8e75a8d0 | 465 | \note |
dflet | 0:400d8e75a8d0 | 466 | \warning |
dflet | 0:400d8e75a8d0 | 467 | */ |
dflet | 0:400d8e75a8d0 | 468 | void * mem_Malloc(uint32_t Size); |
dflet | 0:400d8e75a8d0 | 469 | |
dflet | 0:400d8e75a8d0 | 470 | |
dflet | 0:400d8e75a8d0 | 471 | /*! |
dflet | 0:400d8e75a8d0 | 472 | \brief Deallocates Memory |
dflet | 0:400d8e75a8d0 | 473 | \param pMem - Pointer to the Buffer to be freed |
dflet | 0:400d8e75a8d0 | 474 | \return void |
dflet | 0:400d8e75a8d0 | 475 | \sa |
dflet | 0:400d8e75a8d0 | 476 | \note |
dflet | 0:400d8e75a8d0 | 477 | \warning |
dflet | 0:400d8e75a8d0 | 478 | */ |
dflet | 0:400d8e75a8d0 | 479 | void mem_Free(void *pMem); |
dflet | 0:400d8e75a8d0 | 480 | |
dflet | 0:400d8e75a8d0 | 481 | |
dflet | 0:400d8e75a8d0 | 482 | /*! |
dflet | 0:400d8e75a8d0 | 483 | \brief Set Memory |
dflet | 0:400d8e75a8d0 | 484 | \param pBuf - Pointer to the Buffer |
dflet | 0:400d8e75a8d0 | 485 | \param Val - Value to be set |
dflet | 0:400d8e75a8d0 | 486 | \param Size - Size of the memory to be set |
dflet | 0:400d8e75a8d0 | 487 | \sa |
dflet | 0:400d8e75a8d0 | 488 | \note |
dflet | 0:400d8e75a8d0 | 489 | \warning |
dflet | 0:400d8e75a8d0 | 490 | */ |
dflet | 0:400d8e75a8d0 | 491 | void mem_set(void *pBuf,int Val,size_t Size); |
dflet | 0:400d8e75a8d0 | 492 | |
dflet | 0:400d8e75a8d0 | 493 | /*! |
dflet | 0:400d8e75a8d0 | 494 | \brief Copy Memory |
dflet | 0:400d8e75a8d0 | 495 | \param pDst - Pointer to the Destination Buffer |
dflet | 0:400d8e75a8d0 | 496 | \param pSrc - Pointer to the Source Buffer |
dflet | 0:400d8e75a8d0 | 497 | \param Size - Size of the memory to be copied |
dflet | 0:400d8e75a8d0 | 498 | \return void |
dflet | 0:400d8e75a8d0 | 499 | \note |
dflet | 0:400d8e75a8d0 | 500 | \warning |
dflet | 0:400d8e75a8d0 | 501 | */ |
dflet | 0:400d8e75a8d0 | 502 | void mem_copy(void *pDst, void *pSrc,size_t Size); |
dflet | 0:400d8e75a8d0 | 503 | |
dflet | 0:400d8e75a8d0 | 504 | /*! |
dflet | 0:400d8e75a8d0 | 505 | \brief Enter Critical Section |
dflet | 0:400d8e75a8d0 | 506 | \sa |
dflet | 0:400d8e75a8d0 | 507 | \note |
dflet | 0:400d8e75a8d0 | 508 | \warning |
dflet | 0:400d8e75a8d0 | 509 | */ |
dflet | 0:400d8e75a8d0 | 510 | uint32_t osi_EnterCritical(void); |
dflet | 0:400d8e75a8d0 | 511 | |
dflet | 0:400d8e75a8d0 | 512 | /*! |
dflet | 0:400d8e75a8d0 | 513 | \brief Exit Critical Section |
dflet | 0:400d8e75a8d0 | 514 | \sa |
dflet | 0:400d8e75a8d0 | 515 | \note |
dflet | 0:400d8e75a8d0 | 516 | \warning |
dflet | 0:400d8e75a8d0 | 517 | */ |
dflet | 0:400d8e75a8d0 | 518 | void osi_ExitCritical(uint32_t ulKey); |
dflet | 0:400d8e75a8d0 | 519 | |
dflet | 0:400d8e75a8d0 | 520 | /*! |
dflet | 0:400d8e75a8d0 | 521 | \brief This function used to save the os context before sleep |
dflet | 0:400d8e75a8d0 | 522 | \param void |
dflet | 0:400d8e75a8d0 | 523 | \return void |
dflet | 0:400d8e75a8d0 | 524 | \note |
dflet | 0:400d8e75a8d0 | 525 | \warning |
dflet | 0:400d8e75a8d0 | 526 | */ |
dflet | 0:400d8e75a8d0 | 527 | void osi_ContextSave(void); |
dflet | 0:400d8e75a8d0 | 528 | /*! |
dflet | 0:400d8e75a8d0 | 529 | \brief This function used to retrieve the context after sleep |
dflet | 0:400d8e75a8d0 | 530 | \param void |
dflet | 0:400d8e75a8d0 | 531 | \return void |
dflet | 0:400d8e75a8d0 | 532 | \note |
dflet | 0:400d8e75a8d0 | 533 | \warning |
dflet | 0:400d8e75a8d0 | 534 | */ |
dflet | 0:400d8e75a8d0 | 535 | void osi_ContextRestore(void); |
dflet | 0:400d8e75a8d0 | 536 | |
dflet | 0:400d8e75a8d0 | 537 | /*! |
dflet | 0:400d8e75a8d0 | 538 | \brief This function used to suspend the task for the specified number of milli secs |
dflet | 0:400d8e75a8d0 | 539 | \param MilliSecs - Time in millisecs to suspend the task |
dflet | 0:400d8e75a8d0 | 540 | \return void |
dflet | 0:400d8e75a8d0 | 541 | \note |
dflet | 0:400d8e75a8d0 | 542 | \warning |
dflet | 0:400d8e75a8d0 | 543 | */ |
dflet | 0:400d8e75a8d0 | 544 | void osi_Sleep(unsigned int MilliSecs); |
dflet | 0:400d8e75a8d0 | 545 | |
dflet | 0:400d8e75a8d0 | 546 | /*! |
dflet | 0:400d8e75a8d0 | 547 | \brief This function used to disable the tasks |
dflet | 0:400d8e75a8d0 | 548 | \param - void |
dflet | 0:400d8e75a8d0 | 549 | \return - Key with the suspended tasks |
dflet | 0:400d8e75a8d0 | 550 | \note |
dflet | 0:400d8e75a8d0 | 551 | \warning |
dflet | 0:400d8e75a8d0 | 552 | */ |
dflet | 0:400d8e75a8d0 | 553 | uint32_t osi_TaskDisable(void); |
dflet | 0:400d8e75a8d0 | 554 | |
dflet | 0:400d8e75a8d0 | 555 | /*! |
dflet | 0:400d8e75a8d0 | 556 | \brief This function used to enable all tasks |
dflet | 0:400d8e75a8d0 | 557 | \param unsigned long |
dflet | 0:400d8e75a8d0 | 558 | \return - void |
dflet | 0:400d8e75a8d0 | 559 | \note |
dflet | 0:400d8e75a8d0 | 560 | \warning |
dflet | 0:400d8e75a8d0 | 561 | */ |
dflet | 0:400d8e75a8d0 | 562 | void osi_TaskEnable(uint32_t); |
dflet | 0:400d8e75a8d0 | 563 | /*! |
dflet | 0:400d8e75a8d0 | 564 | \brief structure definition for simple link spawn message |
dflet | 0:400d8e75a8d0 | 565 | |
dflet | 0:400d8e75a8d0 | 566 | \note On each porting or platform the type could be whatever is needed - integer, pointer to structure etc. |
dflet | 0:400d8e75a8d0 | 567 | */ |
dflet | 0:400d8e75a8d0 | 568 | |
dflet | 0:400d8e75a8d0 | 569 | typedef struct |
dflet | 0:400d8e75a8d0 | 570 | { |
dflet | 0:400d8e75a8d0 | 571 | P_OSI_SPAWN_ENTRY pEntry; |
dflet | 0:400d8e75a8d0 | 572 | void* pValue; |
dflet | 0:400d8e75a8d0 | 573 | }tSimpleLinkSpawnMsg; |
dflet | 0:400d8e75a8d0 | 574 | |
dflet | 0:400d8e75a8d0 | 575 | /* The queue used to send message to simple link spawn task. */ |
dflet | 0:400d8e75a8d0 | 576 | extern void* xSimpleLinkSpawnQueue; |
dflet | 0:400d8e75a8d0 | 577 | |
dflet | 0:400d8e75a8d0 | 578 | /* API for SL Task*/ |
dflet | 0:400d8e75a8d0 | 579 | OsiReturnVal_e VStartSimpleLinkSpawnTask(unsigned portBASE_TYPE uxPriority); |
dflet | 0:400d8e75a8d0 | 580 | void VDeleteSimpleLinkSpawnTask( void ); |
dflet | 0:400d8e75a8d0 | 581 | |
dflet | 0:400d8e75a8d0 | 582 | |
dflet | 0:400d8e75a8d0 | 583 | |
dflet | 0:400d8e75a8d0 | 584 | #ifdef __cplusplus |
dflet | 0:400d8e75a8d0 | 585 | } |
dflet | 0:400d8e75a8d0 | 586 | #endif // __cplusplus |
dflet | 0:400d8e75a8d0 | 587 | |
dflet | 0:400d8e75a8d0 | 588 | #endif |
dflet | 0:400d8e75a8d0 | 589 |