diff syscalls.c @ 0:c59513fd84fb

Initial commit of STM32 test code.
author Daniel O'Connor <darius@dons.net.au>
date Mon, 03 Oct 2011 21:19:15 +1030
parents
children 74e9b3baac1e
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/syscalls.c	Mon Oct 03 21:19:15 2011 +1030
@@ -0,0 +1,120 @@
+/*
+ * syscalls.c
+ *
+ *  Created on: 03.12.2009
+ *      Author: Martin Thomas, 3BSD license
+ */
+
+//#define SBRK_VERBOSE 1
+
+#include <stdio.h>
+#include <reent.h>
+#include <errno.h>
+#include <stdlib.h> /* abort */
+#include <sys/types.h>
+#include <sys/stat.h>
+
+#include "comm.h"
+#include "stm32f10x.h" /* for _get_PSP() from core_cm3.h*/
+
+#undef errno
+extern int errno;
+
+int
+_kill(int pid, int sig) {
+    pid = pid; sig = sig; /* avoid warnings */
+    errno = EINVAL;
+    return -1;
+}
+
+void _exit(int status) {
+    printf("_exit called with parameter %d\n", status);
+    while(1)
+	;
+}
+
+int
+_getpid(void) {
+    return 1;
+}
+
+
+extern char _end; /* Defined by the linker */
+static char *heap_end;
+
+char *
+get_heap_end(void) {
+    return (char*) heap_end;
+}
+
+char *
+get_stack_top(void) {
+    return (char*) __get_MSP();
+    //return (char*) __get_PSP();
+}
+
+caddr_t
+_sbrk(int incr) {
+    char *prev_heap_end;
+#if SBRK_VERBOSE
+    printf("_sbrk called with incr %d\n", incr);
+#endif
+    if (heap_end == 0) {
+	heap_end = &_end;
+    }
+    prev_heap_end = heap_end;
+#if 1
+    if (heap_end + incr > get_stack_top()) {
+	printf("Heap and stack collision\n");
+	abort();
+    }
+#endif
+    heap_end += incr;
+    return (caddr_t) prev_heap_end;
+}
+
+int
+_close(int file) {
+    file = file; /* avoid warning */
+    return -1;
+}
+
+int
+_fstat(int file, struct stat *st) {
+    file = file; /* avoid warning */
+    st->st_mode = S_IFCHR;
+    return 0;
+}
+
+int
+_isatty(int file) {
+    file = file; /* avoid warning */
+    return 1;
+}
+
+int
+_lseek(int file, int ptr, int dir) {
+    file = file; /* avoid warning */
+    ptr = ptr; /* avoid warning */
+    dir = dir; /* avoid warning */
+    return 0;
+}
+
+int
+_read(int file, char *ptr, int len) {
+    file = file; /* avoid warning */
+    ptr = ptr; /* avoid warning */
+    len = len; /* avoid warning */
+    return 0;
+}
+
+int
+_write(int file, char *ptr, int len) {
+    int todo;
+    
+    file = file; /* avoid warning */
+    for (todo = 0; todo < len; todo++) {
+	comm_put(*ptr++);
+    }
+    return len;
+}