Anasse Abdoul / Mbed 2 deprecated Test_MPU6050

Dependencies:   mbed

Committer:
anasse
Date:
Thu Mar 31 07:43:50 2022 +0000
Revision:
0:a59a3d743804
vers0

Who changed what in which revision?

UserRevisionLine numberNew contents of line
anasse 0:a59a3d743804 1 /*----------------------------------------------------------------------------
anasse 0:a59a3d743804 2 * RL-ARM - RTX
anasse 0:a59a3d743804 3 *----------------------------------------------------------------------------
anasse 0:a59a3d743804 4 * Name: RT_MAILBOX.C
anasse 0:a59a3d743804 5 * Purpose: Implements waits and wake-ups for mailbox messages
anasse 0:a59a3d743804 6 * Rev.: V4.60
anasse 0:a59a3d743804 7 *----------------------------------------------------------------------------
anasse 0:a59a3d743804 8 *
anasse 0:a59a3d743804 9 * Copyright (c) 1999-2009 KEIL, 2009-2015 ARM Germany GmbH
anasse 0:a59a3d743804 10 * All rights reserved.
anasse 0:a59a3d743804 11 * Redistribution and use in source and binary forms, with or without
anasse 0:a59a3d743804 12 * modification, are permitted provided that the following conditions are met:
anasse 0:a59a3d743804 13 * - Redistributions of source code must retain the above copyright
anasse 0:a59a3d743804 14 * notice, this list of conditions and the following disclaimer.
anasse 0:a59a3d743804 15 * - Redistributions in binary form must reproduce the above copyright
anasse 0:a59a3d743804 16 * notice, this list of conditions and the following disclaimer in the
anasse 0:a59a3d743804 17 * documentation and/or other materials provided with the distribution.
anasse 0:a59a3d743804 18 * - Neither the name of ARM nor the names of its contributors may be used
anasse 0:a59a3d743804 19 * to endorse or promote products derived from this software without
anasse 0:a59a3d743804 20 * specific prior written permission.
anasse 0:a59a3d743804 21 *
anasse 0:a59a3d743804 22 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
anasse 0:a59a3d743804 23 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
anasse 0:a59a3d743804 24 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
anasse 0:a59a3d743804 25 * ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE
anasse 0:a59a3d743804 26 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
anasse 0:a59a3d743804 27 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
anasse 0:a59a3d743804 28 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
anasse 0:a59a3d743804 29 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
anasse 0:a59a3d743804 30 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
anasse 0:a59a3d743804 31 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
anasse 0:a59a3d743804 32 * POSSIBILITY OF SUCH DAMAGE.
anasse 0:a59a3d743804 33 *---------------------------------------------------------------------------*/
anasse 0:a59a3d743804 34
anasse 0:a59a3d743804 35 #include "rt_TypeDef.h"
anasse 0:a59a3d743804 36 #include "RTX_Conf.h"
anasse 0:a59a3d743804 37 #include "rt_System.h"
anasse 0:a59a3d743804 38 #include "rt_List.h"
anasse 0:a59a3d743804 39 #include "rt_Mailbox.h"
anasse 0:a59a3d743804 40 #include "rt_MemBox.h"
anasse 0:a59a3d743804 41 #include "rt_Task.h"
anasse 0:a59a3d743804 42 #include "rt_HAL_CM.h"
anasse 0:a59a3d743804 43
anasse 0:a59a3d743804 44
anasse 0:a59a3d743804 45 /*----------------------------------------------------------------------------
anasse 0:a59a3d743804 46 * Functions
anasse 0:a59a3d743804 47 *---------------------------------------------------------------------------*/
anasse 0:a59a3d743804 48
anasse 0:a59a3d743804 49
anasse 0:a59a3d743804 50 /*--------------------------- rt_mbx_init -----------------------------------*/
anasse 0:a59a3d743804 51
anasse 0:a59a3d743804 52 void rt_mbx_init (OS_ID mailbox, U16 mbx_size) {
anasse 0:a59a3d743804 53 /* Initialize a mailbox */
anasse 0:a59a3d743804 54 P_MCB p_MCB = mailbox;
anasse 0:a59a3d743804 55
anasse 0:a59a3d743804 56 p_MCB->cb_type = MCB;
anasse 0:a59a3d743804 57 p_MCB->state = 0;
anasse 0:a59a3d743804 58 p_MCB->isr_st = 0;
anasse 0:a59a3d743804 59 p_MCB->p_lnk = NULL;
anasse 0:a59a3d743804 60 p_MCB->first = 0;
anasse 0:a59a3d743804 61 p_MCB->last = 0;
anasse 0:a59a3d743804 62 p_MCB->count = 0;
anasse 0:a59a3d743804 63 p_MCB->size = (mbx_size + sizeof(void *) - sizeof(struct OS_MCB)) /
anasse 0:a59a3d743804 64 (U32)sizeof (void *);
anasse 0:a59a3d743804 65 }
anasse 0:a59a3d743804 66
anasse 0:a59a3d743804 67
anasse 0:a59a3d743804 68 /*--------------------------- rt_mbx_send -----------------------------------*/
anasse 0:a59a3d743804 69
anasse 0:a59a3d743804 70 OS_RESULT rt_mbx_send (OS_ID mailbox, void *p_msg, U16 timeout) {
anasse 0:a59a3d743804 71 /* Send message to a mailbox */
anasse 0:a59a3d743804 72 P_MCB p_MCB = mailbox;
anasse 0:a59a3d743804 73 P_TCB p_TCB;
anasse 0:a59a3d743804 74
anasse 0:a59a3d743804 75 if ((p_MCB->p_lnk != NULL) && (p_MCB->state == 1)) {
anasse 0:a59a3d743804 76 /* A task is waiting for message */
anasse 0:a59a3d743804 77 p_TCB = rt_get_first ((P_XCB)p_MCB);
anasse 0:a59a3d743804 78 #ifdef __CMSIS_RTOS
anasse 0:a59a3d743804 79 rt_ret_val2(p_TCB, 0x10/*osEventMessage*/, (U32)p_msg);
anasse 0:a59a3d743804 80 #else
anasse 0:a59a3d743804 81 *p_TCB->msg = p_msg;
anasse 0:a59a3d743804 82 rt_ret_val (p_TCB, OS_R_MBX);
anasse 0:a59a3d743804 83 #endif
anasse 0:a59a3d743804 84 rt_rmv_dly (p_TCB);
anasse 0:a59a3d743804 85 rt_dispatch (p_TCB);
anasse 0:a59a3d743804 86 }
anasse 0:a59a3d743804 87 else {
anasse 0:a59a3d743804 88 /* Store message in mailbox queue */
anasse 0:a59a3d743804 89 if (p_MCB->count == p_MCB->size) {
anasse 0:a59a3d743804 90 /* No free message entry, wait for one. If message queue is full, */
anasse 0:a59a3d743804 91 /* then no task is waiting for message. The 'p_MCB->p_lnk' list */
anasse 0:a59a3d743804 92 /* pointer can now be reused for send message waits task list. */
anasse 0:a59a3d743804 93 if (timeout == 0) {
anasse 0:a59a3d743804 94 return (OS_R_TMO);
anasse 0:a59a3d743804 95 }
anasse 0:a59a3d743804 96 if (p_MCB->p_lnk != NULL) {
anasse 0:a59a3d743804 97 rt_put_prio ((P_XCB)p_MCB, os_tsk.run);
anasse 0:a59a3d743804 98 }
anasse 0:a59a3d743804 99 else {
anasse 0:a59a3d743804 100 p_MCB->p_lnk = os_tsk.run;
anasse 0:a59a3d743804 101 os_tsk.run->p_lnk = NULL;
anasse 0:a59a3d743804 102 os_tsk.run->p_rlnk = (P_TCB)p_MCB;
anasse 0:a59a3d743804 103 /* Task is waiting to send a message */
anasse 0:a59a3d743804 104 p_MCB->state = 2;
anasse 0:a59a3d743804 105 }
anasse 0:a59a3d743804 106 os_tsk.run->msg = p_msg;
anasse 0:a59a3d743804 107 rt_block (timeout, WAIT_MBX);
anasse 0:a59a3d743804 108 return (OS_R_TMO);
anasse 0:a59a3d743804 109 }
anasse 0:a59a3d743804 110 /* Yes, there is a free entry in a mailbox. */
anasse 0:a59a3d743804 111 p_MCB->msg[p_MCB->first] = p_msg;
anasse 0:a59a3d743804 112 rt_inc (&p_MCB->count);
anasse 0:a59a3d743804 113 if (++p_MCB->first == p_MCB->size) {
anasse 0:a59a3d743804 114 p_MCB->first = 0;
anasse 0:a59a3d743804 115 }
anasse 0:a59a3d743804 116 }
anasse 0:a59a3d743804 117 return (OS_R_OK);
anasse 0:a59a3d743804 118 }
anasse 0:a59a3d743804 119
anasse 0:a59a3d743804 120
anasse 0:a59a3d743804 121 /*--------------------------- rt_mbx_wait -----------------------------------*/
anasse 0:a59a3d743804 122
anasse 0:a59a3d743804 123 OS_RESULT rt_mbx_wait (OS_ID mailbox, void **message, U16 timeout) {
anasse 0:a59a3d743804 124 /* Receive a message; possibly wait for it */
anasse 0:a59a3d743804 125 P_MCB p_MCB = mailbox;
anasse 0:a59a3d743804 126 P_TCB p_TCB;
anasse 0:a59a3d743804 127
anasse 0:a59a3d743804 128 /* If a message is available in the fifo buffer */
anasse 0:a59a3d743804 129 /* remove it from the fifo buffer and return. */
anasse 0:a59a3d743804 130 if (p_MCB->count) {
anasse 0:a59a3d743804 131 *message = p_MCB->msg[p_MCB->last];
anasse 0:a59a3d743804 132 if (++p_MCB->last == p_MCB->size) {
anasse 0:a59a3d743804 133 p_MCB->last = 0;
anasse 0:a59a3d743804 134 }
anasse 0:a59a3d743804 135 if ((p_MCB->p_lnk != NULL) && (p_MCB->state == 2)) {
anasse 0:a59a3d743804 136 /* A task is waiting to send message */
anasse 0:a59a3d743804 137 p_TCB = rt_get_first ((P_XCB)p_MCB);
anasse 0:a59a3d743804 138 #ifdef __CMSIS_RTOS
anasse 0:a59a3d743804 139 rt_ret_val(p_TCB, 0/*osOK*/);
anasse 0:a59a3d743804 140 #else
anasse 0:a59a3d743804 141 rt_ret_val(p_TCB, OS_R_OK);
anasse 0:a59a3d743804 142 #endif
anasse 0:a59a3d743804 143 p_MCB->msg[p_MCB->first] = p_TCB->msg;
anasse 0:a59a3d743804 144 if (++p_MCB->first == p_MCB->size) {
anasse 0:a59a3d743804 145 p_MCB->first = 0;
anasse 0:a59a3d743804 146 }
anasse 0:a59a3d743804 147 rt_rmv_dly (p_TCB);
anasse 0:a59a3d743804 148 rt_dispatch (p_TCB);
anasse 0:a59a3d743804 149 }
anasse 0:a59a3d743804 150 else {
anasse 0:a59a3d743804 151 rt_dec (&p_MCB->count);
anasse 0:a59a3d743804 152 }
anasse 0:a59a3d743804 153 return (OS_R_OK);
anasse 0:a59a3d743804 154 }
anasse 0:a59a3d743804 155 /* No message available: wait for one */
anasse 0:a59a3d743804 156 if (timeout == 0) {
anasse 0:a59a3d743804 157 return (OS_R_TMO);
anasse 0:a59a3d743804 158 }
anasse 0:a59a3d743804 159 if (p_MCB->p_lnk != NULL) {
anasse 0:a59a3d743804 160 rt_put_prio ((P_XCB)p_MCB, os_tsk.run);
anasse 0:a59a3d743804 161 }
anasse 0:a59a3d743804 162 else {
anasse 0:a59a3d743804 163 p_MCB->p_lnk = os_tsk.run;
anasse 0:a59a3d743804 164 os_tsk.run->p_lnk = NULL;
anasse 0:a59a3d743804 165 os_tsk.run->p_rlnk = (P_TCB)p_MCB;
anasse 0:a59a3d743804 166 /* Task is waiting to receive a message */
anasse 0:a59a3d743804 167 p_MCB->state = 1;
anasse 0:a59a3d743804 168 }
anasse 0:a59a3d743804 169 rt_block(timeout, WAIT_MBX);
anasse 0:a59a3d743804 170 #ifndef __CMSIS_RTOS
anasse 0:a59a3d743804 171 os_tsk.run->msg = message;
anasse 0:a59a3d743804 172 #endif
anasse 0:a59a3d743804 173 return (OS_R_TMO);
anasse 0:a59a3d743804 174 }
anasse 0:a59a3d743804 175
anasse 0:a59a3d743804 176
anasse 0:a59a3d743804 177 /*--------------------------- rt_mbx_check ----------------------------------*/
anasse 0:a59a3d743804 178
anasse 0:a59a3d743804 179 OS_RESULT rt_mbx_check (OS_ID mailbox) {
anasse 0:a59a3d743804 180 /* Check for free space in a mailbox. Returns the number of messages */
anasse 0:a59a3d743804 181 /* that can be stored to a mailbox. It returns 0 when mailbox is full. */
anasse 0:a59a3d743804 182 P_MCB p_MCB = mailbox;
anasse 0:a59a3d743804 183
anasse 0:a59a3d743804 184 return (p_MCB->size - p_MCB->count);
anasse 0:a59a3d743804 185 }
anasse 0:a59a3d743804 186
anasse 0:a59a3d743804 187
anasse 0:a59a3d743804 188 /*--------------------------- isr_mbx_send ----------------------------------*/
anasse 0:a59a3d743804 189
anasse 0:a59a3d743804 190 void isr_mbx_send (OS_ID mailbox, void *p_msg) {
anasse 0:a59a3d743804 191 /* Same function as "os_mbx_send", but to be called by ISRs. */
anasse 0:a59a3d743804 192 P_MCB p_MCB = mailbox;
anasse 0:a59a3d743804 193
anasse 0:a59a3d743804 194 rt_psq_enq (p_MCB, (U32)p_msg);
anasse 0:a59a3d743804 195 rt_psh_req ();
anasse 0:a59a3d743804 196 }
anasse 0:a59a3d743804 197
anasse 0:a59a3d743804 198
anasse 0:a59a3d743804 199 /*--------------------------- isr_mbx_receive -------------------------------*/
anasse 0:a59a3d743804 200
anasse 0:a59a3d743804 201 OS_RESULT isr_mbx_receive (OS_ID mailbox, void **message) {
anasse 0:a59a3d743804 202 /* Receive a message in the interrupt function. The interrupt function */
anasse 0:a59a3d743804 203 /* should not wait for a message since this would block the rtx os. */
anasse 0:a59a3d743804 204 P_MCB p_MCB = mailbox;
anasse 0:a59a3d743804 205
anasse 0:a59a3d743804 206 if (p_MCB->count) {
anasse 0:a59a3d743804 207 /* A message is available in the fifo buffer. */
anasse 0:a59a3d743804 208 *message = p_MCB->msg[p_MCB->last];
anasse 0:a59a3d743804 209 if (p_MCB->state == 2) {
anasse 0:a59a3d743804 210 /* A task is locked waiting to send message */
anasse 0:a59a3d743804 211 rt_psq_enq (p_MCB, 0);
anasse 0:a59a3d743804 212 rt_psh_req ();
anasse 0:a59a3d743804 213 }
anasse 0:a59a3d743804 214 rt_dec (&p_MCB->count);
anasse 0:a59a3d743804 215 if (++p_MCB->last == p_MCB->size) {
anasse 0:a59a3d743804 216 p_MCB->last = 0;
anasse 0:a59a3d743804 217 }
anasse 0:a59a3d743804 218 return (OS_R_MBX);
anasse 0:a59a3d743804 219 }
anasse 0:a59a3d743804 220 return (OS_R_OK);
anasse 0:a59a3d743804 221 }
anasse 0:a59a3d743804 222
anasse 0:a59a3d743804 223
anasse 0:a59a3d743804 224 /*--------------------------- rt_mbx_psh ------------------------------------*/
anasse 0:a59a3d743804 225
anasse 0:a59a3d743804 226 void rt_mbx_psh (P_MCB p_CB, void *p_msg) {
anasse 0:a59a3d743804 227 /* Store the message to the mailbox queue or pass it to task directly. */
anasse 0:a59a3d743804 228 P_TCB p_TCB;
anasse 0:a59a3d743804 229 void *mem;
anasse 0:a59a3d743804 230
anasse 0:a59a3d743804 231 if (p_CB->p_lnk != NULL) switch (p_CB->state) {
anasse 0:a59a3d743804 232 #ifdef __CMSIS_RTOS
anasse 0:a59a3d743804 233 case 3:
anasse 0:a59a3d743804 234 /* Task is waiting to allocate memory, remove it from the waiting list */
anasse 0:a59a3d743804 235 mem = rt_alloc_box(p_msg);
anasse 0:a59a3d743804 236 if (mem == NULL) break;
anasse 0:a59a3d743804 237 p_TCB = rt_get_first ((P_XCB)p_CB);
anasse 0:a59a3d743804 238 rt_ret_val(p_TCB, (U32)mem);
anasse 0:a59a3d743804 239 p_TCB->state = READY;
anasse 0:a59a3d743804 240 rt_rmv_dly (p_TCB);
anasse 0:a59a3d743804 241 rt_put_prio (&os_rdy, p_TCB);
anasse 0:a59a3d743804 242 break;
anasse 0:a59a3d743804 243 #endif
anasse 0:a59a3d743804 244 case 2:
anasse 0:a59a3d743804 245 /* Task is waiting to send a message, remove it from the waiting list */
anasse 0:a59a3d743804 246 p_TCB = rt_get_first ((P_XCB)p_CB);
anasse 0:a59a3d743804 247 #ifdef __CMSIS_RTOS
anasse 0:a59a3d743804 248 rt_ret_val(p_TCB, 0/*osOK*/);
anasse 0:a59a3d743804 249 #else
anasse 0:a59a3d743804 250 rt_ret_val(p_TCB, OS_R_OK);
anasse 0:a59a3d743804 251 #endif
anasse 0:a59a3d743804 252 p_CB->msg[p_CB->first] = p_TCB->msg;
anasse 0:a59a3d743804 253 rt_inc (&p_CB->count);
anasse 0:a59a3d743804 254 if (++p_CB->first == p_CB->size) {
anasse 0:a59a3d743804 255 p_CB->first = 0;
anasse 0:a59a3d743804 256 }
anasse 0:a59a3d743804 257 p_TCB->state = READY;
anasse 0:a59a3d743804 258 rt_rmv_dly (p_TCB);
anasse 0:a59a3d743804 259 rt_put_prio (&os_rdy, p_TCB);
anasse 0:a59a3d743804 260 break;
anasse 0:a59a3d743804 261 case 1:
anasse 0:a59a3d743804 262 /* Task is waiting for a message, pass the message to the task directly */
anasse 0:a59a3d743804 263 p_TCB = rt_get_first ((P_XCB)p_CB);
anasse 0:a59a3d743804 264 #ifdef __CMSIS_RTOS
anasse 0:a59a3d743804 265 rt_ret_val2(p_TCB, 0x10/*osEventMessage*/, (U32)p_msg);
anasse 0:a59a3d743804 266 #else
anasse 0:a59a3d743804 267 *p_TCB->msg = p_msg;
anasse 0:a59a3d743804 268 rt_ret_val (p_TCB, OS_R_MBX);
anasse 0:a59a3d743804 269 #endif
anasse 0:a59a3d743804 270 p_TCB->state = READY;
anasse 0:a59a3d743804 271 rt_rmv_dly (p_TCB);
anasse 0:a59a3d743804 272 rt_put_prio (&os_rdy, p_TCB);
anasse 0:a59a3d743804 273 break;
anasse 0:a59a3d743804 274 } else {
anasse 0:a59a3d743804 275 /* No task is waiting for a message, store it to the mailbox queue */
anasse 0:a59a3d743804 276 if (p_CB->count < p_CB->size) {
anasse 0:a59a3d743804 277 p_CB->msg[p_CB->first] = p_msg;
anasse 0:a59a3d743804 278 rt_inc (&p_CB->count);
anasse 0:a59a3d743804 279 if (++p_CB->first == p_CB->size) {
anasse 0:a59a3d743804 280 p_CB->first = 0;
anasse 0:a59a3d743804 281 }
anasse 0:a59a3d743804 282 }
anasse 0:a59a3d743804 283 else {
anasse 0:a59a3d743804 284 os_error (OS_ERR_MBX_OVF);
anasse 0:a59a3d743804 285 }
anasse 0:a59a3d743804 286 }
anasse 0:a59a3d743804 287 }
anasse 0:a59a3d743804 288
anasse 0:a59a3d743804 289 /*----------------------------------------------------------------------------
anasse 0:a59a3d743804 290 * end of file
anasse 0:a59a3d743804 291 *---------------------------------------------------------------------------*/
anasse 0:a59a3d743804 292