]> code.bitgloo.com Git - clyne/zig-stm32l476.git/commitdiff
better startup: all zig, bss and data init'd
authorClyne Sullivan <clyne@bitgloo.com>
Sun, 6 Oct 2024 20:01:53 +0000 (16:01 -0400)
committerClyne Sullivan <clyne@bitgloo.com>
Sun, 6 Oct 2024 20:01:53 +0000 (16:01 -0400)
build.zig
link.ld
src/bootstrap.s [deleted file]
src/main.zig
src/startup.zig [new file with mode: 0644]

index 00d19c48e83f9b609d28ff4fd0d8ef359b1ed88c..8493bbb893f4890ec1d1b9169dbb1431d3094595 100644 (file)
--- a/build.zig
+++ b/build.zig
@@ -10,14 +10,13 @@ pub fn build(b: *std.Build) void {
 
     const exe = b.addExecutable(.{
         .name = "stm32",
-        .root_source_file = b.path("src/main.zig"),
+        .root_source_file = b.path("src/startup.zig"),
         .target = target,
         //.optimize = .Debug,
         .optimize = .ReleaseSafe,
         .linkage = .static,
     });
 
-    exe.addAssemblyFile(b.path("src/bootstrap.s"));
     exe.setLinkerScriptPath(b.path("link.ld"));
 
     b.installArtifact(exe);
diff --git a/link.ld b/link.ld
index e777ac48106fa412ecf44f9daf0f6d57d27da9d0..f5011ba7bbcf4af52f5f02eba27b7770d49c7bf9 100644 (file)
--- a/link.ld
+++ b/link.ld
@@ -23,24 +23,24 @@ SECTIONS {
        } > FLASH
 
        /* initialized data */
-       _sidata = LOADADDR(.data);
+       __data_flash = LOADADDR(.data);
        .data : {
                . = ALIGN(8);
-               _sdata = .;
+               __data = .;
                *(.data)
                *(.data*)
                . = ALIGN(8);
-               _edata = .;
+               __data_size = . - __data;
        } > RAM AT > FLASH
 
        /* uninitialized data */
        .bss : {
                . = ALIGN(8);
-               _sbss = .;
+               __bss = .;
                *(.bss)
                *(.bss*)
                . = ALIGN(8);
-               _ebss = .;
+               __bss_size = . - __bss;
        } > RAM
 
        .stack : {
diff --git a/src/bootstrap.s b/src/bootstrap.s
deleted file mode 100644 (file)
index 612fac3..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-.cpu cortex-m4
-.thumb
-
-.extern _start
-.extern _tstack
-
-.section .vector_table
-.global init_vector_table
-init_vector_table:
-    .word _tstack
-    .word _start
-    .skip 4 * 14
-
index d6a1aa4b3c04892ba01cd9d1bf3c6fc61fc48433..99cb451ac677c7ebcaf1a097bd746147b944dbba 100644 (file)
@@ -8,7 +8,7 @@ const gpioa = gpio.gpioa;
 const gpioc = gpio.gpioc;
 const tick = timer.systick;
 
-export fn _start() callconv(.C) noreturn {
+pub fn main() void {
     cpu.interrupt_disable();
     interrupt.initialize();
     interrupt.register(.SVCall, svcall);
diff --git a/src/startup.zig b/src/startup.zig
new file mode 100644 (file)
index 0000000..f7c7712
--- /dev/null
@@ -0,0 +1,41 @@
+const main = @import("main.zig");
+
+extern const __data_flash: u32;
+extern const __data: u32;
+extern const __data_size: u32;
+extern const __bss: u32;
+extern const __bss_size: u32;
+
+comptime {
+    asm (
+        \\.extern _start
+        \\.extern _tstack
+        \\
+        \\.section .vector_table
+        \\.global init_vector_table
+        \\init_vector_table:
+        \\    .word _tstack
+        \\    .word _start
+        \\    .skip 4 * 14
+    );
+}
+
+inline fn zero_bss() void {
+    const bss: [*]volatile u8 = @ptrFromInt(@intFromPtr(&__bss));
+    @memset(bss[0..@intFromPtr(&__bss_size)], 0);
+}
+
+inline fn copy_data() void {
+    const data_flash: [*]volatile u8 = @ptrFromInt(@intFromPtr(&__data_flash));
+    const data: [*]volatile u8 = @ptrFromInt(@intFromPtr(&__data));
+    const data_size = @intFromPtr(&__data_size);
+    @memcpy(data[0..data_size], data_flash[0..data_size]);
+}
+
+export fn _start() callconv(.C) noreturn {
+    zero_bss();
+    copy_data();
+    main.main();
+    while (true) {}
+}
+