From eaef0cfffad5d400dfa69429e0fd3b19c3cd82b8 Mon Sep 17 00:00:00 2001 From: tkl Date: Sun, 21 Aug 2016 13:12:03 +0200 Subject: [PATCH] startup code etc. --- Makefile | 31 +- config/make/rules.mk | 32 +- config/make/stm32f4xx.mk | 102 +- source/application/main.c | 4 +- source/os/debug/include/board_devices.h | 16 - source/os/debug/include/driver.h | 37 - source/os/debug/include/kernel.h | 64 - source/os/debug/include/list.h | 25 - source/os/debug/include/queue.h | 26 - source/os/debug/include/shell.h | 23 - source/os/debug/include/stack.h | 8 - ...ibkosmos-arm-stm32f4-discovery-0.1.1-dbg.a | Bin 486606 -> 0 bytes .../libkosmos-arm-stm32f4-discovery-dbg.a | 1 - source/system/stm32f4xx/ExceptionHandlers.h | 94 ++ source/system/stm32f4xx/_cxx.cpp | 50 + source/system/stm32f4xx/_exit.c | 59 + source/system/stm32f4xx/_sbrk.c | 65 + source/system/stm32f4xx/_startup.c | 327 +++++ source/system/stm32f4xx/_syscalls.c | 1219 +++++++++++++++++ source/system/stm32f4xx/assert.c | 55 + source/system/stm32f4xx/vectors_stm32f407xx.c | 335 +++++ .../test/firmware/kernel/ringbuffer/Makefile | 42 - source/test/firmware/kernel/ringbuffer/cpu.h | 14 - .../kernel/ringbuffer/cunit_ringbuffer.c | 67 - 24 files changed, 2284 insertions(+), 412 deletions(-) delete mode 100644 source/os/debug/include/board_devices.h delete mode 100644 source/os/debug/include/driver.h delete mode 100644 source/os/debug/include/kernel.h delete mode 100644 source/os/debug/include/list.h delete mode 100644 source/os/debug/include/queue.h delete mode 100644 source/os/debug/include/shell.h delete mode 100644 source/os/debug/include/stack.h delete mode 100644 source/os/debug/libkosmos-arm-stm32f4-discovery-0.1.1-dbg.a delete mode 120000 source/os/debug/libkosmos-arm-stm32f4-discovery-dbg.a create mode 100644 source/system/stm32f4xx/ExceptionHandlers.h create mode 100644 source/system/stm32f4xx/_cxx.cpp create mode 100644 source/system/stm32f4xx/_exit.c create mode 100644 source/system/stm32f4xx/_sbrk.c create mode 100644 source/system/stm32f4xx/_startup.c create mode 100644 source/system/stm32f4xx/_syscalls.c create mode 100644 source/system/stm32f4xx/assert.c create mode 100644 source/system/stm32f4xx/vectors_stm32f407xx.c delete mode 100755 source/test/firmware/kernel/ringbuffer/Makefile delete mode 100755 source/test/firmware/kernel/ringbuffer/cpu.h delete mode 100755 source/test/firmware/kernel/ringbuffer/cunit_ringbuffer.c diff --git a/Makefile b/Makefile index d435fa4..3c9a7df 100755 --- a/Makefile +++ b/Makefile @@ -8,36 +8,26 @@ MAINFILE = $(EXE_DIR)/$(APP)$(ELF_EXT) BINFILE = $(EXE_DIR)/$(APP)$(BIN_EXT) HEXFILE = $(EXE_DIR)/$(APP)$(HEX_EXT) SIZEFILE = $(SIZE_DIR)/$(APP)$(SIZE_EXT) - +MAP_FILE = $(MAP_DIR)/$(APP)$(MAP_EXT) INCLUDES += $(SRC_DIR) -SUB_FOLDER := -CHECK_FOLDER := SOURCES := $(wildcard $(SRC_DIR)/*.c) -ASM_SOURCES := $(wildcard $(SRC_DIR)/*.s) OBJECTS = $(SOURCES:$(ROOT_DIR)/%.c=$(OBJ_DIR)/%.o) -ASM_OBJECTS = $(ASMSOURCES:$(ROOT_DIR)/%.s=$(OBJ_DIR)/%.o) DEPS = $(SOURCES:$(ROOT_DIR)/%.c=$(OBJ_DIR)/%.d) #include subfolders include source/application/application.mk SOURCES += $(foreach folder, $(SUB_FOLDER), $(wildcard $(ROOT_DIR)/$(folder)/*.c)) -CHECKSOURCES += $(foreach folder, $(CHECK_FOLDER), $(wildcard $(ROOT_DIR)/$(folder)/*.c)) -ASMSOURCES += $(foreach folder, $(SUB_FOLDER), $(wildcard $(ROOT_DIR)/$(folder)/*.s)) -all: check $(MAINFILE) +all: $(MAINFILE) -check: - $(CPPCHECK) $(CPPCHECK_FLAGS) $(CHECKSOURCES) - - -$(MAINFILE): $(OBJECTS) $(ASM_OBJECTS) +$(MAINFILE): $(OBJECTS) @$(MKDIR) $(EXE_DIR) @$(MKDIR) $(MAP_DIR) @$(MKDIR) $(SIZE_DIR) - $(CC) $(CFLAGS) -L$(LIB_DIR) $(LDFLAGS) -o $(MAINFILE) $(OBJECTS) $(ASM_OBJECTS) $(addprefix -l, $(LIBS)) + $(CXX) $(GEN_FLAGS) $(L_FLAGS) -L$(LIB_DIR) -Wl,-Map,"$(MAP_FILE)" -o "$(MAINFILE)" $(OBJECTS) $(addprefix -l, $(LIBS)) $(OBJCOPY) $(MAINFILE) -O binary $(BINFILE) $(OBJCOPY) $(MAINFILE) -O ihex $(HEXFILE) $(NM) --size-sort --print-size $(MAINFILE) > $(SIZEFILE) @@ -48,13 +38,8 @@ $(MAINFILE): $(OBJECTS) $(ASM_OBJECTS) $(OBJ_DIR)/%.o: $(ROOT_DIR)/%.c @$(MKDIR) $(OBJ_DIR) @$(foreach folder, $(SUB_FOLDER), $(shell mkdir -p $(OBJ_DIR)/$(folder))) - $(call makedep,$<,$@,$(subst .o,.d,$@)) - $(CC) $(CFLAGS) -c $< -o $@ - -$(OBJ_DIR)/%.o: $(ROOT_DIR)/%.s - @$(MKDIR) $(OBJ_DIR) - @$(foreach folder, $(SUB_FOLDER), $(shell mkdir -p $(OBJ_DIR)/$(folder))) - $(CC) $(CFLAGS) -c $< -o $@ + $(call makedep,$<,$@,$(subst .o,.d,$@),$(GEN_FLAGS) $(C_FLAGS)) + $(CC) $(GEN_FLAGS) $(C_FLAGS) -c -o "$@" "$<" clean: $(foreach folder, $(SUB_FOLDER), $(shell rm -f $(OBJ_DIR)/$(folder)/*.o)) @@ -73,10 +58,6 @@ install: all $(PRE_PROGRAM) $(PROGRAM) -doc: - @$(MKDIR) $(DOC_DIR) - (cat $(DOXYFILE) ; echo "INPUT=$(DOC_SRC)" ; echo "OUTPUT_DIRECTORY=$(DOC_DIR)") | doxygen - - ifneq "$(MAKECMDGOALS)" "clean" -include $(DEPS) else diff --git a/config/make/rules.mk b/config/make/rules.mk index f09f8a2..c12c972 100755 --- a/config/make/rules.mk +++ b/config/make/rules.mk @@ -12,18 +12,6 @@ LIB_DIR += $(SRC_DIR)/os/$(DBG_REL_DIR) OS_LIB = kosmos-$(ARCH)-$(BOARD)$(DBG_EXT) LIBS += $(OS_LIB) -CFLAGS += \ - -O$(OPTIM) \ - $(addprefix -I, $(INCLUDES)) \ - -Wall - -CPPCHECK_FLAGS += \ - --template=gcc \ - --error-exitcode=1 \ - --enable=warning,performance,information,style \ - --inline-suppr \ - $(addprefix -I, $(INCLUDES)) - include $(ROOT_DIR)/config/make/tools.mk SRC_DIR = $(ROOT_DIR)/source @@ -48,23 +36,15 @@ HEX_EXT = .hex LIB_EXT = .a SIZE_EXT = .size TEST_EXT = +MAP_EXT = .map DOXYFILE=$(ROOT_DIR)/config/doxygen/Doxyfile define makedep - $(CC) -MM \ - -MF $3 \ - -MP \ - -MT $2 \ - $(CFLAGS) \ - $1 -endef - -define maketestdep - $(NATIVE_CC) -MM \ - -MF $3 \ - -MP \ - -MT $2 \ - $(TEST_CFLAGS) \ + $(CC) -MM \ + -MF $3 \ + -MP \ + -MT $2 \ + $4 \ $1 endef diff --git a/config/make/stm32f4xx.mk b/config/make/stm32f4xx.mk index 83791ec..7394a12 100644 --- a/config/make/stm32f4xx.mk +++ b/config/make/stm32f4xx.mk @@ -6,53 +6,81 @@ endif ifeq ($(BOARD), stm32f4-discovery) CFLAGS += -DBOARD_STM32F4_DISCOVERY endif -CROSS_COMPILE=arm-none-eabi- +CROSS_COMPILE ?= arm-none-eabi- + +INCLUDES += source/system/stm32f4xx +SUB_FOLDER += source/system/stm32f4xx INCLUDES += \ - /opt/arm-2011.09/arm-none-eabi/include \ - /opt/arm-2011.09/lib/gcc/arm-none-eabi/4.6.1/include + /opt/gcc-arm-none-eabi-5_4-2016q2/arm-none-eabi/include \ + /opt/gcc-arm-none-eabi-5_4-2016q2/lib/gcc/arm-none-eabi/5.4.1/include + +GEN_FLAGS += \ + -mcpu=cortex-m4 \ + -mthumb \ + -mfloat-abi=hard \ + -mfpu=fpv4-sp-d16 \ + -O$(OPTIM) \ + -fmessage-length=0 \ + -fsigned-char \ + -ffunction-sections \ + -fdata-sections \ + -ffreestanding \ + -fno-move-loop-invariants \ + -Werror \ + -Wunused \ + -Wuninitialized \ + -Wall \ + -Wextra \ + -Wmissing-declarations \ + -Wconversion \ + -Wpointer-arith \ + -Wpadded \ + -Wshadow \ + -Wlogical-op \ + -Waggregate-return \ + -Wfloat-equal + +C_FLAGS += \ + -DDEBUG \ + -DUSE_FULL_ASSERT \ + -DTRACE \ + -DOS_USE_TRACE_SEMIHOSTING_DEBUG \ + -DSTM32F407xx \ + -DUSE_HAL_DRIVER \ + -DHSE_VALUE=8000000 \ + $(addprefix -I, $(INCLUDES)) \ + -std=gnu11 \ + -Wmissing-prototypes \ + -Wstrict-prototypes \ + -Wbad-function-cast \ + -Wno-bad-function-cast \ + -Wno-conversion \ + -Wno-sign-conversion \ + -Wno-unused-parameter \ + -Wno-sign-compare \ + -Wno-missing-prototypes \ + -Wno-missing-declarations + +L_FLAGS := \ + -T mem.ld \ + -T libs.ld \ + -T sections.ld \ + -nostartfiles \ + -Xlinker --gc-sections \ + -L"config/linker" \ + --specs=nano.specs +# --specs=nosys.specs ifeq ($(DEBUG),y) -OPTIM = 0 -CFLAGS += -g +OPTIM = g +GEN_FLAGS += -g3 DBG_EXT = -dbg else OPTIM = s -LDFLAGS += -s DBG_EXT = endif -CFLAGS += \ - -mthumb \ - -T $(ROOT_DIR)/config/linker/stm32_flash.ld \ - -D USE_STDPERIPH_DRIVER\ - -D VECT_TAB_FLASH\ - -D GCC_ARMCM4\ - -D THUMB_INTERWORK\ - -D PACK_STRUCT_END=__attribute\(\(packed\)\)\ - -D ALIGN_STRUCT_END=__attribute\(\(aligned\(4\)\)\)\ - -mcpu=cortex-m4 \ - -mfpu=fpv4-sp-d16 \ - -mfloat-abi=softfp \ - -fdata-sections \ - -ffunction-sections -# -D inline= -mthumb\ - -CPPCHECK_FLAGS += \ - -D USE_STDPERIPH_DRIVER\ - -D VECT_TAB_FLASH\ - -D GCC_ARMCM4\ - -D THUMB_INTERWORK\ - -D PACK_STRUCT_END=__attribute\(\(packed\)\)\ - -D ALIGN_STRUCT_END=__attribute\(\(aligned\(4\)\)\)\ - -D __thumb__ \ - --check-config - -LDFLAGS=\ - -Wl,--gc-sections \ - -Xlinker -M > $(MAP_DIR)/$(APP).map - -ASFLAGS=-mapcs-32 -g ARFLAGS=rcs OOCD_IMAGE=$(BINFILE) diff --git a/source/application/main.c b/source/application/main.c index fc7f263..4544360 100644 --- a/source/application/main.c +++ b/source/application/main.c @@ -17,7 +17,9 @@ int main(void) shell_init(&uart_1); shell_commands_init(); - schedule_start(); + while(1) { + sleep_ms(1000); + } return 0; } diff --git a/source/os/debug/include/board_devices.h b/source/os/debug/include/board_devices.h deleted file mode 100644 index ec42636..0000000 --- a/source/os/debug/include/board_devices.h +++ /dev/null @@ -1,16 +0,0 @@ -/* Board devices include file */ - -#ifndef BOARD_DEVICES_H -#define BOARD_DEVICES_H - -extern const struct driver gpio_c0; -extern const struct driver gpio_c1; -extern const struct driver gpio_c2; -extern const struct driver gpio_c3; -extern const struct driver pwm_4; -extern const struct driver pwm_3; -extern const struct driver pwm_2; -extern const struct driver pwm_1; -extern const struct driver uart_1; - -#endif /* BOARD_DEVICES_H */ diff --git a/source/os/debug/include/driver.h b/source/os/debug/include/driver.h deleted file mode 100644 index e91349d..0000000 --- a/source/os/debug/include/driver.h +++ /dev/null @@ -1,37 +0,0 @@ -/* - * driver.h - * - * Created on: Jul 27, 2016 - * Author: tkl - */ - -#ifndef SOURCE_FIRMWARE_KERNEL_DRIVER_INCLUDE_DRIVER_H_ -#define SOURCE_FIRMWARE_KERNEL_DRIVER_INCLUDE_DRIVER_H_ - -#define IOCTL_PWM_SET_DUTY_CYCLE 0 - -enum driver_type { - DRIVER_TYPE_ADC, - DRIVER_TYPE_GPIO, - DRIVER_TYPE_I2C, - DRIVER_TYPE_PWM, - DRIVER_TYPE_RTC, - DRIVER_TYPE_SPI, - DRIVER_TYPE_UART -}; - -#pragma pack(push) -#pragma pack(1) -struct driver { - enum driver_type driver_type; - const void *device_driver; -}; -#pragma pack(pop) - -int drv_open(const struct driver *driver); -int drv_close(const struct driver *driver); -int drv_read(const struct driver *driver, char *buffer, int len); -int drv_write(const struct driver *driver, const char *buffer, int len); -int drv_ioctl(const struct driver *driver, unsigned int cmd, const void *data); - -#endif /* SOURCE_FIRMWARE_KERNEL_DRIVER_INCLUDE_DRIVER_H_ */ diff --git a/source/os/debug/include/kernel.h b/source/os/debug/include/kernel.h deleted file mode 100644 index e69f607..0000000 --- a/source/os/debug/include/kernel.h +++ /dev/null @@ -1,64 +0,0 @@ -/* - * kernel.h - * - * Created on: Jul 28, 2016 - * Author: tkl - */ - -#ifndef SOURCE_FIRMWARE_KERNEL_INTERFACE_KERNEL_H_ -#define SOURCE_FIRMWARE_KERNEL_INTERFACE_KERNEL_H_ - -void schedule_start(void); - -enum thread_priority { - THREAD_PRIO_IDLE = 0, - THREAD_PRIO_LOW, - THREAD_PRIO_MEDIUM, - THREAD_PRIO_HIGH -}; - -enum thread_status { - THREAD_STATUS_INIT = 0, - THREAD_STATUS_EXECUTING, - THREAD_STATUS_WAITING, - THREAD_STATUS_SLEEPING, - THREAD_STATUS_BLOCKING -}; - -#pragma pack(push) -#pragma pack(1) -struct thread_context { - stack_t *sp; /**< thread's stack pointer */ - stack_t *stack; /**< thread's stack start address */ - unsigned int stack_size; /**< thread's stack size */ - unsigned int pid; /**< thread's process id */ - enum thread_priority priority; /**< thread's priority */ - enum thread_status status; /**< thread's status */ - unsigned long next_executing_time; - void *wakeup_blocking_source; - struct queue_node sem_queue_node; -}; -#pragma pack(pop) - -struct kernel_version { - unsigned int kernel_version; - unsigned int major_version; - unsigned int minor_version; - unsigned int build_number; -}; - -int get_kernel_version(struct kernel_version *version); - -struct thread_context *thread_create( - struct thread_context *thread, - stack_t *stack, - unsigned int stack_size, - void (*thread_func)(void *), - void *arg, - enum thread_priority priority); - - -void thread_exit(void); -void sleep_ms(unsigned int ms); - -#endif /* SOURCE_FIRMWARE_KERNEL_INTERFACE_KERNEL_H_ */ diff --git a/source/os/debug/include/list.h b/source/os/debug/include/list.h deleted file mode 100644 index f26b4fe..0000000 --- a/source/os/debug/include/list.h +++ /dev/null @@ -1,25 +0,0 @@ -/* - * list.h - * - * Created on: Jul 27, 2016 - * Author: tkl - */ - -#ifndef SOURCE_FIRMWARE_KERNEL_LIST_H_ -#define SOURCE_FIRMWARE_KERNEL_LIST_H_ - -struct list_node { - struct list_node *next; - unsigned int data; -}; - -struct list { - struct list_node *front; - struct list_node *rear; -}; - -int list_init(struct list *head); -int list_add(struct list *head, struct list_node *node); -int list_get_len(struct list *head); - -#endif /* SOURCE_FIRMWARE_KERNEL_LIST_H_ */ diff --git a/source/os/debug/include/queue.h b/source/os/debug/include/queue.h deleted file mode 100644 index 996ef90..0000000 --- a/source/os/debug/include/queue.h +++ /dev/null @@ -1,26 +0,0 @@ -/* - * queue.h - * - * Created on: Oct 25, 2015 - * Author: tkl - */ - -#ifndef QUEUE_H_ -#define QUEUE_H_ - -struct queue_node { - struct queue_node *next; - unsigned int data; -}; - -struct queue { - struct queue_node *front; - struct queue_node *rear; -}; - -int queue_init(struct queue *head); -int queue_push(struct queue *head, struct queue_node *node); -int queue_pop(struct queue *head, struct queue_node *node); -bool queue_is_empty(struct queue *head); - -#endif /* QUEUE_H_ */ diff --git a/source/os/debug/include/shell.h b/source/os/debug/include/shell.h deleted file mode 100644 index c242e8d..0000000 --- a/source/os/debug/include/shell.h +++ /dev/null @@ -1,23 +0,0 @@ -/* - * shell.h - * - * Created on: Aug 1, 2016 - * Author: tkl - */ - -#ifndef SOURCE_FIRMWARE_KERNEL_INTERFACE_SHELL_H_ -#define SOURCE_FIRMWARE_KERNEL_INTERFACE_SHELL_H_ - -typedef void *(*command_callback)(const char*); - -struct command { - const char *command; - const char *description; - const command_callback command_callback; - struct list_node item; -}; - -int shell_init(const struct driver *shell_device); -int shell_add_command(struct command *command); - -#endif /* SOURCE_FIRMWARE_KERNEL_INTERFACE_SHELL_H_ */ diff --git a/source/os/debug/include/stack.h b/source/os/debug/include/stack.h deleted file mode 100644 index b792758..0000000 --- a/source/os/debug/include/stack.h +++ /dev/null @@ -1,8 +0,0 @@ -/* Stack include file */ - -#ifndef STACK_H -#define STACK_H - -typedef uint32_t stack_t; - -#endif /* STACK_H */ diff --git a/source/os/debug/libkosmos-arm-stm32f4-discovery-0.1.1-dbg.a b/source/os/debug/libkosmos-arm-stm32f4-discovery-0.1.1-dbg.a deleted file mode 100644 index 89d74e5e097edf314f2f7f44163dec44ff548785..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 486606 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 z

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 nI|tKg5oMZ^2jb7dgZc^MPlsVSm|vFF + +#if defined(DEBUG) +#define __DEBUG_BKPT() asm volatile ("bkpt 0") +#endif + +// ---------------------------------------------------------------------------- + +#if defined(__cplusplus) +extern "C" +{ +#endif + +// External references to cortexm_handlers.c + + extern void + Reset_Handler (void); + extern void + NMI_Handler (void); + extern void + HardFault_Handler (void); + +#if defined(__ARM_ARCH_7M__) || defined(__ARM_ARCH_7EM__) + extern void + MemManage_Handler (void); + extern void + BusFault_Handler (void); + extern void + UsageFault_Handler (void); + extern void + DebugMon_Handler (void); +#endif + + extern void + SVC_Handler (void); + + extern void + PendSV_Handler (void); + extern void + SysTick_Handler (void); + + // Exception Stack Frame of the Cortex-M3 or Cortex-M4 processor. + typedef struct + { + uint32_t r0; + uint32_t r1; + uint32_t r2; + uint32_t r3; + uint32_t r12; + uint32_t lr; + uint32_t pc; + uint32_t psr; +#if defined(__ARM_ARCH_7EM__) + uint32_t s[16]; +#endif + } ExceptionStackFrame; + +#if defined(TRACE) +#if defined(__ARM_ARCH_7M__) || defined(__ARM_ARCH_7EM__) + void + dumpExceptionStack (ExceptionStackFrame* frame, uint32_t cfsr, uint32_t mmfar, + uint32_t bfar, uint32_t lr); +#endif // defined(__ARM_ARCH_7M__) || defined(__ARM_ARCH_7EM__) +#if defined(__ARM_ARCH_6M__) + void + dumpExceptionStack (ExceptionStackFrame* frame, uint32_t lr); +#endif // defined(__ARM_ARCH_6M__) +#endif // defined(TRACE) + + void + HardFault_Handler_C (ExceptionStackFrame* frame, uint32_t lr); + +#if defined(__ARM_ARCH_7M__) || defined(__ARM_ARCH_7EM__) + void + UsageFault_Handler_C (ExceptionStackFrame* frame, uint32_t lr); + void + BusFault_Handler_C (ExceptionStackFrame* frame, uint32_t lr); +#endif // defined(__ARM_ARCH_7M__) || defined(__ARM_ARCH_7EM__) + +#if defined(__cplusplus) +} +#endif + +// ---------------------------------------------------------------------------- + +#endif // CORTEXM_EXCEPTION_HANDLERS_H_ diff --git a/source/system/stm32f4xx/_cxx.cpp b/source/system/stm32f4xx/_cxx.cpp new file mode 100644 index 0000000..efcb451 --- /dev/null +++ b/source/system/stm32f4xx/_cxx.cpp @@ -0,0 +1,50 @@ +// +// This file is part of the µOS++ III distribution. +// Copyright (c) 2014 Liviu Ionescu. +// + +// ---------------------------------------------------------------------------- + +// These functions are redefined locally, to avoid references to some +// heavy implementations in the standard C++ library. + +// ---------------------------------------------------------------------------- + +#include +#include +#include "diag/Trace.h" + +// ---------------------------------------------------------------------------- + +namespace __gnu_cxx +{ + void + __attribute__((noreturn)) + __verbose_terminate_handler(); + + void + __verbose_terminate_handler() + { + trace_puts(__func__); + abort(); + } +} + +// ---------------------------------------------------------------------------- + +extern "C" +{ + void + __attribute__((noreturn)) + __cxa_pure_virtual(); + + void + __cxa_pure_virtual() + { + trace_puts(__func__); + abort(); + } +} + +// ---------------------------------------------------------------------------- + diff --git a/source/system/stm32f4xx/_exit.c b/source/system/stm32f4xx/_exit.c new file mode 100644 index 0000000..fb1d71a --- /dev/null +++ b/source/system/stm32f4xx/_exit.c @@ -0,0 +1,59 @@ +// +// This file is part of the µOS++ III distribution. +// Copyright (c) 2014 Liviu Ionescu. +// + +// ---------------------------------------------------------------------------- + +#include +//#include "diag/Trace.h" + +// ---------------------------------------------------------------------------- + +#if !defined(DEBUG) +extern void +__attribute__((noreturn)) +__reset_hardware(void); +#endif + +// ---------------------------------------------------------------------------- + +// Forward declaration + +void +_exit(int code); + +// ---------------------------------------------------------------------------- + +// On Release, call the hardware reset procedure. +// On Debug we just enter an infinite loop, to be used as landmark when halting +// the debugger. +// +// It can be redefined in the application, if more functionality +// is required. + +void +__attribute__((weak)) +_exit(int code __attribute__((unused))) +{ +#if !defined(DEBUG) + __reset_hardware(); +#endif + + // TODO: write on trace + while (1) + ; +} + +// ---------------------------------------------------------------------------- + +void +__attribute__((weak,noreturn)) +abort(void) +{ +// trace_puts("abort(), exiting..."); + while(1); + _exit(1); +} + +// ---------------------------------------------------------------------------- diff --git a/source/system/stm32f4xx/_sbrk.c b/source/system/stm32f4xx/_sbrk.c new file mode 100644 index 0000000..ac3a8aa --- /dev/null +++ b/source/system/stm32f4xx/_sbrk.c @@ -0,0 +1,65 @@ +// +// This file is part of the µOS++ III distribution. +// Copyright (c) 2014 Liviu Ionescu. +// + +// ---------------------------------------------------------------------------- + +#include +#include + +// ---------------------------------------------------------------------------- + +caddr_t +_sbrk(int incr); + +// ---------------------------------------------------------------------------- + +// The definitions used here should be kept in sync with the +// stack definitions in the linker script. + +caddr_t +_sbrk(int incr) +{ + extern char _Heap_Begin; // Defined by the linker. + extern char _Heap_Limit; // Defined by the linker. + + static char* current_heap_end; + char* current_block_address; + + if (current_heap_end == 0) + { + current_heap_end = &_Heap_Begin; + } + + current_block_address = current_heap_end; + + // Need to align heap to word boundary, else will get + // hard faults on Cortex-M0. So we assume that heap starts on + // word boundary, hence make sure we always add a multiple of + // 4 to it. + incr = (incr + 3) & (~3); // align value to 4 + if (current_heap_end + incr > &_Heap_Limit) + { + // 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 + // Heap has overflowed + errno = ENOMEM; + return (caddr_t) - 1; +#endif + } + + current_heap_end += incr; + + return (caddr_t) current_block_address; +} + +// ---------------------------------------------------------------------------- + diff --git a/source/system/stm32f4xx/_startup.c b/source/system/stm32f4xx/_startup.c new file mode 100644 index 0000000..169538c --- /dev/null +++ b/source/system/stm32f4xx/_startup.c @@ -0,0 +1,327 @@ +// +// This file is part of the µOS++ III distribution. +// Copyright (c) 2014 Liviu Ionescu. +// + +// ---------------------------------------------------------------------------- + +// This module contains the startup code for a portable embedded +// C/C++ application, built with newlib. +// +// Control reaches here from the reset handler via jump or call. +// +// The actual steps performed by _start are: +// - copy the initialised data region(s) +// - clear the BSS region(s) +// - initialise the system +// - run the preinit/init array (for the C++ static constructors) +// - initialise the arc/argv +// - branch to main() +// - run the fini array (for the C++ static destructors) +// - call _exit(), directly or via exit() +// +// If OS_INCLUDE_STARTUP_INIT_MULTIPLE_RAM_SECTIONS is defined, the +// code is capable of initialising multiple regions. +// +// The normal configuration is standalone, with all support +// functions implemented locally. +// +// For this to be called, the project linker must be configured without +// the startup sequence (-nostartfiles). + +// ---------------------------------------------------------------------------- + +#include +#include + +// ---------------------------------------------------------------------------- + +#if !defined(OS_INCLUDE_STARTUP_GUARD_CHECKS) +#define OS_INCLUDE_STARTUP_GUARD_CHECKS (1) +#endif + +// ---------------------------------------------------------------------------- + +#if !defined(OS_INCLUDE_STARTUP_INIT_MULTIPLE_RAM_SECTIONS) +// Begin address for the initialisation values of the .data section. +// defined in linker script +extern unsigned int _sidata; +// Begin address for the .data section; defined in linker script +extern unsigned int _sdata; +// End address for the .data section; defined in linker script +extern unsigned int _edata; + +// Begin address for the .bss section; defined in linker script +extern unsigned int __bss_start__; +// End address for the .bss section; defined in linker script +extern unsigned int __bss_end__; +#else +// The following symbols are constructs generated by the linker, indicating +// the location of various points in the "Memory regions initialisation arrays". +// These arrays are created by the linker via the managed linker script +// of each RW data mechanism. It contains the load address, execution address +// and length section and the execution and length of each BSS (zero +// initialised) section. +extern unsigned int __data_regions_array_start; +extern unsigned int __data_regions_array_end; +extern unsigned int __bss_regions_array_start; +extern unsigned int __bss_regions_array_end; +#endif + +extern void +__initialize_args (int*, char***); + +// main() is the entry point for newlib based applications. +// By default, there are no arguments, but this can be customised +// by redefining __initialize_args(), which is done when the +// semihosting configurations are used. +extern int +start_application (int argc, char* argv[]); + +// The implementation for the exit routine; for embedded +// applications, a system reset will be performed. +extern void +__attribute__((noreturn)) +_exit (int); + +// ---------------------------------------------------------------------------- + +// Forward declarations + +void +_start (void); + +void +__initialize_data (unsigned int* from, unsigned int* region_begin, + unsigned int* region_end); + +void +__initialize_bss (unsigned int* region_begin, unsigned int* region_end); + +void +__run_init_array (void); + +void +__run_fini_array (void); + +void +__initialize_hardware_early (void); + +void +__initialize_hardware (void); + +// ---------------------------------------------------------------------------- + +inline void +__attribute__((always_inline)) +__initialize_data (unsigned int* from, unsigned int* region_begin, + unsigned int* region_end) +{ + // Iterate and copy word by word. + // It is assumed that the pointers are word aligned. + unsigned int *p = region_begin; + while (p < region_end) + *p++ = *from++; +} + +inline void +__attribute__((always_inline)) +__initialize_bss (unsigned int* region_begin, unsigned int* region_end) +{ + // Iterate and clear word by word. + // It is assumed that the pointers are word aligned. + unsigned int *p = region_begin; + while (p < region_end) + *p++ = 0; +} + +// These magic symbols are provided by the linker. +extern void +(*__preinit_array_start[]) (void) __attribute__((weak)); +extern void +(*__preinit_array_end[]) (void) __attribute__((weak)); +extern void +(*__init_array_start[]) (void) __attribute__((weak)); +extern void +(*__init_array_end[]) (void) __attribute__((weak)); +extern void +(*__fini_array_start[]) (void) __attribute__((weak)); +extern void +(*__fini_array_end[]) (void) __attribute__((weak)); + +// Iterate over all the preinit/init routines (mainly static constructors). +inline void +__attribute__((always_inline)) +__run_init_array (void) +{ + int count; + int i; + + count = __preinit_array_end - __preinit_array_start; + for (i = 0; i < count; i++) + __preinit_array_start[i] (); + + // If you need to run the code in the .init section, please use + // the startup files, since this requires the code in crti.o and crtn.o + // to add the function prologue/epilogue. + //_init(); // DO NOT ENABE THIS! + + count = __init_array_end - __init_array_start; + for (i = 0; i < count; i++) + __init_array_start[i] (); +} + +// Run all the cleanup routines (mainly static destructors). +inline void +__attribute__((always_inline)) +__run_fini_array (void) +{ + int count; + int i; + + count = __fini_array_end - __fini_array_start; + for (i = count; i > 0; i--) + __fini_array_start[i - 1] (); + + // If you need to run the code in the .fini section, please use + // the startup files, since this requires the code in crti.o and crtn.o + // to add the function prologue/epilogue. + //_fini(); // DO NOT ENABE THIS! +} + +#if defined(DEBUG) && (OS_INCLUDE_STARTUP_GUARD_CHECKS) + +// These definitions are used to check if the routines used to +// clear the BSS and to copy the initialised DATA perform correctly. + +#define BSS_GUARD_BAD_VALUE (0xCADEBABA) + +static uint32_t volatile __attribute__ ((section(".bss_begin"))) +__bss_begin_guard; +static uint32_t volatile __attribute__ ((section(".bss_end"))) +__bss_end_guard; + +#define DATA_GUARD_BAD_VALUE (0xCADEBABA) +#define DATA_BEGIN_GUARD_VALUE (0x12345678) +#define DATA_END_GUARD_VALUE (0x98765432) + +static uint32_t volatile __attribute__ ((section(".data_begin"))) +__data_begin_guard = DATA_BEGIN_GUARD_VALUE; + +static uint32_t volatile __attribute__ ((section(".data_end"))) +__data_end_guard = DATA_END_GUARD_VALUE; + +#endif // defined(DEBUG) && (OS_INCLUDE_STARTUP_GUARD_CHECKS) + +// This is the place where Cortex-M core will go immediately after reset, +// via a call or jump from the Reset_Handler. +// +// For the call to work, and for the call to __initialize_hardware_early() +// to work, the reset stack must point to a valid internal RAM area. + +void __attribute__ ((section(".after_vectors"),noreturn,weak)) +_start (void) +{ + + // Initialise hardware right after reset, to switch clock to higher + // frequency and have the rest of the initialisations run faster. + // + // Mandatory on platforms like Kinetis, which start with the watch dog + // enabled and require an early sequence to disable it. + // + // Also useful on platform with external RAM, that need to be + // initialised before filling the BSS section. + + __initialize_hardware_early (); + + // Use Old Style DATA and BSS section initialisation, + // that will manage a single BSS sections. + +#if defined(DEBUG) && (OS_INCLUDE_STARTUP_GUARD_CHECKS) + __data_begin_guard = DATA_GUARD_BAD_VALUE; + __data_end_guard = DATA_GUARD_BAD_VALUE; +#endif + +#if !defined(OS_INCLUDE_STARTUP_INIT_MULTIPLE_RAM_SECTIONS) + // Copy the DATA segment from Flash to RAM (inlined). + __initialize_data(&_sidata, &_sdata, &_edata); +#else + + // Copy the data sections from flash to SRAM. + for (unsigned int* p = &__data_regions_array_start; + p < &__data_regions_array_end;) + { + unsigned int* from = (unsigned int *) (*p++); + unsigned int* region_begin = (unsigned int *) (*p++); + unsigned int* region_end = (unsigned int *) (*p++); + + __initialize_data (from, region_begin, region_end); + } + +#endif + +#if defined(DEBUG) && (OS_INCLUDE_STARTUP_GUARD_CHECKS) + if ((__data_begin_guard != DATA_BEGIN_GUARD_VALUE) + || (__data_end_guard != DATA_END_GUARD_VALUE)) + { + for (;;) + ; + } +#endif + +#if defined(DEBUG) && (OS_INCLUDE_STARTUP_GUARD_CHECKS) + __bss_begin_guard = BSS_GUARD_BAD_VALUE; + __bss_end_guard = BSS_GUARD_BAD_VALUE; +#endif + +#if !defined(OS_INCLUDE_STARTUP_INIT_MULTIPLE_RAM_SECTIONS) + // Zero fill the BSS section (inlined). + __initialize_bss(&__bss_start__, &__bss_end__); +#else + + // Zero fill all bss segments + for (unsigned int *p = &__bss_regions_array_start; + p < &__bss_regions_array_end;) + { + unsigned int* region_begin = (unsigned int*) (*p++); + unsigned int* region_end = (unsigned int*) (*p++); + __initialize_bss (region_begin, region_end); + } +#endif + +#if defined(DEBUG) && (OS_INCLUDE_STARTUP_GUARD_CHECKS) + if ((__bss_begin_guard != 0) || (__bss_end_guard != 0)) + { + for (;;) + ; + } +#endif + + // Hook to continue the initialisations. Usually compute and store the + // clock frequency in the global CMSIS variable, cleared above. + __initialize_hardware (); + + // Get the argc/argv (useful in semihosting configurations). + int argc; + char** argv; + __initialize_args (&argc, &argv); + + // Call the standard library initialisation (mandatory for C++ to + // execute the constructors for the static objects). + __run_init_array (); + + // Call the main entry point, and save the exit code. + int code = start_application (argc, argv); + + // Run the C++ static destructors. + __run_fini_array (); + + _exit (code); + + // Should never reach this, _exit() should have already + // performed a reset. + for (;;) + ; +} + +// ---------------------------------------------------------------------------- diff --git a/source/system/stm32f4xx/_syscalls.c b/source/system/stm32f4xx/_syscalls.c new file mode 100644 index 0000000..3e930c5 --- /dev/null +++ b/source/system/stm32f4xx/_syscalls.c @@ -0,0 +1,1219 @@ +// +// This file is part of the µOS++ III distribution. +// Parts of this file are from the newlib sources, issued under GPL. +// Copyright (c) 2014 Liviu Ionescu +// + +// ---------------------------------------------------------------------------- + +int errno; +void *__dso_handle __attribute__ ((weak)); + +// ---------------------------------------------------------------------------- + +#if !defined(OS_USE_SEMIHOSTING) + +#include <_ansi.h> +#include <_syslist.h> +#include +//#include +#include +#include +#include +#include +#include + +void +__initialize_args(int* p_argc, char*** p_argv); + +// This is the standard default implementation for the routine to +// process args. It returns a single empty arg. +// For semihosting applications, this is redefined to get the real +// args from the debugger. You can also use it if you decide to keep +// some args in a non-volatile memory. + +void __attribute__((weak)) +__initialize_args(int* p_argc, char*** p_argv) +{ + // By the time we reach this, the data and bss should have been initialised. + + // The strings pointed to by the argv array shall be modifiable by the + // program, and retain their last-stored values between program startup + // and program termination. (static, no const) + static char name[] = ""; + + // The string pointed to by argv[0] represents the program name; + // argv[0][0] shall be the null character if the program name is not + // available from the host environment. argv[argc] shall be a null pointer. + // (static, no const) + static char* argv[2] = + { name, NULL }; + + *p_argc = 1; + *p_argv = &argv[0]; + return; +} + +// These functions are defined here to avoid linker errors in freestanding +// applications. They might be called in some error cases from library +// code. +// +// If you detect other functions to be needed, just let us know +// and we'll add them. + +int +raise(int sig __attribute__((unused))) +{ + errno = ENOSYS; + return -1; +} + +int +kill(pid_t pid, int sig); + +int +kill(pid_t pid __attribute__((unused)), int sig __attribute__((unused))) +{ + errno = ENOSYS; + return -1; +} + +#endif // !defined(OS_USE_SEMIHOSTING) + +// ---------------------------------------------------------------------------- + +// If you need the empty definitions, remove the -ffreestanding option. + +#if __STDC_HOSTED__ == 1 + +char* __env[1] = + { 0 }; +char** environ = __env; + +#if !defined(OS_USE_SEMIHOSTING) + +// Forward declarations + +int +_chown(const char* path, uid_t owner, gid_t group); + +int +_close(int fildes); + +int +_execve(char* name, char** argv, char** env); + +int +_fork(void); + +int +_fstat(int fildes, struct stat* st); + +int +_getpid(void); + +int +_gettimeofday(struct timeval* ptimeval, void* ptimezone); + +int +_isatty(int file); + +int +_kill(int pid, int sig); + +int +_link(char* existing, char* _new); + +int +_lseek(int file, int ptr, int dir); + +int +_open(char* file, int flags, int mode); + +int +_read(int file, char* ptr, int len); + +int +_readlink(const char* path, char* buf, size_t bufsize); + +int +_stat(const char* file, struct stat* st); + +int +_symlink(const char* path1, const char* path2); + +clock_t +_times(struct tms* buf); + +int +_unlink(char* name); + +int +_wait(int* status); + +int +_write(int file, char* ptr, int len); + +// Definitions + +int __attribute__((weak)) +_chown(const char* path __attribute__((unused)), + uid_t owner __attribute__((unused)), gid_t group __attribute__((unused))) +{ + errno = ENOSYS; + return -1; +} + +int __attribute__((weak)) +_close(int fildes __attribute__((unused))) +{ + errno = ENOSYS; + return -1; +} + +int __attribute__((weak)) +_execve(char* name __attribute__((unused)), char** argv __attribute__((unused)), + char** env __attribute__((unused))) +{ + errno = ENOSYS; + return -1; +} + +int __attribute__((weak)) +_fork(void) +{ + errno = ENOSYS; + return -1; +} + +int __attribute__((weak)) +_fstat(int fildes __attribute__((unused)), + struct stat* st __attribute__((unused))) +{ + errno = ENOSYS; + return -1; +} + +int __attribute__((weak)) +_getpid(void) +{ + errno = ENOSYS; + return -1; +} + +int __attribute__((weak)) +_gettimeofday(struct timeval* ptimeval __attribute__((unused)), + void* ptimezone __attribute__((unused))) +{ + errno = ENOSYS; + return -1; +} + +int __attribute__((weak)) +_isatty(int file __attribute__((unused))) +{ + errno = ENOSYS; + return 0; +} + +int __attribute__((weak)) +_kill(int pid __attribute__((unused)), int sig __attribute__((unused))) +{ + errno = ENOSYS; + return -1; +} + +int __attribute__((weak)) +_link(char* existing __attribute__((unused)), + char* _new __attribute__((unused))) +{ + errno = ENOSYS; + return -1; +} + +int __attribute__((weak)) +_lseek(int file __attribute__((unused)), int ptr __attribute__((unused)), + int dir __attribute__((unused))) +{ + errno = ENOSYS; + return -1; +} + +int __attribute__((weak)) +_open(char* file __attribute__((unused)), int flags __attribute__((unused)), + int mode __attribute__((unused))) +{ + errno = ENOSYS; + return -1; +} + +int __attribute__((weak)) +_read(int file __attribute__((unused)), char* ptr __attribute__((unused)), + int len __attribute__((unused))) +{ + errno = ENOSYS; + return -1; +} + +int __attribute__((weak)) +_readlink(const char* path __attribute__((unused)), + char* buf __attribute__((unused)), size_t bufsize __attribute__((unused))) +{ + errno = ENOSYS; + return -1; +} + +int __attribute__((weak)) +_stat(const char* file __attribute__((unused)), + struct stat* st __attribute__((unused))) +{ + errno = ENOSYS; + return -1; +} + +int __attribute__((weak)) +_symlink(const char* path1 __attribute__((unused)), + const char* path2 __attribute__((unused))) +{ + errno = ENOSYS; + return -1; +} + +clock_t __attribute__((weak)) +_times(struct tms* buf __attribute__((unused))) +{ + errno = ENOSYS; + return ((clock_t) -1); +} + +int __attribute__((weak)) +_unlink(char* name __attribute__((unused))) +{ + errno = ENOSYS; + return -1; +} + +int __attribute__((weak)) +_wait(int* status __attribute__((unused))) +{ + errno = ENOSYS; + return -1; +} + +int __attribute__((weak)) +_write(int file __attribute__((unused)), char* ptr __attribute__((unused)), + int len __attribute__((unused))) +{ + errno = ENOSYS; + return -1; +} + +// ---------------------------------------------------------------------------- + +#else // defined(OS_USE_SEMIHOSTING) + +// ---------------------------------------------------------------------------- + +/* 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. */ + +#include <_ansi.h> +#include +//#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "arm/semihosting.h" + +int +_kill (int pid, int sig); + +void +__attribute__((noreturn)) +_exit (int status); + +// Forward declarations. +int +_system (const char*); +int +_rename (const char*, const char*); +int +_isatty (int); +clock_t +_times (struct tms*); +int +_gettimeofday (struct timeval *, void*); +int +_unlink (const char*); +int +_link (void); + +int +_stat (const char*, struct stat*); + +int +_fstat (int, struct stat*); +int +_swistat (int fd, struct stat* st); +int +_getpid (int); +int +_close (int); +clock_t +_clock (void); +int +_swiclose (int); +int +_open (const char*, int, ...); +int +_swiopen (const char*, int); +int +_write (int, char*, int); +int +_swiwrite (int, char*, int); +int +_lseek (int, int, int); +int +_swilseek (int, int, int); +int +_read (int, char*, int); +int +_swiread (int, char*, int); + +void +initialise_monitor_handles (void); + +void +__initialize_args (int* p_argc, char*** p_argv); + +static int +checkerror (int); +static int +error (int); +static int +get_errno (void); + +// ---------------------------------------------------------------------------- + +#define ARGS_BUF_ARRAY_SIZE 80 +#define ARGV_BUF_ARRAY_SIZE 10 + +typedef struct +{ + char* pCommandLine; + int size; +} CommandLineBlock; + +void +__initialize_args (int* p_argc, char*** p_argv) +{ + + // Array of chars to receive the command line from the host + static char args_buf[ARGS_BUF_ARRAY_SIZE]; + + // Array of pointers to store the final argv pointers (pointing + // in the above array). + static char* argv_buf[ARGV_BUF_ARRAY_SIZE]; + + int argc = 0; + int isInArgument = 0; + + CommandLineBlock cmdBlock; + cmdBlock.pCommandLine = args_buf; + cmdBlock.size = sizeof(args_buf) - 1; + + int ret = call_host (SEMIHOSTING_SYS_GET_CMDLINE, &cmdBlock); + if (ret == 0) + { + + // In case the host send more than we can chew, limit the + // string to our buffer. + args_buf[ARGS_BUF_ARRAY_SIZE - 1] = '\0'; + + // The command line is a null terminated string + char* p = cmdBlock.pCommandLine; + + int delim = '\0'; + int ch; + + while ((ch = *p) != '\0') + { + if (isInArgument == 0) + { + if (!isblank(ch)) + { + if (argc + >= (int) ((sizeof(argv_buf) / sizeof(argv_buf[0])) - 1)) + break; + + if (ch == '"' || ch == '\'') + { + // Remember the delimiter to search for the + // corresponding terminator + delim = ch; + ++p; // skip the delimiter + ch = *p; + } + // Remember the arg beginning address + argv_buf[argc++] = p; + isInArgument = 1; + } + } + else if (delim != '\0') + { + if ((ch == delim)) + { + delim = '\0'; + *p = '\0'; + isInArgument = 0; + } + } + else if (isblank(ch)) + { + delim = '\0'; + *p = '\0'; + isInArgument = 0; + } + ++p; + } + } + + if (argc == 0) + { + // No args found in string, return a single empty name. + args_buf[0] = '\0'; + argv_buf[0] = &args_buf[0]; + ++argc; + } + + // Must end the array with a null pointer. + argv_buf[argc] = NULL; + + *p_argc = argc; + *p_argv = &argv_buf[0]; + + // temporary here + initialise_monitor_handles (); + + return; +} + +// ---------------------------------------------------------------------------- + +void +_exit (int status) +{ + /* There is only one SWI for both _exit and _kill. For _exit, call + the SWI with the second argument set to -1, an invalid value for + signum, so that the SWI handler can distinguish the two calls. + Note: The RDI implementation of _kill throws away both its + arguments. */ + report_exception ( + status == 0 ? ADP_Stopped_ApplicationExit : ADP_Stopped_RunTimeError); +} + +// ---------------------------------------------------------------------------- + +int __attribute__((weak)) +_kill (int pid __attribute__((unused)), int sig __attribute__((unused))) +{ + errno = ENOSYS; + return -1; +} + +// ---------------------------------------------------------------------------- + +/* Struct used to keep track of the file position, just so we + can implement fseek(fh,x,SEEK_CUR). */ +struct fdent +{ + int handle; + int pos; +}; + +#define MAX_OPEN_FILES 20 + +/* User file descriptors (fd) are integer indexes into + the openfiles[] array. Error checking is done by using + findslot(). + + This openfiles array is manipulated directly by only + these 5 functions: + + findslot() - Translate entry. + newslot() - Find empty entry. + initilise_monitor_handles() - Initialize entries. + _swiopen() - Initialize entry. + _close() - Handle stdout == stderr case. + + Every other function must use findslot(). */ + +static struct fdent openfiles[MAX_OPEN_FILES]; + +static struct fdent* +findslot (int); +static int +newslot (void); + +/* Register name faking - works in collusion with the linker. */ +register char* stack_ptr asm ("sp"); + +/* following is copied from libc/stdio/local.h to check std streams */ +extern void _EXFUN(__sinit,(struct _reent*)); +#define CHECK_INIT(ptr) \ + do \ + { \ + if ((ptr) && !(ptr)->__sdidinit) \ + __sinit (ptr); \ + } \ + while (0) + +static int monitor_stdin; +static int monitor_stdout; +static int monitor_stderr; + +/* Return a pointer to the structure associated with + the user file descriptor fd. */ +static struct fdent* +findslot (int fd) +{ + CHECK_INIT(_REENT); + + /* User file descriptor is out of range. */ + if ((unsigned int) fd >= MAX_OPEN_FILES) + { + return NULL; + } + + /* User file descriptor is open? */ + if (openfiles[fd].handle == -1) + { + return NULL; + } + + /* Valid. */ + return &openfiles[fd]; +} + +/* Return the next lowest numbered free file + structure, or -1 if we can't find one. */ +static int +newslot (void) +{ + int i; + + for (i = 0; i < MAX_OPEN_FILES; i++) + { + if (openfiles[i].handle == -1) + { + break; + } + } + + if (i == MAX_OPEN_FILES) + { + return -1; + } + + return i; +} + +void +initialise_monitor_handles (void) +{ + int i; + + /* Open the standard file descriptors by opening the special + * teletype device, ":tt", read-only to obtain a descriptor for + * standard input and write-only to obtain a descriptor for standard + * output. Finally, open ":tt" in append mode to obtain a descriptor + * for standard error. Since this is a write mode, most kernels will + * probably return the same value as for standard output, but the + * kernel can differentiate the two using the mode flag and return a + * different descriptor for standard error. + */ + + int volatile block[3]; + + block[0] = (int) ":tt"; + block[2] = 3; /* length of filename */ + block[1] = 0; /* mode "r" */ + monitor_stdin = call_host (SEMIHOSTING_SYS_OPEN, (void*) block); + + block[0] = (int) ":tt"; + block[2] = 3; /* length of filename */ + block[1] = 4; /* mode "w" */ + monitor_stdout = call_host (SEMIHOSTING_SYS_OPEN, (void*) block); + + block[0] = (int) ":tt"; + block[2] = 3; /* length of filename */ + block[1] = 8; /* mode "a" */ + monitor_stderr = call_host (SEMIHOSTING_SYS_OPEN, (void*) block); + + /* If we failed to open stderr, redirect to stdout. */ + if (monitor_stderr == -1) + { + monitor_stderr = monitor_stdout; + } + + for (i = 0; i < MAX_OPEN_FILES; i++) + { + openfiles[i].handle = -1; + } + + openfiles[0].handle = monitor_stdin; + openfiles[0].pos = 0; + openfiles[1].handle = monitor_stdout; + openfiles[1].pos = 0; + openfiles[2].handle = monitor_stderr; + openfiles[2].pos = 0; +} + +static int +get_errno (void) +{ + return call_host (SEMIHOSTING_SYS_ERRNO, NULL); +} + +/* Set errno and return result. */ +static int +error (int result) +{ + errno = get_errno (); + return result; +} + +/* Check the return and set errno appropriately. */ +static int +checkerror (int result) +{ + if (result == -1) + { + return error (-1); + } + + return result; +} + +/* fh, is a valid internal file handle. + ptr, is a null terminated string. + len, is the length in bytes to read. + Returns the number of bytes *not* written. */ +int +_swiread (int fh, char* ptr, int len) +{ + int block[3]; + + block[0] = fh; + block[1] = (int) ptr; + block[2] = len; + + return checkerror (call_host (SEMIHOSTING_SYS_READ, block)); +} + +/* fd, is a valid user file handle. + Translates the return of _swiread into + bytes read. */ +int +_read (int fd, char* ptr, int len) +{ + int res; + struct fdent *pfd; + + pfd = findslot (fd); + if (pfd == NULL) + { + errno = EBADF; + return -1; + } + + res = _swiread (pfd->handle, ptr, len); + + if (res == -1) + { + return res; + } + + pfd->pos += len - res; + + /* res == len is not an error, + at least if we want feof() to work. */ + return len - res; +} + +/* fd, is a user file descriptor. */ +int +_swilseek (int fd, int ptr, int dir) +{ + int res; + struct fdent *pfd; + + /* Valid file descriptor? */ + pfd = findslot (fd); + if (pfd == NULL) + { + errno = EBADF; + return -1; + } + + /* Valid whence? */ + if ((dir != SEEK_CUR) && (dir != SEEK_SET) && (dir != SEEK_END)) + { + errno = EINVAL; + return -1; + } + + /* Convert SEEK_CUR to SEEK_SET */ + if (dir == SEEK_CUR) + { + ptr = pfd->pos + ptr; + /* The resulting file offset would be negative. */ + if (ptr < 0) + { + errno = EINVAL; + if ((pfd->pos > 0) && (ptr > 0)) + { + errno = EOVERFLOW; + } + return -1; + } + dir = SEEK_SET; + } + + int block[2]; + if (dir == SEEK_END) + { + block[0] = pfd->handle; + res = checkerror (call_host (SEMIHOSTING_SYS_FLEN, block)); + if (res == -1) + { + return -1; + } + ptr += res; + } + + /* This code only does absolute seeks. */ + block[0] = pfd->handle; + block[1] = ptr; + res = checkerror (call_host (SEMIHOSTING_SYS_SEEK, block)); + + /* At this point ptr is the current file position. */ + if (res >= 0) + { + pfd->pos = ptr; + return ptr; + } + else + { + return -1; + } +} + +int +_lseek (int fd, int ptr, int dir) +{ + return _swilseek (fd, ptr, dir); +} + +/* fh, is a valid internal file handle. + Returns the number of bytes *not* written. */ +int +_swiwrite (int fh, char* ptr, int len) +{ + int block[3]; + + block[0] = fh; + block[1] = (int) ptr; + block[2] = len; + + return checkerror (call_host (SEMIHOSTING_SYS_WRITE, block)); +} + +/* fd, is a user file descriptor. */ +int +_write (int fd, char* ptr, int len) +{ + int res; + struct fdent *pfd; + + pfd = findslot (fd); + if (pfd == NULL) + { + errno = EBADF; + return -1; + } + + res = _swiwrite (pfd->handle, ptr, len); + + /* Clearly an error. */ + if (res < 0) + { + return -1; + } + + pfd->pos += len - res; + + /* We wrote 0 bytes? + Retrieve errno just in case. */ + if ((len - res) == 0) + { + return error (0); + } + + return (len - res); +} + +int +_swiopen (const char* path, int flags) +{ + int aflags = 0, fh; + uint32_t block[3]; + + int fd = newslot (); + + if (fd == -1) + { + errno = EMFILE; + return -1; + } + + /* It is an error to open a file that already exists. */ + if ((flags & O_CREAT) && (flags & O_EXCL)) + { + struct stat st; + int res; + res = _stat (path, &st); + if (res != -1) + { + errno = EEXIST; + return -1; + } + } + + /* The flags are Unix-style, so we need to convert them. */ +#ifdef O_BINARY + if (flags & O_BINARY) + { + aflags |= 1; + } +#endif + + /* In O_RDONLY we expect aflags == 0. */ + + if (flags & O_RDWR) + { + aflags |= 2; + } + + if ((flags & O_CREAT) || (flags & O_TRUNC) || (flags & O_WRONLY)) + { + aflags |= 4; + } + + if (flags & O_APPEND) + { + /* Can't ask for w AND a; means just 'a'. */ + aflags &= ~4; + aflags |= 8; + } + + block[0] = (uint32_t) path; + block[2] = strlen (path); + block[1] = (uint32_t) aflags; + + fh = call_host (SEMIHOSTING_SYS_OPEN, block); + + /* Return a user file descriptor or an error. */ + if (fh >= 0) + { + openfiles[fd].handle = fh; + openfiles[fd].pos = 0; + return fd; + } + else + { + return error (fh); + } +} + +int +_open (const char* path, int flags, ...) +{ + return _swiopen (path, flags); +} + +/* fh, is a valid internal file handle. */ +int +_swiclose (int fh) +{ + return checkerror (call_host (SEMIHOSTING_SYS_CLOSE, &fh)); +} + +/* fd, is a user file descriptor. */ +int +_close (int fd) +{ + int res; + struct fdent *pfd; + + pfd = findslot (fd); + if (pfd == NULL) + { + errno = EBADF; + return -1; + } + + /* Handle stderr == stdout. */ + if ((fd == 1 || fd == 2) && (openfiles[1].handle == openfiles[2].handle)) + { + pfd->handle = -1; + return 0; + } + + /* Attempt to close the handle. */ + res = _swiclose (pfd->handle); + + /* Reclaim handle? */ + if (res == 0) + { + pfd->handle = -1; + } + + return res; +} + +int __attribute__((weak)) +_getpid (int n __attribute__ ((unused))) +{ + return 1; +} + +int +_swistat (int fd, struct stat* st) +{ + struct fdent *pfd; + int res; + + pfd = findslot (fd); + if (pfd == NULL) + { + errno = EBADF; + return -1; + } + + /* Always assume a character device, + with 1024 byte blocks. */ + st->st_mode |= S_IFCHR; + st->st_blksize = 1024; + res = checkerror (call_host (SEMIHOSTING_SYS_FLEN, &pfd->handle)); + if (res == -1) + { + return -1; + } + + /* Return the file size. */ + st->st_size = res; + return 0; +} + +int __attribute__((weak)) +_fstat (int fd, struct stat* st) +{ + memset (st, 0, sizeof(*st)); + return _swistat (fd, st); +} + +int __attribute__((weak)) +_stat (const char*fname, struct stat *st) +{ + int fd, res; + memset (st, 0, sizeof(*st)); + /* The best we can do is try to open the file readonly. + If it exists, then we can guess a few things about it. */ + if ((fd = _open (fname, O_RDONLY)) == -1) + { + return -1; + } + st->st_mode |= S_IFREG | S_IREAD; + res = _swistat (fd, st); + /* Not interested in the error. */ + _close (fd); + return res; +} + +int __attribute__((weak)) +_link (void) +{ + errno = ENOSYS; + return -1; +} + +int +_unlink (const char* path) +{ + int res; + uint32_t block[2]; + block[0] = (uint32_t) path; + block[1] = strlen (path); + res = call_host (SEMIHOSTING_SYS_REMOVE, block); + + if (res == -1) + { + return error (res); + } + return 0; +} + +int +_gettimeofday (struct timeval* tp, void* tzvp) +{ + struct timezone* tzp = tzvp; + if (tp) + { + /* Ask the host for the seconds since the Unix epoch. */ + tp->tv_sec = call_host (SEMIHOSTING_SYS_TIME, NULL); + tp->tv_usec = 0; + } + + /* Return fixed data for the timezone. */ + if (tzp) + { + tzp->tz_minuteswest = 0; + tzp->tz_dsttime = 0; + } + + return 0; +} + +/* Return a clock that ticks at 100Hz. */ +clock_t +_clock (void) +{ + clock_t timeval; + + timeval = (clock_t) call_host (SEMIHOSTING_SYS_CLOCK, NULL); + return timeval; +} + +/* Return a clock that ticks at 100Hz. */ +clock_t +_times (struct tms* tp) +{ + clock_t timeval = _clock (); + + if (tp) + { + tp->tms_utime = timeval; /* user time */ + tp->tms_stime = 0; /* system time */ + tp->tms_cutime = 0; /* user time, children */ + tp->tms_cstime = 0; /* system time, children */ + } + + return timeval; +} + +int +_isatty (int fd) +{ + struct fdent *pfd; + int tty; + + pfd = findslot (fd); + if (pfd == NULL) + { + errno = EBADF; + return 0; + } + + tty = call_host (SEMIHOSTING_SYS_ISTTY, &pfd->handle); + + if (tty == 1) + { + return 1; + } + + errno = get_errno (); + return 0; +} + +int +_system (const char* s) +{ + uint32_t block[2]; + int e; + + /* Hmmm. The ARM debug interface specification doesn't say whether + SYS_SYSTEM does the right thing with a null argument, or assign any + meaning to its return value. Try to do something reasonable.... */ + if (!s) + { + return 1; /* maybe there is a shell available? we can hope. :-P */ + } + block[0] = (uint32_t) s; + block[1] = strlen (s); + e = checkerror (call_host (SEMIHOSTING_SYS_SYSTEM, block)); + if ((e >= 0) && (e < 256)) + { + /* We have to convert e, an exit status to the encoded status of + the command. To avoid hard coding the exit status, we simply + loop until we find the right position. */ + int exit_code; + + for (exit_code = e; e && WEXITSTATUS (e) != exit_code; e <<= 1) + { + continue; + } + } + return e; +} + +int +_rename (const char* oldpath, const char* newpath) +{ + uint32_t block[4]; + block[0] = (uint32_t) oldpath; + block[1] = strlen (oldpath); + block[2] = (uint32_t) newpath; + block[3] = strlen (newpath); + return checkerror (call_host (SEMIHOSTING_SYS_RENAME, block)) ? -1 : 0; +} + +// ---------------------------------------------------------------------------- +// Required by Google Tests + +int +mkdir (const char *path __attribute__((unused)), + mode_t mode __attribute__((unused))) +{ +#if 0 + // always return true + return 0; +#else + errno = ENOSYS; + return -1; +#endif +} + +char * +getcwd (char *buf, size_t size) +{ + // no cwd available via semihosting, so we use the temporary folder + strncpy (buf, "/tmp", size); + return buf; +} + +#endif // defined OS_USE_SEMIHOSTING + +#endif // __STDC_HOSTED__ == 1 diff --git a/source/system/stm32f4xx/assert.c b/source/system/stm32f4xx/assert.c new file mode 100644 index 0000000..19a48a0 --- /dev/null +++ b/source/system/stm32f4xx/assert.c @@ -0,0 +1,55 @@ +// +// This file is part of the µOS++ III distribution. +// Copyright (c) 2014 Liviu Ionescu. +// + +#include +#include +#include + +//#include "diag/Trace.h" + +// ---------------------------------------------------------------------------- + +void +__attribute__((noreturn)) +__assert_func (const char *file, int line, const char *func, + const char *failedexpr) +{ +// trace_printf ("assertion \"%s\" failed: file \"%s\", line %d%s%s\n", +// failedexpr, file, line, func ? ", function: " : "", +// func ? func : ""); + abort (); + /* NOTREACHED */ +} + +// ---------------------------------------------------------------------------- + +// This is STM32 specific, but can be used on other platforms too. +// If you need it, add the following to your application header: + +//#ifdef USE_FULL_ASSERT +//#define assert_param(expr) ((expr) ? (void)0 : assert_failed((uint8_t *)__FILE__, __LINE__)) +//void assert_failed(uint8_t* file, uint32_t line); +//#else +//#define assert_param(expr) ((void)0) +//#endif // USE_FULL_ASSERT + +#if defined(USE_FULL_ASSERT) + +void +assert_failed (uint8_t* file, uint32_t line); + +// Called from the assert_param() macro, usually defined in the stm32f*_conf.h +void +__attribute__((noreturn, weak)) +assert_failed (uint8_t* file, uint32_t line) +{ +// trace_printf ("assert_param() failed: file \"%s\", line %d\n", file, line); + abort (); + /* NOTREACHED */ +} + +#endif // defined(USE_FULL_ASSERT) + +// ---------------------------------------------------------------------------- diff --git a/source/system/stm32f4xx/vectors_stm32f407xx.c b/source/system/stm32f4xx/vectors_stm32f407xx.c new file mode 100644 index 0000000..33ac1d4 --- /dev/null +++ b/source/system/stm32f4xx/vectors_stm32f407xx.c @@ -0,0 +1,335 @@ +// +// Copyright (c) 2015 Liviu Ionescu. +// This file was automatically generated by the xPacks scripts. +// + +// The list of external handlers is from the ARM assembly startup files. + +// ---------------------------------------------------------------------------- + +#include "ExceptionHandlers.h" + +// ---------------------------------------------------------------------------- + +void __attribute__((weak)) +Default_Handler(void); + +// Forward declaration of the specific IRQ handlers. These are aliased +// to the Default_Handler, which is a 'forever' loop. When the application +// defines a handler (with the same name), this will automatically take +// precedence over these weak definitions + +void __attribute__ ((weak, alias ("Default_Handler"))) +WWDG_IRQHandler(void); +void __attribute__ ((weak, alias ("Default_Handler"))) +PVD_IRQHandler(void); +void __attribute__ ((weak, alias ("Default_Handler"))) +TAMP_STAMP_IRQHandler(void); +void __attribute__ ((weak, alias ("Default_Handler"))) +RTC_WKUP_IRQHandler(void); +void __attribute__ ((weak, alias ("Default_Handler"))) +FLASH_IRQHandler(void); +void __attribute__ ((weak, alias ("Default_Handler"))) +RCC_IRQHandler(void); +void __attribute__ ((weak, alias ("Default_Handler"))) +EXTI0_IRQHandler(void); +void __attribute__ ((weak, alias ("Default_Handler"))) +EXTI1_IRQHandler(void); +void __attribute__ ((weak, alias ("Default_Handler"))) +EXTI2_IRQHandler(void); +void __attribute__ ((weak, alias ("Default_Handler"))) +EXTI3_IRQHandler(void); +void __attribute__ ((weak, alias ("Default_Handler"))) +EXTI4_IRQHandler(void); +void __attribute__ ((weak, alias ("Default_Handler"))) +DMA1_Stream0_IRQHandler(void); +void __attribute__ ((weak, alias ("Default_Handler"))) +DMA1_Stream1_IRQHandler(void); +void __attribute__ ((weak, alias ("Default_Handler"))) +DMA1_Stream2_IRQHandler(void); +void __attribute__ ((weak, alias ("Default_Handler"))) +DMA1_Stream3_IRQHandler(void); +void __attribute__ ((weak, alias ("Default_Handler"))) +DMA1_Stream4_IRQHandler(void); +void __attribute__ ((weak, alias ("Default_Handler"))) +DMA1_Stream5_IRQHandler(void); +void __attribute__ ((weak, alias ("Default_Handler"))) +DMA1_Stream6_IRQHandler(void); +void __attribute__ ((weak, alias ("Default_Handler"))) +ADC_IRQHandler(void); +void __attribute__ ((weak, alias ("Default_Handler"))) +CAN1_TX_IRQHandler(void); +void __attribute__ ((weak, alias ("Default_Handler"))) +CAN1_RX0_IRQHandler(void); +void __attribute__ ((weak, alias ("Default_Handler"))) +CAN1_RX1_IRQHandler(void); +void __attribute__ ((weak, alias ("Default_Handler"))) +CAN1_SCE_IRQHandler(void); +void __attribute__ ((weak, alias ("Default_Handler"))) +EXTI9_5_IRQHandler(void); +void __attribute__ ((weak, alias ("Default_Handler"))) +TIM1_BRK_TIM9_IRQHandler(void); +void __attribute__ ((weak, alias ("Default_Handler"))) +TIM1_UP_TIM10_IRQHandler(void); +void __attribute__ ((weak, alias ("Default_Handler"))) +TIM1_TRG_COM_TIM11_IRQHandler(void); +void __attribute__ ((weak, alias ("Default_Handler"))) +TIM1_CC_IRQHandler(void); +void __attribute__ ((weak, alias ("Default_Handler"))) +TIM2_IRQHandler(void); +void __attribute__ ((weak, alias ("Default_Handler"))) +TIM3_IRQHandler(void); +void __attribute__ ((weak, alias ("Default_Handler"))) +TIM4_IRQHandler(void); +void __attribute__ ((weak, alias ("Default_Handler"))) +I2C1_EV_IRQHandler(void); +void __attribute__ ((weak, alias ("Default_Handler"))) +I2C1_ER_IRQHandler(void); +void __attribute__ ((weak, alias ("Default_Handler"))) +I2C2_EV_IRQHandler(void); +void __attribute__ ((weak, alias ("Default_Handler"))) +I2C2_ER_IRQHandler(void); +void __attribute__ ((weak, alias ("Default_Handler"))) +SPI1_IRQHandler(void); +void __attribute__ ((weak, alias ("Default_Handler"))) +SPI2_IRQHandler(void); +void __attribute__ ((weak, alias ("Default_Handler"))) +USART1_IRQHandler(void); +void __attribute__ ((weak, alias ("Default_Handler"))) +USART2_IRQHandler(void); +void __attribute__ ((weak, alias ("Default_Handler"))) +USART3_IRQHandler(void); +void __attribute__ ((weak, alias ("Default_Handler"))) +EXTI15_10_IRQHandler(void); +void __attribute__ ((weak, alias ("Default_Handler"))) +RTC_Alarm_IRQHandler(void); +void __attribute__ ((weak, alias ("Default_Handler"))) +OTG_FS_WKUP_IRQHandler(void); +void __attribute__ ((weak, alias ("Default_Handler"))) +TIM8_BRK_TIM12_IRQHandler(void); +void __attribute__ ((weak, alias ("Default_Handler"))) +TIM8_UP_TIM13_IRQHandler(void); +void __attribute__ ((weak, alias ("Default_Handler"))) +TIM8_TRG_COM_TIM14_IRQHandler(void); +void __attribute__ ((weak, alias ("Default_Handler"))) +TIM8_CC_IRQHandler(void); +void __attribute__ ((weak, alias ("Default_Handler"))) +DMA1_Stream7_IRQHandler(void); +void __attribute__ ((weak, alias ("Default_Handler"))) +FMC_IRQHandler(void); +void __attribute__ ((weak, alias ("Default_Handler"))) +SDIO_IRQHandler(void); +void __attribute__ ((weak, alias ("Default_Handler"))) +TIM5_IRQHandler(void); +void __attribute__ ((weak, alias ("Default_Handler"))) +SPI3_IRQHandler(void); +void __attribute__ ((weak, alias ("Default_Handler"))) +UART4_IRQHandler(void); +void __attribute__ ((weak, alias ("Default_Handler"))) +UART5_IRQHandler(void); +void __attribute__ ((weak, alias ("Default_Handler"))) +TIM6_DAC_IRQHandler(void); +void __attribute__ ((weak, alias ("Default_Handler"))) +TIM7_IRQHandler(void); +void __attribute__ ((weak, alias ("Default_Handler"))) +DMA2_Stream0_IRQHandler(void); +void __attribute__ ((weak, alias ("Default_Handler"))) +DMA2_Stream1_IRQHandler(void); +void __attribute__ ((weak, alias ("Default_Handler"))) +DMA2_Stream2_IRQHandler(void); +void __attribute__ ((weak, alias ("Default_Handler"))) +DMA2_Stream3_IRQHandler(void); +void __attribute__ ((weak, alias ("Default_Handler"))) +DMA2_Stream4_IRQHandler(void); +void __attribute__ ((weak, alias ("Default_Handler"))) +ETH_IRQHandler(void); +void __attribute__ ((weak, alias ("Default_Handler"))) +ETH_WKUP_IRQHandler(void); +void __attribute__ ((weak, alias ("Default_Handler"))) +CAN2_TX_IRQHandler(void); +void __attribute__ ((weak, alias ("Default_Handler"))) +CAN2_RX0_IRQHandler(void); +void __attribute__ ((weak, alias ("Default_Handler"))) +CAN2_RX1_IRQHandler(void); +void __attribute__ ((weak, alias ("Default_Handler"))) +CAN2_SCE_IRQHandler(void); +void __attribute__ ((weak, alias ("Default_Handler"))) +OTG_FS_IRQHandler(void); +void __attribute__ ((weak, alias ("Default_Handler"))) +DMA2_Stream5_IRQHandler(void); +void __attribute__ ((weak, alias ("Default_Handler"))) +DMA2_Stream6_IRQHandler(void); +void __attribute__ ((weak, alias ("Default_Handler"))) +DMA2_Stream7_IRQHandler(void); +void __attribute__ ((weak, alias ("Default_Handler"))) +USART6_IRQHandler(void); +void __attribute__ ((weak, alias ("Default_Handler"))) +I2C3_EV_IRQHandler(void); +void __attribute__ ((weak, alias ("Default_Handler"))) +I2C3_ER_IRQHandler(void); +void __attribute__ ((weak, alias ("Default_Handler"))) +OTG_HS_EP1_OUT_IRQHandler(void); +void __attribute__ ((weak, alias ("Default_Handler"))) +OTG_HS_EP1_IN_IRQHandler(void); +void __attribute__ ((weak, alias ("Default_Handler"))) +OTG_HS_WKUP_IRQHandler(void); +void __attribute__ ((weak, alias ("Default_Handler"))) +OTG_HS_IRQHandler(void); +void __attribute__ ((weak, alias ("Default_Handler"))) +DCMI_IRQHandler(void); +void __attribute__ ((weak, alias ("Default_Handler"))) +HASH_RNG_IRQHandler(void); +void __attribute__ ((weak, alias ("Default_Handler"))) +FPU_IRQHandler(void); + +// ---------------------------------------------------------------------------- + +extern unsigned int _estack; + +typedef void +(* const pHandler)(void); + +// ---------------------------------------------------------------------------- + +// The table of interrupt handlers. It has an explicit section name +// and relies on the linker script to place it at the correct location +// in memory. + +__attribute__ ((section(".isr_vector"),used)) +pHandler __isr_vectors[] = + { + // Cortex-M Core Handlers + (pHandler) &_estack, // The initial stack pointer + Reset_Handler, // The reset handler + + NMI_Handler, // The NMI handler + HardFault_Handler, // The hard fault handler + +#if defined(__ARM_ARCH_7M__) || defined(__ARM_ARCH_7EM__) + MemManage_Handler, // The MPU fault handler + BusFault_Handler, // The bus fault handler + UsageFault_Handler, // The usage fault handler +#else + 0, // Reserved + 0, // Reserved + 0, // Reserved +#endif + 0, // Reserved + 0, // Reserved + 0, // Reserved + 0, // Reserved + SVC_Handler, // SVCall handler +#if defined(__ARM_ARCH_7M__) || defined(__ARM_ARCH_7EM__) + DebugMon_Handler, // Debug monitor handler +#else + 0, // Reserved +#endif + 0, // Reserved + PendSV_Handler, // The PendSV handler + SysTick_Handler, // The SysTick handler + + // ---------------------------------------------------------------------- + // External Interrupts + WWDG_IRQHandler, // Window WatchDog + PVD_IRQHandler, // PVD through EXTI Line detection + TAMP_STAMP_IRQHandler, // Tamper and TimeStamps through the EXTI line + RTC_WKUP_IRQHandler, // RTC Wakeup through the EXTI line + FLASH_IRQHandler, // FLASH + RCC_IRQHandler, // RCC + EXTI0_IRQHandler, // EXTI Line0 + EXTI1_IRQHandler, // EXTI Line1 + EXTI2_IRQHandler, // EXTI Line2 + EXTI3_IRQHandler, // EXTI Line3 + EXTI4_IRQHandler, // EXTI Line4 + DMA1_Stream0_IRQHandler, // DMA1 Stream 0 + DMA1_Stream1_IRQHandler, // DMA1 Stream 1 + DMA1_Stream2_IRQHandler, // DMA1 Stream 2 + DMA1_Stream3_IRQHandler, // DMA1 Stream 3 + DMA1_Stream4_IRQHandler, // DMA1 Stream 4 + DMA1_Stream5_IRQHandler, // DMA1 Stream 5 + DMA1_Stream6_IRQHandler, // DMA1 Stream 6 + ADC_IRQHandler, // ADC1, ADC2 and ADC3s + CAN1_TX_IRQHandler, // CAN1 TX + CAN1_RX0_IRQHandler, // CAN1 RX0 + CAN1_RX1_IRQHandler, // CAN1 RX1 + CAN1_SCE_IRQHandler, // CAN1 SCE + EXTI9_5_IRQHandler, // External Line[9:5]s + TIM1_BRK_TIM9_IRQHandler, // TIM1 Break and TIM9 + TIM1_UP_TIM10_IRQHandler, // TIM1 Update and TIM10 + TIM1_TRG_COM_TIM11_IRQHandler, // TIM1 Trigger and Commutation and TIM11 + TIM1_CC_IRQHandler, // TIM1 Capture Compare + TIM2_IRQHandler, // TIM2 + TIM3_IRQHandler, // TIM3 + TIM4_IRQHandler, // TIM4 + I2C1_EV_IRQHandler, // I2C1 Event + I2C1_ER_IRQHandler, // I2C1 Error + I2C2_EV_IRQHandler, // I2C2 Event + I2C2_ER_IRQHandler, // I2C2 Error + SPI1_IRQHandler, // SPI1 + SPI2_IRQHandler, // SPI2 + USART1_IRQHandler, // USART1 + USART2_IRQHandler, // USART2 + USART3_IRQHandler, // USART3 + EXTI15_10_IRQHandler, // External Line[15:10]s + RTC_Alarm_IRQHandler, // RTC Alarm (A and B) through EXTI Line + OTG_FS_WKUP_IRQHandler, // USB OTG FS Wakeup through EXTI line + TIM8_BRK_TIM12_IRQHandler, // TIM8 Break and TIM12 + TIM8_UP_TIM13_IRQHandler, // TIM8 Update and TIM13 + TIM8_TRG_COM_TIM14_IRQHandler, // TIM8 Trigger and Commutation and TIM14 + TIM8_CC_IRQHandler, // TIM8 Capture Compare + DMA1_Stream7_IRQHandler, // DMA1 Stream7 + FMC_IRQHandler, // FMC + SDIO_IRQHandler, // SDIO + TIM5_IRQHandler, // TIM5 + SPI3_IRQHandler, // SPI3 + UART4_IRQHandler, // UART4 + UART5_IRQHandler, // UART5 + TIM6_DAC_IRQHandler, // TIM6 and DAC1&2 underrun errors + TIM7_IRQHandler, // TIM7 + DMA2_Stream0_IRQHandler, // DMA2 Stream 0 + DMA2_Stream1_IRQHandler, // DMA2 Stream 1 + DMA2_Stream2_IRQHandler, // DMA2 Stream 2 + DMA2_Stream3_IRQHandler, // DMA2 Stream 3 + DMA2_Stream4_IRQHandler, // DMA2 Stream 4 + ETH_IRQHandler, // Ethernet + ETH_WKUP_IRQHandler, // Ethernet Wakeup through EXTI line + CAN2_TX_IRQHandler, // CAN2 TX + CAN2_RX0_IRQHandler, // CAN2 RX0 + CAN2_RX1_IRQHandler, // CAN2 RX1 + CAN2_SCE_IRQHandler, // CAN2 SCE + OTG_FS_IRQHandler, // USB OTG FS + DMA2_Stream5_IRQHandler, // DMA2 Stream 5 + DMA2_Stream6_IRQHandler, // DMA2 Stream 6 + DMA2_Stream7_IRQHandler, // DMA2 Stream 7 + USART6_IRQHandler, // USART6 + I2C3_EV_IRQHandler, // I2C3 event + I2C3_ER_IRQHandler, // I2C3 error + OTG_HS_EP1_OUT_IRQHandler, // USB OTG HS End Point 1 Out + OTG_HS_EP1_IN_IRQHandler, // USB OTG HS End Point 1 In + OTG_HS_WKUP_IRQHandler, // USB OTG HS Wakeup through EXTI + OTG_HS_IRQHandler, // USB OTG HS + DCMI_IRQHandler, // DCMI + 0, // Reserved + HASH_RNG_IRQHandler, // Hash and Rng + FPU_IRQHandler, // FPU +}; + +// ---------------------------------------------------------------------------- + +// Processor ends up here if an unexpected interrupt occurs or a +// specific handler is not present in the application code. +// When in DEBUG, trigger a debug exception to clearly notify +// the user of the exception and help identify the cause. + +void __attribute__ ((section(".after_vectors"))) +Default_Handler(void) +{ +#if defined(DEBUG) +__DEBUG_BKPT(); +#endif +while (1) + { + } +} + +// ---------------------------------------------------------------------------- diff --git a/source/test/firmware/kernel/ringbuffer/Makefile b/source/test/firmware/kernel/ringbuffer/Makefile deleted file mode 100755 index fed86fd..0000000 --- a/source/test/firmware/kernel/ringbuffer/Makefile +++ /dev/null @@ -1,42 +0,0 @@ -include ../../../../../config/make/rules.mk - -TEST_MAINFILE = $(TEST_EXE_DIR)cunit_ringbuffer -TEST_INCLUDES = \ - -I . \ - -I /usr/include \ - -I $(ROOT_DIR)/source/firmware/kernel - -TEST_SOURCES = \ - $(ROOT_DIR)/source/firmware/kernel/ringbuffer.c \ - $(ROOT_DIR)/source/test/firmware/kernel/ringbuffer/cunit_ringbuffer.c - -TEST_OBJECTS = $(TEST_SOURCES:$(SRC_DIR)/%.c=$(TEST_OBJ_DIR)/%.o) -TEST_DEPS = $(TEST_SOURCES:$(SRC_DIR)/%.c=$(TEST_OBJ_DIR)/%.d) - -TEST_CFLAGS = \ - $(CFLAGS) \ - $(TEST_INCLUDES) - -TEST_LDFLAGS = \ - $(LDFLAGS) \ - -lcunit - -all: $(TEST_MAINFILE) - -clean: - -rm -f $(TEST_OBJECTS) \ - $(TEST_DEPS) \ - $(TEST_MAINFILE) - -$(TEST_MAINFILE): $(TEST_OBJECTS) - @$(MKDIR) $(TEST_EXE_DIR) - $(NATIVE_CC) $(TEST_CFLAGS) $(TEST_LDFLAGS) $(TEST_OBJECTS) -o $(TEST_MAINFILE) - -$(TEST_OBJ_DIR)/%.o: $(SRC_DIR)/%.c - @$(MKDIR) $(dir $@) - $(call maketestdep,$<,$@,$(subst .o,.d,$@)) - $(NATIVE_CC) $(TEST_CFLAGS) -c $< -o $@ - -ifneq "$(MAKECMDGOALS)" "clean" --include $(TEST_DEPS) -endif diff --git a/source/test/firmware/kernel/ringbuffer/cpu.h b/source/test/firmware/kernel/ringbuffer/cpu.h deleted file mode 100755 index 6d39253..0000000 --- a/source/test/firmware/kernel/ringbuffer/cpu.h +++ /dev/null @@ -1,14 +0,0 @@ -/* - * cpu.h - * - * Created on: Nov 3, 2013 - * Author: tkl - */ - -#ifndef CPU_H_ -#define CPU_H_ - -#define disable_irq() -#define enable_irq() - -#endif /* CPU_H_ */ diff --git a/source/test/firmware/kernel/ringbuffer/cunit_ringbuffer.c b/source/test/firmware/kernel/ringbuffer/cunit_ringbuffer.c deleted file mode 100755 index 703ec6e..0000000 --- a/source/test/firmware/kernel/ringbuffer/cunit_ringbuffer.c +++ /dev/null @@ -1,67 +0,0 @@ -#include -#include - -#if 0 -#include -#endif - -#include "ringbuffer.h" - -static int init_suite(void) -{ - return 0; -} - -static int clean_suite(void) -{ - return 0; -} - -/* DUT */ -static char mem[10]; -static struct ringbuffer rb = { - mem, - mem, - mem, - sizeof(mem), - 0 -}; - -static void test_ringbuffer_size(void) -{ - char str[] = "0123456789ABCDEFGHI"; - CU_ASSERT(sizeof(mem) == ringbuffer_write(&rb, str, sizeof(str))); -} - -int main(void) -{ - /* test suite section */ - CU_pSuite suite = NULL; - if(CUE_SUCCESS != CU_initialize_registry()) - goto exit_2; - suite = CU_add_suite("list test suite", init_suite, clean_suite); - if(NULL == suite) - goto exit_1; - - /* test case section */ - if( - NULL == CU_add_test(suite, "ringbuffer size", test_ringbuffer_size) - ) - goto exit_1; - - /* basic interface using tests */ - CU_basic_set_mode(CU_BRM_VERBOSE); - CU_basic_run_tests(); - CU_basic_show_failures(CU_get_failure_list()); - -#if 0 - /* automated interface using tests */ - CU_automated_run_tests(); - CU_list_tests_to_file(); -#endif - -exit_1: - CU_cleanup_registry(); -exit_2: - return CU_get_error(); -}