/** ****************************************************************************** * @file syscalls.c * @author Auto-generated by STM32CubeMX * @brief Minimal System calls file * * For more information about which c-functions * need which of these lowlevel functions * please consult the Newlib or Picolibc libc-manual ****************************************************************************** * @attention * * Copyright (c) 2020-2025 STMicroelectronics. * All rights reserved. * * This software is licensed under terms that can be found in the LICENSE file * in the root directory of this software component. * If no LICENSE file comes with this software, it is provided AS-IS. * ****************************************************************************** */ /* Includes */ #include #include #include #include #include #include #include #include /* Variables */ extern int __io_putchar(int ch) __attribute__((weak)); extern int __io_getchar(void) __attribute__((weak)); char *__env[1] = { 0 }; char **environ = __env; /* Functions */ void initialise_monitor_handles() { } int _getpid(void) { return 1; } int _kill(int pid, int sig) { (void)pid; (void)sig; errno = EINVAL; return -1; } void _exit (int status) { _kill(status, -1); while (1) {} /* Make sure we hang here */ } __attribute__((weak)) int _read(int file, char *ptr, int len) { (void)file; int DataIdx; for (DataIdx = 0; DataIdx < len; DataIdx++) { *ptr++ = __io_getchar(); } return len; } __attribute__((weak)) int _write(int file, char *ptr, int len) { (void)file; int DataIdx; for (DataIdx = 0; DataIdx < len; DataIdx++) { __io_putchar(*ptr++); } return len; } int _close(int file) { (void)file; return -1; } int _fstat(int file, struct stat *st) { (void)file; st->st_mode = S_IFCHR; return 0; } int _isatty(int file) { (void)file; return 1; } int _lseek(int file, int ptr, int dir) { (void)file; (void)ptr; (void)dir; return 0; } int _open(char *path, int flags, ...) { (void)path; (void)flags; /* Pretend like we always fail */ return -1; } int _wait(int *status) { (void)status; errno = ECHILD; return -1; } int _unlink(char *name) { (void)name; errno = ENOENT; return -1; } clock_t _times(struct tms *buf) { (void)buf; return -1; } int _stat(const char *file, struct stat *st) { (void)file; st->st_mode = S_IFCHR; return 0; } int _link(char *old, char *new) { (void)old; (void)new; errno = EMLINK; return -1; } int _fork(void) { errno = EAGAIN; return -1; } int _execve(char *name, char **argv, char **env) { (void)name; (void)argv; (void)env; errno = ENOMEM; return -1; } // --- Picolibc Specific Section --- #if defined(__PICOLIBC__) /** * @brief Picolibc helper function to output a character to a FILE stream. * This redirects the output to the low-level __io_putchar function. * @param c Character to write. * @param file FILE stream pointer (ignored). * @retval int The character written. */ static int starm_putc(char c, FILE *file) { (void) file; __io_putchar(c); return c; } /** * @brief Picolibc helper function to input a character from a FILE stream. * This redirects the input from the low-level __io_getchar function. * @param file FILE stream pointer (ignored). * @retval int The character read, cast to an unsigned char then int. */ static int starm_getc(FILE *file) { unsigned char c; (void) file; c = __io_getchar(); return c; } // Define and initialize the standard I/O streams for Picolibc. // FDEV_SETUP_STREAM connects the starm_putc and starm_getc helper functions to a FILE structure. // _FDEV_SETUP_RW indicates the stream is for reading and writing. static FILE __stdio = FDEV_SETUP_STREAM(starm_putc, starm_getc, NULL, _FDEV_SETUP_RW); // Assign the standard stream pointers (stdin, stdout, stderr) to the initialized stream. // Picolibc uses these pointers for standard I/O operations (printf, scanf, etc.). FILE *const stdin = &__stdio; __strong_reference(stdin, stdout); __strong_reference(stdin, stderr); // Create strong aliases mapping standard C library function names (without underscore) // to the implemented system call stubs (with underscore). Picolibc uses these // standard names internally, so this linking is required. __strong_reference(_read, read); __strong_reference(_write, write); __strong_reference(_times, times); __strong_reference(_execve, execve); __strong_reference(_fork, fork); __strong_reference(_link, link); __strong_reference(_unlink, unlink); __strong_reference(_stat, stat); __strong_reference(_wait, wait); __strong_reference(_open, open); __strong_reference(_close, close); __strong_reference(_lseek, lseek); __strong_reference(_isatty, isatty); __strong_reference(_fstat, fstat); __strong_reference(_exit, exit); __strong_reference(_kill, kill); __strong_reference(_getpid, getpid); #endif //__PICOLIBC__