diff options
author | Josh Rahm <joshuarahm@gmail.com> | 2022-12-12 21:41:55 -0700 |
---|---|---|
committer | Josh Rahm <joshuarahm@gmail.com> | 2022-12-12 21:41:55 -0700 |
commit | 8bb2d168044213ce9bd31a19efb6bab90f5c9722 (patch) | |
tree | 737ba66cd1405fb4aa9ac5df9415b2ea5d88ab20 /src/init/load.rs | |
parent | ef3a1919ce5c87179e8f1d7a3b1b835151fdf50f (diff) | |
download | stm32l4-rust-8bb2d168044213ce9bd31a19efb6bab90f5c9722.tar.gz stm32l4-rust-8bb2d168044213ce9bd31a19efb6bab90f5c9722.tar.bz2 stm32l4-rust-8bb2d168044213ce9bd31a19efb6bab90f5c9722.zip |
Create an init system.
Diffstat (limited to 'src/init/load.rs')
-rw-r--r-- | src/init/load.rs | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/src/init/load.rs b/src/init/load.rs new file mode 100644 index 0000000..ce7b681 --- /dev/null +++ b/src/init/load.rs @@ -0,0 +1,37 @@ +/** Load into the data segments */ +#[link_section = ".inits.005"] +#[no_mangle] +static __LOAD_DATA_SEGMENTS: fn() -> () = data_segments; + +/** Loads the .data segment data from flash to memory if required. */ +fn data_segments() -> () { + extern "C" { + static mut __data_load: u32; + static mut __data_store_start: u32; + static mut __data_store_end: u32; + static mut __bss_start: u32; + static mut __bss_end: u32; + } + + unsafe { + let mut data_load_addr: *mut u32 = &mut __data_load; + let mut store_cursor: *mut u32 = &mut __data_store_start; + let data_store_end_addr: *mut u32 = &mut __data_store_end; + + while store_cursor < data_store_end_addr { + store_cursor.write_volatile(*data_load_addr); + data_load_addr = data_load_addr.offset(1); + store_cursor = store_cursor.offset(1); + } + + let bss_end: *mut u32 = &mut __bss_end; + let mut bss_cursor: *mut u32 = &mut __bss_start; + + while bss_cursor < bss_end { + bss_cursor.write_volatile(0); + bss_cursor = bss_cursor.offset(1); + } + } + + return; +} |