Seger Real time terminal, use RTT viewer to view messages through the segger debugger instead of art

Fork of SEGGER_RTT by Glimworm Beacons

Committer:
GlimwormBeacons
Date:
Sun Oct 09 09:45:11 2016 +0000
Revision:
0:a7800e894aaf
test

Who changed what in which revision?

UserRevisionLine numberNew contents of line
GlimwormBeacons 0:a7800e894aaf 1 /*********************************************************************
GlimwormBeacons 0:a7800e894aaf 2 * SEGGER MICROCONTROLLER GmbH & Co. KG *
GlimwormBeacons 0:a7800e894aaf 3 * Solutions for real time microcontroller applications *
GlimwormBeacons 0:a7800e894aaf 4 **********************************************************************
GlimwormBeacons 0:a7800e894aaf 5 * *
GlimwormBeacons 0:a7800e894aaf 6 * (c) 2014 - 2016 SEGGER Microcontroller GmbH & Co. KG *
GlimwormBeacons 0:a7800e894aaf 7 * *
GlimwormBeacons 0:a7800e894aaf 8 * www.segger.com Support: support@segger.com *
GlimwormBeacons 0:a7800e894aaf 9 * *
GlimwormBeacons 0:a7800e894aaf 10 **********************************************************************
GlimwormBeacons 0:a7800e894aaf 11 * *
GlimwormBeacons 0:a7800e894aaf 12 * SEGGER RTT * Real Time Transfer for embedded targets *
GlimwormBeacons 0:a7800e894aaf 13 * *
GlimwormBeacons 0:a7800e894aaf 14 **********************************************************************
GlimwormBeacons 0:a7800e894aaf 15 * *
GlimwormBeacons 0:a7800e894aaf 16 * All rights reserved. *
GlimwormBeacons 0:a7800e894aaf 17 * *
GlimwormBeacons 0:a7800e894aaf 18 * * This software may in its unmodified form be freely redistributed *
GlimwormBeacons 0:a7800e894aaf 19 * in source form. *
GlimwormBeacons 0:a7800e894aaf 20 * * The source code may be modified, provided the source code *
GlimwormBeacons 0:a7800e894aaf 21 * retains the above copyright notice, this list of conditions and *
GlimwormBeacons 0:a7800e894aaf 22 * the following disclaimer. *
GlimwormBeacons 0:a7800e894aaf 23 * * Modified versions of this software in source or linkable form *
GlimwormBeacons 0:a7800e894aaf 24 * may not be distributed without prior consent of SEGGER. *
GlimwormBeacons 0:a7800e894aaf 25 * * This software may only be used for communication with SEGGER *
GlimwormBeacons 0:a7800e894aaf 26 * J-Link debug probes. *
GlimwormBeacons 0:a7800e894aaf 27 * *
GlimwormBeacons 0:a7800e894aaf 28 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND *
GlimwormBeacons 0:a7800e894aaf 29 * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, *
GlimwormBeacons 0:a7800e894aaf 30 * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF *
GlimwormBeacons 0:a7800e894aaf 31 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE *
GlimwormBeacons 0:a7800e894aaf 32 * DISCLAIMED. IN NO EVENT SHALL SEGGER Microcontroller BE LIABLE FOR *
GlimwormBeacons 0:a7800e894aaf 33 * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR *
GlimwormBeacons 0:a7800e894aaf 34 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT *
GlimwormBeacons 0:a7800e894aaf 35 * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; *
GlimwormBeacons 0:a7800e894aaf 36 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF *
GlimwormBeacons 0:a7800e894aaf 37 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT *
GlimwormBeacons 0:a7800e894aaf 38 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE *
GlimwormBeacons 0:a7800e894aaf 39 * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH *
GlimwormBeacons 0:a7800e894aaf 40 * DAMAGE. *
GlimwormBeacons 0:a7800e894aaf 41 * *
GlimwormBeacons 0:a7800e894aaf 42 **********************************************************************
GlimwormBeacons 0:a7800e894aaf 43 * *
GlimwormBeacons 0:a7800e894aaf 44 * RTT version: 5.12g *
GlimwormBeacons 0:a7800e894aaf 45 * *
GlimwormBeacons 0:a7800e894aaf 46 **********************************************************************
GlimwormBeacons 0:a7800e894aaf 47 ---------------------------END-OF-HEADER------------------------------
GlimwormBeacons 0:a7800e894aaf 48 File : SEGGER_RTT.c
GlimwormBeacons 0:a7800e894aaf 49 Purpose : Implementation of SEGGER real-time transfer (RTT) which
GlimwormBeacons 0:a7800e894aaf 50 allows real-time communication on targets which support
GlimwormBeacons 0:a7800e894aaf 51 debugger memory accesses while the CPU is running.
GlimwormBeacons 0:a7800e894aaf 52
GlimwormBeacons 0:a7800e894aaf 53 Additional information:
GlimwormBeacons 0:a7800e894aaf 54 Type "int" is assumed to be 32-bits in size
GlimwormBeacons 0:a7800e894aaf 55 H->T Host to target communication
GlimwormBeacons 0:a7800e894aaf 56 T->H Target to host communication
GlimwormBeacons 0:a7800e894aaf 57
GlimwormBeacons 0:a7800e894aaf 58 RTT channel 0 is always present and reserved for Terminal usage.
GlimwormBeacons 0:a7800e894aaf 59 Name is fixed to "Terminal"
GlimwormBeacons 0:a7800e894aaf 60
GlimwormBeacons 0:a7800e894aaf 61 Effective buffer size: SizeOfBuffer - 1
GlimwormBeacons 0:a7800e894aaf 62
GlimwormBeacons 0:a7800e894aaf 63 WrOff == RdOff: Buffer is empty
GlimwormBeacons 0:a7800e894aaf 64 WrOff == (RdOff - 1): Buffer is full
GlimwormBeacons 0:a7800e894aaf 65 WrOff > RdOff: Free space includes wrap-around
GlimwormBeacons 0:a7800e894aaf 66 WrOff < RdOff: Used space includes wrap-around
GlimwormBeacons 0:a7800e894aaf 67 (WrOff == (SizeOfBuffer - 1)) && (RdOff == 0):
GlimwormBeacons 0:a7800e894aaf 68 Buffer full and wrap-around after next byte
GlimwormBeacons 0:a7800e894aaf 69
GlimwormBeacons 0:a7800e894aaf 70
GlimwormBeacons 0:a7800e894aaf 71 ----------------------------------------------------------------------
GlimwormBeacons 0:a7800e894aaf 72 */
GlimwormBeacons 0:a7800e894aaf 73
GlimwormBeacons 0:a7800e894aaf 74 #include "SEGGER_RTT.h"
GlimwormBeacons 0:a7800e894aaf 75
GlimwormBeacons 0:a7800e894aaf 76 #include <string.h> // for memcpy
GlimwormBeacons 0:a7800e894aaf 77
GlimwormBeacons 0:a7800e894aaf 78 /*********************************************************************
GlimwormBeacons 0:a7800e894aaf 79 *
GlimwormBeacons 0:a7800e894aaf 80 * Configuration, default values
GlimwormBeacons 0:a7800e894aaf 81 *
GlimwormBeacons 0:a7800e894aaf 82 **********************************************************************
GlimwormBeacons 0:a7800e894aaf 83 */
GlimwormBeacons 0:a7800e894aaf 84
GlimwormBeacons 0:a7800e894aaf 85 #ifndef BUFFER_SIZE_UP
GlimwormBeacons 0:a7800e894aaf 86 #define BUFFER_SIZE_UP 1024 // Size of the buffer for terminal output of target, up to host
GlimwormBeacons 0:a7800e894aaf 87 #endif
GlimwormBeacons 0:a7800e894aaf 88
GlimwormBeacons 0:a7800e894aaf 89 #ifndef BUFFER_SIZE_DOWN
GlimwormBeacons 0:a7800e894aaf 90 #define BUFFER_SIZE_DOWN 16 // Size of the buffer for terminal input to target from host (Usually keyboard input)
GlimwormBeacons 0:a7800e894aaf 91 #endif
GlimwormBeacons 0:a7800e894aaf 92
GlimwormBeacons 0:a7800e894aaf 93 #ifndef SEGGER_RTT_MAX_NUM_UP_BUFFERS
GlimwormBeacons 0:a7800e894aaf 94 #define SEGGER_RTT_MAX_NUM_UP_BUFFERS 2 // Number of up-buffers (T->H) available on this target
GlimwormBeacons 0:a7800e894aaf 95 #endif
GlimwormBeacons 0:a7800e894aaf 96
GlimwormBeacons 0:a7800e894aaf 97 #ifndef SEGGER_RTT_MAX_NUM_DOWN_BUFFERS
GlimwormBeacons 0:a7800e894aaf 98 #define SEGGER_RTT_MAX_NUM_DOWN_BUFFERS 2 // Number of down-buffers (H->T) available on this target
GlimwormBeacons 0:a7800e894aaf 99 #endif
GlimwormBeacons 0:a7800e894aaf 100
GlimwormBeacons 0:a7800e894aaf 101 #ifndef SEGGER_RTT_BUFFER_SECTION
GlimwormBeacons 0:a7800e894aaf 102 #if defined SEGGER_RTT_SECTION
GlimwormBeacons 0:a7800e894aaf 103 #define SEGGER_RTT_BUFFER_SECTION SEGGER_RTT_SECTION
GlimwormBeacons 0:a7800e894aaf 104 #endif
GlimwormBeacons 0:a7800e894aaf 105 #endif
GlimwormBeacons 0:a7800e894aaf 106
GlimwormBeacons 0:a7800e894aaf 107 #ifndef SEGGER_RTT_MODE_DEFAULT
GlimwormBeacons 0:a7800e894aaf 108 #define SEGGER_RTT_MODE_DEFAULT SEGGER_RTT_MODE_NO_BLOCK_SKIP
GlimwormBeacons 0:a7800e894aaf 109 #endif
GlimwormBeacons 0:a7800e894aaf 110
GlimwormBeacons 0:a7800e894aaf 111 #ifndef SEGGER_RTT_LOCK
GlimwormBeacons 0:a7800e894aaf 112 #define SEGGER_RTT_LOCK()
GlimwormBeacons 0:a7800e894aaf 113 #endif
GlimwormBeacons 0:a7800e894aaf 114
GlimwormBeacons 0:a7800e894aaf 115 #ifndef SEGGER_RTT_UNLOCK
GlimwormBeacons 0:a7800e894aaf 116 #define SEGGER_RTT_UNLOCK()
GlimwormBeacons 0:a7800e894aaf 117 #endif
GlimwormBeacons 0:a7800e894aaf 118
GlimwormBeacons 0:a7800e894aaf 119 #ifndef STRLEN
GlimwormBeacons 0:a7800e894aaf 120 #define STRLEN(a) strlen((a))
GlimwormBeacons 0:a7800e894aaf 121 #endif
GlimwormBeacons 0:a7800e894aaf 122
GlimwormBeacons 0:a7800e894aaf 123 #ifndef MEMCPY
GlimwormBeacons 0:a7800e894aaf 124 #define MEMCPY(pDest, pSrc, NumBytes) memcpy((pDest), (pSrc), (NumBytes))
GlimwormBeacons 0:a7800e894aaf 125 #endif
GlimwormBeacons 0:a7800e894aaf 126
GlimwormBeacons 0:a7800e894aaf 127 #ifndef MIN
GlimwormBeacons 0:a7800e894aaf 128 #define MIN(a, b) (((a) < (b)) ? (a) : (b))
GlimwormBeacons 0:a7800e894aaf 129 #endif
GlimwormBeacons 0:a7800e894aaf 130
GlimwormBeacons 0:a7800e894aaf 131 #ifndef MAX
GlimwormBeacons 0:a7800e894aaf 132 #define MAX(a, b) (((a) > (b)) ? (a) : (b))
GlimwormBeacons 0:a7800e894aaf 133 #endif
GlimwormBeacons 0:a7800e894aaf 134 //
GlimwormBeacons 0:a7800e894aaf 135 // For some environments, NULL may not be defined until certain headers are included
GlimwormBeacons 0:a7800e894aaf 136 //
GlimwormBeacons 0:a7800e894aaf 137 #ifndef NULL
GlimwormBeacons 0:a7800e894aaf 138 #define NULL 0
GlimwormBeacons 0:a7800e894aaf 139 #endif
GlimwormBeacons 0:a7800e894aaf 140
GlimwormBeacons 0:a7800e894aaf 141 /*********************************************************************
GlimwormBeacons 0:a7800e894aaf 142 *
GlimwormBeacons 0:a7800e894aaf 143 * Static const data
GlimwormBeacons 0:a7800e894aaf 144 *
GlimwormBeacons 0:a7800e894aaf 145 **********************************************************************
GlimwormBeacons 0:a7800e894aaf 146 */
GlimwormBeacons 0:a7800e894aaf 147
GlimwormBeacons 0:a7800e894aaf 148 static unsigned char _aTerminalId[16] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };
GlimwormBeacons 0:a7800e894aaf 149
GlimwormBeacons 0:a7800e894aaf 150 /*********************************************************************
GlimwormBeacons 0:a7800e894aaf 151 *
GlimwormBeacons 0:a7800e894aaf 152 * Static data
GlimwormBeacons 0:a7800e894aaf 153 *
GlimwormBeacons 0:a7800e894aaf 154 **********************************************************************
GlimwormBeacons 0:a7800e894aaf 155 */
GlimwormBeacons 0:a7800e894aaf 156 //
GlimwormBeacons 0:a7800e894aaf 157 // RTT Control Block and allocate buffers for channel 0
GlimwormBeacons 0:a7800e894aaf 158 //
GlimwormBeacons 0:a7800e894aaf 159 #ifdef SEGGER_RTT_SECTION
GlimwormBeacons 0:a7800e894aaf 160 #if (defined __GNUC__)
GlimwormBeacons 0:a7800e894aaf 161 __attribute__ ((section (SEGGER_RTT_SECTION))) SEGGER_RTT_CB _SEGGER_RTT;
GlimwormBeacons 0:a7800e894aaf 162 #elif (defined __ICCARM__) || (defined __ICCRX__)
GlimwormBeacons 0:a7800e894aaf 163 #pragma location=SEGGER_RTT_SECTION
GlimwormBeacons 0:a7800e894aaf 164 SEGGER_RTT_CB _SEGGER_RTT;
GlimwormBeacons 0:a7800e894aaf 165 #elif (defined __CC_ARM__)
GlimwormBeacons 0:a7800e894aaf 166 __attribute__ ((section (SEGGER_RTT_SECTION), zero_init)) SEGGER_RTT_CB _SEGGER_RTT;
GlimwormBeacons 0:a7800e894aaf 167 #else
GlimwormBeacons 0:a7800e894aaf 168 SEGGER_RTT_CB _SEGGER_RTT;
GlimwormBeacons 0:a7800e894aaf 169 #endif
GlimwormBeacons 0:a7800e894aaf 170 #else
GlimwormBeacons 0:a7800e894aaf 171 SEGGER_RTT_CB _SEGGER_RTT;
GlimwormBeacons 0:a7800e894aaf 172 #endif
GlimwormBeacons 0:a7800e894aaf 173
GlimwormBeacons 0:a7800e894aaf 174 #ifdef SEGGER_RTT_BUFFER_SECTION
GlimwormBeacons 0:a7800e894aaf 175 #if (defined __GNUC__)
GlimwormBeacons 0:a7800e894aaf 176 __attribute__ ((section (SEGGER_RTT_BUFFER_SECTION))) static char _acUpBuffer [BUFFER_SIZE_UP];
GlimwormBeacons 0:a7800e894aaf 177 __attribute__ ((section (SEGGER_RTT_BUFFER_SECTION))) static char _acDownBuffer[BUFFER_SIZE_DOWN];
GlimwormBeacons 0:a7800e894aaf 178 #elif (defined __ICCARM__) || (defined __ICCRX__)
GlimwormBeacons 0:a7800e894aaf 179 #pragma location=SEGGER_RTT_BUFFER_SECTION
GlimwormBeacons 0:a7800e894aaf 180 static char _acUpBuffer [BUFFER_SIZE_UP];
GlimwormBeacons 0:a7800e894aaf 181 #pragma location=SEGGER_RTT_BUFFER_SECTION
GlimwormBeacons 0:a7800e894aaf 182 static char _acDownBuffer[BUFFER_SIZE_DOWN];
GlimwormBeacons 0:a7800e894aaf 183 #elif (defined __CC_ARM__)
GlimwormBeacons 0:a7800e894aaf 184 __attribute__ ((section (SEGGER_RTT_BUFFER_SECTION), zero_init)) static char _acUpBuffer [BUFFER_SIZE_UP];
GlimwormBeacons 0:a7800e894aaf 185 __attribute__ ((section (SEGGER_RTT_BUFFER_SECTION), zero_init)) static char _acDownBuffer[BUFFER_SIZE_DOWN];
GlimwormBeacons 0:a7800e894aaf 186 #else
GlimwormBeacons 0:a7800e894aaf 187 static char _acUpBuffer [BUFFER_SIZE_UP];
GlimwormBeacons 0:a7800e894aaf 188 static char _acDownBuffer[BUFFER_SIZE_DOWN];
GlimwormBeacons 0:a7800e894aaf 189 #endif
GlimwormBeacons 0:a7800e894aaf 190 #else
GlimwormBeacons 0:a7800e894aaf 191 static char _acUpBuffer [BUFFER_SIZE_UP];
GlimwormBeacons 0:a7800e894aaf 192 static char _acDownBuffer[BUFFER_SIZE_DOWN];
GlimwormBeacons 0:a7800e894aaf 193 #endif
GlimwormBeacons 0:a7800e894aaf 194
GlimwormBeacons 0:a7800e894aaf 195 static char _ActiveTerminal;
GlimwormBeacons 0:a7800e894aaf 196
GlimwormBeacons 0:a7800e894aaf 197 /*********************************************************************
GlimwormBeacons 0:a7800e894aaf 198 *
GlimwormBeacons 0:a7800e894aaf 199 * Static functions
GlimwormBeacons 0:a7800e894aaf 200 *
GlimwormBeacons 0:a7800e894aaf 201 **********************************************************************
GlimwormBeacons 0:a7800e894aaf 202 */
GlimwormBeacons 0:a7800e894aaf 203
GlimwormBeacons 0:a7800e894aaf 204 /*********************************************************************
GlimwormBeacons 0:a7800e894aaf 205 *
GlimwormBeacons 0:a7800e894aaf 206 * _DoInit()
GlimwormBeacons 0:a7800e894aaf 207 *
GlimwormBeacons 0:a7800e894aaf 208 * Function description
GlimwormBeacons 0:a7800e894aaf 209 * Initializes the control block an buffers.
GlimwormBeacons 0:a7800e894aaf 210 * May only be called via INIT() to avoid overriding settings.
GlimwormBeacons 0:a7800e894aaf 211 *
GlimwormBeacons 0:a7800e894aaf 212 */
GlimwormBeacons 0:a7800e894aaf 213 #define INIT() do { \
GlimwormBeacons 0:a7800e894aaf 214 if (_SEGGER_RTT.acID[0] == '\0') { _DoInit(); } \
GlimwormBeacons 0:a7800e894aaf 215 } while (0)
GlimwormBeacons 0:a7800e894aaf 216 static void _DoInit(void) {
GlimwormBeacons 0:a7800e894aaf 217 SEGGER_RTT_CB* p;
GlimwormBeacons 0:a7800e894aaf 218 //
GlimwormBeacons 0:a7800e894aaf 219 // Initialize control block
GlimwormBeacons 0:a7800e894aaf 220 //
GlimwormBeacons 0:a7800e894aaf 221 p = &_SEGGER_RTT;
GlimwormBeacons 0:a7800e894aaf 222 p->MaxNumUpBuffers = SEGGER_RTT_MAX_NUM_UP_BUFFERS;
GlimwormBeacons 0:a7800e894aaf 223 p->MaxNumDownBuffers = SEGGER_RTT_MAX_NUM_DOWN_BUFFERS;
GlimwormBeacons 0:a7800e894aaf 224 //
GlimwormBeacons 0:a7800e894aaf 225 // Initialize up buffer 0
GlimwormBeacons 0:a7800e894aaf 226 //
GlimwormBeacons 0:a7800e894aaf 227 p->aUp[0].sName = "Terminal";
GlimwormBeacons 0:a7800e894aaf 228 p->aUp[0].pBuffer = _acUpBuffer;
GlimwormBeacons 0:a7800e894aaf 229 p->aUp[0].SizeOfBuffer = sizeof(_acUpBuffer);
GlimwormBeacons 0:a7800e894aaf 230 p->aUp[0].RdOff = 0u;
GlimwormBeacons 0:a7800e894aaf 231 p->aUp[0].WrOff = 0u;
GlimwormBeacons 0:a7800e894aaf 232 p->aUp[0].Flags = SEGGER_RTT_MODE_DEFAULT;
GlimwormBeacons 0:a7800e894aaf 233 //
GlimwormBeacons 0:a7800e894aaf 234 // Initialize down buffer 0
GlimwormBeacons 0:a7800e894aaf 235 //
GlimwormBeacons 0:a7800e894aaf 236 p->aDown[0].sName = "Terminal";
GlimwormBeacons 0:a7800e894aaf 237 p->aDown[0].pBuffer = _acDownBuffer;
GlimwormBeacons 0:a7800e894aaf 238 p->aDown[0].SizeOfBuffer = sizeof(_acDownBuffer);
GlimwormBeacons 0:a7800e894aaf 239 p->aDown[0].RdOff = 0u;
GlimwormBeacons 0:a7800e894aaf 240 p->aDown[0].WrOff = 0u;
GlimwormBeacons 0:a7800e894aaf 241 p->aDown[0].Flags = SEGGER_RTT_MODE_DEFAULT;
GlimwormBeacons 0:a7800e894aaf 242 //
GlimwormBeacons 0:a7800e894aaf 243 // Finish initialization of the control block.
GlimwormBeacons 0:a7800e894aaf 244 // Copy Id string in three steps to make sure "SEGGER RTT" is not found
GlimwormBeacons 0:a7800e894aaf 245 // in initializer memory (usually flash) by J-Link
GlimwormBeacons 0:a7800e894aaf 246 //
GlimwormBeacons 0:a7800e894aaf 247 strcpy(&p->acID[7], "RTT");
GlimwormBeacons 0:a7800e894aaf 248 strcpy(&p->acID[0], "SEGGER");
GlimwormBeacons 0:a7800e894aaf 249 p->acID[6] = ' ';
GlimwormBeacons 0:a7800e894aaf 250 }
GlimwormBeacons 0:a7800e894aaf 251
GlimwormBeacons 0:a7800e894aaf 252 /*********************************************************************
GlimwormBeacons 0:a7800e894aaf 253 *
GlimwormBeacons 0:a7800e894aaf 254 * _WriteBlocking()
GlimwormBeacons 0:a7800e894aaf 255 *
GlimwormBeacons 0:a7800e894aaf 256 * Function description
GlimwormBeacons 0:a7800e894aaf 257 * Stores a specified number of characters in SEGGER RTT ring buffer
GlimwormBeacons 0:a7800e894aaf 258 * and updates the associated write pointer which is periodically
GlimwormBeacons 0:a7800e894aaf 259 * read by the host.
GlimwormBeacons 0:a7800e894aaf 260 * The caller is responsible for managing the write chunk sizes as
GlimwormBeacons 0:a7800e894aaf 261 * _WriteBlocking() will block until all data has been posted successfully.
GlimwormBeacons 0:a7800e894aaf 262 *
GlimwormBeacons 0:a7800e894aaf 263 * Parameters
GlimwormBeacons 0:a7800e894aaf 264 * pRing Ring buffer to post to.
GlimwormBeacons 0:a7800e894aaf 265 * pBuffer Pointer to character array. Does not need to point to a \0 terminated string.
GlimwormBeacons 0:a7800e894aaf 266 * NumBytes Number of bytes to be stored in the SEGGER RTT control block.
GlimwormBeacons 0:a7800e894aaf 267 *
GlimwormBeacons 0:a7800e894aaf 268 * Return value
GlimwormBeacons 0:a7800e894aaf 269 * >= 0 - Number of bytes written into buffer.
GlimwormBeacons 0:a7800e894aaf 270 */
GlimwormBeacons 0:a7800e894aaf 271 static unsigned _WriteBlocking(SEGGER_RTT_BUFFER_UP* pRing, const char* pBuffer, unsigned NumBytes) {
GlimwormBeacons 0:a7800e894aaf 272 unsigned NumBytesToWrite;
GlimwormBeacons 0:a7800e894aaf 273 unsigned NumBytesWritten;
GlimwormBeacons 0:a7800e894aaf 274 unsigned RdOff;
GlimwormBeacons 0:a7800e894aaf 275 unsigned WrOff;
GlimwormBeacons 0:a7800e894aaf 276 //
GlimwormBeacons 0:a7800e894aaf 277 // Write data to buffer and handle wrap-around if necessary
GlimwormBeacons 0:a7800e894aaf 278 //
GlimwormBeacons 0:a7800e894aaf 279 NumBytesWritten = 0u;
GlimwormBeacons 0:a7800e894aaf 280 WrOff = pRing->WrOff;
GlimwormBeacons 0:a7800e894aaf 281 do {
GlimwormBeacons 0:a7800e894aaf 282 RdOff = pRing->RdOff; // May be changed by host (debug probe) in the meantime
GlimwormBeacons 0:a7800e894aaf 283 if (RdOff > WrOff) {
GlimwormBeacons 0:a7800e894aaf 284 NumBytesToWrite = RdOff - WrOff - 1u;
GlimwormBeacons 0:a7800e894aaf 285 } else {
GlimwormBeacons 0:a7800e894aaf 286 NumBytesToWrite = pRing->SizeOfBuffer - (WrOff - RdOff + 1u);
GlimwormBeacons 0:a7800e894aaf 287 }
GlimwormBeacons 0:a7800e894aaf 288 NumBytesToWrite = MIN(NumBytesToWrite, (pRing->SizeOfBuffer - WrOff)); // Number of bytes that can be written until buffer wrap-around
GlimwormBeacons 0:a7800e894aaf 289 NumBytesToWrite = MIN(NumBytesToWrite, NumBytes);
GlimwormBeacons 0:a7800e894aaf 290 memcpy(pRing->pBuffer + WrOff, pBuffer, NumBytesToWrite);
GlimwormBeacons 0:a7800e894aaf 291 NumBytesWritten += NumBytesToWrite;
GlimwormBeacons 0:a7800e894aaf 292 pBuffer += NumBytesToWrite;
GlimwormBeacons 0:a7800e894aaf 293 NumBytes -= NumBytesToWrite;
GlimwormBeacons 0:a7800e894aaf 294 WrOff += NumBytesToWrite;
GlimwormBeacons 0:a7800e894aaf 295 if (WrOff == pRing->SizeOfBuffer) {
GlimwormBeacons 0:a7800e894aaf 296 WrOff = 0u;
GlimwormBeacons 0:a7800e894aaf 297 }
GlimwormBeacons 0:a7800e894aaf 298 pRing->WrOff = WrOff;
GlimwormBeacons 0:a7800e894aaf 299 } while (NumBytes);
GlimwormBeacons 0:a7800e894aaf 300 //
GlimwormBeacons 0:a7800e894aaf 301 return NumBytesWritten;
GlimwormBeacons 0:a7800e894aaf 302 }
GlimwormBeacons 0:a7800e894aaf 303
GlimwormBeacons 0:a7800e894aaf 304 /*********************************************************************
GlimwormBeacons 0:a7800e894aaf 305 *
GlimwormBeacons 0:a7800e894aaf 306 * _WriteNoCheck()
GlimwormBeacons 0:a7800e894aaf 307 *
GlimwormBeacons 0:a7800e894aaf 308 * Function description
GlimwormBeacons 0:a7800e894aaf 309 * Stores a specified number of characters in SEGGER RTT ring buffer
GlimwormBeacons 0:a7800e894aaf 310 * and updates the associated write pointer which is periodically
GlimwormBeacons 0:a7800e894aaf 311 * read by the host.
GlimwormBeacons 0:a7800e894aaf 312 * It is callers responsibility to make sure data actually fits in buffer.
GlimwormBeacons 0:a7800e894aaf 313 *
GlimwormBeacons 0:a7800e894aaf 314 * Parameters
GlimwormBeacons 0:a7800e894aaf 315 * pRing Ring buffer to post to.
GlimwormBeacons 0:a7800e894aaf 316 * pBuffer Pointer to character array. Does not need to point to a \0 terminated string.
GlimwormBeacons 0:a7800e894aaf 317 * NumBytes Number of bytes to be stored in the SEGGER RTT control block.
GlimwormBeacons 0:a7800e894aaf 318 *
GlimwormBeacons 0:a7800e894aaf 319 * Notes
GlimwormBeacons 0:a7800e894aaf 320 * (1) If there might not be enough space in the "Up"-buffer, call _WriteBlocking
GlimwormBeacons 0:a7800e894aaf 321 */
GlimwormBeacons 0:a7800e894aaf 322 static void _WriteNoCheck(SEGGER_RTT_BUFFER_UP* pRing, const char* pData, unsigned NumBytes) {
GlimwormBeacons 0:a7800e894aaf 323 unsigned NumBytesAtOnce;
GlimwormBeacons 0:a7800e894aaf 324 unsigned WrOff;
GlimwormBeacons 0:a7800e894aaf 325 unsigned Rem;
GlimwormBeacons 0:a7800e894aaf 326
GlimwormBeacons 0:a7800e894aaf 327 WrOff = pRing->WrOff;
GlimwormBeacons 0:a7800e894aaf 328 Rem = pRing->SizeOfBuffer - WrOff;
GlimwormBeacons 0:a7800e894aaf 329 if (Rem > NumBytes) {
GlimwormBeacons 0:a7800e894aaf 330 //
GlimwormBeacons 0:a7800e894aaf 331 // All data fits before wrap around
GlimwormBeacons 0:a7800e894aaf 332 //
GlimwormBeacons 0:a7800e894aaf 333 memcpy(pRing->pBuffer + WrOff, pData, NumBytes);
GlimwormBeacons 0:a7800e894aaf 334 pRing->WrOff = WrOff + NumBytes;
GlimwormBeacons 0:a7800e894aaf 335 } else {
GlimwormBeacons 0:a7800e894aaf 336 //
GlimwormBeacons 0:a7800e894aaf 337 // We reach the end of the buffer, so need to wrap around
GlimwormBeacons 0:a7800e894aaf 338 //
GlimwormBeacons 0:a7800e894aaf 339 NumBytesAtOnce = Rem;
GlimwormBeacons 0:a7800e894aaf 340 memcpy(pRing->pBuffer + WrOff, pData, NumBytesAtOnce);
GlimwormBeacons 0:a7800e894aaf 341 NumBytesAtOnce = NumBytes - Rem;
GlimwormBeacons 0:a7800e894aaf 342 memcpy(pRing->pBuffer, pData + Rem, NumBytesAtOnce);
GlimwormBeacons 0:a7800e894aaf 343 pRing->WrOff = NumBytesAtOnce;
GlimwormBeacons 0:a7800e894aaf 344 }
GlimwormBeacons 0:a7800e894aaf 345 }
GlimwormBeacons 0:a7800e894aaf 346
GlimwormBeacons 0:a7800e894aaf 347 /*********************************************************************
GlimwormBeacons 0:a7800e894aaf 348 *
GlimwormBeacons 0:a7800e894aaf 349 * _PostTerminalSwitch()
GlimwormBeacons 0:a7800e894aaf 350 *
GlimwormBeacons 0:a7800e894aaf 351 * Function description
GlimwormBeacons 0:a7800e894aaf 352 * Switch terminal to the given terminal ID. It is the caller's
GlimwormBeacons 0:a7800e894aaf 353 * responsibility to ensure the terminal ID is correct and there is
GlimwormBeacons 0:a7800e894aaf 354 * enough space in the buffer for this to complete successfully.
GlimwormBeacons 0:a7800e894aaf 355 *
GlimwormBeacons 0:a7800e894aaf 356 * Parameters
GlimwormBeacons 0:a7800e894aaf 357 * pRing Ring buffer to post to.
GlimwormBeacons 0:a7800e894aaf 358 * TerminalId Terminal ID to switch to.
GlimwormBeacons 0:a7800e894aaf 359 */
GlimwormBeacons 0:a7800e894aaf 360 static void _PostTerminalSwitch(SEGGER_RTT_BUFFER_UP* pRing, unsigned char TerminalId) {
GlimwormBeacons 0:a7800e894aaf 361 char ac[2];
GlimwormBeacons 0:a7800e894aaf 362
GlimwormBeacons 0:a7800e894aaf 363 ac[0] = 0xFFu;
GlimwormBeacons 0:a7800e894aaf 364 ac[1] = _aTerminalId[TerminalId]; // Caller made already sure that TerminalId does not exceed our terminal limit
GlimwormBeacons 0:a7800e894aaf 365 _WriteBlocking(pRing, ac, 2u);
GlimwormBeacons 0:a7800e894aaf 366 }
GlimwormBeacons 0:a7800e894aaf 367
GlimwormBeacons 0:a7800e894aaf 368 /*********************************************************************
GlimwormBeacons 0:a7800e894aaf 369 *
GlimwormBeacons 0:a7800e894aaf 370 * _GetAvailWriteSpace()
GlimwormBeacons 0:a7800e894aaf 371 *
GlimwormBeacons 0:a7800e894aaf 372 * Function description
GlimwormBeacons 0:a7800e894aaf 373 * Returns the number of bytes that can be written to the ring
GlimwormBeacons 0:a7800e894aaf 374 * buffer without blocking.
GlimwormBeacons 0:a7800e894aaf 375 *
GlimwormBeacons 0:a7800e894aaf 376 * Parameters
GlimwormBeacons 0:a7800e894aaf 377 * pRing Ring buffer to check.
GlimwormBeacons 0:a7800e894aaf 378 *
GlimwormBeacons 0:a7800e894aaf 379 * Return value
GlimwormBeacons 0:a7800e894aaf 380 * Number of bytes that are free in the buffer.
GlimwormBeacons 0:a7800e894aaf 381 */
GlimwormBeacons 0:a7800e894aaf 382 static unsigned _GetAvailWriteSpace(SEGGER_RTT_BUFFER_UP* pRing) {
GlimwormBeacons 0:a7800e894aaf 383 unsigned RdOff;
GlimwormBeacons 0:a7800e894aaf 384 unsigned WrOff;
GlimwormBeacons 0:a7800e894aaf 385 unsigned r;
GlimwormBeacons 0:a7800e894aaf 386 //
GlimwormBeacons 0:a7800e894aaf 387 // Avoid warnings regarding volatile access order. It's not a problem
GlimwormBeacons 0:a7800e894aaf 388 // in this case, but dampen compiler enthusiasm.
GlimwormBeacons 0:a7800e894aaf 389 //
GlimwormBeacons 0:a7800e894aaf 390 RdOff = pRing->RdOff;
GlimwormBeacons 0:a7800e894aaf 391 WrOff = pRing->WrOff;
GlimwormBeacons 0:a7800e894aaf 392 if (RdOff <= WrOff) {
GlimwormBeacons 0:a7800e894aaf 393 r = pRing->SizeOfBuffer - 1u - WrOff + RdOff;
GlimwormBeacons 0:a7800e894aaf 394 } else {
GlimwormBeacons 0:a7800e894aaf 395 r = RdOff - WrOff - 1u;
GlimwormBeacons 0:a7800e894aaf 396 }
GlimwormBeacons 0:a7800e894aaf 397 return r;
GlimwormBeacons 0:a7800e894aaf 398 }
GlimwormBeacons 0:a7800e894aaf 399
GlimwormBeacons 0:a7800e894aaf 400 /*********************************************************************
GlimwormBeacons 0:a7800e894aaf 401 *
GlimwormBeacons 0:a7800e894aaf 402 * Public code
GlimwormBeacons 0:a7800e894aaf 403 *
GlimwormBeacons 0:a7800e894aaf 404 **********************************************************************
GlimwormBeacons 0:a7800e894aaf 405 */
GlimwormBeacons 0:a7800e894aaf 406 /*********************************************************************
GlimwormBeacons 0:a7800e894aaf 407 *
GlimwormBeacons 0:a7800e894aaf 408 * SEGGER_RTT_ReadNoLock()
GlimwormBeacons 0:a7800e894aaf 409 *
GlimwormBeacons 0:a7800e894aaf 410 * Function description
GlimwormBeacons 0:a7800e894aaf 411 * Reads characters from SEGGER real-time-terminal control block
GlimwormBeacons 0:a7800e894aaf 412 * which have been previously stored by the host.
GlimwormBeacons 0:a7800e894aaf 413 * Do not lock against interrupts and multiple access.
GlimwormBeacons 0:a7800e894aaf 414 *
GlimwormBeacons 0:a7800e894aaf 415 * Parameters
GlimwormBeacons 0:a7800e894aaf 416 * BufferIndex Index of Down-buffer to be used (e.g. 0 for "Terminal").
GlimwormBeacons 0:a7800e894aaf 417 * pBuffer Pointer to buffer provided by target application, to copy characters from RTT-down-buffer to.
GlimwormBeacons 0:a7800e894aaf 418 * BufferSize Size of the target application buffer.
GlimwormBeacons 0:a7800e894aaf 419 *
GlimwormBeacons 0:a7800e894aaf 420 * Return value
GlimwormBeacons 0:a7800e894aaf 421 * Number of bytes that have been read.
GlimwormBeacons 0:a7800e894aaf 422 */
GlimwormBeacons 0:a7800e894aaf 423 unsigned SEGGER_RTT_ReadNoLock(unsigned BufferIndex, void* pData, unsigned BufferSize) {
GlimwormBeacons 0:a7800e894aaf 424 unsigned NumBytesRem;
GlimwormBeacons 0:a7800e894aaf 425 unsigned NumBytesRead;
GlimwormBeacons 0:a7800e894aaf 426 unsigned RdOff;
GlimwormBeacons 0:a7800e894aaf 427 unsigned WrOff;
GlimwormBeacons 0:a7800e894aaf 428 unsigned char* pBuffer;
GlimwormBeacons 0:a7800e894aaf 429 SEGGER_RTT_BUFFER_DOWN* pRing;
GlimwormBeacons 0:a7800e894aaf 430 //
GlimwormBeacons 0:a7800e894aaf 431 INIT();
GlimwormBeacons 0:a7800e894aaf 432 pRing = &_SEGGER_RTT.aDown[BufferIndex];
GlimwormBeacons 0:a7800e894aaf 433 pBuffer = (unsigned char*)pData;
GlimwormBeacons 0:a7800e894aaf 434 RdOff = pRing->RdOff;
GlimwormBeacons 0:a7800e894aaf 435 WrOff = pRing->WrOff;
GlimwormBeacons 0:a7800e894aaf 436 NumBytesRead = 0u;
GlimwormBeacons 0:a7800e894aaf 437 //
GlimwormBeacons 0:a7800e894aaf 438 // Read from current read position to wrap-around of buffer, first
GlimwormBeacons 0:a7800e894aaf 439 //
GlimwormBeacons 0:a7800e894aaf 440 if (RdOff > WrOff) {
GlimwormBeacons 0:a7800e894aaf 441 NumBytesRem = pRing->SizeOfBuffer - RdOff;
GlimwormBeacons 0:a7800e894aaf 442 NumBytesRem = MIN(NumBytesRem, BufferSize);
GlimwormBeacons 0:a7800e894aaf 443 memcpy(pBuffer, pRing->pBuffer + RdOff, NumBytesRem);
GlimwormBeacons 0:a7800e894aaf 444 NumBytesRead += NumBytesRem;
GlimwormBeacons 0:a7800e894aaf 445 pBuffer += NumBytesRem;
GlimwormBeacons 0:a7800e894aaf 446 BufferSize -= NumBytesRem;
GlimwormBeacons 0:a7800e894aaf 447 RdOff += NumBytesRem;
GlimwormBeacons 0:a7800e894aaf 448 //
GlimwormBeacons 0:a7800e894aaf 449 // Handle wrap-around of buffer
GlimwormBeacons 0:a7800e894aaf 450 //
GlimwormBeacons 0:a7800e894aaf 451 if (RdOff == pRing->SizeOfBuffer) {
GlimwormBeacons 0:a7800e894aaf 452 RdOff = 0u;
GlimwormBeacons 0:a7800e894aaf 453 }
GlimwormBeacons 0:a7800e894aaf 454 }
GlimwormBeacons 0:a7800e894aaf 455 //
GlimwormBeacons 0:a7800e894aaf 456 // Read remaining items of buffer
GlimwormBeacons 0:a7800e894aaf 457 //
GlimwormBeacons 0:a7800e894aaf 458 NumBytesRem = WrOff - RdOff;
GlimwormBeacons 0:a7800e894aaf 459 NumBytesRem = MIN(NumBytesRem, BufferSize);
GlimwormBeacons 0:a7800e894aaf 460 if (NumBytesRem > 0u) {
GlimwormBeacons 0:a7800e894aaf 461 memcpy(pBuffer, pRing->pBuffer + RdOff, NumBytesRem);
GlimwormBeacons 0:a7800e894aaf 462 NumBytesRead += NumBytesRem;
GlimwormBeacons 0:a7800e894aaf 463 pBuffer += NumBytesRem;
GlimwormBeacons 0:a7800e894aaf 464 BufferSize -= NumBytesRem;
GlimwormBeacons 0:a7800e894aaf 465 RdOff += NumBytesRem;
GlimwormBeacons 0:a7800e894aaf 466 }
GlimwormBeacons 0:a7800e894aaf 467 if (NumBytesRead) {
GlimwormBeacons 0:a7800e894aaf 468 pRing->RdOff = RdOff;
GlimwormBeacons 0:a7800e894aaf 469 }
GlimwormBeacons 0:a7800e894aaf 470 //
GlimwormBeacons 0:a7800e894aaf 471 return NumBytesRead;
GlimwormBeacons 0:a7800e894aaf 472 }
GlimwormBeacons 0:a7800e894aaf 473
GlimwormBeacons 0:a7800e894aaf 474 /*********************************************************************
GlimwormBeacons 0:a7800e894aaf 475 *
GlimwormBeacons 0:a7800e894aaf 476 * SEGGER_RTT_Read
GlimwormBeacons 0:a7800e894aaf 477 *
GlimwormBeacons 0:a7800e894aaf 478 * Function description
GlimwormBeacons 0:a7800e894aaf 479 * Reads characters from SEGGER real-time-terminal control block
GlimwormBeacons 0:a7800e894aaf 480 * which have been previously stored by the host.
GlimwormBeacons 0:a7800e894aaf 481 *
GlimwormBeacons 0:a7800e894aaf 482 * Parameters
GlimwormBeacons 0:a7800e894aaf 483 * BufferIndex Index of Down-buffer to be used (e.g. 0 for "Terminal").
GlimwormBeacons 0:a7800e894aaf 484 * pBuffer Pointer to buffer provided by target application, to copy characters from RTT-down-buffer to.
GlimwormBeacons 0:a7800e894aaf 485 * BufferSize Size of the target application buffer.
GlimwormBeacons 0:a7800e894aaf 486 *
GlimwormBeacons 0:a7800e894aaf 487 * Return value
GlimwormBeacons 0:a7800e894aaf 488 * Number of bytes that have been read.
GlimwormBeacons 0:a7800e894aaf 489 */
GlimwormBeacons 0:a7800e894aaf 490 unsigned SEGGER_RTT_Read(unsigned BufferIndex, void* pBuffer, unsigned BufferSize) {
GlimwormBeacons 0:a7800e894aaf 491 unsigned NumBytesRead;
GlimwormBeacons 0:a7800e894aaf 492 //
GlimwormBeacons 0:a7800e894aaf 493 SEGGER_RTT_LOCK();
GlimwormBeacons 0:a7800e894aaf 494 //
GlimwormBeacons 0:a7800e894aaf 495 // Call the non-locking read function
GlimwormBeacons 0:a7800e894aaf 496 //
GlimwormBeacons 0:a7800e894aaf 497 NumBytesRead = SEGGER_RTT_ReadNoLock(BufferIndex, pBuffer, BufferSize);
GlimwormBeacons 0:a7800e894aaf 498 //
GlimwormBeacons 0:a7800e894aaf 499 // Finish up.
GlimwormBeacons 0:a7800e894aaf 500 //
GlimwormBeacons 0:a7800e894aaf 501 SEGGER_RTT_UNLOCK();
GlimwormBeacons 0:a7800e894aaf 502 //
GlimwormBeacons 0:a7800e894aaf 503 return NumBytesRead;
GlimwormBeacons 0:a7800e894aaf 504 }
GlimwormBeacons 0:a7800e894aaf 505
GlimwormBeacons 0:a7800e894aaf 506 /*********************************************************************
GlimwormBeacons 0:a7800e894aaf 507 *
GlimwormBeacons 0:a7800e894aaf 508 * SEGGER_RTT_WriteWithOverwriteNoLock
GlimwormBeacons 0:a7800e894aaf 509 *
GlimwormBeacons 0:a7800e894aaf 510 * Function description
GlimwormBeacons 0:a7800e894aaf 511 * Stores a specified number of characters in SEGGER RTT
GlimwormBeacons 0:a7800e894aaf 512 * control block.
GlimwormBeacons 0:a7800e894aaf 513 * SEGGER_RTT_WriteWithOverwriteNoLock does not lock the application
GlimwormBeacons 0:a7800e894aaf 514 * and overwrites data if the data does not fit into the buffer.
GlimwormBeacons 0:a7800e894aaf 515 *
GlimwormBeacons 0:a7800e894aaf 516 * Parameters
GlimwormBeacons 0:a7800e894aaf 517 * BufferIndex Index of "Up"-buffer to be used (e.g. 0 for "Terminal").
GlimwormBeacons 0:a7800e894aaf 518 * pBuffer Pointer to character array. Does not need to point to a \0 terminated string.
GlimwormBeacons 0:a7800e894aaf 519 * NumBytes Number of bytes to be stored in the SEGGER RTT control block.
GlimwormBeacons 0:a7800e894aaf 520 *
GlimwormBeacons 0:a7800e894aaf 521 * Notes
GlimwormBeacons 0:a7800e894aaf 522 * (1) If there is not enough space in the "Up"-buffer, data is overwritten.
GlimwormBeacons 0:a7800e894aaf 523 * (2) For performance reasons this function does not call Init()
GlimwormBeacons 0:a7800e894aaf 524 * and may only be called after RTT has been initialized.
GlimwormBeacons 0:a7800e894aaf 525 * Either by calling SEGGER_RTT_Init() or calling another RTT API function first.
GlimwormBeacons 0:a7800e894aaf 526 * (3) Do not use SEGGER_RTT_WriteWithOverwriteNoLock if a J-Link
GlimwormBeacons 0:a7800e894aaf 527 * connection reads RTT data.
GlimwormBeacons 0:a7800e894aaf 528 */
GlimwormBeacons 0:a7800e894aaf 529 void SEGGER_RTT_WriteWithOverwriteNoLock(unsigned BufferIndex, const void* pBuffer, unsigned NumBytes) {
GlimwormBeacons 0:a7800e894aaf 530 const char* pData;
GlimwormBeacons 0:a7800e894aaf 531 SEGGER_RTT_BUFFER_UP* pRing;
GlimwormBeacons 0:a7800e894aaf 532 unsigned Avail;
GlimwormBeacons 0:a7800e894aaf 533
GlimwormBeacons 0:a7800e894aaf 534 pData = (const char *)pBuffer;
GlimwormBeacons 0:a7800e894aaf 535 //
GlimwormBeacons 0:a7800e894aaf 536 // Get "to-host" ring buffer and copy some elements into local variables.
GlimwormBeacons 0:a7800e894aaf 537 //
GlimwormBeacons 0:a7800e894aaf 538 pRing = &_SEGGER_RTT.aUp[BufferIndex];
GlimwormBeacons 0:a7800e894aaf 539 //
GlimwormBeacons 0:a7800e894aaf 540 // Check if we will overwrite data and need to adjust the RdOff.
GlimwormBeacons 0:a7800e894aaf 541 //
GlimwormBeacons 0:a7800e894aaf 542 if (pRing->WrOff == pRing->RdOff) {
GlimwormBeacons 0:a7800e894aaf 543 Avail = pRing->SizeOfBuffer - 1u;
GlimwormBeacons 0:a7800e894aaf 544 } else if ( pRing->WrOff < pRing->RdOff) {
GlimwormBeacons 0:a7800e894aaf 545 Avail = pRing->RdOff - pRing->WrOff - 1u;
GlimwormBeacons 0:a7800e894aaf 546 } else {
GlimwormBeacons 0:a7800e894aaf 547 Avail = pRing->RdOff - pRing->WrOff - 1u + pRing->SizeOfBuffer;
GlimwormBeacons 0:a7800e894aaf 548 }
GlimwormBeacons 0:a7800e894aaf 549 if (NumBytes > Avail) {
GlimwormBeacons 0:a7800e894aaf 550 pRing->RdOff += (NumBytes - Avail);
GlimwormBeacons 0:a7800e894aaf 551 while (pRing->RdOff >= pRing->SizeOfBuffer) {
GlimwormBeacons 0:a7800e894aaf 552 pRing->RdOff -= pRing->SizeOfBuffer;
GlimwormBeacons 0:a7800e894aaf 553 }
GlimwormBeacons 0:a7800e894aaf 554 }
GlimwormBeacons 0:a7800e894aaf 555 //
GlimwormBeacons 0:a7800e894aaf 556 // Write all data, no need to check the RdOff, but possibly handle multiple wrap-arounds
GlimwormBeacons 0:a7800e894aaf 557 //
GlimwormBeacons 0:a7800e894aaf 558 Avail = pRing->SizeOfBuffer - pRing->WrOff;
GlimwormBeacons 0:a7800e894aaf 559 do {
GlimwormBeacons 0:a7800e894aaf 560 if (Avail > NumBytes) {
GlimwormBeacons 0:a7800e894aaf 561 //
GlimwormBeacons 0:a7800e894aaf 562 // Last round
GlimwormBeacons 0:a7800e894aaf 563 //
GlimwormBeacons 0:a7800e894aaf 564 #if 1 // memcpy() is good for large amounts of data, but the overhead is too big for small amounts. Use a simple byte loop instead.
GlimwormBeacons 0:a7800e894aaf 565 char* pDst;
GlimwormBeacons 0:a7800e894aaf 566 pDst = pRing->pBuffer + pRing->WrOff;
GlimwormBeacons 0:a7800e894aaf 567 pRing->WrOff += NumBytes;
GlimwormBeacons 0:a7800e894aaf 568 do {
GlimwormBeacons 0:a7800e894aaf 569 *pDst++ = *pData++;
GlimwormBeacons 0:a7800e894aaf 570 } while (--NumBytes);
GlimwormBeacons 0:a7800e894aaf 571 #else
GlimwormBeacons 0:a7800e894aaf 572 memcpy(pRing->pBuffer + WrOff, pData, NumBytes);
GlimwormBeacons 0:a7800e894aaf 573 pRing->WrOff += NumBytes;
GlimwormBeacons 0:a7800e894aaf 574 #endif
GlimwormBeacons 0:a7800e894aaf 575 break; //Alternatively: NumBytes = 0;
GlimwormBeacons 0:a7800e894aaf 576 } else {
GlimwormBeacons 0:a7800e894aaf 577 //
GlimwormBeacons 0:a7800e894aaf 578 // Wrap-around necessary, write until wrap-around and reset WrOff
GlimwormBeacons 0:a7800e894aaf 579 //
GlimwormBeacons 0:a7800e894aaf 580 memcpy(pRing->pBuffer + pRing->WrOff, pData, Avail);
GlimwormBeacons 0:a7800e894aaf 581 pData += Avail;
GlimwormBeacons 0:a7800e894aaf 582 pRing->WrOff = 0;
GlimwormBeacons 0:a7800e894aaf 583 NumBytes -= Avail;
GlimwormBeacons 0:a7800e894aaf 584 Avail = (pRing->SizeOfBuffer - 1);
GlimwormBeacons 0:a7800e894aaf 585 }
GlimwormBeacons 0:a7800e894aaf 586 } while (NumBytes);
GlimwormBeacons 0:a7800e894aaf 587 }
GlimwormBeacons 0:a7800e894aaf 588
GlimwormBeacons 0:a7800e894aaf 589 /*********************************************************************
GlimwormBeacons 0:a7800e894aaf 590 *
GlimwormBeacons 0:a7800e894aaf 591 * SEGGER_RTT_WriteSkipNoLock
GlimwormBeacons 0:a7800e894aaf 592 *
GlimwormBeacons 0:a7800e894aaf 593 * Function description
GlimwormBeacons 0:a7800e894aaf 594 * Stores a specified number of characters in SEGGER RTT
GlimwormBeacons 0:a7800e894aaf 595 * control block which is then read by the host.
GlimwormBeacons 0:a7800e894aaf 596 * SEGGER_RTT_WriteSkipNoLock does not lock the application and
GlimwormBeacons 0:a7800e894aaf 597 * skips all data, if the data does not fit into the buffer.
GlimwormBeacons 0:a7800e894aaf 598 *
GlimwormBeacons 0:a7800e894aaf 599 * Parameters
GlimwormBeacons 0:a7800e894aaf 600 * BufferIndex Index of "Up"-buffer to be used (e.g. 0 for "Terminal").
GlimwormBeacons 0:a7800e894aaf 601 * pBuffer Pointer to character array. Does not need to point to a \0 terminated string.
GlimwormBeacons 0:a7800e894aaf 602 * NumBytes Number of bytes to be stored in the SEGGER RTT control block.
GlimwormBeacons 0:a7800e894aaf 603 *
GlimwormBeacons 0:a7800e894aaf 604 * Return value
GlimwormBeacons 0:a7800e894aaf 605 * Number of bytes which have been stored in the "Up"-buffer.
GlimwormBeacons 0:a7800e894aaf 606 *
GlimwormBeacons 0:a7800e894aaf 607 * Notes
GlimwormBeacons 0:a7800e894aaf 608 * (1) If there is not enough space in the "Up"-buffer, all data is dropped.
GlimwormBeacons 0:a7800e894aaf 609 * (2) For performance reasons this function does not call Init()
GlimwormBeacons 0:a7800e894aaf 610 * and may only be called after RTT has been initialized.
GlimwormBeacons 0:a7800e894aaf 611 * Either by calling SEGGER_RTT_Init() or calling another RTT API function first.
GlimwormBeacons 0:a7800e894aaf 612 */
GlimwormBeacons 0:a7800e894aaf 613 unsigned SEGGER_RTT_WriteSkipNoLock(unsigned BufferIndex, const void* pBuffer, unsigned NumBytes) {
GlimwormBeacons 0:a7800e894aaf 614 const char* pData;
GlimwormBeacons 0:a7800e894aaf 615 SEGGER_RTT_BUFFER_UP* pRing;
GlimwormBeacons 0:a7800e894aaf 616 unsigned Avail;
GlimwormBeacons 0:a7800e894aaf 617 unsigned RdOff;
GlimwormBeacons 0:a7800e894aaf 618 unsigned WrOff;
GlimwormBeacons 0:a7800e894aaf 619 unsigned Rem;
GlimwormBeacons 0:a7800e894aaf 620
GlimwormBeacons 0:a7800e894aaf 621 pData = (const char *)pBuffer;
GlimwormBeacons 0:a7800e894aaf 622 //
GlimwormBeacons 0:a7800e894aaf 623 // Get "to-host" ring buffer and copy some elements into local variables.
GlimwormBeacons 0:a7800e894aaf 624 //
GlimwormBeacons 0:a7800e894aaf 625 pRing = &_SEGGER_RTT.aUp[BufferIndex];
GlimwormBeacons 0:a7800e894aaf 626 RdOff = pRing->RdOff;
GlimwormBeacons 0:a7800e894aaf 627 WrOff = pRing->WrOff;
GlimwormBeacons 0:a7800e894aaf 628 //
GlimwormBeacons 0:a7800e894aaf 629 // Handle the most common cases fastest.
GlimwormBeacons 0:a7800e894aaf 630 // Which is:
GlimwormBeacons 0:a7800e894aaf 631 // RdOff <= WrOff -> Space until wrap around is free.
GlimwormBeacons 0:a7800e894aaf 632 // AND
GlimwormBeacons 0:a7800e894aaf 633 // WrOff + NumBytes < SizeOfBuffer -> No Wrap around necessary.
GlimwormBeacons 0:a7800e894aaf 634 //
GlimwormBeacons 0:a7800e894aaf 635 // OR
GlimwormBeacons 0:a7800e894aaf 636 //
GlimwormBeacons 0:a7800e894aaf 637 // RdOff > WrOff -> Space until RdOff - 1 is free.
GlimwormBeacons 0:a7800e894aaf 638 // AND
GlimwormBeacons 0:a7800e894aaf 639 // WrOff + NumBytes < RdOff -> Data fits into buffer
GlimwormBeacons 0:a7800e894aaf 640 //
GlimwormBeacons 0:a7800e894aaf 641 if (RdOff <= WrOff) {
GlimwormBeacons 0:a7800e894aaf 642 //
GlimwormBeacons 0:a7800e894aaf 643 // Get space until WrOff will be at wrap around.
GlimwormBeacons 0:a7800e894aaf 644 //
GlimwormBeacons 0:a7800e894aaf 645 Avail = pRing->SizeOfBuffer - 1u - WrOff ;
GlimwormBeacons 0:a7800e894aaf 646 if (Avail >= NumBytes) {
GlimwormBeacons 0:a7800e894aaf 647 #if 1 // memcpy() is good for large amounts of data, but the overhead is too big for small amounts. Use a simple byte loop instead.
GlimwormBeacons 0:a7800e894aaf 648 char* pDst;
GlimwormBeacons 0:a7800e894aaf 649 pDst = pRing->pBuffer + WrOff;
GlimwormBeacons 0:a7800e894aaf 650 WrOff += NumBytes;
GlimwormBeacons 0:a7800e894aaf 651 do {
GlimwormBeacons 0:a7800e894aaf 652 *pDst++ = *pData++;
GlimwormBeacons 0:a7800e894aaf 653 } while (--NumBytes);
GlimwormBeacons 0:a7800e894aaf 654 pRing->WrOff = WrOff + NumBytes;
GlimwormBeacons 0:a7800e894aaf 655 #else
GlimwormBeacons 0:a7800e894aaf 656 memcpy(pRing->pBuffer + WrOff, pData, NumBytes);
GlimwormBeacons 0:a7800e894aaf 657 pRing->WrOff = WrOff + NumBytes;
GlimwormBeacons 0:a7800e894aaf 658 #endif
GlimwormBeacons 0:a7800e894aaf 659 return 1;
GlimwormBeacons 0:a7800e894aaf 660 }
GlimwormBeacons 0:a7800e894aaf 661 //
GlimwormBeacons 0:a7800e894aaf 662 // If data did not fit into space until wrap around calculate complete space in buffer.
GlimwormBeacons 0:a7800e894aaf 663 //
GlimwormBeacons 0:a7800e894aaf 664 Avail += RdOff;
GlimwormBeacons 0:a7800e894aaf 665 //
GlimwormBeacons 0:a7800e894aaf 666 // If there is still no space for the whole of this output, don't bother.
GlimwormBeacons 0:a7800e894aaf 667 //
GlimwormBeacons 0:a7800e894aaf 668 if (Avail >= NumBytes) {
GlimwormBeacons 0:a7800e894aaf 669 //
GlimwormBeacons 0:a7800e894aaf 670 // OK, we have enough space in buffer. Copy in one or 2 chunks
GlimwormBeacons 0:a7800e894aaf 671 //
GlimwormBeacons 0:a7800e894aaf 672 Rem = pRing->SizeOfBuffer - WrOff; // Space until end of buffer
GlimwormBeacons 0:a7800e894aaf 673 if (Rem > NumBytes) {
GlimwormBeacons 0:a7800e894aaf 674 memcpy(pRing->pBuffer + WrOff, pData, NumBytes);
GlimwormBeacons 0:a7800e894aaf 675 pRing->WrOff = WrOff + NumBytes;
GlimwormBeacons 0:a7800e894aaf 676 } else {
GlimwormBeacons 0:a7800e894aaf 677 //
GlimwormBeacons 0:a7800e894aaf 678 // We reach the end of the buffer, so need to wrap around
GlimwormBeacons 0:a7800e894aaf 679 //
GlimwormBeacons 0:a7800e894aaf 680 memcpy(pRing->pBuffer + WrOff, pData, Rem);
GlimwormBeacons 0:a7800e894aaf 681 memcpy(pRing->pBuffer, pData + Rem, NumBytes - Rem);
GlimwormBeacons 0:a7800e894aaf 682 pRing->WrOff = NumBytes - Rem;
GlimwormBeacons 0:a7800e894aaf 683 }
GlimwormBeacons 0:a7800e894aaf 684 return 1;
GlimwormBeacons 0:a7800e894aaf 685 }
GlimwormBeacons 0:a7800e894aaf 686 } else {
GlimwormBeacons 0:a7800e894aaf 687 Avail = RdOff - WrOff - 1u;
GlimwormBeacons 0:a7800e894aaf 688 if (Avail >= NumBytes) {
GlimwormBeacons 0:a7800e894aaf 689 memcpy(pRing->pBuffer + WrOff, pData, NumBytes);
GlimwormBeacons 0:a7800e894aaf 690 pRing->WrOff = WrOff + NumBytes;
GlimwormBeacons 0:a7800e894aaf 691 return 1;
GlimwormBeacons 0:a7800e894aaf 692 }
GlimwormBeacons 0:a7800e894aaf 693 }
GlimwormBeacons 0:a7800e894aaf 694 //
GlimwormBeacons 0:a7800e894aaf 695 // If we reach this point no data has been written
GlimwormBeacons 0:a7800e894aaf 696 //
GlimwormBeacons 0:a7800e894aaf 697 return 0;
GlimwormBeacons 0:a7800e894aaf 698 }
GlimwormBeacons 0:a7800e894aaf 699
GlimwormBeacons 0:a7800e894aaf 700 /*********************************************************************
GlimwormBeacons 0:a7800e894aaf 701 *
GlimwormBeacons 0:a7800e894aaf 702 * SEGGER_RTT_WriteNoLock
GlimwormBeacons 0:a7800e894aaf 703 *
GlimwormBeacons 0:a7800e894aaf 704 * Function description
GlimwormBeacons 0:a7800e894aaf 705 * Stores a specified number of characters in SEGGER RTT
GlimwormBeacons 0:a7800e894aaf 706 * control block which is then read by the host.
GlimwormBeacons 0:a7800e894aaf 707 * SEGGER_RTT_WriteNoLock does not lock the application.
GlimwormBeacons 0:a7800e894aaf 708 *
GlimwormBeacons 0:a7800e894aaf 709 * Parameters
GlimwormBeacons 0:a7800e894aaf 710 * BufferIndex Index of "Up"-buffer to be used (e.g. 0 for "Terminal").
GlimwormBeacons 0:a7800e894aaf 711 * pBuffer Pointer to character array. Does not need to point to a \0 terminated string.
GlimwormBeacons 0:a7800e894aaf 712 * NumBytes Number of bytes to be stored in the SEGGER RTT control block.
GlimwormBeacons 0:a7800e894aaf 713 *
GlimwormBeacons 0:a7800e894aaf 714 * Return value
GlimwormBeacons 0:a7800e894aaf 715 * Number of bytes which have been stored in the "Up"-buffer.
GlimwormBeacons 0:a7800e894aaf 716 *
GlimwormBeacons 0:a7800e894aaf 717 * Notes
GlimwormBeacons 0:a7800e894aaf 718 * (1) If there is not enough space in the "Up"-buffer, remaining characters of pBuffer are dropped.
GlimwormBeacons 0:a7800e894aaf 719 * (2) For performance reasons this function does not call Init()
GlimwormBeacons 0:a7800e894aaf 720 * and may only be called after RTT has been initialized.
GlimwormBeacons 0:a7800e894aaf 721 * Either by calling SEGGER_RTT_Init() or calling another RTT API function first.
GlimwormBeacons 0:a7800e894aaf 722 */
GlimwormBeacons 0:a7800e894aaf 723 unsigned SEGGER_RTT_WriteNoLock(unsigned BufferIndex, const void* pBuffer, unsigned NumBytes) {
GlimwormBeacons 0:a7800e894aaf 724 unsigned Status;
GlimwormBeacons 0:a7800e894aaf 725 unsigned Avail;
GlimwormBeacons 0:a7800e894aaf 726 const char* pData;
GlimwormBeacons 0:a7800e894aaf 727 SEGGER_RTT_BUFFER_UP* pRing;
GlimwormBeacons 0:a7800e894aaf 728
GlimwormBeacons 0:a7800e894aaf 729 pData = (const char *)pBuffer;
GlimwormBeacons 0:a7800e894aaf 730 //
GlimwormBeacons 0:a7800e894aaf 731 // Get "to-host" ring buffer.
GlimwormBeacons 0:a7800e894aaf 732 //
GlimwormBeacons 0:a7800e894aaf 733 pRing = &_SEGGER_RTT.aUp[BufferIndex];
GlimwormBeacons 0:a7800e894aaf 734 //
GlimwormBeacons 0:a7800e894aaf 735 // How we output depends upon the mode...
GlimwormBeacons 0:a7800e894aaf 736 //
GlimwormBeacons 0:a7800e894aaf 737 switch (pRing->Flags) {
GlimwormBeacons 0:a7800e894aaf 738 case SEGGER_RTT_MODE_NO_BLOCK_SKIP:
GlimwormBeacons 0:a7800e894aaf 739 //
GlimwormBeacons 0:a7800e894aaf 740 // If we are in skip mode and there is no space for the whole
GlimwormBeacons 0:a7800e894aaf 741 // of this output, don't bother.
GlimwormBeacons 0:a7800e894aaf 742 //
GlimwormBeacons 0:a7800e894aaf 743 Avail = _GetAvailWriteSpace(pRing);
GlimwormBeacons 0:a7800e894aaf 744 if (Avail < NumBytes) {
GlimwormBeacons 0:a7800e894aaf 745 Status = 0u;
GlimwormBeacons 0:a7800e894aaf 746 } else {
GlimwormBeacons 0:a7800e894aaf 747 Status = NumBytes;
GlimwormBeacons 0:a7800e894aaf 748 _WriteNoCheck(pRing, pData, NumBytes);
GlimwormBeacons 0:a7800e894aaf 749 }
GlimwormBeacons 0:a7800e894aaf 750 break;
GlimwormBeacons 0:a7800e894aaf 751 case SEGGER_RTT_MODE_NO_BLOCK_TRIM:
GlimwormBeacons 0:a7800e894aaf 752 //
GlimwormBeacons 0:a7800e894aaf 753 // If we are in trim mode, trim to what we can output without blocking.
GlimwormBeacons 0:a7800e894aaf 754 //
GlimwormBeacons 0:a7800e894aaf 755 Avail = _GetAvailWriteSpace(pRing);
GlimwormBeacons 0:a7800e894aaf 756 Status = Avail < NumBytes ? Avail : NumBytes;
GlimwormBeacons 0:a7800e894aaf 757 _WriteNoCheck(pRing, pData, Status);
GlimwormBeacons 0:a7800e894aaf 758 break;
GlimwormBeacons 0:a7800e894aaf 759 case SEGGER_RTT_MODE_BLOCK_IF_FIFO_FULL:
GlimwormBeacons 0:a7800e894aaf 760 //
GlimwormBeacons 0:a7800e894aaf 761 // If we are in blocking mode, output everything.
GlimwormBeacons 0:a7800e894aaf 762 //
GlimwormBeacons 0:a7800e894aaf 763 Status = _WriteBlocking(pRing, pData, NumBytes);
GlimwormBeacons 0:a7800e894aaf 764 break;
GlimwormBeacons 0:a7800e894aaf 765 default:
GlimwormBeacons 0:a7800e894aaf 766 Status = 0u;
GlimwormBeacons 0:a7800e894aaf 767 break;
GlimwormBeacons 0:a7800e894aaf 768 }
GlimwormBeacons 0:a7800e894aaf 769 //
GlimwormBeacons 0:a7800e894aaf 770 // Finish up.
GlimwormBeacons 0:a7800e894aaf 771 //
GlimwormBeacons 0:a7800e894aaf 772 return Status;
GlimwormBeacons 0:a7800e894aaf 773 }
GlimwormBeacons 0:a7800e894aaf 774
GlimwormBeacons 0:a7800e894aaf 775 /*********************************************************************
GlimwormBeacons 0:a7800e894aaf 776 *
GlimwormBeacons 0:a7800e894aaf 777 * SEGGER_RTT_Write
GlimwormBeacons 0:a7800e894aaf 778 *
GlimwormBeacons 0:a7800e894aaf 779 * Function description
GlimwormBeacons 0:a7800e894aaf 780 * Stores a specified number of characters in SEGGER RTT
GlimwormBeacons 0:a7800e894aaf 781 * control block which is then read by the host.
GlimwormBeacons 0:a7800e894aaf 782 *
GlimwormBeacons 0:a7800e894aaf 783 * Parameters
GlimwormBeacons 0:a7800e894aaf 784 * BufferIndex Index of "Up"-buffer to be used (e.g. 0 for "Terminal").
GlimwormBeacons 0:a7800e894aaf 785 * pBuffer Pointer to character array. Does not need to point to a \0 terminated string.
GlimwormBeacons 0:a7800e894aaf 786 * NumBytes Number of bytes to be stored in the SEGGER RTT control block.
GlimwormBeacons 0:a7800e894aaf 787 *
GlimwormBeacons 0:a7800e894aaf 788 * Return value
GlimwormBeacons 0:a7800e894aaf 789 * Number of bytes which have been stored in the "Up"-buffer.
GlimwormBeacons 0:a7800e894aaf 790 *
GlimwormBeacons 0:a7800e894aaf 791 * Notes
GlimwormBeacons 0:a7800e894aaf 792 * (1) If there is not enough space in the "Up"-buffer, remaining characters of pBuffer are dropped.
GlimwormBeacons 0:a7800e894aaf 793 */
GlimwormBeacons 0:a7800e894aaf 794 unsigned SEGGER_RTT_Write(unsigned BufferIndex, const void* pBuffer, unsigned NumBytes) {
GlimwormBeacons 0:a7800e894aaf 795 unsigned Status;
GlimwormBeacons 0:a7800e894aaf 796 //
GlimwormBeacons 0:a7800e894aaf 797 INIT();
GlimwormBeacons 0:a7800e894aaf 798 SEGGER_RTT_LOCK();
GlimwormBeacons 0:a7800e894aaf 799 //
GlimwormBeacons 0:a7800e894aaf 800 // Call the non-locking write function
GlimwormBeacons 0:a7800e894aaf 801 //
GlimwormBeacons 0:a7800e894aaf 802 Status = SEGGER_RTT_WriteNoLock(BufferIndex, pBuffer, NumBytes);
GlimwormBeacons 0:a7800e894aaf 803 //
GlimwormBeacons 0:a7800e894aaf 804 // Finish up.
GlimwormBeacons 0:a7800e894aaf 805 //
GlimwormBeacons 0:a7800e894aaf 806 SEGGER_RTT_UNLOCK();
GlimwormBeacons 0:a7800e894aaf 807 //
GlimwormBeacons 0:a7800e894aaf 808 return Status;
GlimwormBeacons 0:a7800e894aaf 809 }
GlimwormBeacons 0:a7800e894aaf 810
GlimwormBeacons 0:a7800e894aaf 811 /*********************************************************************
GlimwormBeacons 0:a7800e894aaf 812 *
GlimwormBeacons 0:a7800e894aaf 813 * SEGGER_RTT_WriteString
GlimwormBeacons 0:a7800e894aaf 814 *
GlimwormBeacons 0:a7800e894aaf 815 * Function description
GlimwormBeacons 0:a7800e894aaf 816 * Stores string in SEGGER RTT control block.
GlimwormBeacons 0:a7800e894aaf 817 * This data is read by the host.
GlimwormBeacons 0:a7800e894aaf 818 *
GlimwormBeacons 0:a7800e894aaf 819 * Parameters
GlimwormBeacons 0:a7800e894aaf 820 * BufferIndex Index of "Up"-buffer to be used (e.g. 0 for "Terminal").
GlimwormBeacons 0:a7800e894aaf 821 * s Pointer to string.
GlimwormBeacons 0:a7800e894aaf 822 *
GlimwormBeacons 0:a7800e894aaf 823 * Return value
GlimwormBeacons 0:a7800e894aaf 824 * Number of bytes which have been stored in the "Up"-buffer.
GlimwormBeacons 0:a7800e894aaf 825 *
GlimwormBeacons 0:a7800e894aaf 826 * Notes
GlimwormBeacons 0:a7800e894aaf 827 * (1) If there is not enough space in the "Up"-buffer, depending on configuration,
GlimwormBeacons 0:a7800e894aaf 828 * remaining characters may be dropped or RTT module waits until there is more space in the buffer.
GlimwormBeacons 0:a7800e894aaf 829 * (2) String passed to this function has to be \0 terminated
GlimwormBeacons 0:a7800e894aaf 830 * (3) \0 termination character is *not* stored in RTT buffer
GlimwormBeacons 0:a7800e894aaf 831 */
GlimwormBeacons 0:a7800e894aaf 832 unsigned SEGGER_RTT_WriteString(unsigned BufferIndex, const char* s) {
GlimwormBeacons 0:a7800e894aaf 833 unsigned Len;
GlimwormBeacons 0:a7800e894aaf 834
GlimwormBeacons 0:a7800e894aaf 835 Len = STRLEN(s);
GlimwormBeacons 0:a7800e894aaf 836 return SEGGER_RTT_Write(BufferIndex, s, Len);
GlimwormBeacons 0:a7800e894aaf 837 }
GlimwormBeacons 0:a7800e894aaf 838
GlimwormBeacons 0:a7800e894aaf 839 /*********************************************************************
GlimwormBeacons 0:a7800e894aaf 840 *
GlimwormBeacons 0:a7800e894aaf 841 * SEGGER_RTT_GetKey
GlimwormBeacons 0:a7800e894aaf 842 *
GlimwormBeacons 0:a7800e894aaf 843 * Function description
GlimwormBeacons 0:a7800e894aaf 844 * Reads one character from the SEGGER RTT buffer.
GlimwormBeacons 0:a7800e894aaf 845 * Host has previously stored data there.
GlimwormBeacons 0:a7800e894aaf 846 *
GlimwormBeacons 0:a7800e894aaf 847 * Return value
GlimwormBeacons 0:a7800e894aaf 848 * < 0 - No character available (buffer empty).
GlimwormBeacons 0:a7800e894aaf 849 * >= 0 - Character which has been read. (Possible values: 0 - 255)
GlimwormBeacons 0:a7800e894aaf 850 *
GlimwormBeacons 0:a7800e894aaf 851 * Notes
GlimwormBeacons 0:a7800e894aaf 852 * (1) This function is only specified for accesses to RTT buffer 0.
GlimwormBeacons 0:a7800e894aaf 853 */
GlimwormBeacons 0:a7800e894aaf 854 int SEGGER_RTT_GetKey(void) {
GlimwormBeacons 0:a7800e894aaf 855 char c;
GlimwormBeacons 0:a7800e894aaf 856 int r;
GlimwormBeacons 0:a7800e894aaf 857
GlimwormBeacons 0:a7800e894aaf 858 r = (int)SEGGER_RTT_Read(0u, &c, 1u);
GlimwormBeacons 0:a7800e894aaf 859 if (r == 1) {
GlimwormBeacons 0:a7800e894aaf 860 r = (int)(unsigned char)c;
GlimwormBeacons 0:a7800e894aaf 861 } else {
GlimwormBeacons 0:a7800e894aaf 862 r = -1;
GlimwormBeacons 0:a7800e894aaf 863 }
GlimwormBeacons 0:a7800e894aaf 864 return r;
GlimwormBeacons 0:a7800e894aaf 865 }
GlimwormBeacons 0:a7800e894aaf 866
GlimwormBeacons 0:a7800e894aaf 867 /*********************************************************************
GlimwormBeacons 0:a7800e894aaf 868 *
GlimwormBeacons 0:a7800e894aaf 869 * SEGGER_RTT_WaitKey
GlimwormBeacons 0:a7800e894aaf 870 *
GlimwormBeacons 0:a7800e894aaf 871 * Function description
GlimwormBeacons 0:a7800e894aaf 872 * Waits until at least one character is avaible in the SEGGER RTT buffer.
GlimwormBeacons 0:a7800e894aaf 873 * Once a character is available, it is read and this function returns.
GlimwormBeacons 0:a7800e894aaf 874 *
GlimwormBeacons 0:a7800e894aaf 875 * Return value
GlimwormBeacons 0:a7800e894aaf 876 * >=0 - Character which has been read.
GlimwormBeacons 0:a7800e894aaf 877 *
GlimwormBeacons 0:a7800e894aaf 878 * Notes
GlimwormBeacons 0:a7800e894aaf 879 * (1) This function is only specified for accesses to RTT buffer 0
GlimwormBeacons 0:a7800e894aaf 880 * (2) This function is blocking if no character is present in RTT buffer
GlimwormBeacons 0:a7800e894aaf 881 */
GlimwormBeacons 0:a7800e894aaf 882 int SEGGER_RTT_WaitKey(void) {
GlimwormBeacons 0:a7800e894aaf 883 int r;
GlimwormBeacons 0:a7800e894aaf 884
GlimwormBeacons 0:a7800e894aaf 885 do {
GlimwormBeacons 0:a7800e894aaf 886 r = SEGGER_RTT_GetKey();
GlimwormBeacons 0:a7800e894aaf 887 } while (r < 0);
GlimwormBeacons 0:a7800e894aaf 888 return r;
GlimwormBeacons 0:a7800e894aaf 889 }
GlimwormBeacons 0:a7800e894aaf 890
GlimwormBeacons 0:a7800e894aaf 891 /*********************************************************************
GlimwormBeacons 0:a7800e894aaf 892 *
GlimwormBeacons 0:a7800e894aaf 893 * SEGGER_RTT_HasKey
GlimwormBeacons 0:a7800e894aaf 894 *
GlimwormBeacons 0:a7800e894aaf 895 * Function description
GlimwormBeacons 0:a7800e894aaf 896 * Checks if at least one character for reading is available in the SEGGER RTT buffer.
GlimwormBeacons 0:a7800e894aaf 897 *
GlimwormBeacons 0:a7800e894aaf 898 * Return value
GlimwormBeacons 0:a7800e894aaf 899 * == 0 - No characters are available to read.
GlimwormBeacons 0:a7800e894aaf 900 * == 1 - At least one character is available.
GlimwormBeacons 0:a7800e894aaf 901 *
GlimwormBeacons 0:a7800e894aaf 902 * Notes
GlimwormBeacons 0:a7800e894aaf 903 * (1) This function is only specified for accesses to RTT buffer 0
GlimwormBeacons 0:a7800e894aaf 904 */
GlimwormBeacons 0:a7800e894aaf 905 int SEGGER_RTT_HasKey(void) {
GlimwormBeacons 0:a7800e894aaf 906 unsigned RdOff;
GlimwormBeacons 0:a7800e894aaf 907 int r;
GlimwormBeacons 0:a7800e894aaf 908
GlimwormBeacons 0:a7800e894aaf 909 INIT();
GlimwormBeacons 0:a7800e894aaf 910 RdOff = _SEGGER_RTT.aDown[0].RdOff;
GlimwormBeacons 0:a7800e894aaf 911 if (RdOff != _SEGGER_RTT.aDown[0].WrOff) {
GlimwormBeacons 0:a7800e894aaf 912 r = 1;
GlimwormBeacons 0:a7800e894aaf 913 } else {
GlimwormBeacons 0:a7800e894aaf 914 r = 0;
GlimwormBeacons 0:a7800e894aaf 915 }
GlimwormBeacons 0:a7800e894aaf 916 return r;
GlimwormBeacons 0:a7800e894aaf 917 }
GlimwormBeacons 0:a7800e894aaf 918
GlimwormBeacons 0:a7800e894aaf 919 /*********************************************************************
GlimwormBeacons 0:a7800e894aaf 920 *
GlimwormBeacons 0:a7800e894aaf 921 * SEGGER_RTT_HasData
GlimwormBeacons 0:a7800e894aaf 922 *
GlimwormBeacons 0:a7800e894aaf 923 * Function description
GlimwormBeacons 0:a7800e894aaf 924 * Check if there is data from the host in the given buffer.
GlimwormBeacons 0:a7800e894aaf 925 *
GlimwormBeacons 0:a7800e894aaf 926 * Return value:
GlimwormBeacons 0:a7800e894aaf 927 * ==0: No data
GlimwormBeacons 0:a7800e894aaf 928 * !=0: Data in buffer
GlimwormBeacons 0:a7800e894aaf 929 *
GlimwormBeacons 0:a7800e894aaf 930 */
GlimwormBeacons 0:a7800e894aaf 931 unsigned SEGGER_RTT_HasData(unsigned BufferIndex) {
GlimwormBeacons 0:a7800e894aaf 932 SEGGER_RTT_BUFFER_DOWN* pRing;
GlimwormBeacons 0:a7800e894aaf 933 unsigned v;
GlimwormBeacons 0:a7800e894aaf 934
GlimwormBeacons 0:a7800e894aaf 935 pRing = &_SEGGER_RTT.aDown[BufferIndex];
GlimwormBeacons 0:a7800e894aaf 936 v = pRing->WrOff;
GlimwormBeacons 0:a7800e894aaf 937 return v - pRing->RdOff;
GlimwormBeacons 0:a7800e894aaf 938 }
GlimwormBeacons 0:a7800e894aaf 939
GlimwormBeacons 0:a7800e894aaf 940 /*********************************************************************
GlimwormBeacons 0:a7800e894aaf 941 *
GlimwormBeacons 0:a7800e894aaf 942 * SEGGER_RTT_AllocDownBuffer
GlimwormBeacons 0:a7800e894aaf 943 *
GlimwormBeacons 0:a7800e894aaf 944 * Function description
GlimwormBeacons 0:a7800e894aaf 945 * Run-time configuration of the next down-buffer (H->T).
GlimwormBeacons 0:a7800e894aaf 946 * The next buffer, which is not used yet is configured.
GlimwormBeacons 0:a7800e894aaf 947 * This includes: Buffer address, size, name, flags, ...
GlimwormBeacons 0:a7800e894aaf 948 *
GlimwormBeacons 0:a7800e894aaf 949 * Parameters
GlimwormBeacons 0:a7800e894aaf 950 * sName Pointer to a constant name string.
GlimwormBeacons 0:a7800e894aaf 951 * pBuffer Pointer to a buffer to be used.
GlimwormBeacons 0:a7800e894aaf 952 * BufferSize Size of the buffer.
GlimwormBeacons 0:a7800e894aaf 953 * Flags Operating modes. Define behavior if buffer is full (not enough space for entire message).
GlimwormBeacons 0:a7800e894aaf 954 *
GlimwormBeacons 0:a7800e894aaf 955 * Return value
GlimwormBeacons 0:a7800e894aaf 956 * >= 0 - O.K. Buffer Index
GlimwormBeacons 0:a7800e894aaf 957 * < 0 - Error
GlimwormBeacons 0:a7800e894aaf 958 */
GlimwormBeacons 0:a7800e894aaf 959 int SEGGER_RTT_AllocDownBuffer(const char* sName, void* pBuffer, unsigned BufferSize, unsigned Flags) {
GlimwormBeacons 0:a7800e894aaf 960 int BufferIndex;
GlimwormBeacons 0:a7800e894aaf 961
GlimwormBeacons 0:a7800e894aaf 962 INIT();
GlimwormBeacons 0:a7800e894aaf 963 SEGGER_RTT_LOCK();
GlimwormBeacons 0:a7800e894aaf 964 BufferIndex = 0;
GlimwormBeacons 0:a7800e894aaf 965 do {
GlimwormBeacons 0:a7800e894aaf 966 if (_SEGGER_RTT.aDown[BufferIndex].pBuffer == NULL) {
GlimwormBeacons 0:a7800e894aaf 967 break;
GlimwormBeacons 0:a7800e894aaf 968 }
GlimwormBeacons 0:a7800e894aaf 969 BufferIndex++;
GlimwormBeacons 0:a7800e894aaf 970 } while (BufferIndex < _SEGGER_RTT.MaxNumDownBuffers);
GlimwormBeacons 0:a7800e894aaf 971 if (BufferIndex < _SEGGER_RTT.MaxNumDownBuffers) {
GlimwormBeacons 0:a7800e894aaf 972 _SEGGER_RTT.aDown[BufferIndex].sName = sName;
GlimwormBeacons 0:a7800e894aaf 973 _SEGGER_RTT.aDown[BufferIndex].pBuffer = (char*)pBuffer;
GlimwormBeacons 0:a7800e894aaf 974 _SEGGER_RTT.aDown[BufferIndex].SizeOfBuffer = BufferSize;
GlimwormBeacons 0:a7800e894aaf 975 _SEGGER_RTT.aDown[BufferIndex].RdOff = 0u;
GlimwormBeacons 0:a7800e894aaf 976 _SEGGER_RTT.aDown[BufferIndex].WrOff = 0u;
GlimwormBeacons 0:a7800e894aaf 977 _SEGGER_RTT.aDown[BufferIndex].Flags = Flags;
GlimwormBeacons 0:a7800e894aaf 978 } else {
GlimwormBeacons 0:a7800e894aaf 979 BufferIndex = -1;
GlimwormBeacons 0:a7800e894aaf 980 }
GlimwormBeacons 0:a7800e894aaf 981 SEGGER_RTT_UNLOCK();
GlimwormBeacons 0:a7800e894aaf 982 return BufferIndex;
GlimwormBeacons 0:a7800e894aaf 983 }
GlimwormBeacons 0:a7800e894aaf 984
GlimwormBeacons 0:a7800e894aaf 985 /*********************************************************************
GlimwormBeacons 0:a7800e894aaf 986 *
GlimwormBeacons 0:a7800e894aaf 987 * SEGGER_RTT_AllocUpBuffer
GlimwormBeacons 0:a7800e894aaf 988 *
GlimwormBeacons 0:a7800e894aaf 989 * Function description
GlimwormBeacons 0:a7800e894aaf 990 * Run-time configuration of the next up-buffer (T->H).
GlimwormBeacons 0:a7800e894aaf 991 * The next buffer, which is not used yet is configured.
GlimwormBeacons 0:a7800e894aaf 992 * This includes: Buffer address, size, name, flags, ...
GlimwormBeacons 0:a7800e894aaf 993 *
GlimwormBeacons 0:a7800e894aaf 994 * Parameters
GlimwormBeacons 0:a7800e894aaf 995 * sName Pointer to a constant name string.
GlimwormBeacons 0:a7800e894aaf 996 * pBuffer Pointer to a buffer to be used.
GlimwormBeacons 0:a7800e894aaf 997 * BufferSize Size of the buffer.
GlimwormBeacons 0:a7800e894aaf 998 * Flags Operating modes. Define behavior if buffer is full (not enough space for entire message).
GlimwormBeacons 0:a7800e894aaf 999 *
GlimwormBeacons 0:a7800e894aaf 1000 * Return value
GlimwormBeacons 0:a7800e894aaf 1001 * >= 0 - O.K. Buffer Index
GlimwormBeacons 0:a7800e894aaf 1002 * < 0 - Error
GlimwormBeacons 0:a7800e894aaf 1003 */
GlimwormBeacons 0:a7800e894aaf 1004 int SEGGER_RTT_AllocUpBuffer(const char* sName, void* pBuffer, unsigned BufferSize, unsigned Flags) {
GlimwormBeacons 0:a7800e894aaf 1005 int BufferIndex;
GlimwormBeacons 0:a7800e894aaf 1006
GlimwormBeacons 0:a7800e894aaf 1007 INIT();
GlimwormBeacons 0:a7800e894aaf 1008 SEGGER_RTT_LOCK();
GlimwormBeacons 0:a7800e894aaf 1009 BufferIndex = 0;
GlimwormBeacons 0:a7800e894aaf 1010 do {
GlimwormBeacons 0:a7800e894aaf 1011 if (_SEGGER_RTT.aUp[BufferIndex].pBuffer == NULL) {
GlimwormBeacons 0:a7800e894aaf 1012 break;
GlimwormBeacons 0:a7800e894aaf 1013 }
GlimwormBeacons 0:a7800e894aaf 1014 BufferIndex++;
GlimwormBeacons 0:a7800e894aaf 1015 } while (BufferIndex < _SEGGER_RTT.MaxNumUpBuffers);
GlimwormBeacons 0:a7800e894aaf 1016 if (BufferIndex < _SEGGER_RTT.MaxNumUpBuffers) {
GlimwormBeacons 0:a7800e894aaf 1017 _SEGGER_RTT.aUp[BufferIndex].sName = sName;
GlimwormBeacons 0:a7800e894aaf 1018 _SEGGER_RTT.aUp[BufferIndex].pBuffer = (char*)pBuffer;
GlimwormBeacons 0:a7800e894aaf 1019 _SEGGER_RTT.aUp[BufferIndex].SizeOfBuffer = BufferSize;
GlimwormBeacons 0:a7800e894aaf 1020 _SEGGER_RTT.aUp[BufferIndex].RdOff = 0u;
GlimwormBeacons 0:a7800e894aaf 1021 _SEGGER_RTT.aUp[BufferIndex].WrOff = 0u;
GlimwormBeacons 0:a7800e894aaf 1022 _SEGGER_RTT.aUp[BufferIndex].Flags = Flags;
GlimwormBeacons 0:a7800e894aaf 1023 } else {
GlimwormBeacons 0:a7800e894aaf 1024 BufferIndex = -1;
GlimwormBeacons 0:a7800e894aaf 1025 }
GlimwormBeacons 0:a7800e894aaf 1026 SEGGER_RTT_UNLOCK();
GlimwormBeacons 0:a7800e894aaf 1027 return BufferIndex;
GlimwormBeacons 0:a7800e894aaf 1028 }
GlimwormBeacons 0:a7800e894aaf 1029
GlimwormBeacons 0:a7800e894aaf 1030 /*********************************************************************
GlimwormBeacons 0:a7800e894aaf 1031 *
GlimwormBeacons 0:a7800e894aaf 1032 * SEGGER_RTT_ConfigUpBuffer
GlimwormBeacons 0:a7800e894aaf 1033 *
GlimwormBeacons 0:a7800e894aaf 1034 * Function description
GlimwormBeacons 0:a7800e894aaf 1035 * Run-time configuration of a specific up-buffer (T->H).
GlimwormBeacons 0:a7800e894aaf 1036 * Buffer to be configured is specified by index.
GlimwormBeacons 0:a7800e894aaf 1037 * This includes: Buffer address, size, name, flags, ...
GlimwormBeacons 0:a7800e894aaf 1038 *
GlimwormBeacons 0:a7800e894aaf 1039 * Parameters
GlimwormBeacons 0:a7800e894aaf 1040 * BufferIndex Index of the buffer to configure.
GlimwormBeacons 0:a7800e894aaf 1041 * sName Pointer to a constant name string.
GlimwormBeacons 0:a7800e894aaf 1042 * pBuffer Pointer to a buffer to be used.
GlimwormBeacons 0:a7800e894aaf 1043 * BufferSize Size of the buffer.
GlimwormBeacons 0:a7800e894aaf 1044 * Flags Operating modes. Define behavior if buffer is full (not enough space for entire message).
GlimwormBeacons 0:a7800e894aaf 1045 *
GlimwormBeacons 0:a7800e894aaf 1046 * Return value
GlimwormBeacons 0:a7800e894aaf 1047 * >= 0 - O.K.
GlimwormBeacons 0:a7800e894aaf 1048 * < 0 - Error
GlimwormBeacons 0:a7800e894aaf 1049 */
GlimwormBeacons 0:a7800e894aaf 1050 int SEGGER_RTT_ConfigUpBuffer(unsigned BufferIndex, const char* sName, void* pBuffer, unsigned BufferSize, unsigned Flags) {
GlimwormBeacons 0:a7800e894aaf 1051 int r;
GlimwormBeacons 0:a7800e894aaf 1052
GlimwormBeacons 0:a7800e894aaf 1053 INIT();
GlimwormBeacons 0:a7800e894aaf 1054 if (BufferIndex < (unsigned)_SEGGER_RTT.MaxNumUpBuffers) {
GlimwormBeacons 0:a7800e894aaf 1055 SEGGER_RTT_LOCK();
GlimwormBeacons 0:a7800e894aaf 1056 if (BufferIndex > 0u) {
GlimwormBeacons 0:a7800e894aaf 1057 _SEGGER_RTT.aUp[BufferIndex].sName = sName;
GlimwormBeacons 0:a7800e894aaf 1058 _SEGGER_RTT.aUp[BufferIndex].pBuffer = (char*)pBuffer;
GlimwormBeacons 0:a7800e894aaf 1059 _SEGGER_RTT.aUp[BufferIndex].SizeOfBuffer = BufferSize;
GlimwormBeacons 0:a7800e894aaf 1060 _SEGGER_RTT.aUp[BufferIndex].RdOff = 0u;
GlimwormBeacons 0:a7800e894aaf 1061 _SEGGER_RTT.aUp[BufferIndex].WrOff = 0u;
GlimwormBeacons 0:a7800e894aaf 1062 }
GlimwormBeacons 0:a7800e894aaf 1063 _SEGGER_RTT.aUp[BufferIndex].Flags = Flags;
GlimwormBeacons 0:a7800e894aaf 1064 SEGGER_RTT_UNLOCK();
GlimwormBeacons 0:a7800e894aaf 1065 r = 0;
GlimwormBeacons 0:a7800e894aaf 1066 } else {
GlimwormBeacons 0:a7800e894aaf 1067 r = -1;
GlimwormBeacons 0:a7800e894aaf 1068 }
GlimwormBeacons 0:a7800e894aaf 1069 return r;
GlimwormBeacons 0:a7800e894aaf 1070 }
GlimwormBeacons 0:a7800e894aaf 1071
GlimwormBeacons 0:a7800e894aaf 1072 /*********************************************************************
GlimwormBeacons 0:a7800e894aaf 1073 *
GlimwormBeacons 0:a7800e894aaf 1074 * SEGGER_RTT_ConfigDownBuffer
GlimwormBeacons 0:a7800e894aaf 1075 *
GlimwormBeacons 0:a7800e894aaf 1076 * Function description
GlimwormBeacons 0:a7800e894aaf 1077 * Run-time configuration of a specific down-buffer (H->T).
GlimwormBeacons 0:a7800e894aaf 1078 * Buffer to be configured is specified by index.
GlimwormBeacons 0:a7800e894aaf 1079 * This includes: Buffer address, size, name, flags, ...
GlimwormBeacons 0:a7800e894aaf 1080 *
GlimwormBeacons 0:a7800e894aaf 1081 * Parameters
GlimwormBeacons 0:a7800e894aaf 1082 * BufferIndex Index of the buffer to configure.
GlimwormBeacons 0:a7800e894aaf 1083 * sName Pointer to a constant name string.
GlimwormBeacons 0:a7800e894aaf 1084 * pBuffer Pointer to a buffer to be used.
GlimwormBeacons 0:a7800e894aaf 1085 * BufferSize Size of the buffer.
GlimwormBeacons 0:a7800e894aaf 1086 * Flags Operating modes. Define behavior if buffer is full (not enough space for entire message).
GlimwormBeacons 0:a7800e894aaf 1087 *
GlimwormBeacons 0:a7800e894aaf 1088 * Return value
GlimwormBeacons 0:a7800e894aaf 1089 * >= 0 O.K.
GlimwormBeacons 0:a7800e894aaf 1090 * < 0 Error
GlimwormBeacons 0:a7800e894aaf 1091 */
GlimwormBeacons 0:a7800e894aaf 1092 int SEGGER_RTT_ConfigDownBuffer(unsigned BufferIndex, const char* sName, void* pBuffer, unsigned BufferSize, unsigned Flags) {
GlimwormBeacons 0:a7800e894aaf 1093 int r;
GlimwormBeacons 0:a7800e894aaf 1094
GlimwormBeacons 0:a7800e894aaf 1095 INIT();
GlimwormBeacons 0:a7800e894aaf 1096 if (BufferIndex < (unsigned)_SEGGER_RTT.MaxNumDownBuffers) {
GlimwormBeacons 0:a7800e894aaf 1097 SEGGER_RTT_LOCK();
GlimwormBeacons 0:a7800e894aaf 1098 if (BufferIndex > 0u) {
GlimwormBeacons 0:a7800e894aaf 1099 _SEGGER_RTT.aDown[BufferIndex].sName = sName;
GlimwormBeacons 0:a7800e894aaf 1100 _SEGGER_RTT.aDown[BufferIndex].pBuffer = (char*)pBuffer;
GlimwormBeacons 0:a7800e894aaf 1101 _SEGGER_RTT.aDown[BufferIndex].SizeOfBuffer = BufferSize;
GlimwormBeacons 0:a7800e894aaf 1102 _SEGGER_RTT.aDown[BufferIndex].RdOff = 0u;
GlimwormBeacons 0:a7800e894aaf 1103 _SEGGER_RTT.aDown[BufferIndex].WrOff = 0u;
GlimwormBeacons 0:a7800e894aaf 1104 }
GlimwormBeacons 0:a7800e894aaf 1105 _SEGGER_RTT.aDown[BufferIndex].Flags = Flags;
GlimwormBeacons 0:a7800e894aaf 1106 SEGGER_RTT_UNLOCK();
GlimwormBeacons 0:a7800e894aaf 1107 r = 0;
GlimwormBeacons 0:a7800e894aaf 1108 } else {
GlimwormBeacons 0:a7800e894aaf 1109 r = -1;
GlimwormBeacons 0:a7800e894aaf 1110 }
GlimwormBeacons 0:a7800e894aaf 1111 return r;
GlimwormBeacons 0:a7800e894aaf 1112 }
GlimwormBeacons 0:a7800e894aaf 1113
GlimwormBeacons 0:a7800e894aaf 1114 /*********************************************************************
GlimwormBeacons 0:a7800e894aaf 1115 *
GlimwormBeacons 0:a7800e894aaf 1116 * SEGGER_RTT_SetNameUpBuffer
GlimwormBeacons 0:a7800e894aaf 1117 *
GlimwormBeacons 0:a7800e894aaf 1118 * Function description
GlimwormBeacons 0:a7800e894aaf 1119 * Run-time configuration of a specific up-buffer name (T->H).
GlimwormBeacons 0:a7800e894aaf 1120 * Buffer to be configured is specified by index.
GlimwormBeacons 0:a7800e894aaf 1121 *
GlimwormBeacons 0:a7800e894aaf 1122 * Parameters
GlimwormBeacons 0:a7800e894aaf 1123 * BufferIndex Index of the buffer to renamed.
GlimwormBeacons 0:a7800e894aaf 1124 * sName Pointer to a constant name string.
GlimwormBeacons 0:a7800e894aaf 1125 *
GlimwormBeacons 0:a7800e894aaf 1126 * Return value
GlimwormBeacons 0:a7800e894aaf 1127 * >= 0 O.K.
GlimwormBeacons 0:a7800e894aaf 1128 * < 0 Error
GlimwormBeacons 0:a7800e894aaf 1129 */
GlimwormBeacons 0:a7800e894aaf 1130 int SEGGER_RTT_SetNameUpBuffer(unsigned BufferIndex, const char* sName) {
GlimwormBeacons 0:a7800e894aaf 1131 int r;
GlimwormBeacons 0:a7800e894aaf 1132
GlimwormBeacons 0:a7800e894aaf 1133 INIT();
GlimwormBeacons 0:a7800e894aaf 1134 if (BufferIndex < (unsigned)_SEGGER_RTT.MaxNumUpBuffers) {
GlimwormBeacons 0:a7800e894aaf 1135 SEGGER_RTT_LOCK();
GlimwormBeacons 0:a7800e894aaf 1136 _SEGGER_RTT.aUp[BufferIndex].sName = sName;
GlimwormBeacons 0:a7800e894aaf 1137 SEGGER_RTT_UNLOCK();
GlimwormBeacons 0:a7800e894aaf 1138 r = 0;
GlimwormBeacons 0:a7800e894aaf 1139 } else {
GlimwormBeacons 0:a7800e894aaf 1140 r = -1;
GlimwormBeacons 0:a7800e894aaf 1141 }
GlimwormBeacons 0:a7800e894aaf 1142 return r;
GlimwormBeacons 0:a7800e894aaf 1143 }
GlimwormBeacons 0:a7800e894aaf 1144
GlimwormBeacons 0:a7800e894aaf 1145 /*********************************************************************
GlimwormBeacons 0:a7800e894aaf 1146 *
GlimwormBeacons 0:a7800e894aaf 1147 * SEGGER_RTT_SetNameDownBuffer
GlimwormBeacons 0:a7800e894aaf 1148 *
GlimwormBeacons 0:a7800e894aaf 1149 * Function description
GlimwormBeacons 0:a7800e894aaf 1150 * Run-time configuration of a specific Down-buffer name (T->H).
GlimwormBeacons 0:a7800e894aaf 1151 * Buffer to be configured is specified by index.
GlimwormBeacons 0:a7800e894aaf 1152 *
GlimwormBeacons 0:a7800e894aaf 1153 * Parameters
GlimwormBeacons 0:a7800e894aaf 1154 * BufferIndex Index of the buffer to renamed.
GlimwormBeacons 0:a7800e894aaf 1155 * sName Pointer to a constant name string.
GlimwormBeacons 0:a7800e894aaf 1156 *
GlimwormBeacons 0:a7800e894aaf 1157 * Return value
GlimwormBeacons 0:a7800e894aaf 1158 * >= 0 O.K.
GlimwormBeacons 0:a7800e894aaf 1159 * < 0 Error
GlimwormBeacons 0:a7800e894aaf 1160 */
GlimwormBeacons 0:a7800e894aaf 1161 int SEGGER_RTT_SetNameDownBuffer(unsigned BufferIndex, const char* sName) {
GlimwormBeacons 0:a7800e894aaf 1162 int r;
GlimwormBeacons 0:a7800e894aaf 1163
GlimwormBeacons 0:a7800e894aaf 1164 INIT();
GlimwormBeacons 0:a7800e894aaf 1165 if (BufferIndex < (unsigned)_SEGGER_RTT.MaxNumDownBuffers) {
GlimwormBeacons 0:a7800e894aaf 1166 SEGGER_RTT_LOCK();
GlimwormBeacons 0:a7800e894aaf 1167 _SEGGER_RTT.aDown[BufferIndex].sName = sName;
GlimwormBeacons 0:a7800e894aaf 1168 SEGGER_RTT_UNLOCK();
GlimwormBeacons 0:a7800e894aaf 1169 r = 0;
GlimwormBeacons 0:a7800e894aaf 1170 } else {
GlimwormBeacons 0:a7800e894aaf 1171 r = -1;
GlimwormBeacons 0:a7800e894aaf 1172 }
GlimwormBeacons 0:a7800e894aaf 1173 return r;
GlimwormBeacons 0:a7800e894aaf 1174 }
GlimwormBeacons 0:a7800e894aaf 1175
GlimwormBeacons 0:a7800e894aaf 1176 /*********************************************************************
GlimwormBeacons 0:a7800e894aaf 1177 *
GlimwormBeacons 0:a7800e894aaf 1178 * SEGGER_RTT_Init
GlimwormBeacons 0:a7800e894aaf 1179 *
GlimwormBeacons 0:a7800e894aaf 1180 * Function description
GlimwormBeacons 0:a7800e894aaf 1181 * Initializes the RTT Control Block.
GlimwormBeacons 0:a7800e894aaf 1182 * Should be used in RAM targets, at start of the application.
GlimwormBeacons 0:a7800e894aaf 1183 *
GlimwormBeacons 0:a7800e894aaf 1184 */
GlimwormBeacons 0:a7800e894aaf 1185 void SEGGER_RTT_Init (void) {
GlimwormBeacons 0:a7800e894aaf 1186 _DoInit();
GlimwormBeacons 0:a7800e894aaf 1187 }
GlimwormBeacons 0:a7800e894aaf 1188
GlimwormBeacons 0:a7800e894aaf 1189 /*********************************************************************
GlimwormBeacons 0:a7800e894aaf 1190 *
GlimwormBeacons 0:a7800e894aaf 1191 * SEGGER_RTT_SetTerminal
GlimwormBeacons 0:a7800e894aaf 1192 *
GlimwormBeacons 0:a7800e894aaf 1193 * Function description
GlimwormBeacons 0:a7800e894aaf 1194 * Sets the terminal to be used for output on channel 0.
GlimwormBeacons 0:a7800e894aaf 1195 *
GlimwormBeacons 0:a7800e894aaf 1196 * Parameters
GlimwormBeacons 0:a7800e894aaf 1197 * TerminalId Index of the terminal.
GlimwormBeacons 0:a7800e894aaf 1198 *
GlimwormBeacons 0:a7800e894aaf 1199 * Return value
GlimwormBeacons 0:a7800e894aaf 1200 * >= 0 O.K.
GlimwormBeacons 0:a7800e894aaf 1201 * < 0 Error (e.g. if RTT is configured for non-blocking mode and there was no space in the buffer to set the new terminal Id)
GlimwormBeacons 0:a7800e894aaf 1202 */
GlimwormBeacons 0:a7800e894aaf 1203 int SEGGER_RTT_SetTerminal (char TerminalId) {
GlimwormBeacons 0:a7800e894aaf 1204 char ac[2];
GlimwormBeacons 0:a7800e894aaf 1205 SEGGER_RTT_BUFFER_UP* pRing;
GlimwormBeacons 0:a7800e894aaf 1206 unsigned Avail;
GlimwormBeacons 0:a7800e894aaf 1207 int r;
GlimwormBeacons 0:a7800e894aaf 1208 //
GlimwormBeacons 0:a7800e894aaf 1209 INIT();
GlimwormBeacons 0:a7800e894aaf 1210 //
GlimwormBeacons 0:a7800e894aaf 1211 r = 0;
GlimwormBeacons 0:a7800e894aaf 1212 ac[0] = 0xFFU;
GlimwormBeacons 0:a7800e894aaf 1213 if ((unsigned char)TerminalId < (unsigned char)sizeof(_aTerminalId)) { // We only support a certain number of channels
GlimwormBeacons 0:a7800e894aaf 1214 ac[1] = _aTerminalId[(unsigned char)TerminalId];
GlimwormBeacons 0:a7800e894aaf 1215 pRing = &_SEGGER_RTT.aUp[0]; // Buffer 0 is always reserved for terminal I/O, so we can use index 0 here, fixed
GlimwormBeacons 0:a7800e894aaf 1216 SEGGER_RTT_LOCK(); // Lock to make sure that no other task is writing into buffer, while we are and number of free bytes in buffer does not change downwards after checking and before writing
GlimwormBeacons 0:a7800e894aaf 1217 if ((pRing->Flags & SEGGER_RTT_MODE_MASK) == SEGGER_RTT_MODE_BLOCK_IF_FIFO_FULL) {
GlimwormBeacons 0:a7800e894aaf 1218 _ActiveTerminal = TerminalId;
GlimwormBeacons 0:a7800e894aaf 1219 _WriteBlocking(pRing, ac, 2u);
GlimwormBeacons 0:a7800e894aaf 1220 } else { // Skipping mode or trim mode? => We cannot trim this command so handling is the same for both modes
GlimwormBeacons 0:a7800e894aaf 1221 Avail = _GetAvailWriteSpace(pRing);
GlimwormBeacons 0:a7800e894aaf 1222 if (Avail >= 2) {
GlimwormBeacons 0:a7800e894aaf 1223 _ActiveTerminal = TerminalId; // Only change active terminal in case of success
GlimwormBeacons 0:a7800e894aaf 1224 _WriteNoCheck(pRing, ac, 2u);
GlimwormBeacons 0:a7800e894aaf 1225 } else {
GlimwormBeacons 0:a7800e894aaf 1226 r = -1;
GlimwormBeacons 0:a7800e894aaf 1227 }
GlimwormBeacons 0:a7800e894aaf 1228 }
GlimwormBeacons 0:a7800e894aaf 1229 SEGGER_RTT_UNLOCK();
GlimwormBeacons 0:a7800e894aaf 1230 } else {
GlimwormBeacons 0:a7800e894aaf 1231 r = -1;
GlimwormBeacons 0:a7800e894aaf 1232 }
GlimwormBeacons 0:a7800e894aaf 1233 return r;
GlimwormBeacons 0:a7800e894aaf 1234 }
GlimwormBeacons 0:a7800e894aaf 1235
GlimwormBeacons 0:a7800e894aaf 1236 /*********************************************************************
GlimwormBeacons 0:a7800e894aaf 1237 *
GlimwormBeacons 0:a7800e894aaf 1238 * SEGGER_RTT_TerminalOut
GlimwormBeacons 0:a7800e894aaf 1239 *
GlimwormBeacons 0:a7800e894aaf 1240 * Function description
GlimwormBeacons 0:a7800e894aaf 1241 * Writes a string to the given terminal
GlimwormBeacons 0:a7800e894aaf 1242 * without changing the terminal for channel 0.
GlimwormBeacons 0:a7800e894aaf 1243 *
GlimwormBeacons 0:a7800e894aaf 1244 * Parameters
GlimwormBeacons 0:a7800e894aaf 1245 * TerminalId Index of the terminal.
GlimwormBeacons 0:a7800e894aaf 1246 * s String to be printed on the terminal.
GlimwormBeacons 0:a7800e894aaf 1247 *
GlimwormBeacons 0:a7800e894aaf 1248 * Return value
GlimwormBeacons 0:a7800e894aaf 1249 * >= 0 - Number of bytes written.
GlimwormBeacons 0:a7800e894aaf 1250 * < 0 - Error.
GlimwormBeacons 0:a7800e894aaf 1251 *
GlimwormBeacons 0:a7800e894aaf 1252 */
GlimwormBeacons 0:a7800e894aaf 1253 int SEGGER_RTT_TerminalOut (char TerminalId, const char* s) {
GlimwormBeacons 0:a7800e894aaf 1254 int Status;
GlimwormBeacons 0:a7800e894aaf 1255 unsigned FragLen;
GlimwormBeacons 0:a7800e894aaf 1256 unsigned Avail;
GlimwormBeacons 0:a7800e894aaf 1257 SEGGER_RTT_BUFFER_UP* pRing;
GlimwormBeacons 0:a7800e894aaf 1258 //
GlimwormBeacons 0:a7800e894aaf 1259 INIT();
GlimwormBeacons 0:a7800e894aaf 1260 //
GlimwormBeacons 0:a7800e894aaf 1261 // Validate terminal ID.
GlimwormBeacons 0:a7800e894aaf 1262 //
GlimwormBeacons 0:a7800e894aaf 1263 if (TerminalId < (char)sizeof(_aTerminalId)) { // We only support a certain number of channels
GlimwormBeacons 0:a7800e894aaf 1264 //
GlimwormBeacons 0:a7800e894aaf 1265 // Get "to-host" ring buffer.
GlimwormBeacons 0:a7800e894aaf 1266 //
GlimwormBeacons 0:a7800e894aaf 1267 pRing = &_SEGGER_RTT.aUp[0];
GlimwormBeacons 0:a7800e894aaf 1268 //
GlimwormBeacons 0:a7800e894aaf 1269 // Need to be able to change terminal, write data, change back.
GlimwormBeacons 0:a7800e894aaf 1270 // Compute the fixed and variable sizes.
GlimwormBeacons 0:a7800e894aaf 1271 //
GlimwormBeacons 0:a7800e894aaf 1272 FragLen = strlen(s);
GlimwormBeacons 0:a7800e894aaf 1273 //
GlimwormBeacons 0:a7800e894aaf 1274 // How we output depends upon the mode...
GlimwormBeacons 0:a7800e894aaf 1275 //
GlimwormBeacons 0:a7800e894aaf 1276 SEGGER_RTT_LOCK();
GlimwormBeacons 0:a7800e894aaf 1277 Avail = _GetAvailWriteSpace(pRing);
GlimwormBeacons 0:a7800e894aaf 1278 switch (pRing->Flags & SEGGER_RTT_MODE_MASK) {
GlimwormBeacons 0:a7800e894aaf 1279 case SEGGER_RTT_MODE_NO_BLOCK_SKIP:
GlimwormBeacons 0:a7800e894aaf 1280 //
GlimwormBeacons 0:a7800e894aaf 1281 // If we are in skip mode and there is no space for the whole
GlimwormBeacons 0:a7800e894aaf 1282 // of this output, don't bother switching terminals at all.
GlimwormBeacons 0:a7800e894aaf 1283 //
GlimwormBeacons 0:a7800e894aaf 1284 if (Avail < (FragLen + 4u)) {
GlimwormBeacons 0:a7800e894aaf 1285 Status = 0;
GlimwormBeacons 0:a7800e894aaf 1286 } else {
GlimwormBeacons 0:a7800e894aaf 1287 _PostTerminalSwitch(pRing, TerminalId);
GlimwormBeacons 0:a7800e894aaf 1288 Status = (int)_WriteBlocking(pRing, s, FragLen);
GlimwormBeacons 0:a7800e894aaf 1289 _PostTerminalSwitch(pRing, _ActiveTerminal);
GlimwormBeacons 0:a7800e894aaf 1290 }
GlimwormBeacons 0:a7800e894aaf 1291 break;
GlimwormBeacons 0:a7800e894aaf 1292 case SEGGER_RTT_MODE_NO_BLOCK_TRIM:
GlimwormBeacons 0:a7800e894aaf 1293 //
GlimwormBeacons 0:a7800e894aaf 1294 // If we are in trim mode and there is not enough space for everything,
GlimwormBeacons 0:a7800e894aaf 1295 // trim the output but always include the terminal switch. If no room
GlimwormBeacons 0:a7800e894aaf 1296 // for terminal switch, skip that totally.
GlimwormBeacons 0:a7800e894aaf 1297 //
GlimwormBeacons 0:a7800e894aaf 1298 if (Avail < 4u) {
GlimwormBeacons 0:a7800e894aaf 1299 Status = -1;
GlimwormBeacons 0:a7800e894aaf 1300 } else {
GlimwormBeacons 0:a7800e894aaf 1301 _PostTerminalSwitch(pRing, TerminalId);
GlimwormBeacons 0:a7800e894aaf 1302 Status = (int)_WriteBlocking(pRing, s, (FragLen < (Avail - 4u)) ? FragLen : (Avail - 4u));
GlimwormBeacons 0:a7800e894aaf 1303 _PostTerminalSwitch(pRing, _ActiveTerminal);
GlimwormBeacons 0:a7800e894aaf 1304 }
GlimwormBeacons 0:a7800e894aaf 1305 break;
GlimwormBeacons 0:a7800e894aaf 1306 case SEGGER_RTT_MODE_BLOCK_IF_FIFO_FULL:
GlimwormBeacons 0:a7800e894aaf 1307 //
GlimwormBeacons 0:a7800e894aaf 1308 // If we are in blocking mode, output everything.
GlimwormBeacons 0:a7800e894aaf 1309 //
GlimwormBeacons 0:a7800e894aaf 1310 _PostTerminalSwitch(pRing, TerminalId);
GlimwormBeacons 0:a7800e894aaf 1311 Status = (int)_WriteBlocking(pRing, s, FragLen);
GlimwormBeacons 0:a7800e894aaf 1312 _PostTerminalSwitch(pRing, _ActiveTerminal);
GlimwormBeacons 0:a7800e894aaf 1313 break;
GlimwormBeacons 0:a7800e894aaf 1314 default:
GlimwormBeacons 0:a7800e894aaf 1315 Status = -1;
GlimwormBeacons 0:a7800e894aaf 1316 break;
GlimwormBeacons 0:a7800e894aaf 1317 }
GlimwormBeacons 0:a7800e894aaf 1318 //
GlimwormBeacons 0:a7800e894aaf 1319 // Finish up.
GlimwormBeacons 0:a7800e894aaf 1320 //
GlimwormBeacons 0:a7800e894aaf 1321 SEGGER_RTT_UNLOCK();
GlimwormBeacons 0:a7800e894aaf 1322 } else {
GlimwormBeacons 0:a7800e894aaf 1323 Status = -1;
GlimwormBeacons 0:a7800e894aaf 1324 }
GlimwormBeacons 0:a7800e894aaf 1325 return Status;
GlimwormBeacons 0:a7800e894aaf 1326 }
GlimwormBeacons 0:a7800e894aaf 1327
GlimwormBeacons 0:a7800e894aaf 1328
GlimwormBeacons 0:a7800e894aaf 1329 /*************************** End of file ****************************/