Programme gyro_accelero avec acquisition accelero + calcul téta

Dependents:   Gyro_Accelerometre2

Committer:
SandrineO
Date:
Tue Feb 20 15:58:26 2018 +0000
Revision:
0:07281ea3b26b
temps r?el

Who changed what in which revision?

UserRevisionLine numberNew contents of line
SandrineO 0:07281ea3b26b 1 /*----------------------------------------------------------------------------
SandrineO 0:07281ea3b26b 2 * RL-ARM - RTX
SandrineO 0:07281ea3b26b 3 *----------------------------------------------------------------------------
SandrineO 0:07281ea3b26b 4 * Name: RT_MUTEX.C
SandrineO 0:07281ea3b26b 5 * Purpose: Implements mutex synchronization objects
SandrineO 0:07281ea3b26b 6 * Rev.: V4.60
SandrineO 0:07281ea3b26b 7 *----------------------------------------------------------------------------
SandrineO 0:07281ea3b26b 8 *
SandrineO 0:07281ea3b26b 9 * Copyright (c) 1999-2009 KEIL, 2009-2015 ARM Germany GmbH
SandrineO 0:07281ea3b26b 10 * All rights reserved.
SandrineO 0:07281ea3b26b 11 * Redistribution and use in source and binary forms, with or without
SandrineO 0:07281ea3b26b 12 * modification, are permitted provided that the following conditions are met:
SandrineO 0:07281ea3b26b 13 * - Redistributions of source code must retain the above copyright
SandrineO 0:07281ea3b26b 14 * notice, this list of conditions and the following disclaimer.
SandrineO 0:07281ea3b26b 15 * - Redistributions in binary form must reproduce the above copyright
SandrineO 0:07281ea3b26b 16 * notice, this list of conditions and the following disclaimer in the
SandrineO 0:07281ea3b26b 17 * documentation and/or other materials provided with the distribution.
SandrineO 0:07281ea3b26b 18 * - Neither the name of ARM nor the names of its contributors may be used
SandrineO 0:07281ea3b26b 19 * to endorse or promote products derived from this software without
SandrineO 0:07281ea3b26b 20 * specific prior written permission.
SandrineO 0:07281ea3b26b 21 *
SandrineO 0:07281ea3b26b 22 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
SandrineO 0:07281ea3b26b 23 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
SandrineO 0:07281ea3b26b 24 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
SandrineO 0:07281ea3b26b 25 * ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE
SandrineO 0:07281ea3b26b 26 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
SandrineO 0:07281ea3b26b 27 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SandrineO 0:07281ea3b26b 28 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
SandrineO 0:07281ea3b26b 29 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
SandrineO 0:07281ea3b26b 30 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
SandrineO 0:07281ea3b26b 31 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
SandrineO 0:07281ea3b26b 32 * POSSIBILITY OF SUCH DAMAGE.
SandrineO 0:07281ea3b26b 33 *---------------------------------------------------------------------------*/
SandrineO 0:07281ea3b26b 34
SandrineO 0:07281ea3b26b 35 #include "rt_TypeDef.h"
SandrineO 0:07281ea3b26b 36 #include "RTX_Conf.h"
SandrineO 0:07281ea3b26b 37 #include "rt_List.h"
SandrineO 0:07281ea3b26b 38 #include "rt_Task.h"
SandrineO 0:07281ea3b26b 39 #include "rt_Mutex.h"
SandrineO 0:07281ea3b26b 40 #include "rt_HAL_CM.h"
SandrineO 0:07281ea3b26b 41
SandrineO 0:07281ea3b26b 42
SandrineO 0:07281ea3b26b 43 /*----------------------------------------------------------------------------
SandrineO 0:07281ea3b26b 44 * Functions
SandrineO 0:07281ea3b26b 45 *---------------------------------------------------------------------------*/
SandrineO 0:07281ea3b26b 46
SandrineO 0:07281ea3b26b 47
SandrineO 0:07281ea3b26b 48 /*--------------------------- rt_mut_init -----------------------------------*/
SandrineO 0:07281ea3b26b 49
SandrineO 0:07281ea3b26b 50 void rt_mut_init (OS_ID mutex) {
SandrineO 0:07281ea3b26b 51 /* Initialize a mutex object */
SandrineO 0:07281ea3b26b 52 P_MUCB p_MCB = mutex;
SandrineO 0:07281ea3b26b 53
SandrineO 0:07281ea3b26b 54 p_MCB->cb_type = MUCB;
SandrineO 0:07281ea3b26b 55 p_MCB->prio = 0;
SandrineO 0:07281ea3b26b 56 p_MCB->level = 0;
SandrineO 0:07281ea3b26b 57 p_MCB->p_lnk = NULL;
SandrineO 0:07281ea3b26b 58 p_MCB->owner = NULL;
SandrineO 0:07281ea3b26b 59 }
SandrineO 0:07281ea3b26b 60
SandrineO 0:07281ea3b26b 61
SandrineO 0:07281ea3b26b 62 /*--------------------------- rt_mut_delete ---------------------------------*/
SandrineO 0:07281ea3b26b 63
SandrineO 0:07281ea3b26b 64 #ifdef __CMSIS_RTOS
SandrineO 0:07281ea3b26b 65 OS_RESULT rt_mut_delete (OS_ID mutex) {
SandrineO 0:07281ea3b26b 66 /* Delete a mutex object */
SandrineO 0:07281ea3b26b 67 P_MUCB p_MCB = mutex;
SandrineO 0:07281ea3b26b 68 P_TCB p_TCB;
SandrineO 0:07281ea3b26b 69
SandrineO 0:07281ea3b26b 70 /* Restore owner task's priority. */
SandrineO 0:07281ea3b26b 71 if (p_MCB->level != 0) {
SandrineO 0:07281ea3b26b 72 p_MCB->owner->prio = p_MCB->prio;
SandrineO 0:07281ea3b26b 73 if (p_MCB->owner != os_tsk.run) {
SandrineO 0:07281ea3b26b 74 rt_resort_prio (p_MCB->owner);
SandrineO 0:07281ea3b26b 75 }
SandrineO 0:07281ea3b26b 76 }
SandrineO 0:07281ea3b26b 77
SandrineO 0:07281ea3b26b 78 while (p_MCB->p_lnk != NULL) {
SandrineO 0:07281ea3b26b 79 /* A task is waiting for mutex. */
SandrineO 0:07281ea3b26b 80 p_TCB = rt_get_first ((P_XCB)p_MCB);
SandrineO 0:07281ea3b26b 81 rt_ret_val(p_TCB, 0/*osOK*/);
SandrineO 0:07281ea3b26b 82 rt_rmv_dly(p_TCB);
SandrineO 0:07281ea3b26b 83 p_TCB->state = READY;
SandrineO 0:07281ea3b26b 84 rt_put_prio (&os_rdy, p_TCB);
SandrineO 0:07281ea3b26b 85 }
SandrineO 0:07281ea3b26b 86
SandrineO 0:07281ea3b26b 87 if (os_rdy.p_lnk && (os_rdy.p_lnk->prio > os_tsk.run->prio)) {
SandrineO 0:07281ea3b26b 88 /* preempt running task */
SandrineO 0:07281ea3b26b 89 rt_put_prio (&os_rdy, os_tsk.run);
SandrineO 0:07281ea3b26b 90 os_tsk.run->state = READY;
SandrineO 0:07281ea3b26b 91 rt_dispatch (NULL);
SandrineO 0:07281ea3b26b 92 }
SandrineO 0:07281ea3b26b 93
SandrineO 0:07281ea3b26b 94 p_MCB->cb_type = 0;
SandrineO 0:07281ea3b26b 95
SandrineO 0:07281ea3b26b 96 return (OS_R_OK);
SandrineO 0:07281ea3b26b 97 }
SandrineO 0:07281ea3b26b 98 #endif
SandrineO 0:07281ea3b26b 99
SandrineO 0:07281ea3b26b 100
SandrineO 0:07281ea3b26b 101 /*--------------------------- rt_mut_release --------------------------------*/
SandrineO 0:07281ea3b26b 102
SandrineO 0:07281ea3b26b 103 OS_RESULT rt_mut_release (OS_ID mutex) {
SandrineO 0:07281ea3b26b 104 /* Release a mutex object */
SandrineO 0:07281ea3b26b 105 P_MUCB p_MCB = mutex;
SandrineO 0:07281ea3b26b 106 P_TCB p_TCB;
SandrineO 0:07281ea3b26b 107
SandrineO 0:07281ea3b26b 108 if (p_MCB->level == 0 || p_MCB->owner != os_tsk.run) {
SandrineO 0:07281ea3b26b 109 /* Unbalanced mutex release or task is not the owner */
SandrineO 0:07281ea3b26b 110 return (OS_R_NOK);
SandrineO 0:07281ea3b26b 111 }
SandrineO 0:07281ea3b26b 112 if (--p_MCB->level != 0) {
SandrineO 0:07281ea3b26b 113 return (OS_R_OK);
SandrineO 0:07281ea3b26b 114 }
SandrineO 0:07281ea3b26b 115 /* Restore owner task's priority. */
SandrineO 0:07281ea3b26b 116 os_tsk.run->prio = p_MCB->prio;
SandrineO 0:07281ea3b26b 117 if (p_MCB->p_lnk != NULL) {
SandrineO 0:07281ea3b26b 118 /* A task is waiting for mutex. */
SandrineO 0:07281ea3b26b 119 p_TCB = rt_get_first ((P_XCB)p_MCB);
SandrineO 0:07281ea3b26b 120 #ifdef __CMSIS_RTOS
SandrineO 0:07281ea3b26b 121 rt_ret_val(p_TCB, 0/*osOK*/);
SandrineO 0:07281ea3b26b 122 #else
SandrineO 0:07281ea3b26b 123 rt_ret_val(p_TCB, OS_R_MUT);
SandrineO 0:07281ea3b26b 124 #endif
SandrineO 0:07281ea3b26b 125 rt_rmv_dly (p_TCB);
SandrineO 0:07281ea3b26b 126 /* A waiting task becomes the owner of this mutex. */
SandrineO 0:07281ea3b26b 127 p_MCB->level = 1;
SandrineO 0:07281ea3b26b 128 p_MCB->owner = p_TCB;
SandrineO 0:07281ea3b26b 129 p_MCB->prio = p_TCB->prio;
SandrineO 0:07281ea3b26b 130 /* Priority inversion, check which task continues. */
SandrineO 0:07281ea3b26b 131 if (os_tsk.run->prio >= rt_rdy_prio()) {
SandrineO 0:07281ea3b26b 132 rt_dispatch (p_TCB);
SandrineO 0:07281ea3b26b 133 }
SandrineO 0:07281ea3b26b 134 else {
SandrineO 0:07281ea3b26b 135 /* Ready task has higher priority than running task. */
SandrineO 0:07281ea3b26b 136 rt_put_prio (&os_rdy, os_tsk.run);
SandrineO 0:07281ea3b26b 137 rt_put_prio (&os_rdy, p_TCB);
SandrineO 0:07281ea3b26b 138 os_tsk.run->state = READY;
SandrineO 0:07281ea3b26b 139 p_TCB->state = READY;
SandrineO 0:07281ea3b26b 140 rt_dispatch (NULL);
SandrineO 0:07281ea3b26b 141 }
SandrineO 0:07281ea3b26b 142 }
SandrineO 0:07281ea3b26b 143 else {
SandrineO 0:07281ea3b26b 144 /* Check if own priority raised by priority inversion. */
SandrineO 0:07281ea3b26b 145 if (rt_rdy_prio() > os_tsk.run->prio) {
SandrineO 0:07281ea3b26b 146 rt_put_prio (&os_rdy, os_tsk.run);
SandrineO 0:07281ea3b26b 147 os_tsk.run->state = READY;
SandrineO 0:07281ea3b26b 148 rt_dispatch (NULL);
SandrineO 0:07281ea3b26b 149 }
SandrineO 0:07281ea3b26b 150 }
SandrineO 0:07281ea3b26b 151 return (OS_R_OK);
SandrineO 0:07281ea3b26b 152 }
SandrineO 0:07281ea3b26b 153
SandrineO 0:07281ea3b26b 154
SandrineO 0:07281ea3b26b 155 /*--------------------------- rt_mut_wait -----------------------------------*/
SandrineO 0:07281ea3b26b 156
SandrineO 0:07281ea3b26b 157 OS_RESULT rt_mut_wait (OS_ID mutex, U16 timeout) {
SandrineO 0:07281ea3b26b 158 /* Wait for a mutex, continue when mutex is free. */
SandrineO 0:07281ea3b26b 159 P_MUCB p_MCB = mutex;
SandrineO 0:07281ea3b26b 160
SandrineO 0:07281ea3b26b 161 if (p_MCB->level == 0) {
SandrineO 0:07281ea3b26b 162 p_MCB->owner = os_tsk.run;
SandrineO 0:07281ea3b26b 163 p_MCB->prio = os_tsk.run->prio;
SandrineO 0:07281ea3b26b 164 goto inc;
SandrineO 0:07281ea3b26b 165 }
SandrineO 0:07281ea3b26b 166 if (p_MCB->owner == os_tsk.run) {
SandrineO 0:07281ea3b26b 167 /* OK, running task is the owner of this mutex. */
SandrineO 0:07281ea3b26b 168 inc:p_MCB->level++;
SandrineO 0:07281ea3b26b 169 return (OS_R_OK);
SandrineO 0:07281ea3b26b 170 }
SandrineO 0:07281ea3b26b 171 /* Mutex owned by another task, wait until released. */
SandrineO 0:07281ea3b26b 172 if (timeout == 0) {
SandrineO 0:07281ea3b26b 173 return (OS_R_TMO);
SandrineO 0:07281ea3b26b 174 }
SandrineO 0:07281ea3b26b 175 /* Raise the owner task priority if lower than current priority. */
SandrineO 0:07281ea3b26b 176 /* This priority inversion is called priority inheritance. */
SandrineO 0:07281ea3b26b 177 if (p_MCB->prio < os_tsk.run->prio) {
SandrineO 0:07281ea3b26b 178 p_MCB->owner->prio = os_tsk.run->prio;
SandrineO 0:07281ea3b26b 179 rt_resort_prio (p_MCB->owner);
SandrineO 0:07281ea3b26b 180 }
SandrineO 0:07281ea3b26b 181 if (p_MCB->p_lnk != NULL) {
SandrineO 0:07281ea3b26b 182 rt_put_prio ((P_XCB)p_MCB, os_tsk.run);
SandrineO 0:07281ea3b26b 183 }
SandrineO 0:07281ea3b26b 184 else {
SandrineO 0:07281ea3b26b 185 p_MCB->p_lnk = os_tsk.run;
SandrineO 0:07281ea3b26b 186 os_tsk.run->p_lnk = NULL;
SandrineO 0:07281ea3b26b 187 os_tsk.run->p_rlnk = (P_TCB)p_MCB;
SandrineO 0:07281ea3b26b 188 }
SandrineO 0:07281ea3b26b 189 rt_block(timeout, WAIT_MUT);
SandrineO 0:07281ea3b26b 190 return (OS_R_TMO);
SandrineO 0:07281ea3b26b 191 }
SandrineO 0:07281ea3b26b 192
SandrineO 0:07281ea3b26b 193
SandrineO 0:07281ea3b26b 194 /*----------------------------------------------------------------------------
SandrineO 0:07281ea3b26b 195 * end of file
SandrineO 0:07281ea3b26b 196 *---------------------------------------------------------------------------*/
SandrineO 0:07281ea3b26b 197