Dependencies:   mbed

Fork of FYDP_Final2 by Dave Lu

Committer:
tntmarket
Date:
Wed Mar 25 18:11:09 2015 +0000
Revision:
11:425dff6a4af9
Parent:
8:3d5a84b897be
Working

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_SEMAPHORE.C
majik 0:21019d94ad33 5 * Purpose: Implements binary and counting semaphores
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_System.h"
majik 0:21019d94ad33 38 #include "rt_List.h"
majik 0:21019d94ad33 39 #include "rt_Task.h"
majik 0:21019d94ad33 40 #include "rt_Semaphore.h"
majik 0:21019d94ad33 41 #include "rt_HAL_CM.h"
majik 0:21019d94ad33 42
majik 0:21019d94ad33 43
majik 0:21019d94ad33 44 /*----------------------------------------------------------------------------
majik 0:21019d94ad33 45 * Functions
majik 0:21019d94ad33 46 *---------------------------------------------------------------------------*/
majik 0:21019d94ad33 47
majik 0:21019d94ad33 48
majik 0:21019d94ad33 49 /*--------------------------- rt_sem_init -----------------------------------*/
majik 0:21019d94ad33 50
majik 0:21019d94ad33 51 void rt_sem_init (OS_ID semaphore, U16 token_count) {
majik 0:21019d94ad33 52 /* Initialize a semaphore */
majik 0:21019d94ad33 53 P_SCB p_SCB = semaphore;
majik 0:21019d94ad33 54
majik 0:21019d94ad33 55 p_SCB->cb_type = SCB;
majik 0:21019d94ad33 56 p_SCB->p_lnk = NULL;
majik 0:21019d94ad33 57 p_SCB->tokens = token_count;
majik 0:21019d94ad33 58 }
majik 0:21019d94ad33 59
majik 0:21019d94ad33 60
majik 0:21019d94ad33 61 /*--------------------------- rt_sem_delete ---------------------------------*/
majik 0:21019d94ad33 62
majik 0:21019d94ad33 63 #ifdef __CMSIS_RTOS
majik 0:21019d94ad33 64 OS_RESULT rt_sem_delete (OS_ID semaphore) {
majik 0:21019d94ad33 65 /* Delete semaphore */
majik 0:21019d94ad33 66 P_SCB p_SCB = semaphore;
majik 0:21019d94ad33 67 P_TCB p_TCB;
majik 0:21019d94ad33 68
majik 0:21019d94ad33 69 while (p_SCB->p_lnk != NULL) {
majik 0:21019d94ad33 70 /* A task is waiting for token */
majik 0:21019d94ad33 71 p_TCB = rt_get_first ((P_XCB)p_SCB);
majik 0:21019d94ad33 72 rt_ret_val(p_TCB, 0);
majik 0:21019d94ad33 73 rt_rmv_dly(p_TCB);
majik 0:21019d94ad33 74 p_TCB->state = READY;
majik 0:21019d94ad33 75 rt_put_prio (&os_rdy, p_TCB);
majik 0:21019d94ad33 76 }
majik 0:21019d94ad33 77
majik 0:21019d94ad33 78 if (os_rdy.p_lnk && (os_rdy.p_lnk->prio > os_tsk.run->prio)) {
majik 0:21019d94ad33 79 /* preempt running task */
majik 0:21019d94ad33 80 rt_put_prio (&os_rdy, os_tsk.run);
majik 0:21019d94ad33 81 os_tsk.run->state = READY;
majik 0:21019d94ad33 82 rt_dispatch (NULL);
majik 0:21019d94ad33 83 }
majik 0:21019d94ad33 84
majik 0:21019d94ad33 85 p_SCB->cb_type = 0;
majik 0:21019d94ad33 86
majik 0:21019d94ad33 87 return (OS_R_OK);
majik 0:21019d94ad33 88 }
majik 0:21019d94ad33 89 #endif
majik 0:21019d94ad33 90
majik 0:21019d94ad33 91
majik 0:21019d94ad33 92 /*--------------------------- rt_sem_send -----------------------------------*/
majik 0:21019d94ad33 93
majik 0:21019d94ad33 94 OS_RESULT rt_sem_send (OS_ID semaphore) {
majik 0:21019d94ad33 95 /* Return a token to semaphore */
majik 0:21019d94ad33 96 P_SCB p_SCB = semaphore;
majik 0:21019d94ad33 97 P_TCB p_TCB;
majik 0:21019d94ad33 98
majik 0:21019d94ad33 99 if (p_SCB->p_lnk != NULL) {
majik 0:21019d94ad33 100 /* A task is waiting for token */
majik 0:21019d94ad33 101 p_TCB = rt_get_first ((P_XCB)p_SCB);
majik 0:21019d94ad33 102 #ifdef __CMSIS_RTOS
majik 0:21019d94ad33 103 rt_ret_val(p_TCB, 1);
majik 0:21019d94ad33 104 #else
majik 0:21019d94ad33 105 rt_ret_val(p_TCB, OS_R_SEM);
majik 0:21019d94ad33 106 #endif
majik 0:21019d94ad33 107 rt_rmv_dly (p_TCB);
majik 0:21019d94ad33 108 rt_dispatch (p_TCB);
majik 0:21019d94ad33 109 }
majik 0:21019d94ad33 110 else {
majik 0:21019d94ad33 111 /* Store token. */
majik 0:21019d94ad33 112 p_SCB->tokens++;
majik 0:21019d94ad33 113 }
majik 0:21019d94ad33 114 return (OS_R_OK);
majik 0:21019d94ad33 115 }
majik 0:21019d94ad33 116
majik 0:21019d94ad33 117
majik 0:21019d94ad33 118 /*--------------------------- rt_sem_wait -----------------------------------*/
majik 0:21019d94ad33 119
majik 0:21019d94ad33 120 OS_RESULT rt_sem_wait (OS_ID semaphore, U16 timeout) {
majik 0:21019d94ad33 121 /* Obtain a token; possibly wait for it */
majik 0:21019d94ad33 122 P_SCB p_SCB = semaphore;
majik 0:21019d94ad33 123
majik 0:21019d94ad33 124 if (p_SCB->tokens) {
majik 0:21019d94ad33 125 p_SCB->tokens--;
majik 0:21019d94ad33 126 return (OS_R_OK);
majik 0:21019d94ad33 127 }
majik 0:21019d94ad33 128 /* No token available: wait for one */
majik 0:21019d94ad33 129 if (timeout == 0) {
majik 0:21019d94ad33 130 return (OS_R_TMO);
majik 0:21019d94ad33 131 }
majik 0:21019d94ad33 132 if (p_SCB->p_lnk != NULL) {
majik 0:21019d94ad33 133 rt_put_prio ((P_XCB)p_SCB, os_tsk.run);
majik 0:21019d94ad33 134 }
majik 0:21019d94ad33 135 else {
majik 0:21019d94ad33 136 p_SCB->p_lnk = os_tsk.run;
majik 0:21019d94ad33 137 os_tsk.run->p_lnk = NULL;
majik 0:21019d94ad33 138 os_tsk.run->p_rlnk = (P_TCB)p_SCB;
majik 0:21019d94ad33 139 }
majik 0:21019d94ad33 140 rt_block(timeout, WAIT_SEM);
majik 0:21019d94ad33 141 return (OS_R_TMO);
majik 0:21019d94ad33 142 }
majik 0:21019d94ad33 143
majik 0:21019d94ad33 144
majik 0:21019d94ad33 145 /*--------------------------- isr_sem_send ----------------------------------*/
majik 0:21019d94ad33 146
majik 0:21019d94ad33 147 void isr_sem_send (OS_ID semaphore) {
majik 0:21019d94ad33 148 /* Same function as "os_sem"send", but to be called by ISRs */
majik 0:21019d94ad33 149 P_SCB p_SCB = semaphore;
majik 0:21019d94ad33 150
majik 0:21019d94ad33 151 rt_psq_enq (p_SCB, 0);
majik 0:21019d94ad33 152 rt_psh_req ();
majik 0:21019d94ad33 153 }
majik 0:21019d94ad33 154
majik 0:21019d94ad33 155
majik 0:21019d94ad33 156 /*--------------------------- rt_sem_psh ------------------------------------*/
majik 0:21019d94ad33 157
majik 0:21019d94ad33 158 void rt_sem_psh (P_SCB p_CB) {
majik 0:21019d94ad33 159 /* Check if task has to be waken up */
majik 0:21019d94ad33 160 P_TCB p_TCB;
majik 0:21019d94ad33 161
majik 0:21019d94ad33 162 if (p_CB->p_lnk != NULL) {
majik 0:21019d94ad33 163 /* A task is waiting for token */
majik 0:21019d94ad33 164 p_TCB = rt_get_first ((P_XCB)p_CB);
majik 0:21019d94ad33 165 rt_rmv_dly (p_TCB);
majik 0:21019d94ad33 166 p_TCB->state = READY;
majik 0:21019d94ad33 167 #ifdef __CMSIS_RTOS
majik 0:21019d94ad33 168 rt_ret_val(p_TCB, 1);
majik 0:21019d94ad33 169 #else
majik 0:21019d94ad33 170 rt_ret_val(p_TCB, OS_R_SEM);
majik 0:21019d94ad33 171 #endif
majik 0:21019d94ad33 172 rt_put_prio (&os_rdy, p_TCB);
majik 0:21019d94ad33 173 }
majik 0:21019d94ad33 174 else {
majik 0:21019d94ad33 175 /* Store token */
majik 0:21019d94ad33 176 p_CB->tokens++;
majik 0:21019d94ad33 177 }
majik 0:21019d94ad33 178 }
majik 0:21019d94ad33 179
majik 0:21019d94ad33 180 /*----------------------------------------------------------------------------
majik 0:21019d94ad33 181 * end of file
majik 0:21019d94ad33 182 *---------------------------------------------------------------------------*/
majik 0:21019d94ad33 183