We are running a survey to help us improve the experience for all of our members. If you see the survey appear, please take the time to tell us about your experience if you can.
HI,I Want use gun in keil.now,Can't output debug log to uart.I have implement fputc like this: int fputc(int ch, FILE *f) { if (s_debugInit) { UART_SendData(DEBUG_UART, ch); } return ch; } but when I call printf,don't call fputc function.what's worry?Thanks for your help!
I have add syscalls.c in my keil project.
syscalls.c
#include <stdlib.h> #include <errno.h> #include <string.h> #include <sys/stat.h> #include <sys/types.h>
/***************************************************************************/
int _read_r (struct _reent *r, int file, char * ptr, int len) { r = r; file = file; ptr = ptr; len = len;
errno = EINVAL; return -1; }
int _lseek_r (struct _reent *r, int file, int ptr, int dir) { r = r; file = file; ptr = ptr; dir = dir;
return 0; }
int _write_r (struct _reent *r, int file, char * ptr, int len) { r = r; file = file; ptr = ptr;
#if 0 int index;
/* For example, output string by UART */ for(index=0; index<len; index++) { if (ptr[index] == '\n') { uart_putc('\r'); }
uart_putc(ptr[index]); } #endif
return len; }
int _close_r (struct _reent *r, int file) { return 0; }
/* Register name faking - works in collusion with the linker. */ register char * stack_ptr asm ("sp");
caddr_t _sbrk_r (struct _reent *r, int incr) { extern char end asm ("end"); /* Defined by the linker. */ static char * heap_end; char * prev_heap_end;
if (heap_end == NULL) heap_end = & end;
prev_heap_end = heap_end;
if (heap_end + incr > stack_ptr) { /* Some of the libstdc++-v3 tests rely upon detecting out of memory errors, so do not abort here. */ #if 0 extern void abort (void);
_write (1, "_sbrk: Heap and stack collision\n", 32);
abort (); #else errno = ENOMEM; return (caddr_t) -1; #endif }
heap_end += incr;
return (caddr_t) prev_heap_end; }
int _fstat_r (struct _reent *r, int file, struct stat * st) { r = r; file = file;
memset (st, 0, sizeof (* st)); st->st_mode = S_IFCHR; return 0; }
int _isatty_r(struct _reent *r, int fd) { r = r; fd = fd;
return 1; }
/*** EOF ***/
Please try reading the instructions about posting source code again.
Does it call _write_r() ? What part? Does UART_SendData() expect you wait on TXE? Normally GNU/GCC wants you to output to UART via _write()
int _read (int file, char *ptr, int len) { int DataIdx; for (DataIdx = 0; DataIdx < len; DataIdx++) { *ptr++ = __io_getchar(); } return len; } int _write(int file, char *ptr, int len) { int DataIdx; for (DataIdx = 0; DataIdx < len; DataIdx++) { __io_putchar(*ptr++); } return len; }
Where you implement the specifically targeted __io_ functions