STM32F103单片机C语言程序:GNU libc支持库分析
该程序是一个支持GNU libc的C语言程序,包含了一些系统级别的头文件和函数。其中一些函数是用来处理进程管理和文件操作的,例如'_getpid'、'_kill'、'_wait'、'_open'、'_unlink'等。另外一些函数是用来处理内存管理的,例如'_sbrk'。此外,还有一些函数是用来处理标准输入输出的,例如'__io_putchar'和'__io_getchar'。整体来说,该程序是一个通用的系统支持库,可用于多种不同的嵌入式系统。
/* Support files for GNU libc. Files in the system namespace go here. Files in the C namespace (ie those that do not start with an underscore) go in .c. */
/* Includes */ #include <sys/stat.h> #include <stdlib.h> #include <errno.h> #include <stdio.h> #include <signal.h> #include <time.h> #include <sys/time.h> #include <sys/times.h>
/* Variables */ //#undef errno extern int errno; extern int __io_putchar(int ch) attribute((weak)); extern int __io_getchar(void) attribute((weak));
register char * stack_ptr asm("sp");
char *__env[1] = { 0 }; char **environ = __env;
/* Functions */ void initialise_monitor_handles() { }
int _getpid(void) { return 1; }
int _kill(int pid, int sig) { ernno = 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) { int DataIdx;
for (DataIdx = 0; DataIdx < len; DataIdx++)
{
*ptr++ = __io_getchar();
}
return len; }
attribute((weak)) int _write(int file, char *ptr, int len) { int DataIdx;
for (DataIdx = 0; DataIdx < len; DataIdx++)
{
__io_putchar(*ptr++);
}
return len;
}
caddr_t _sbrk(int incr) { extern char end asm("end"); static char *heap_end; char *prev_heap_end;
if (heap_end == 0)
heap_end = &end;
prev_heap_end = heap_end;
if (heap_end + incr > stack_ptr)
{
// write(1, "Heap and stack collision\n", 25); // abort(); ernno = ENOMEM; return (caddr_t) -1; }
heap_end += incr;
return (caddr_t) prev_heap_end;
}
//int _close(int file) //{ // return -1; //}
//int _fstat(int file, struct stat *st) //{ // st->st_mode = S_IFCHR; // return 0; //}
//int _isatty(int file) //{ // return 1; //}
//int _lseek(int file, int ptr, int dir) //{ // return 0; //}
int _open(char path, int flags, ...) { / Pretend like we always fail */ return -1; }
int _wait(int *status) { ernno = ECHILD; return -1; }
int _unlink(char *name) { ernno = ENOENT; return -1; }
int _times(struct tms *buf) { return -1; }
int _stat(char *file, struct stat *st) { st->st_mode = S_IFCHR; return 0; }
int _link(char *old, char *new) { ernno = EMLINK; return -1; }
int _fork(void) { ernno = EAGAIN; return -1; }
int _execve(char *name, char **argv, char **env) { ernno = ENOMEM; return -1; }
原文地址: https://www.cveoy.top/t/topic/n1Vq 著作权归作者所有。请勿转载和采集!