the program have one sensor acs712 and moduleds1302

Dependencies:   FATFileSystem mbed

Committer:
RUBENTEC
Date:
Thu Jun 08 20:17:34 2017 +0000
Revision:
0:b82abca089ac
ds1302-bluetooth-acs712

Who changed what in which revision?

UserRevisionLine numberNew contents of line
RUBENTEC 0:b82abca089ac 1 /*----------------------------------------------------------------------------
RUBENTEC 0:b82abca089ac 2 * RL-ARM - RTX
RUBENTEC 0:b82abca089ac 3 *----------------------------------------------------------------------------
RUBENTEC 0:b82abca089ac 4 * Name: RT_SEMAPHORE.C
RUBENTEC 0:b82abca089ac 5 * Purpose: Implements binary and counting semaphores
RUBENTEC 0:b82abca089ac 6 * Rev.: V4.60
RUBENTEC 0:b82abca089ac 7 *----------------------------------------------------------------------------
RUBENTEC 0:b82abca089ac 8 *
RUBENTEC 0:b82abca089ac 9 * Copyright (c) 1999-2009 KEIL, 2009-2015 ARM Germany GmbH
RUBENTEC 0:b82abca089ac 10 * All rights reserved.
RUBENTEC 0:b82abca089ac 11 * Redistribution and use in source and binary forms, with or without
RUBENTEC 0:b82abca089ac 12 * modification, are permitted provided that the following conditions are met:
RUBENTEC 0:b82abca089ac 13 * - Redistributions of source code must retain the above copyright
RUBENTEC 0:b82abca089ac 14 * notice, this list of conditions and the following disclaimer.
RUBENTEC 0:b82abca089ac 15 * - Redistributions in binary form must reproduce the above copyright
RUBENTEC 0:b82abca089ac 16 * notice, this list of conditions and the following disclaimer in the
RUBENTEC 0:b82abca089ac 17 * documentation and/or other materials provided with the distribution.
RUBENTEC 0:b82abca089ac 18 * - Neither the name of ARM nor the names of its contributors may be used
RUBENTEC 0:b82abca089ac 19 * to endorse or promote products derived from this software without
RUBENTEC 0:b82abca089ac 20 * specific prior written permission.
RUBENTEC 0:b82abca089ac 21 *
RUBENTEC 0:b82abca089ac 22 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
RUBENTEC 0:b82abca089ac 23 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
RUBENTEC 0:b82abca089ac 24 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
RUBENTEC 0:b82abca089ac 25 * ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE
RUBENTEC 0:b82abca089ac 26 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
RUBENTEC 0:b82abca089ac 27 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
RUBENTEC 0:b82abca089ac 28 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
RUBENTEC 0:b82abca089ac 29 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
RUBENTEC 0:b82abca089ac 30 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
RUBENTEC 0:b82abca089ac 31 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
RUBENTEC 0:b82abca089ac 32 * POSSIBILITY OF SUCH DAMAGE.
RUBENTEC 0:b82abca089ac 33 *---------------------------------------------------------------------------*/
RUBENTEC 0:b82abca089ac 34
RUBENTEC 0:b82abca089ac 35 #include "rt_TypeDef.h"
RUBENTEC 0:b82abca089ac 36 #include "RTX_Conf.h"
RUBENTEC 0:b82abca089ac 37 #include "rt_System.h"
RUBENTEC 0:b82abca089ac 38 #include "rt_List.h"
RUBENTEC 0:b82abca089ac 39 #include "rt_Task.h"
RUBENTEC 0:b82abca089ac 40 #include "rt_Semaphore.h"
RUBENTEC 0:b82abca089ac 41 #include "rt_HAL_CM.h"
RUBENTEC 0:b82abca089ac 42
RUBENTEC 0:b82abca089ac 43
RUBENTEC 0:b82abca089ac 44 /*----------------------------------------------------------------------------
RUBENTEC 0:b82abca089ac 45 * Functions
RUBENTEC 0:b82abca089ac 46 *---------------------------------------------------------------------------*/
RUBENTEC 0:b82abca089ac 47
RUBENTEC 0:b82abca089ac 48
RUBENTEC 0:b82abca089ac 49 /*--------------------------- rt_sem_init -----------------------------------*/
RUBENTEC 0:b82abca089ac 50
RUBENTEC 0:b82abca089ac 51 void rt_sem_init (OS_ID semaphore, U16 token_count) {
RUBENTEC 0:b82abca089ac 52 /* Initialize a semaphore */
RUBENTEC 0:b82abca089ac 53 P_SCB p_SCB = semaphore;
RUBENTEC 0:b82abca089ac 54
RUBENTEC 0:b82abca089ac 55 p_SCB->cb_type = SCB;
RUBENTEC 0:b82abca089ac 56 p_SCB->p_lnk = NULL;
RUBENTEC 0:b82abca089ac 57 p_SCB->tokens = token_count;
RUBENTEC 0:b82abca089ac 58 }
RUBENTEC 0:b82abca089ac 59
RUBENTEC 0:b82abca089ac 60
RUBENTEC 0:b82abca089ac 61 /*--------------------------- rt_sem_delete ---------------------------------*/
RUBENTEC 0:b82abca089ac 62
RUBENTEC 0:b82abca089ac 63 #ifdef __CMSIS_RTOS
RUBENTEC 0:b82abca089ac 64 OS_RESULT rt_sem_delete (OS_ID semaphore) {
RUBENTEC 0:b82abca089ac 65 /* Delete semaphore */
RUBENTEC 0:b82abca089ac 66 P_SCB p_SCB = semaphore;
RUBENTEC 0:b82abca089ac 67 P_TCB p_TCB;
RUBENTEC 0:b82abca089ac 68
RUBENTEC 0:b82abca089ac 69 while (p_SCB->p_lnk != NULL) {
RUBENTEC 0:b82abca089ac 70 /* A task is waiting for token */
RUBENTEC 0:b82abca089ac 71 p_TCB = rt_get_first ((P_XCB)p_SCB);
RUBENTEC 0:b82abca089ac 72 rt_ret_val(p_TCB, 0);
RUBENTEC 0:b82abca089ac 73 rt_rmv_dly(p_TCB);
RUBENTEC 0:b82abca089ac 74 p_TCB->state = READY;
RUBENTEC 0:b82abca089ac 75 rt_put_prio (&os_rdy, p_TCB);
RUBENTEC 0:b82abca089ac 76 }
RUBENTEC 0:b82abca089ac 77
RUBENTEC 0:b82abca089ac 78 if (os_rdy.p_lnk && (os_rdy.p_lnk->prio > os_tsk.run->prio)) {
RUBENTEC 0:b82abca089ac 79 /* preempt running task */
RUBENTEC 0:b82abca089ac 80 rt_put_prio (&os_rdy, os_tsk.run);
RUBENTEC 0:b82abca089ac 81 os_tsk.run->state = READY;
RUBENTEC 0:b82abca089ac 82 rt_dispatch (NULL);
RUBENTEC 0:b82abca089ac 83 }
RUBENTEC 0:b82abca089ac 84
RUBENTEC 0:b82abca089ac 85 p_SCB->cb_type = 0;
RUBENTEC 0:b82abca089ac 86
RUBENTEC 0:b82abca089ac 87 return (OS_R_OK);
RUBENTEC 0:b82abca089ac 88 }
RUBENTEC 0:b82abca089ac 89 #endif
RUBENTEC 0:b82abca089ac 90
RUBENTEC 0:b82abca089ac 91
RUBENTEC 0:b82abca089ac 92 /*--------------------------- rt_sem_send -----------------------------------*/
RUBENTEC 0:b82abca089ac 93
RUBENTEC 0:b82abca089ac 94 OS_RESULT rt_sem_send (OS_ID semaphore) {
RUBENTEC 0:b82abca089ac 95 /* Return a token to semaphore */
RUBENTEC 0:b82abca089ac 96 P_SCB p_SCB = semaphore;
RUBENTEC 0:b82abca089ac 97 P_TCB p_TCB;
RUBENTEC 0:b82abca089ac 98
RUBENTEC 0:b82abca089ac 99 if (p_SCB->p_lnk != NULL) {
RUBENTEC 0:b82abca089ac 100 /* A task is waiting for token */
RUBENTEC 0:b82abca089ac 101 p_TCB = rt_get_first ((P_XCB)p_SCB);
RUBENTEC 0:b82abca089ac 102 #ifdef __CMSIS_RTOS
RUBENTEC 0:b82abca089ac 103 rt_ret_val(p_TCB, 1);
RUBENTEC 0:b82abca089ac 104 #else
RUBENTEC 0:b82abca089ac 105 rt_ret_val(p_TCB, OS_R_SEM);
RUBENTEC 0:b82abca089ac 106 #endif
RUBENTEC 0:b82abca089ac 107 rt_rmv_dly (p_TCB);
RUBENTEC 0:b82abca089ac 108 rt_dispatch (p_TCB);
RUBENTEC 0:b82abca089ac 109 }
RUBENTEC 0:b82abca089ac 110 else {
RUBENTEC 0:b82abca089ac 111 /* Store token. */
RUBENTEC 0:b82abca089ac 112 p_SCB->tokens++;
RUBENTEC 0:b82abca089ac 113 }
RUBENTEC 0:b82abca089ac 114 return (OS_R_OK);
RUBENTEC 0:b82abca089ac 115 }
RUBENTEC 0:b82abca089ac 116
RUBENTEC 0:b82abca089ac 117
RUBENTEC 0:b82abca089ac 118 /*--------------------------- rt_sem_wait -----------------------------------*/
RUBENTEC 0:b82abca089ac 119
RUBENTEC 0:b82abca089ac 120 OS_RESULT rt_sem_wait (OS_ID semaphore, U16 timeout) {
RUBENTEC 0:b82abca089ac 121 /* Obtain a token; possibly wait for it */
RUBENTEC 0:b82abca089ac 122 P_SCB p_SCB = semaphore;
RUBENTEC 0:b82abca089ac 123
RUBENTEC 0:b82abca089ac 124 if (p_SCB->tokens) {
RUBENTEC 0:b82abca089ac 125 p_SCB->tokens--;
RUBENTEC 0:b82abca089ac 126 return (OS_R_OK);
RUBENTEC 0:b82abca089ac 127 }
RUBENTEC 0:b82abca089ac 128 /* No token available: wait for one */
RUBENTEC 0:b82abca089ac 129 if (timeout == 0) {
RUBENTEC 0:b82abca089ac 130 return (OS_R_TMO);
RUBENTEC 0:b82abca089ac 131 }
RUBENTEC 0:b82abca089ac 132 if (p_SCB->p_lnk != NULL) {
RUBENTEC 0:b82abca089ac 133 rt_put_prio ((P_XCB)p_SCB, os_tsk.run);
RUBENTEC 0:b82abca089ac 134 }
RUBENTEC 0:b82abca089ac 135 else {
RUBENTEC 0:b82abca089ac 136 p_SCB->p_lnk = os_tsk.run;
RUBENTEC 0:b82abca089ac 137 os_tsk.run->p_lnk = NULL;
RUBENTEC 0:b82abca089ac 138 os_tsk.run->p_rlnk = (P_TCB)p_SCB;
RUBENTEC 0:b82abca089ac 139 }
RUBENTEC 0:b82abca089ac 140 rt_block(timeout, WAIT_SEM);
RUBENTEC 0:b82abca089ac 141 return (OS_R_TMO);
RUBENTEC 0:b82abca089ac 142 }
RUBENTEC 0:b82abca089ac 143
RUBENTEC 0:b82abca089ac 144
RUBENTEC 0:b82abca089ac 145 /*--------------------------- isr_sem_send ----------------------------------*/
RUBENTEC 0:b82abca089ac 146
RUBENTEC 0:b82abca089ac 147 void isr_sem_send (OS_ID semaphore) {
RUBENTEC 0:b82abca089ac 148 /* Same function as "os_sem"send", but to be called by ISRs */
RUBENTEC 0:b82abca089ac 149 P_SCB p_SCB = semaphore;
RUBENTEC 0:b82abca089ac 150
RUBENTEC 0:b82abca089ac 151 rt_psq_enq (p_SCB, 0);
RUBENTEC 0:b82abca089ac 152 rt_psh_req ();
RUBENTEC 0:b82abca089ac 153 }
RUBENTEC 0:b82abca089ac 154
RUBENTEC 0:b82abca089ac 155
RUBENTEC 0:b82abca089ac 156 /*--------------------------- rt_sem_psh ------------------------------------*/
RUBENTEC 0:b82abca089ac 157
RUBENTEC 0:b82abca089ac 158 void rt_sem_psh (P_SCB p_CB) {
RUBENTEC 0:b82abca089ac 159 /* Check if task has to be waken up */
RUBENTEC 0:b82abca089ac 160 P_TCB p_TCB;
RUBENTEC 0:b82abca089ac 161
RUBENTEC 0:b82abca089ac 162 if (p_CB->p_lnk != NULL) {
RUBENTEC 0:b82abca089ac 163 /* A task is waiting for token */
RUBENTEC 0:b82abca089ac 164 p_TCB = rt_get_first ((P_XCB)p_CB);
RUBENTEC 0:b82abca089ac 165 rt_rmv_dly (p_TCB);
RUBENTEC 0:b82abca089ac 166 p_TCB->state = READY;
RUBENTEC 0:b82abca089ac 167 #ifdef __CMSIS_RTOS
RUBENTEC 0:b82abca089ac 168 rt_ret_val(p_TCB, 1);
RUBENTEC 0:b82abca089ac 169 #else
RUBENTEC 0:b82abca089ac 170 rt_ret_val(p_TCB, OS_R_SEM);
RUBENTEC 0:b82abca089ac 171 #endif
RUBENTEC 0:b82abca089ac 172 rt_put_prio (&os_rdy, p_TCB);
RUBENTEC 0:b82abca089ac 173 }
RUBENTEC 0:b82abca089ac 174 else {
RUBENTEC 0:b82abca089ac 175 /* Store token */
RUBENTEC 0:b82abca089ac 176 p_CB->tokens++;
RUBENTEC 0:b82abca089ac 177 }
RUBENTEC 0:b82abca089ac 178 }
RUBENTEC 0:b82abca089ac 179
RUBENTEC 0:b82abca089ac 180 /*----------------------------------------------------------------------------
RUBENTEC 0:b82abca089ac 181 * end of file
RUBENTEC 0:b82abca089ac 182 *---------------------------------------------------------------------------*/
RUBENTEC 0:b82abca089ac 183