summaryrefslogtreecommitdiff
path: root/src/startup.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/startup.c')
-rw-r--r--src/startup.c50
1 files changed, 50 insertions, 0 deletions
diff --git a/src/startup.c b/src/startup.c
new file mode 100644
index 0000000..b71a805
--- /dev/null
+++ b/src/startup.c
@@ -0,0 +1,50 @@
+
+
+#define STACK_TOP 0x20005000
+
+
+extern unsigned int _BSS_START;
+extern unsigned int _BSS_END;
+extern unsigned int _DATA_ROM_START;
+extern unsigned int _DATA_RAM_START;
+extern unsigned int _DATA_RAM_END;
+
+void startup();
+void main();
+
+// Define the vector table
+unsigned int * myvectors[2]
+__attribute__ ((section("vectors")))= {
+ (unsigned int *) STACK_TOP, // stack pointer
+ (unsigned int *) startup // code entry point
+};
+
+void startup()
+{
+ /* Set memory in bss segment to zeros */
+ unsigned int * bss_start_p = &_BSS_START;
+ unsigned int * bss_end_p = &_BSS_END;
+
+ while(bss_start_p != bss_end_p)
+ {
+ *bss_start_p = 0;
+ bss_start_p++;
+ }
+
+ /* Copy memory in data segment from its position
+ * in the flash image to its position in the
+ * read/write memory */
+ unsigned int * data_rom_start_p = &_DATA_ROM_START;
+ unsigned int * data_ram_start_p = &_DATA_RAM_START;
+ unsigned int * data_ram_end_p = &_DATA_RAM_END;
+
+ while(data_ram_start_p != data_ram_end_p)
+ {
+ *data_ram_start_p = *data_rom_start_p;
+ data_ram_start_p++;
+ data_rom_start_p++;
+ }
+
+ /* Now we are ready to start the main function */
+ main();
+}