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_EVENT.C
anasse 0:a59a3d743804 5 * Purpose: Implements waits and wake-ups for event flags
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_Event.h"
anasse 0:a59a3d743804 39 #include "rt_List.h"
anasse 0:a59a3d743804 40 #include "rt_Task.h"
anasse 0:a59a3d743804 41 #include "rt_HAL_CM.h"
anasse 0:a59a3d743804 42
anasse 0:a59a3d743804 43
anasse 0:a59a3d743804 44 /*----------------------------------------------------------------------------
anasse 0:a59a3d743804 45 * Functions
anasse 0:a59a3d743804 46 *---------------------------------------------------------------------------*/
anasse 0:a59a3d743804 47
anasse 0:a59a3d743804 48
anasse 0:a59a3d743804 49 /*--------------------------- rt_evt_wait -----------------------------------*/
anasse 0:a59a3d743804 50
anasse 0:a59a3d743804 51 OS_RESULT rt_evt_wait (U16 wait_flags, U16 timeout, BOOL and_wait) {
anasse 0:a59a3d743804 52 /* Wait for one or more event flags with optional time-out. */
anasse 0:a59a3d743804 53 /* "wait_flags" identifies the flags to wait for. */
anasse 0:a59a3d743804 54 /* "timeout" is the time-out limit in system ticks (0xffff if no time-out) */
anasse 0:a59a3d743804 55 /* "and_wait" specifies the AND-ing of "wait_flags" as condition to be met */
anasse 0:a59a3d743804 56 /* to complete the wait. (OR-ing if set to 0). */
anasse 0:a59a3d743804 57 U32 block_state;
anasse 0:a59a3d743804 58
anasse 0:a59a3d743804 59 if (and_wait) {
anasse 0:a59a3d743804 60 /* Check for AND-connected events */
anasse 0:a59a3d743804 61 if ((os_tsk.run->events & wait_flags) == wait_flags) {
anasse 0:a59a3d743804 62 os_tsk.run->events &= ~wait_flags;
anasse 0:a59a3d743804 63 return (OS_R_EVT);
anasse 0:a59a3d743804 64 }
anasse 0:a59a3d743804 65 block_state = WAIT_AND;
anasse 0:a59a3d743804 66 }
anasse 0:a59a3d743804 67 else {
anasse 0:a59a3d743804 68 /* Check for OR-connected events */
anasse 0:a59a3d743804 69 if (os_tsk.run->events & wait_flags) {
anasse 0:a59a3d743804 70 os_tsk.run->waits = os_tsk.run->events & wait_flags;
anasse 0:a59a3d743804 71 os_tsk.run->events &= ~wait_flags;
anasse 0:a59a3d743804 72 return (OS_R_EVT);
anasse 0:a59a3d743804 73 }
anasse 0:a59a3d743804 74 block_state = WAIT_OR;
anasse 0:a59a3d743804 75 }
anasse 0:a59a3d743804 76 /* Task has to wait */
anasse 0:a59a3d743804 77 os_tsk.run->waits = wait_flags;
anasse 0:a59a3d743804 78 rt_block (timeout, (U8)block_state);
anasse 0:a59a3d743804 79 return (OS_R_TMO);
anasse 0:a59a3d743804 80 }
anasse 0:a59a3d743804 81
anasse 0:a59a3d743804 82
anasse 0:a59a3d743804 83 /*--------------------------- rt_evt_set ------------------------------------*/
anasse 0:a59a3d743804 84
anasse 0:a59a3d743804 85 void rt_evt_set (U16 event_flags, OS_TID task_id) {
anasse 0:a59a3d743804 86 /* Set one or more event flags of a selectable task. */
anasse 0:a59a3d743804 87 P_TCB p_tcb;
anasse 0:a59a3d743804 88
anasse 0:a59a3d743804 89 p_tcb = os_active_TCB[task_id-1];
anasse 0:a59a3d743804 90 if (p_tcb == NULL) {
anasse 0:a59a3d743804 91 return;
anasse 0:a59a3d743804 92 }
anasse 0:a59a3d743804 93 p_tcb->events |= event_flags;
anasse 0:a59a3d743804 94 event_flags = p_tcb->waits;
anasse 0:a59a3d743804 95 /* If the task is not waiting for an event, it should not be put */
anasse 0:a59a3d743804 96 /* to ready state. */
anasse 0:a59a3d743804 97 if (p_tcb->state == WAIT_AND) {
anasse 0:a59a3d743804 98 /* Check for AND-connected events */
anasse 0:a59a3d743804 99 if ((p_tcb->events & event_flags) == event_flags) {
anasse 0:a59a3d743804 100 goto wkup;
anasse 0:a59a3d743804 101 }
anasse 0:a59a3d743804 102 }
anasse 0:a59a3d743804 103 if (p_tcb->state == WAIT_OR) {
anasse 0:a59a3d743804 104 /* Check for OR-connected events */
anasse 0:a59a3d743804 105 if (p_tcb->events & event_flags) {
anasse 0:a59a3d743804 106 p_tcb->waits &= p_tcb->events;
anasse 0:a59a3d743804 107 wkup: p_tcb->events &= ~event_flags;
anasse 0:a59a3d743804 108 rt_rmv_dly (p_tcb);
anasse 0:a59a3d743804 109 p_tcb->state = READY;
anasse 0:a59a3d743804 110 #ifdef __CMSIS_RTOS
anasse 0:a59a3d743804 111 rt_ret_val2(p_tcb, 0x08/*osEventSignal*/, p_tcb->waits);
anasse 0:a59a3d743804 112 #else
anasse 0:a59a3d743804 113 rt_ret_val (p_tcb, OS_R_EVT);
anasse 0:a59a3d743804 114 #endif
anasse 0:a59a3d743804 115 rt_dispatch (p_tcb);
anasse 0:a59a3d743804 116 }
anasse 0:a59a3d743804 117 }
anasse 0:a59a3d743804 118 }
anasse 0:a59a3d743804 119
anasse 0:a59a3d743804 120
anasse 0:a59a3d743804 121 /*--------------------------- rt_evt_clr ------------------------------------*/
anasse 0:a59a3d743804 122
anasse 0:a59a3d743804 123 void rt_evt_clr (U16 clear_flags, OS_TID task_id) {
anasse 0:a59a3d743804 124 /* Clear one or more event flags (identified by "clear_flags") of a */
anasse 0:a59a3d743804 125 /* selectable task (identified by "task"). */
anasse 0:a59a3d743804 126 P_TCB task = os_active_TCB[task_id-1];
anasse 0:a59a3d743804 127
anasse 0:a59a3d743804 128 if (task == NULL) {
anasse 0:a59a3d743804 129 return;
anasse 0:a59a3d743804 130 }
anasse 0:a59a3d743804 131 task->events &= ~clear_flags;
anasse 0:a59a3d743804 132 }
anasse 0:a59a3d743804 133
anasse 0:a59a3d743804 134
anasse 0:a59a3d743804 135 /*--------------------------- isr_evt_set -----------------------------------*/
anasse 0:a59a3d743804 136
anasse 0:a59a3d743804 137 void isr_evt_set (U16 event_flags, OS_TID task_id) {
anasse 0:a59a3d743804 138 /* Same function as "os_evt_set", but to be called by ISRs. */
anasse 0:a59a3d743804 139 P_TCB p_tcb = os_active_TCB[task_id-1];
anasse 0:a59a3d743804 140
anasse 0:a59a3d743804 141 if (p_tcb == NULL) {
anasse 0:a59a3d743804 142 return;
anasse 0:a59a3d743804 143 }
anasse 0:a59a3d743804 144 rt_psq_enq (p_tcb, event_flags);
anasse 0:a59a3d743804 145 rt_psh_req ();
anasse 0:a59a3d743804 146 }
anasse 0:a59a3d743804 147
anasse 0:a59a3d743804 148
anasse 0:a59a3d743804 149 /*--------------------------- rt_evt_get ------------------------------------*/
anasse 0:a59a3d743804 150
anasse 0:a59a3d743804 151 U16 rt_evt_get (void) {
anasse 0:a59a3d743804 152 /* Get events of a running task after waiting for OR connected events. */
anasse 0:a59a3d743804 153 return (os_tsk.run->waits);
anasse 0:a59a3d743804 154 }
anasse 0:a59a3d743804 155
anasse 0:a59a3d743804 156
anasse 0:a59a3d743804 157 /*--------------------------- rt_evt_psh ------------------------------------*/
anasse 0:a59a3d743804 158
anasse 0:a59a3d743804 159 void rt_evt_psh (P_TCB p_CB, U16 set_flags) {
anasse 0:a59a3d743804 160 /* Check if task has to be waken up */
anasse 0:a59a3d743804 161 U16 event_flags;
anasse 0:a59a3d743804 162
anasse 0:a59a3d743804 163 p_CB->events |= set_flags;
anasse 0:a59a3d743804 164 event_flags = p_CB->waits;
anasse 0:a59a3d743804 165 if (p_CB->state == WAIT_AND) {
anasse 0:a59a3d743804 166 /* Check for AND-connected events */
anasse 0:a59a3d743804 167 if ((p_CB->events & event_flags) == event_flags) {
anasse 0:a59a3d743804 168 goto rdy;
anasse 0:a59a3d743804 169 }
anasse 0:a59a3d743804 170 }
anasse 0:a59a3d743804 171 if (p_CB->state == WAIT_OR) {
anasse 0:a59a3d743804 172 /* Check for OR-connected events */
anasse 0:a59a3d743804 173 if (p_CB->events & event_flags) {
anasse 0:a59a3d743804 174 p_CB->waits &= p_CB->events;
anasse 0:a59a3d743804 175 rdy: p_CB->events &= ~event_flags;
anasse 0:a59a3d743804 176 rt_rmv_dly (p_CB);
anasse 0:a59a3d743804 177 p_CB->state = READY;
anasse 0:a59a3d743804 178 #ifdef __CMSIS_RTOS
anasse 0:a59a3d743804 179 rt_ret_val2(p_CB, 0x08/*osEventSignal*/, p_CB->waits);
anasse 0:a59a3d743804 180 #else
anasse 0:a59a3d743804 181 rt_ret_val (p_CB, OS_R_EVT);
anasse 0:a59a3d743804 182 #endif
anasse 0:a59a3d743804 183 rt_put_prio (&os_rdy, p_CB);
anasse 0:a59a3d743804 184 }
anasse 0:a59a3d743804 185 }
anasse 0:a59a3d743804 186 }
anasse 0:a59a3d743804 187
anasse 0:a59a3d743804 188 /*----------------------------------------------------------------------------
anasse 0:a59a3d743804 189 * end of file
anasse 0:a59a3d743804 190 *---------------------------------------------------------------------------*/