Development mbed library for MAX32630FTHR

Dependents:   blinky_max32630fthr

Committer:
switches
Date:
Fri Dec 16 16:27:57 2016 +0000
Revision:
3:1198227e6421
Parent:
0:5c4d7b2438d3
Changed ADC scale for MAX32625 platforms to 1.2V full scale to match MAX32630 platforms

Who changed what in which revision?

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