该程序是一个支持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; }

STM32F103单片机C语言程序:GNU libc支持库分析

原文地址: https://www.cveoy.top/t/topic/n1Vq 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录