86 #include "SEGGER_RTT.h" 97 #ifndef BUFFER_SIZE_UP 98 #define BUFFER_SIZE_UP 1024 // Size of the buffer for terminal output of target, up to host 101 #ifndef BUFFER_SIZE_DOWN 102 #define BUFFER_SIZE_DOWN 16 // Size of the buffer for terminal input to target from host (Usually keyboard input) 105 #ifndef SEGGER_RTT_MAX_NUM_UP_BUFFERS 106 #define SEGGER_RTT_MAX_NUM_UP_BUFFERS 2 // Number of up-buffers (T->H) available on this target 109 #ifndef SEGGER_RTT_MAX_NUM_DOWN_BUFFERS 110 #define SEGGER_RTT_MAX_NUM_DOWN_BUFFERS 2 // Number of down-buffers (H->T) available on this target 113 #ifndef SEGGER_RTT_BUFFER_SECTION 114 #if defined(SEGGER_RTT_SECTION) 115 #define SEGGER_RTT_BUFFER_SECTION SEGGER_RTT_SECTION 119 #ifndef SEGGER_RTT_ALIGNMENT 120 #define SEGGER_RTT_ALIGNMENT 0 123 #ifndef SEGGER_RTT_BUFFER_ALIGNMENT 124 #define SEGGER_RTT_BUFFER_ALIGNMENT 0 127 #ifndef SEGGER_RTT_MODE_DEFAULT 128 #define SEGGER_RTT_MODE_DEFAULT SEGGER_RTT_MODE_NO_BLOCK_SKIP 131 #ifndef SEGGER_RTT_LOCK 132 #define SEGGER_RTT_LOCK() 135 #ifndef SEGGER_RTT_UNLOCK 136 #define SEGGER_RTT_UNLOCK() 140 #define STRLEN(a) strlen((a)) 143 #ifndef SEGGER_RTT_MEMCPY_USE_BYTELOOP 144 #define SEGGER_RTT_MEMCPY_USE_BYTELOOP 0 147 #ifndef SEGGER_RTT_MEMCPY 149 #define SEGGER_RTT_MEMCPY(pDest, pSrc, NumBytes) MEMCPY((pDest), (pSrc), (NumBytes)) 151 #define SEGGER_RTT_MEMCPY(pDest, pSrc, NumBytes) memcpy((pDest), (pSrc), (NumBytes)) 156 #define MIN(a, b) (((a) < (b)) ? (a) : (b)) 160 #define MAX(a, b) (((a) > (b)) ? (a) : (b)) 175 #if (defined __ICCARM__) || (defined __ICCRX__) 176 #define RTT_PRAGMA(P) _Pragma(#P) 179 #if SEGGER_RTT_ALIGNMENT || SEGGER_RTT_BUFFER_ALIGNMENT 180 #if (defined __GNUC__) 181 #define SEGGER_RTT_ALIGN(Var, Alignment) Var __attribute__ ((aligned (Alignment))) 182 #elif (defined __ICCARM__) || (defined __ICCRX__) 183 #define PRAGMA(A) _Pragma(#A) 184 #define SEGGER_RTT_ALIGN(Var, Alignment) RTT_PRAGMA(data_alignment=Alignment) \ 186 #elif (defined __CC_ARM) 187 #define SEGGER_RTT_ALIGN(Var, Alignment) Var __attribute__ ((aligned (Alignment))) 189 #error "Alignment not supported for this compiler." 192 #define SEGGER_RTT_ALIGN(Var, Alignment) Var 195 #if defined(SEGGER_RTT_SECTION) || defined (SEGGER_RTT_BUFFER_SECTION) 196 #if (defined __GNUC__) 197 #define SEGGER_RTT_PUT_SECTION(Var, Section) __attribute__ ((section (Section))) Var 198 #elif (defined __ICCARM__) || (defined __ICCRX__) 199 #define SEGGER_RTT_PUT_SECTION(Var, Section) RTT_PRAGMA(location=Section) \ 201 #elif (defined __CC_ARM) 202 #define SEGGER_RTT_PUT_SECTION(Var, Section) __attribute__ ((section (Section), zero_init)) Var 204 #error "Section placement not supported for this compiler." 207 #define SEGGER_RTT_PUT_SECTION(Var, Section) Var 211 #if SEGGER_RTT_ALIGNMENT 212 #define SEGGER_RTT_CB_ALIGN(Var) SEGGER_RTT_ALIGN(Var, SEGGER_RTT_ALIGNMENT) 214 #define SEGGER_RTT_CB_ALIGN(Var) Var 217 #if SEGGER_RTT_BUFFER_ALIGNMENT 218 #define SEGGER_RTT_BUFFER_ALIGN(Var) SEGGER_RTT_ALIGN(Var, SEGGER_RTT_BUFFER_ALIGNMENT) 220 #define SEGGER_RTT_BUFFER_ALIGN(Var) Var 224 #if defined(SEGGER_RTT_SECTION) 225 #define SEGGER_RTT_PUT_CB_SECTION(Var) SEGGER_RTT_PUT_SECTION(Var, SEGGER_RTT_SECTION) 227 #define SEGGER_RTT_PUT_CB_SECTION(Var) Var 230 #if defined(SEGGER_RTT_BUFFER_SECTION) 231 #define SEGGER_RTT_PUT_BUFFER_SECTION(Var) SEGGER_RTT_PUT_SECTION(Var, SEGGER_RTT_BUFFER_SECTION) 233 #define SEGGER_RTT_PUT_BUFFER_SECTION(Var) Var 243 static unsigned char _aTerminalId[16] = {
'0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
'A',
'B',
'C',
'D',
'E',
'F' };
254 SEGGER_RTT_PUT_CB_SECTION(SEGGER_RTT_CB_ALIGN(
SEGGER_RTT_CB _SEGGER_RTT));
256 SEGGER_RTT_PUT_BUFFER_SECTION(SEGGER_RTT_BUFFER_ALIGN(
static char _acUpBuffer [BUFFER_SIZE_UP]));
257 SEGGER_RTT_PUT_BUFFER_SECTION(SEGGER_RTT_BUFFER_ALIGN(
static char _acDownBuffer[BUFFER_SIZE_DOWN]));
259 static char _ActiveTerminal;
277 #define INIT() do { \ 278 if (_SEGGER_RTT.acID[0] == '\0') { _DoInit(); } \ 280 static void _DoInit(
void) {
286 p->MaxNumUpBuffers = SEGGER_RTT_MAX_NUM_UP_BUFFERS;
287 p->MaxNumDownBuffers = SEGGER_RTT_MAX_NUM_DOWN_BUFFERS;
291 p->aUp[0].sName =
"Terminal";
292 p->aUp[0].pBuffer = _acUpBuffer;
293 p->aUp[0].SizeOfBuffer =
sizeof(_acUpBuffer);
294 p->aUp[0].RdOff = 0u;
295 p->aUp[0].WrOff = 0u;
296 p->aUp[0].Flags = SEGGER_RTT_MODE_DEFAULT;
300 p->aDown[0].sName =
"Terminal";
301 p->aDown[0].pBuffer = _acDownBuffer;
302 p->aDown[0].SizeOfBuffer =
sizeof(_acDownBuffer);
303 p->aDown[0].RdOff = 0u;
304 p->aDown[0].WrOff = 0u;
305 p->aDown[0].Flags = SEGGER_RTT_MODE_DEFAULT;
311 strcpy(&p->acID[7],
"RTT");
312 strcpy(&p->acID[0],
"SEGGER");
335 static unsigned _WriteBlocking(
SEGGER_RTT_BUFFER_UP* pRing,
const char* pBuffer,
unsigned NumBytes) {
336 unsigned NumBytesToWrite;
337 unsigned NumBytesWritten;
340 #if SEGGER_RTT_MEMCPY_USE_BYTELOOP 346 NumBytesWritten = 0u;
347 WrOff = pRing->WrOff;
349 RdOff = pRing->RdOff;
351 NumBytesToWrite = RdOff - WrOff - 1u;
353 NumBytesToWrite = pRing->SizeOfBuffer - (WrOff - RdOff + 1u);
355 NumBytesToWrite = MIN(NumBytesToWrite, (pRing->SizeOfBuffer - WrOff));
356 NumBytesToWrite = MIN(NumBytesToWrite, NumBytes);
357 #if SEGGER_RTT_MEMCPY_USE_BYTELOOP 358 pDst = pRing->pBuffer + WrOff;
359 NumBytesWritten += NumBytesToWrite;
360 NumBytes -= NumBytesToWrite;
361 WrOff += NumBytesToWrite;
362 while (NumBytesToWrite--) {
363 *pDst++ = *pBuffer++;
366 SEGGER_RTT_MEMCPY(pRing->pBuffer + WrOff, pBuffer, NumBytesToWrite);
367 NumBytesWritten += NumBytesToWrite;
368 pBuffer += NumBytesToWrite;
369 NumBytes -= NumBytesToWrite;
370 WrOff += NumBytesToWrite;
372 if (WrOff == pRing->SizeOfBuffer) {
375 pRing->WrOff = WrOff;
378 return NumBytesWritten;
400 unsigned NumBytesAtOnce;
403 #if SEGGER_RTT_MEMCPY_USE_BYTELOOP 407 WrOff = pRing->WrOff;
408 Rem = pRing->SizeOfBuffer - WrOff;
409 if (Rem > NumBytes) {
413 #if SEGGER_RTT_MEMCPY_USE_BYTELOOP 414 pDst = pRing->pBuffer + WrOff;
419 pRing->WrOff = WrOff;
421 SEGGER_RTT_MEMCPY(pRing->pBuffer + WrOff, pData, NumBytes);
422 pRing->WrOff = WrOff + NumBytes;
428 #if SEGGER_RTT_MEMCPY_USE_BYTELOOP 429 pDst = pRing->pBuffer + WrOff;
430 NumBytesAtOnce = Rem;
431 while (NumBytesAtOnce--) {
434 pDst = pRing->pBuffer;
435 NumBytesAtOnce = NumBytes - Rem;
436 while (NumBytesAtOnce--) {
439 pRing->WrOff = NumBytes - Rem;
441 NumBytesAtOnce = Rem;
442 SEGGER_RTT_MEMCPY(pRing->pBuffer + WrOff, pData, NumBytesAtOnce);
443 NumBytesAtOnce = NumBytes - Rem;
444 SEGGER_RTT_MEMCPY(pRing->pBuffer, pData + Rem, NumBytesAtOnce);
445 pRing->WrOff = NumBytesAtOnce;
467 ac[1] = _aTerminalId[TerminalId];
468 _WriteBlocking(pRing, ac, 2u);
493 RdOff = pRing->RdOff;
494 WrOff = pRing->WrOff;
495 if (RdOff <= WrOff) {
496 r = pRing->SizeOfBuffer - 1u - WrOff + RdOff;
498 r = RdOff - WrOff - 1u;
526 unsigned SEGGER_RTT_ReadNoLock(
unsigned BufferIndex,
void* pData,
unsigned BufferSize) {
527 unsigned NumBytesRem;
528 unsigned NumBytesRead;
531 unsigned char* pBuffer;
533 #if SEGGER_RTT_MEMCPY_USE_BYTELOOP 538 pRing = &_SEGGER_RTT.aDown[BufferIndex];
539 pBuffer = (
unsigned char*)pData;
540 RdOff = pRing->RdOff;
541 WrOff = pRing->WrOff;
547 NumBytesRem = pRing->SizeOfBuffer - RdOff;
548 NumBytesRem = MIN(NumBytesRem, BufferSize);
549 #if SEGGER_RTT_MEMCPY_USE_BYTELOOP 550 pSrc = pRing->pBuffer + RdOff;
551 NumBytesRead += NumBytesRem;
552 BufferSize -= NumBytesRem;
553 RdOff += NumBytesRem;
554 while (NumBytesRem--) {
555 *pBuffer++ = *pSrc++;
558 SEGGER_RTT_MEMCPY(pBuffer, pRing->pBuffer + RdOff, NumBytesRem);
559 NumBytesRead += NumBytesRem;
560 pBuffer += NumBytesRem;
561 BufferSize -= NumBytesRem;
562 RdOff += NumBytesRem;
567 if (RdOff == pRing->SizeOfBuffer) {
574 NumBytesRem = WrOff - RdOff;
575 NumBytesRem = MIN(NumBytesRem, BufferSize);
576 if (NumBytesRem > 0u) {
577 #if SEGGER_RTT_MEMCPY_USE_BYTELOOP 578 pSrc = pRing->pBuffer + RdOff;
579 NumBytesRead += NumBytesRem;
580 BufferSize -= NumBytesRem;
581 RdOff += NumBytesRem;
582 while (NumBytesRem--) {
583 *pBuffer++ = *pSrc++;
586 SEGGER_RTT_MEMCPY(pBuffer, pRing->pBuffer + RdOff, NumBytesRem);
587 NumBytesRead += NumBytesRem;
588 pBuffer += NumBytesRem;
589 BufferSize -= NumBytesRem;
590 RdOff += NumBytesRem;
594 pRing->RdOff = RdOff;
616 unsigned SEGGER_RTT_Read(
unsigned BufferIndex,
void* pBuffer,
unsigned BufferSize) {
617 unsigned NumBytesRead;
623 NumBytesRead = SEGGER_RTT_ReadNoLock(BufferIndex, pBuffer, BufferSize);
655 void SEGGER_RTT_WriteWithOverwriteNoLock(
unsigned BufferIndex,
const void* pBuffer,
unsigned NumBytes) {
659 #if SEGGER_RTT_MEMCPY_USE_BYTELOOP 663 pData = (
const char *)pBuffer;
667 pRing = &_SEGGER_RTT.aUp[BufferIndex];
671 if (pRing->WrOff == pRing->RdOff) {
672 Avail = pRing->SizeOfBuffer - 1u;
673 }
else if ( pRing->WrOff < pRing->RdOff) {
674 Avail = pRing->RdOff - pRing->WrOff - 1u;
676 Avail = pRing->RdOff - pRing->WrOff - 1u + pRing->SizeOfBuffer;
678 if (NumBytes > Avail) {
679 pRing->RdOff += (NumBytes - Avail);
680 while (pRing->RdOff >= pRing->SizeOfBuffer) {
681 pRing->RdOff -= pRing->SizeOfBuffer;
687 Avail = pRing->SizeOfBuffer - pRing->WrOff;
689 if (Avail > NumBytes) {
693 #if SEGGER_RTT_MEMCPY_USE_BYTELOOP 694 pDst = pRing->pBuffer + pRing->WrOff;
699 pRing->WrOff += Avail;
701 SEGGER_RTT_MEMCPY(pRing->pBuffer + pRing->WrOff, pData, NumBytes);
702 pRing->WrOff += NumBytes;
709 #if SEGGER_RTT_MEMCPY_USE_BYTELOOP 710 pDst = pRing->pBuffer + pRing->WrOff;
717 SEGGER_RTT_MEMCPY(pRing->pBuffer + pRing->WrOff, pData, Avail);
722 Avail = (pRing->SizeOfBuffer - 1);
751 unsigned SEGGER_RTT_WriteSkipNoLock(
unsigned BufferIndex,
const void* pBuffer,
unsigned NumBytes) {
758 #if SEGGER_RTT_MEMCPY_USE_BYTELOOP 762 pData = (
const char *)pBuffer;
766 pRing = &_SEGGER_RTT.aUp[BufferIndex];
767 RdOff = pRing->RdOff;
768 WrOff = pRing->WrOff;
782 if (RdOff <= WrOff) {
786 Avail = pRing->SizeOfBuffer - 1u - WrOff ;
787 if (Avail >= NumBytes) {
788 #if SEGGER_RTT_MEMCPY_USE_BYTELOOP 789 pDst = pRing->pBuffer + WrOff;
794 pRing->WrOff = WrOff;
796 SEGGER_RTT_MEMCPY(pRing->pBuffer + WrOff, pData, NumBytes);
797 pRing->WrOff = WrOff + NumBytes;
808 if (Avail >= NumBytes) {
812 Rem = pRing->SizeOfBuffer - WrOff;
813 if (Rem > NumBytes) {
814 #if SEGGER_RTT_MEMCPY_USE_BYTELOOP 815 pDst = pRing->pBuffer + WrOff;
820 pRing->WrOff = WrOff;
822 SEGGER_RTT_MEMCPY(pRing->pBuffer + WrOff, pData, NumBytes);
823 pRing->WrOff = WrOff + NumBytes;
829 #if SEGGER_RTT_MEMCPY_USE_BYTELOOP 830 pDst = pRing->pBuffer + WrOff;
836 pDst = pRing->pBuffer;
839 }
while (--NumBytes);
840 pRing->WrOff = WrOff;
842 SEGGER_RTT_MEMCPY(pRing->pBuffer + WrOff, pData, Rem);
843 SEGGER_RTT_MEMCPY(pRing->pBuffer, pData + Rem, NumBytes - Rem);
844 pRing->WrOff = NumBytes - Rem;
850 Avail = RdOff - WrOff - 1u;
851 if (Avail >= NumBytes) {
852 #if SEGGER_RTT_MEMCPY_USE_BYTELOOP 853 pDst = pRing->pBuffer + WrOff;
858 pRing->WrOff = WrOff;
860 SEGGER_RTT_MEMCPY(pRing->pBuffer + WrOff, pData, NumBytes);
861 pRing->WrOff = WrOff + NumBytes;
895 unsigned SEGGER_RTT_WriteNoLock(
unsigned BufferIndex,
const void* pBuffer,
unsigned NumBytes) {
901 pData = (
const char *)pBuffer;
905 pRing = &_SEGGER_RTT.aUp[BufferIndex];
909 switch (pRing->Flags) {
910 case SEGGER_RTT_MODE_NO_BLOCK_SKIP:
915 Avail = _GetAvailWriteSpace(pRing);
916 if (Avail < NumBytes) {
920 _WriteNoCheck(pRing, pData, NumBytes);
923 case SEGGER_RTT_MODE_NO_BLOCK_TRIM:
927 Avail = _GetAvailWriteSpace(pRing);
928 Status = Avail < NumBytes ? Avail : NumBytes;
929 _WriteNoCheck(pRing, pData, Status);
931 case SEGGER_RTT_MODE_BLOCK_IF_FIFO_FULL:
935 Status = _WriteBlocking(pRing, pData, NumBytes);
966 unsigned SEGGER_RTT_Write(
unsigned BufferIndex,
const void* pBuffer,
unsigned NumBytes) {
974 Status = SEGGER_RTT_WriteNoLock(BufferIndex, pBuffer, NumBytes);
1003 unsigned SEGGER_RTT_WriteString(
unsigned BufferIndex,
const char* s) {
1007 return SEGGER_RTT_Write(BufferIndex, s, Len);
1033 unsigned SEGGER_RTT_PutCharSkipNoLock(
unsigned BufferIndex,
char c) {
1040 pRing = &_SEGGER_RTT.aUp[BufferIndex];
1044 WrOff = pRing->WrOff + 1;
1045 if (WrOff == pRing->SizeOfBuffer) {
1051 if (WrOff != pRing->RdOff) {
1052 pRing->pBuffer[pRing->WrOff] = c;
1053 pRing->WrOff = WrOff;
1080 unsigned SEGGER_RTT_PutCharSkip(
unsigned BufferIndex,
char c) {
1092 pRing = &_SEGGER_RTT.aUp[BufferIndex];
1096 WrOff = pRing->WrOff + 1;
1097 if (WrOff == pRing->SizeOfBuffer) {
1103 if (WrOff != pRing->RdOff) {
1104 pRing->pBuffer[pRing->WrOff] = c;
1105 pRing->WrOff = WrOff;
1113 SEGGER_RTT_UNLOCK();
1136 unsigned SEGGER_RTT_PutChar(
unsigned BufferIndex,
char c) {
1148 pRing = &_SEGGER_RTT.aUp[BufferIndex];
1152 WrOff = pRing->WrOff + 1;
1153 if (WrOff == pRing->SizeOfBuffer) {
1159 if (pRing->Flags == SEGGER_RTT_MODE_BLOCK_IF_FIFO_FULL) {
1160 while (WrOff == pRing->RdOff) {
1167 if (WrOff != pRing->RdOff) {
1168 pRing->pBuffer[pRing->WrOff] = c;
1169 pRing->WrOff = WrOff;
1177 SEGGER_RTT_UNLOCK();
1197 int SEGGER_RTT_GetKey(
void) {
1201 r = (int)SEGGER_RTT_Read(0u, &c, 1u);
1203 r = (int)(
unsigned char)c;
1225 int SEGGER_RTT_WaitKey(
void) {
1229 r = SEGGER_RTT_GetKey();
1248 int SEGGER_RTT_HasKey(
void) {
1253 RdOff = _SEGGER_RTT.aDown[0].RdOff;
1254 if (RdOff != _SEGGER_RTT.aDown[0].WrOff) {
1274 unsigned SEGGER_RTT_HasData(
unsigned BufferIndex) {
1278 pRing = &_SEGGER_RTT.aDown[BufferIndex];
1280 return v - pRing->RdOff;
1302 int SEGGER_RTT_AllocDownBuffer(
const char* sName,
void* pBuffer,
unsigned BufferSize,
unsigned Flags) {
1309 if (_SEGGER_RTT.aDown[BufferIndex].pBuffer == NULL) {
1313 }
while (BufferIndex < _SEGGER_RTT.MaxNumDownBuffers);
1314 if (BufferIndex < _SEGGER_RTT.MaxNumDownBuffers) {
1315 _SEGGER_RTT.aDown[BufferIndex].sName = sName;
1316 _SEGGER_RTT.aDown[BufferIndex].pBuffer = (
char*)pBuffer;
1317 _SEGGER_RTT.aDown[BufferIndex].SizeOfBuffer = BufferSize;
1318 _SEGGER_RTT.aDown[BufferIndex].RdOff = 0u;
1319 _SEGGER_RTT.aDown[BufferIndex].WrOff = 0u;
1320 _SEGGER_RTT.aDown[BufferIndex].Flags = Flags;
1324 SEGGER_RTT_UNLOCK();
1347 int SEGGER_RTT_AllocUpBuffer(
const char* sName,
void* pBuffer,
unsigned BufferSize,
unsigned Flags) {
1354 if (_SEGGER_RTT.aUp[BufferIndex].pBuffer == NULL) {
1358 }
while (BufferIndex < _SEGGER_RTT.MaxNumUpBuffers);
1359 if (BufferIndex < _SEGGER_RTT.MaxNumUpBuffers) {
1360 _SEGGER_RTT.aUp[BufferIndex].sName = sName;
1361 _SEGGER_RTT.aUp[BufferIndex].pBuffer = (
char*)pBuffer;
1362 _SEGGER_RTT.aUp[BufferIndex].SizeOfBuffer = BufferSize;
1363 _SEGGER_RTT.aUp[BufferIndex].RdOff = 0u;
1364 _SEGGER_RTT.aUp[BufferIndex].WrOff = 0u;
1365 _SEGGER_RTT.aUp[BufferIndex].Flags = Flags;
1369 SEGGER_RTT_UNLOCK();
1398 int SEGGER_RTT_ConfigUpBuffer(
unsigned BufferIndex,
const char* sName,
void* pBuffer,
unsigned BufferSize,
unsigned Flags) {
1402 if (BufferIndex < (
unsigned)_SEGGER_RTT.MaxNumUpBuffers) {
1404 if (BufferIndex > 0u) {
1405 _SEGGER_RTT.aUp[BufferIndex].sName = sName;
1406 _SEGGER_RTT.aUp[BufferIndex].pBuffer = (
char*)pBuffer;
1407 _SEGGER_RTT.aUp[BufferIndex].SizeOfBuffer = BufferSize;
1408 _SEGGER_RTT.aUp[BufferIndex].RdOff = 0u;
1409 _SEGGER_RTT.aUp[BufferIndex].WrOff = 0u;
1411 _SEGGER_RTT.aUp[BufferIndex].Flags = Flags;
1412 SEGGER_RTT_UNLOCK();
1445 int SEGGER_RTT_ConfigDownBuffer(
unsigned BufferIndex,
const char* sName,
void* pBuffer,
unsigned BufferSize,
unsigned Flags) {
1449 if (BufferIndex < (
unsigned)_SEGGER_RTT.MaxNumDownBuffers) {
1451 if (BufferIndex > 0u) {
1452 _SEGGER_RTT.aDown[BufferIndex].sName = sName;
1453 _SEGGER_RTT.aDown[BufferIndex].pBuffer = (
char*)pBuffer;
1454 _SEGGER_RTT.aDown[BufferIndex].SizeOfBuffer = BufferSize;
1455 _SEGGER_RTT.aDown[BufferIndex].RdOff = 0u;
1456 _SEGGER_RTT.aDown[BufferIndex].WrOff = 0u;
1458 _SEGGER_RTT.aDown[BufferIndex].Flags = Flags;
1459 SEGGER_RTT_UNLOCK();
1483 int SEGGER_RTT_SetNameUpBuffer(
unsigned BufferIndex,
const char* sName) {
1487 if (BufferIndex < (
unsigned)_SEGGER_RTT.MaxNumUpBuffers) {
1489 _SEGGER_RTT.aUp[BufferIndex].sName = sName;
1490 SEGGER_RTT_UNLOCK();
1514 int SEGGER_RTT_SetNameDownBuffer(
unsigned BufferIndex,
const char* sName) {
1518 if (BufferIndex < (
unsigned)_SEGGER_RTT.MaxNumDownBuffers) {
1520 _SEGGER_RTT.aDown[BufferIndex].sName = sName;
1521 SEGGER_RTT_UNLOCK();
1545 int SEGGER_RTT_SetFlagsUpBuffer(
unsigned BufferIndex,
unsigned Flags) {
1549 if (BufferIndex < (
unsigned)_SEGGER_RTT.MaxNumUpBuffers) {
1551 _SEGGER_RTT.aUp[BufferIndex].Flags = Flags;
1552 SEGGER_RTT_UNLOCK();
1576 int SEGGER_RTT_SetFlagsDownBuffer(
unsigned BufferIndex,
unsigned Flags) {
1580 if (BufferIndex < (
unsigned)_SEGGER_RTT.MaxNumDownBuffers) {
1582 _SEGGER_RTT.aDown[BufferIndex].Flags = Flags;
1583 SEGGER_RTT_UNLOCK();
1600 void SEGGER_RTT_Init (
void) {
1618 int SEGGER_RTT_SetTerminal (
char TerminalId) {
1628 if ((
unsigned char)TerminalId < (
unsigned char)
sizeof(_aTerminalId)) {
1629 ac[1] = _aTerminalId[(
unsigned char)TerminalId];
1630 pRing = &_SEGGER_RTT.aUp[0];
1632 if ((pRing->Flags & SEGGER_RTT_MODE_MASK) == SEGGER_RTT_MODE_BLOCK_IF_FIFO_FULL) {
1633 _ActiveTerminal = TerminalId;
1634 _WriteBlocking(pRing, ac, 2u);
1636 Avail = _GetAvailWriteSpace(pRing);
1638 _ActiveTerminal = TerminalId;
1639 _WriteNoCheck(pRing, ac, 2u);
1644 SEGGER_RTT_UNLOCK();
1668 int SEGGER_RTT_TerminalOut (
char TerminalId,
const char* s) {
1678 if (TerminalId < (
char)
sizeof(_aTerminalId)) {
1682 pRing = &_SEGGER_RTT.aUp[0];
1687 FragLen = STRLEN(s);
1692 Avail = _GetAvailWriteSpace(pRing);
1693 switch (pRing->Flags & SEGGER_RTT_MODE_MASK) {
1694 case SEGGER_RTT_MODE_NO_BLOCK_SKIP:
1699 if (Avail < (FragLen + 4u)) {
1702 _PostTerminalSwitch(pRing, TerminalId);
1703 Status = (int)_WriteBlocking(pRing, s, FragLen);
1704 _PostTerminalSwitch(pRing, _ActiveTerminal);
1707 case SEGGER_RTT_MODE_NO_BLOCK_TRIM:
1716 _PostTerminalSwitch(pRing, TerminalId);
1717 Status = (int)_WriteBlocking(pRing, s, (FragLen < (Avail - 4u)) ? FragLen : (Avail - 4u));
1718 _PostTerminalSwitch(pRing, _ActiveTerminal);
1721 case SEGGER_RTT_MODE_BLOCK_IF_FIFO_FULL:
1725 _PostTerminalSwitch(pRing, TerminalId);
1726 Status = (int)_WriteBlocking(pRing, s, FragLen);
1727 _PostTerminalSwitch(pRing, _ActiveTerminal);
1736 SEGGER_RTT_UNLOCK();