Dave Lu / Mbed 2 deprecated FYDP

Dependencies:   mbed

Fork of FYDP_Final2 by Dave Lu

Committer:
majik
Date:
Sat Mar 21 21:31:29 2015 +0000
Revision:
0:21019d94ad33
Both IMUs work now

Who changed what in which revision?

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