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_SYSTEM.C
RUBENTEC 0:b82abca089ac 5 * Purpose: System Task Manager
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_Task.h"
RUBENTEC 0:b82abca089ac 38 #include "rt_System.h"
RUBENTEC 0:b82abca089ac 39 #include "rt_Event.h"
RUBENTEC 0:b82abca089ac 40 #include "rt_List.h"
RUBENTEC 0:b82abca089ac 41 #include "rt_Mailbox.h"
RUBENTEC 0:b82abca089ac 42 #include "rt_Semaphore.h"
RUBENTEC 0:b82abca089ac 43 #include "rt_Time.h"
RUBENTEC 0:b82abca089ac 44 #include "rt_Robin.h"
RUBENTEC 0:b82abca089ac 45 #include "rt_HAL_CM.h"
RUBENTEC 0:b82abca089ac 46
RUBENTEC 0:b82abca089ac 47 /*----------------------------------------------------------------------------
RUBENTEC 0:b82abca089ac 48 * Global Variables
RUBENTEC 0:b82abca089ac 49 *---------------------------------------------------------------------------*/
RUBENTEC 0:b82abca089ac 50
RUBENTEC 0:b82abca089ac 51 int os_tick_irqn;
RUBENTEC 0:b82abca089ac 52
RUBENTEC 0:b82abca089ac 53 /*----------------------------------------------------------------------------
RUBENTEC 0:b82abca089ac 54 * Local Variables
RUBENTEC 0:b82abca089ac 55 *---------------------------------------------------------------------------*/
RUBENTEC 0:b82abca089ac 56
RUBENTEC 0:b82abca089ac 57 static volatile BIT os_lock;
RUBENTEC 0:b82abca089ac 58 static volatile BIT os_psh_flag;
RUBENTEC 0:b82abca089ac 59 static U8 pend_flags;
RUBENTEC 0:b82abca089ac 60
RUBENTEC 0:b82abca089ac 61 /*----------------------------------------------------------------------------
RUBENTEC 0:b82abca089ac 62 * Global Functions
RUBENTEC 0:b82abca089ac 63 *---------------------------------------------------------------------------*/
RUBENTEC 0:b82abca089ac 64
RUBENTEC 0:b82abca089ac 65 #if defined (__CC_ARM)
RUBENTEC 0:b82abca089ac 66 __asm void $$RTX$$version (void) {
RUBENTEC 0:b82abca089ac 67 /* Export a version number symbol for a version control. */
RUBENTEC 0:b82abca089ac 68
RUBENTEC 0:b82abca089ac 69 EXPORT __RL_RTX_VER
RUBENTEC 0:b82abca089ac 70
RUBENTEC 0:b82abca089ac 71 __RL_RTX_VER EQU 0x450
RUBENTEC 0:b82abca089ac 72 }
RUBENTEC 0:b82abca089ac 73 #endif
RUBENTEC 0:b82abca089ac 74
RUBENTEC 0:b82abca089ac 75
RUBENTEC 0:b82abca089ac 76 /*--------------------------- rt_suspend ------------------------------------*/
RUBENTEC 0:b82abca089ac 77 U32 rt_suspend (void) {
RUBENTEC 0:b82abca089ac 78 /* Suspend OS scheduler */
RUBENTEC 0:b82abca089ac 79 U32 delta = 0xFFFF;
RUBENTEC 0:b82abca089ac 80
RUBENTEC 0:b82abca089ac 81 rt_tsk_lock();
RUBENTEC 0:b82abca089ac 82
RUBENTEC 0:b82abca089ac 83 if (os_dly.p_dlnk) {
RUBENTEC 0:b82abca089ac 84 delta = os_dly.delta_time;
RUBENTEC 0:b82abca089ac 85 }
RUBENTEC 0:b82abca089ac 86 #ifndef __CMSIS_RTOS
RUBENTEC 0:b82abca089ac 87 if (os_tmr.next) {
RUBENTEC 0:b82abca089ac 88 if (os_tmr.tcnt < delta) delta = os_tmr.tcnt;
RUBENTEC 0:b82abca089ac 89 }
RUBENTEC 0:b82abca089ac 90 #endif
RUBENTEC 0:b82abca089ac 91
RUBENTEC 0:b82abca089ac 92 return (delta);
RUBENTEC 0:b82abca089ac 93 }
RUBENTEC 0:b82abca089ac 94
RUBENTEC 0:b82abca089ac 95
RUBENTEC 0:b82abca089ac 96 /*--------------------------- rt_resume -------------------------------------*/
RUBENTEC 0:b82abca089ac 97 void rt_resume (U32 sleep_time) {
RUBENTEC 0:b82abca089ac 98 /* Resume OS scheduler after suspend */
RUBENTEC 0:b82abca089ac 99 P_TCB next;
RUBENTEC 0:b82abca089ac 100 U32 delta;
RUBENTEC 0:b82abca089ac 101
RUBENTEC 0:b82abca089ac 102 os_tsk.run->state = READY;
RUBENTEC 0:b82abca089ac 103 rt_put_rdy_first (os_tsk.run);
RUBENTEC 0:b82abca089ac 104
RUBENTEC 0:b82abca089ac 105 os_robin.task = NULL;
RUBENTEC 0:b82abca089ac 106
RUBENTEC 0:b82abca089ac 107 /* Update delays. */
RUBENTEC 0:b82abca089ac 108 if (os_dly.p_dlnk) {
RUBENTEC 0:b82abca089ac 109 delta = sleep_time;
RUBENTEC 0:b82abca089ac 110 if (delta >= os_dly.delta_time) {
RUBENTEC 0:b82abca089ac 111 delta -= os_dly.delta_time;
RUBENTEC 0:b82abca089ac 112 os_time += os_dly.delta_time;
RUBENTEC 0:b82abca089ac 113 os_dly.delta_time = 1;
RUBENTEC 0:b82abca089ac 114 while (os_dly.p_dlnk) {
RUBENTEC 0:b82abca089ac 115 rt_dec_dly();
RUBENTEC 0:b82abca089ac 116 if (delta == 0) break;
RUBENTEC 0:b82abca089ac 117 delta--;
RUBENTEC 0:b82abca089ac 118 os_time++;
RUBENTEC 0:b82abca089ac 119 }
RUBENTEC 0:b82abca089ac 120 } else {
RUBENTEC 0:b82abca089ac 121 os_time += delta;
RUBENTEC 0:b82abca089ac 122 os_dly.delta_time -= delta;
RUBENTEC 0:b82abca089ac 123 }
RUBENTEC 0:b82abca089ac 124 } else {
RUBENTEC 0:b82abca089ac 125 os_time += sleep_time;
RUBENTEC 0:b82abca089ac 126 }
RUBENTEC 0:b82abca089ac 127
RUBENTEC 0:b82abca089ac 128 #ifndef __CMSIS_RTOS
RUBENTEC 0:b82abca089ac 129 /* Check the user timers. */
RUBENTEC 0:b82abca089ac 130 if (os_tmr.next) {
RUBENTEC 0:b82abca089ac 131 delta = sleep_time;
RUBENTEC 0:b82abca089ac 132 if (delta >= os_tmr.tcnt) {
RUBENTEC 0:b82abca089ac 133 delta -= os_tmr.tcnt;
RUBENTEC 0:b82abca089ac 134 os_tmr.tcnt = 1;
RUBENTEC 0:b82abca089ac 135 while (os_tmr.next) {
RUBENTEC 0:b82abca089ac 136 rt_tmr_tick();
RUBENTEC 0:b82abca089ac 137 if (delta == 0) break;
RUBENTEC 0:b82abca089ac 138 delta--;
RUBENTEC 0:b82abca089ac 139 }
RUBENTEC 0:b82abca089ac 140 } else {
RUBENTEC 0:b82abca089ac 141 os_tmr.tcnt -= delta;
RUBENTEC 0:b82abca089ac 142 }
RUBENTEC 0:b82abca089ac 143 }
RUBENTEC 0:b82abca089ac 144 #endif
RUBENTEC 0:b82abca089ac 145
RUBENTEC 0:b82abca089ac 146 /* Switch back to highest ready task */
RUBENTEC 0:b82abca089ac 147 next = rt_get_first (&os_rdy);
RUBENTEC 0:b82abca089ac 148 rt_switch_req (next);
RUBENTEC 0:b82abca089ac 149
RUBENTEC 0:b82abca089ac 150 rt_tsk_unlock();
RUBENTEC 0:b82abca089ac 151 }
RUBENTEC 0:b82abca089ac 152
RUBENTEC 0:b82abca089ac 153
RUBENTEC 0:b82abca089ac 154 /*--------------------------- rt_tsk_lock -----------------------------------*/
RUBENTEC 0:b82abca089ac 155
RUBENTEC 0:b82abca089ac 156 void rt_tsk_lock (void) {
RUBENTEC 0:b82abca089ac 157 /* Prevent task switching by locking out scheduler */
RUBENTEC 0:b82abca089ac 158 OS_X_LOCK(os_tick_irqn);
RUBENTEC 0:b82abca089ac 159 os_lock = __TRUE;
RUBENTEC 0:b82abca089ac 160 OS_X_UNPEND (&pend_flags);
RUBENTEC 0:b82abca089ac 161 }
RUBENTEC 0:b82abca089ac 162
RUBENTEC 0:b82abca089ac 163
RUBENTEC 0:b82abca089ac 164 /*--------------------------- rt_tsk_unlock ---------------------------------*/
RUBENTEC 0:b82abca089ac 165
RUBENTEC 0:b82abca089ac 166 void rt_tsk_unlock (void) {
RUBENTEC 0:b82abca089ac 167 /* Unlock scheduler and re-enable task switching */
RUBENTEC 0:b82abca089ac 168 OS_X_UNLOCK(os_tick_irqn);
RUBENTEC 0:b82abca089ac 169 os_lock = __FALSE;
RUBENTEC 0:b82abca089ac 170 OS_X_PEND (pend_flags, os_psh_flag);
RUBENTEC 0:b82abca089ac 171 os_psh_flag = __FALSE;
RUBENTEC 0:b82abca089ac 172 }
RUBENTEC 0:b82abca089ac 173
RUBENTEC 0:b82abca089ac 174
RUBENTEC 0:b82abca089ac 175 /*--------------------------- rt_psh_req ------------------------------------*/
RUBENTEC 0:b82abca089ac 176
RUBENTEC 0:b82abca089ac 177 void rt_psh_req (void) {
RUBENTEC 0:b82abca089ac 178 /* Initiate a post service handling request if required. */
RUBENTEC 0:b82abca089ac 179 if (os_lock == __FALSE) {
RUBENTEC 0:b82abca089ac 180 OS_PEND_IRQ ();
RUBENTEC 0:b82abca089ac 181 }
RUBENTEC 0:b82abca089ac 182 else {
RUBENTEC 0:b82abca089ac 183 os_psh_flag = __TRUE;
RUBENTEC 0:b82abca089ac 184 }
RUBENTEC 0:b82abca089ac 185 }
RUBENTEC 0:b82abca089ac 186
RUBENTEC 0:b82abca089ac 187
RUBENTEC 0:b82abca089ac 188 /*--------------------------- rt_pop_req ------------------------------------*/
RUBENTEC 0:b82abca089ac 189
RUBENTEC 0:b82abca089ac 190 void rt_pop_req (void) {
RUBENTEC 0:b82abca089ac 191 /* Process an ISR post service requests. */
RUBENTEC 0:b82abca089ac 192 struct OS_XCB *p_CB;
RUBENTEC 0:b82abca089ac 193 P_TCB next;
RUBENTEC 0:b82abca089ac 194 U32 idx;
RUBENTEC 0:b82abca089ac 195
RUBENTEC 0:b82abca089ac 196 os_tsk.run->state = READY;
RUBENTEC 0:b82abca089ac 197 rt_put_rdy_first (os_tsk.run);
RUBENTEC 0:b82abca089ac 198
RUBENTEC 0:b82abca089ac 199 idx = os_psq->last;
RUBENTEC 0:b82abca089ac 200 while (os_psq->count) {
RUBENTEC 0:b82abca089ac 201 p_CB = os_psq->q[idx].id;
RUBENTEC 0:b82abca089ac 202 if (p_CB->cb_type == TCB) {
RUBENTEC 0:b82abca089ac 203 /* Is of TCB type */
RUBENTEC 0:b82abca089ac 204 rt_evt_psh ((P_TCB)p_CB, (U16)os_psq->q[idx].arg);
RUBENTEC 0:b82abca089ac 205 }
RUBENTEC 0:b82abca089ac 206 else if (p_CB->cb_type == MCB) {
RUBENTEC 0:b82abca089ac 207 /* Is of MCB type */
RUBENTEC 0:b82abca089ac 208 rt_mbx_psh ((P_MCB)p_CB, (void *)os_psq->q[idx].arg);
RUBENTEC 0:b82abca089ac 209 }
RUBENTEC 0:b82abca089ac 210 else {
RUBENTEC 0:b82abca089ac 211 /* Must be of SCB type */
RUBENTEC 0:b82abca089ac 212 rt_sem_psh ((P_SCB)p_CB);
RUBENTEC 0:b82abca089ac 213 }
RUBENTEC 0:b82abca089ac 214 if (++idx == os_psq->size) idx = 0;
RUBENTEC 0:b82abca089ac 215 rt_dec (&os_psq->count);
RUBENTEC 0:b82abca089ac 216 }
RUBENTEC 0:b82abca089ac 217 os_psq->last = idx;
RUBENTEC 0:b82abca089ac 218
RUBENTEC 0:b82abca089ac 219 next = rt_get_first (&os_rdy);
RUBENTEC 0:b82abca089ac 220 rt_switch_req (next);
RUBENTEC 0:b82abca089ac 221 }
RUBENTEC 0:b82abca089ac 222
RUBENTEC 0:b82abca089ac 223
RUBENTEC 0:b82abca089ac 224 /*--------------------------- os_tick_init ----------------------------------*/
RUBENTEC 0:b82abca089ac 225
RUBENTEC 0:b82abca089ac 226 __weak int os_tick_init (void) {
RUBENTEC 0:b82abca089ac 227 /* Initialize SysTick timer as system tick timer. */
RUBENTEC 0:b82abca089ac 228 rt_systick_init ();
RUBENTEC 0:b82abca089ac 229 return (SYS_TICK_IRQn); /* Return IRQ number of SysTick timer */
RUBENTEC 0:b82abca089ac 230 }
RUBENTEC 0:b82abca089ac 231
RUBENTEC 0:b82abca089ac 232
RUBENTEC 0:b82abca089ac 233 /*--------------------------- os_tick_irqack --------------------------------*/
RUBENTEC 0:b82abca089ac 234
RUBENTEC 0:b82abca089ac 235 __weak void os_tick_irqack (void) {
RUBENTEC 0:b82abca089ac 236 /* Acknowledge timer interrupt. */
RUBENTEC 0:b82abca089ac 237 }
RUBENTEC 0:b82abca089ac 238
RUBENTEC 0:b82abca089ac 239
RUBENTEC 0:b82abca089ac 240 /*--------------------------- rt_systick ------------------------------------*/
RUBENTEC 0:b82abca089ac 241
RUBENTEC 0:b82abca089ac 242 extern void sysTimerTick(void);
RUBENTEC 0:b82abca089ac 243
RUBENTEC 0:b82abca089ac 244 void rt_systick (void) {
RUBENTEC 0:b82abca089ac 245 if(NVIC_Pending(SYS_TICK_IRQn)){
RUBENTEC 0:b82abca089ac 246 rt_pop_req();
RUBENTEC 0:b82abca089ac 247 NVIC_UnpendIRQ(SYS_TICK_IRQn);
RUBENTEC 0:b82abca089ac 248 SYS_TICK_TIMER->IR = 0xF; // clear timer interrupt
RUBENTEC 0:b82abca089ac 249 return;
RUBENTEC 0:b82abca089ac 250 }
RUBENTEC 0:b82abca089ac 251 /* Check for system clock update, suspend running task. */
RUBENTEC 0:b82abca089ac 252 P_TCB next;
RUBENTEC 0:b82abca089ac 253
RUBENTEC 0:b82abca089ac 254 os_tsk.run->state = READY;
RUBENTEC 0:b82abca089ac 255 rt_put_rdy_first (os_tsk.run);
RUBENTEC 0:b82abca089ac 256
RUBENTEC 0:b82abca089ac 257 /* Check Round Robin timeout. */
RUBENTEC 0:b82abca089ac 258 rt_chk_robin ();
RUBENTEC 0:b82abca089ac 259
RUBENTEC 0:b82abca089ac 260 /* Update delays. */
RUBENTEC 0:b82abca089ac 261 os_time++;
RUBENTEC 0:b82abca089ac 262 rt_dec_dly ();
RUBENTEC 0:b82abca089ac 263
RUBENTEC 0:b82abca089ac 264 /* Check the user timers. */
RUBENTEC 0:b82abca089ac 265 #ifdef __CMSIS_RTOS
RUBENTEC 0:b82abca089ac 266 sysTimerTick();
RUBENTEC 0:b82abca089ac 267 #else
RUBENTEC 0:b82abca089ac 268 rt_tmr_tick ();
RUBENTEC 0:b82abca089ac 269 #endif
RUBENTEC 0:b82abca089ac 270
RUBENTEC 0:b82abca089ac 271 /* Switch back to highest ready task */
RUBENTEC 0:b82abca089ac 272 next = rt_get_first (&os_rdy);
RUBENTEC 0:b82abca089ac 273 rt_switch_req (next);
RUBENTEC 0:b82abca089ac 274 SYS_TICK_TIMER->IR = 0xF; // clear timer interrupt
RUBENTEC 0:b82abca089ac 275 }
RUBENTEC 0:b82abca089ac 276
RUBENTEC 0:b82abca089ac 277 /*--------------------------- rt_stk_check ----------------------------------*/
RUBENTEC 0:b82abca089ac 278 __weak void rt_stk_check (void) {
RUBENTEC 0:b82abca089ac 279 /* Check for stack overflow. */
RUBENTEC 0:b82abca089ac 280 if (os_tsk.run->task_id == 0x01) {
RUBENTEC 0:b82abca089ac 281 // TODO: For the main thread the check should be done against the main heap pointer
RUBENTEC 0:b82abca089ac 282 } else {
RUBENTEC 0:b82abca089ac 283 if ((os_tsk.run->tsk_stack < (U32)os_tsk.run->stack) ||
RUBENTEC 0:b82abca089ac 284 (os_tsk.run->stack[0] != MAGIC_WORD)) {
RUBENTEC 0:b82abca089ac 285 os_error (OS_ERR_STK_OVF);
RUBENTEC 0:b82abca089ac 286 }
RUBENTEC 0:b82abca089ac 287 }
RUBENTEC 0:b82abca089ac 288 }
RUBENTEC 0:b82abca089ac 289
RUBENTEC 0:b82abca089ac 290 /*----------------------------------------------------------------------------
RUBENTEC 0:b82abca089ac 291 * end of file
RUBENTEC 0:b82abca089ac 292 *---------------------------------------------------------------------------*/
RUBENTEC 0:b82abca089ac 293