Versie 0.2 Het versturen via de NRF werkt nog niet helemaal omdat er per 4 bytes verstuurd moet worden. Wordt gefixt d.m.v. dynamic stuff!

Dependencies:   BufferedSerial

Dependents:   rtos_basic rtos_basic

Fork of mbed-rtos by mbed official

Committer:
mbed_official
Date:
Thu Nov 06 13:00:11 2014 +0000
Revision:
49:77c8e4604045
Parent:
rtx_ca/HAL_CM.c@48:e9a2c7cb57a4
Synchronized with git revision 7b90c2ba137baaf9769219e0e8a7b8e8d1299c4f

Full URL: https://github.com/mbedmicro/mbed/commit/7b90c2ba137baaf9769219e0e8a7b8e8d1299c4f/

This target is not yet tested, so it can't be released as part of the official
SDK build for now.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mbed_official 48:e9a2c7cb57a4 1 /*----------------------------------------------------------------------------
mbed_official 48:e9a2c7cb57a4 2 * RL-ARM - RTX
mbed_official 48:e9a2c7cb57a4 3 *----------------------------------------------------------------------------
mbed_official 48:e9a2c7cb57a4 4 * Name: HAL_CM.C
mbed_official 48:e9a2c7cb57a4 5 * Purpose: Hardware Abstraction Layer for Cortex-M
mbed_official 48:e9a2c7cb57a4 6 * Rev.: V4.60
mbed_official 48:e9a2c7cb57a4 7 *----------------------------------------------------------------------------
mbed_official 48:e9a2c7cb57a4 8 *
mbed_official 48:e9a2c7cb57a4 9 * Copyright (c) 1999-2009 KEIL, 2009-2012 ARM Germany GmbH
mbed_official 48:e9a2c7cb57a4 10 * All rights reserved.
mbed_official 48:e9a2c7cb57a4 11 * Redistribution and use in source and binary forms, with or without
mbed_official 48:e9a2c7cb57a4 12 * modification, are permitted provided that the following conditions are met:
mbed_official 48:e9a2c7cb57a4 13 * - Redistributions of source code must retain the above copyright
mbed_official 48:e9a2c7cb57a4 14 * notice, this list of conditions and the following disclaimer.
mbed_official 48:e9a2c7cb57a4 15 * - Redistributions in binary form must reproduce the above copyright
mbed_official 48:e9a2c7cb57a4 16 * notice, this list of conditions and the following disclaimer in the
mbed_official 48:e9a2c7cb57a4 17 * documentation and/or other materials provided with the distribution.
mbed_official 48:e9a2c7cb57a4 18 * - Neither the name of ARM nor the names of its contributors may be used
mbed_official 48:e9a2c7cb57a4 19 * to endorse or promote products derived from this software without
mbed_official 48:e9a2c7cb57a4 20 * specific prior written permission.
mbed_official 48:e9a2c7cb57a4 21 *
mbed_official 48:e9a2c7cb57a4 22 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
mbed_official 48:e9a2c7cb57a4 23 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
mbed_official 48:e9a2c7cb57a4 24 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
mbed_official 48:e9a2c7cb57a4 25 * ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE
mbed_official 48:e9a2c7cb57a4 26 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
mbed_official 48:e9a2c7cb57a4 27 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
mbed_official 48:e9a2c7cb57a4 28 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
mbed_official 48:e9a2c7cb57a4 29 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
mbed_official 48:e9a2c7cb57a4 30 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
mbed_official 48:e9a2c7cb57a4 31 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
mbed_official 48:e9a2c7cb57a4 32 * POSSIBILITY OF SUCH DAMAGE.
mbed_official 48:e9a2c7cb57a4 33 *---------------------------------------------------------------------------*/
mbed_official 48:e9a2c7cb57a4 34
mbed_official 48:e9a2c7cb57a4 35 #include "rt_TypeDef.h"
mbed_official 48:e9a2c7cb57a4 36 #include "RTX_Config.h"
mbed_official 48:e9a2c7cb57a4 37 #include "rt_HAL_CM.h"
mbed_official 48:e9a2c7cb57a4 38
mbed_official 48:e9a2c7cb57a4 39
mbed_official 48:e9a2c7cb57a4 40 /*----------------------------------------------------------------------------
mbed_official 48:e9a2c7cb57a4 41 * Global Variables
mbed_official 48:e9a2c7cb57a4 42 *---------------------------------------------------------------------------*/
mbed_official 48:e9a2c7cb57a4 43
mbed_official 48:e9a2c7cb57a4 44 #ifdef DBG_MSG
mbed_official 48:e9a2c7cb57a4 45 BIT dbg_msg;
mbed_official 48:e9a2c7cb57a4 46 #endif
mbed_official 48:e9a2c7cb57a4 47
mbed_official 48:e9a2c7cb57a4 48 /*----------------------------------------------------------------------------
mbed_official 48:e9a2c7cb57a4 49 * Functions
mbed_official 48:e9a2c7cb57a4 50 *---------------------------------------------------------------------------*/
mbed_official 48:e9a2c7cb57a4 51
mbed_official 48:e9a2c7cb57a4 52
mbed_official 48:e9a2c7cb57a4 53 /*--------------------------- rt_init_stack ---------------------------------*/
mbed_official 48:e9a2c7cb57a4 54
mbed_official 48:e9a2c7cb57a4 55 void rt_init_stack (P_TCB p_TCB, FUNCP task_body) {
mbed_official 48:e9a2c7cb57a4 56 /* Prepare TCB and saved context for a first time start of a task. */
mbed_official 48:e9a2c7cb57a4 57 U32 *stk,i,size;
mbed_official 48:e9a2c7cb57a4 58
mbed_official 48:e9a2c7cb57a4 59 /* Prepare a complete interrupt frame for first task start */
mbed_official 48:e9a2c7cb57a4 60 size = p_TCB->priv_stack >> 2;
mbed_official 48:e9a2c7cb57a4 61 if (size == 0) {
mbed_official 48:e9a2c7cb57a4 62 size = (U16)os_stackinfo >> 2;
mbed_official 48:e9a2c7cb57a4 63 }
mbed_official 48:e9a2c7cb57a4 64
mbed_official 48:e9a2c7cb57a4 65 /* Write to the top of stack. */
mbed_official 48:e9a2c7cb57a4 66 stk = &p_TCB->stack[size];
mbed_official 48:e9a2c7cb57a4 67
mbed_official 48:e9a2c7cb57a4 68 /* Auto correct to 8-byte ARM stack alignment. */
mbed_official 48:e9a2c7cb57a4 69 if ((U32)stk & 0x04) {
mbed_official 48:e9a2c7cb57a4 70 stk--;
mbed_official 48:e9a2c7cb57a4 71 }
mbed_official 48:e9a2c7cb57a4 72
mbed_official 48:e9a2c7cb57a4 73 stk -= 16;
mbed_official 48:e9a2c7cb57a4 74
mbed_official 48:e9a2c7cb57a4 75 /* Default xPSR and initial PC */
mbed_official 48:e9a2c7cb57a4 76 stk[15] = INITIAL_xPSR;
mbed_official 48:e9a2c7cb57a4 77 stk[14] = (U32)task_body;
mbed_official 48:e9a2c7cb57a4 78
mbed_official 48:e9a2c7cb57a4 79 /* Clear R4-R11,R0-R3,R12,LR registers. */
mbed_official 48:e9a2c7cb57a4 80 for (i = 0; i < 14; i++) {
mbed_official 48:e9a2c7cb57a4 81 stk[i] = 0;
mbed_official 48:e9a2c7cb57a4 82 }
mbed_official 48:e9a2c7cb57a4 83
mbed_official 48:e9a2c7cb57a4 84 /* Assign a void pointer to R0. */
mbed_official 48:e9a2c7cb57a4 85 stk[8] = (U32)p_TCB->msg;
mbed_official 48:e9a2c7cb57a4 86
mbed_official 48:e9a2c7cb57a4 87 /* Initial Task stack pointer. */
mbed_official 48:e9a2c7cb57a4 88 p_TCB->tsk_stack = (U32)stk;
mbed_official 48:e9a2c7cb57a4 89
mbed_official 48:e9a2c7cb57a4 90 /* Task entry point. */
mbed_official 48:e9a2c7cb57a4 91 p_TCB->ptask = task_body;
mbed_official 48:e9a2c7cb57a4 92
mbed_official 48:e9a2c7cb57a4 93 /* Set a magic word for checking of stack overflow. */
mbed_official 48:e9a2c7cb57a4 94 p_TCB->stack[0] = MAGIC_WORD;
mbed_official 48:e9a2c7cb57a4 95 }
mbed_official 48:e9a2c7cb57a4 96
mbed_official 48:e9a2c7cb57a4 97
mbed_official 48:e9a2c7cb57a4 98 /*--------------------------- rt_ret_val ----------------------------------*/
mbed_official 48:e9a2c7cb57a4 99
mbed_official 48:e9a2c7cb57a4 100 static __inline U32 *rt_ret_regs (P_TCB p_TCB) {
mbed_official 48:e9a2c7cb57a4 101 /* Get pointer to task return value registers (R0..R3) in Stack */
mbed_official 48:e9a2c7cb57a4 102 #if (__TARGET_FPU_VFP)
mbed_official 48:e9a2c7cb57a4 103 if (p_TCB->stack_frame) {
mbed_official 48:e9a2c7cb57a4 104 /* Extended Stack Frame: R4-R11,S16-S31,R0-R3,R12,LR,PC,xPSR,S0-S15,FPSCR */
mbed_official 48:e9a2c7cb57a4 105 return (U32 *)(p_TCB->tsk_stack + 8*4 + 16*4);
mbed_official 48:e9a2c7cb57a4 106 } else {
mbed_official 48:e9a2c7cb57a4 107 /* Basic Stack Frame: R4-R11,R0-R3,R12,LR,PC,xPSR */
mbed_official 48:e9a2c7cb57a4 108 return (U32 *)(p_TCB->tsk_stack + 8*4);
mbed_official 48:e9a2c7cb57a4 109 }
mbed_official 48:e9a2c7cb57a4 110 #else
mbed_official 48:e9a2c7cb57a4 111 /* Stack Frame: R4-R11,R0-R3,R12,LR,PC,xPSR */
mbed_official 48:e9a2c7cb57a4 112 return (U32 *)(p_TCB->tsk_stack + 8*4);
mbed_official 48:e9a2c7cb57a4 113 #endif
mbed_official 48:e9a2c7cb57a4 114 }
mbed_official 48:e9a2c7cb57a4 115
mbed_official 48:e9a2c7cb57a4 116 void rt_ret_val (P_TCB p_TCB, U32 v0) {
mbed_official 48:e9a2c7cb57a4 117 U32 *ret;
mbed_official 48:e9a2c7cb57a4 118
mbed_official 48:e9a2c7cb57a4 119 ret = rt_ret_regs(p_TCB);
mbed_official 48:e9a2c7cb57a4 120 ret[0] = v0;
mbed_official 48:e9a2c7cb57a4 121 }
mbed_official 48:e9a2c7cb57a4 122
mbed_official 48:e9a2c7cb57a4 123 void rt_ret_val2(P_TCB p_TCB, U32 v0, U32 v1) {
mbed_official 48:e9a2c7cb57a4 124 U32 *ret;
mbed_official 48:e9a2c7cb57a4 125
mbed_official 48:e9a2c7cb57a4 126 ret = rt_ret_regs(p_TCB);
mbed_official 48:e9a2c7cb57a4 127 ret[0] = v0;
mbed_official 48:e9a2c7cb57a4 128 ret[1] = v1;
mbed_official 48:e9a2c7cb57a4 129 }
mbed_official 48:e9a2c7cb57a4 130
mbed_official 48:e9a2c7cb57a4 131
mbed_official 48:e9a2c7cb57a4 132 /*--------------------------- dbg_init --------------------------------------*/
mbed_official 48:e9a2c7cb57a4 133
mbed_official 48:e9a2c7cb57a4 134 #ifdef DBG_MSG
mbed_official 48:e9a2c7cb57a4 135 void dbg_init (void) {
mbed_official 48:e9a2c7cb57a4 136 if ((DEMCR & DEMCR_TRCENA) &&
mbed_official 48:e9a2c7cb57a4 137 (ITM_CONTROL & ITM_ITMENA) &&
mbed_official 48:e9a2c7cb57a4 138 (ITM_ENABLE & (1UL << 31))) {
mbed_official 48:e9a2c7cb57a4 139 dbg_msg = __TRUE;
mbed_official 48:e9a2c7cb57a4 140 }
mbed_official 48:e9a2c7cb57a4 141 }
mbed_official 48:e9a2c7cb57a4 142 #endif
mbed_official 48:e9a2c7cb57a4 143
mbed_official 48:e9a2c7cb57a4 144 /*--------------------------- dbg_task_notify -------------------------------*/
mbed_official 48:e9a2c7cb57a4 145
mbed_official 48:e9a2c7cb57a4 146 #ifdef DBG_MSG
mbed_official 48:e9a2c7cb57a4 147 void dbg_task_notify (P_TCB p_tcb, BOOL create) {
mbed_official 48:e9a2c7cb57a4 148 while (ITM_PORT31_U32 == 0);
mbed_official 48:e9a2c7cb57a4 149 ITM_PORT31_U32 = (U32)p_tcb->ptask;
mbed_official 48:e9a2c7cb57a4 150 while (ITM_PORT31_U32 == 0);
mbed_official 48:e9a2c7cb57a4 151 ITM_PORT31_U16 = (create << 8) | p_tcb->task_id;
mbed_official 48:e9a2c7cb57a4 152 }
mbed_official 48:e9a2c7cb57a4 153 #endif
mbed_official 48:e9a2c7cb57a4 154
mbed_official 48:e9a2c7cb57a4 155 /*--------------------------- dbg_task_switch -------------------------------*/
mbed_official 48:e9a2c7cb57a4 156
mbed_official 48:e9a2c7cb57a4 157 #ifdef DBG_MSG
mbed_official 48:e9a2c7cb57a4 158 void dbg_task_switch (U32 task_id) {
mbed_official 48:e9a2c7cb57a4 159 while (ITM_PORT31_U32 == 0);
mbed_official 48:e9a2c7cb57a4 160 ITM_PORT31_U8 = task_id;
mbed_official 48:e9a2c7cb57a4 161 }
mbed_official 48:e9a2c7cb57a4 162 #endif
mbed_official 48:e9a2c7cb57a4 163
mbed_official 48:e9a2c7cb57a4 164
mbed_official 48:e9a2c7cb57a4 165 /*----------------------------------------------------------------------------
mbed_official 48:e9a2c7cb57a4 166 * end of file
mbed_official 48:e9a2c7cb57a4 167 *---------------------------------------------------------------------------*/
mbed_official 48:e9a2c7cb57a4 168