/*============================================================================== * Перенаправление printf(). Переопределение системных функций. *------------------------------------------------------------------------------ * НИИЭТ, Богдан Колбов *============================================================================== * ДАННОЕ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ ПРЕДОСТАВЛЯЕТСЯ «КАК ЕСТЬ», БЕЗ КАКИХ-ЛИБО * ГАРАНТИЙ, ЯВНО ВЫРАЖЕННЫХ ИЛИ ПОДРАЗУМЕВАЕМЫХ, ВКЛЮЧАЯ ГАРАНТИИ ТОВАРНОЙ * ПРИГОДНОСТИ, СООТВЕТСТВИЯ ПО ЕГО КОНКРЕТНОМУ НАЗНАЧЕНИЮ И ОТСУТСТВИЯ * НАРУШЕНИЙ, НО НЕ ОГРАНИЧИВАЯСЬ ИМИ. ДАННОЕ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ * ПРЕДНАЗНАЧЕНО ДЛЯ ОЗНАКОМИТЕЛЬНЫХ ЦЕЛЕЙ И НАПРАВЛЕНО ТОЛЬКО НА * ПРЕДОСТАВЛЕНИЕ ДОПОЛНИТЕЛЬНОЙ ИНФОРМАЦИИ О ПРОДУКТЕ, С ЦЕЛЬЮ СОХРАНИТЬ ВРЕМЯ * ПОТРЕБИТЕЛЮ. НИ В КАКОМ СЛУЧАЕ АВТОРЫ ИЛИ ПРАВООБЛАДАТЕЛИ НЕ НЕСУТ * ОТВЕТСТВЕННОСТИ ПО КАКИМ-ЛИБО ИСКАМ, ЗА ПРЯМОЙ ИЛИ КОСВЕННЫЙ УЩЕРБ, ИЛИ * ПО ИНЫМ ТРЕБОВАНИЯМ, ВОЗНИКШИМ ИЗ-ЗА ИСПОЛЬЗОВАНИЯ ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ * ИЛИ ИНЫХ ДЕЙСТВИЙ С ПРОГРАММНЫМ ОБЕСПЕЧЕНИЕМ. * * 2018 АО "НИИЭТ" *============================================================================== */ //-- Includes ------------------------------------------------------------------ #include "retarget_conf.h" //-- Functions ----------------------------------------------------------------- #ifdef RETARGET #if defined(__GNUC__) int _write(int fd, char* ptr, int len) { (void)fd; int i = 0; while (ptr[i] && (i < len)) { retarget_put_char((int)ptr[i]); if (ptr[i] == '\n') { retarget_put_char((int)'\r'); } i++; } return len; } void _ttywrch(int ch) { retarget_put_char(ch); } int _read(int file, char* ptr, int len) { (void)file; int i = 0; for (/* Empty */; len > 0; --len) { char c = (char)retarget_get_char(); *ptr++ = c; ++i; if (c == '\n') break; } return i; } #elif defined(__ICCARM__) #include size_t __write(int handle, const unsigned char* buffer, size_t size) { size_t nChars = 0; if (buffer == 0) { return 0; } if (handle != _LLIO_STDOUT && handle != _LLIO_STDERR) { return _LLIO_ERROR; } for (; size != 0; --size) { if (retarget_put_char(*buffer++) < 0) { return _LLIO_ERROR; } ++nChars; } return nChars; } size_t __read(int handle, unsigned char* buffer, size_t size) { int nChars = 0; if (handle != _LLIO_STDIN) { return _LLIO_ERROR; } for (; size > 0; --size) { int c = retarget_get_char(); if (c < 0) break; *buffer++ = c; ++nChars; } return nChars; } #elif defined(__CC_ARM) #include #include #pragma import(__use_no_semihosting_swi) #ifdef __DBG_ITM volatile int ITM_RxBuffer = ITM_RXBUFFER_EMPTY; /* CMSIS Debug Input */ #endif struct __FILE { int handle; /* Add whatever you need here */ }; FILE __stdout; FILE __stdin; int fputc(int c, FILE* f) { #ifdef __DBG_ITM ITM_SendChar(c); return 0; #else return (retarget_put_char(c)); #endif } int fgetc(FILE* f) { return (retarget_get_char()); } int ferror(FILE* f) { /* Your implementation of ferror */ return EOF; } void _ttywrch(int c) { #ifdef __DBG_ITM ITM_SendChar(c); #else retarget_put_char(c); #endif } void _sys_exit(int return_code) { label: goto label; /* endless loop */ } #elif defined(__CMCPPARM__) /* Serial port UART as STDIN/STDOUT */ FILE hRetarget = { _STREAM_RW, 0, retarget_get_char, retarget_put_char, NULL, NULL }; #endif #endif //RETARGET