diff --git a/examples/blinky/.cargo/config b/examples/blinky/.cargo/config index 263ebc9..7b512e5 100644 --- a/examples/blinky/.cargo/config +++ b/examples/blinky/.cargo/config @@ -1,6 +1,6 @@ [target.mipsel-unknown-none] -rustflags = ["-C", "link-arg=-T32MX270F256B_procdefs.ld"] +rustflags = ["-C", "link-arg=-Tlink.x"] [build] target = "mipsel-unknown-none" diff --git a/examples/blinky/32MX270F256B_procdefs.ld b/examples/blinky/32MX270F256B_procdefs.ld deleted file mode 100644 index 858d8aa..0000000 --- a/examples/blinky/32MX270F256B_procdefs.ld +++ /dev/null @@ -1,40 +0,0 @@ -/************************************************************************* - * Processor-specific linker script for PIC32MX170 and PIC32MX270 - *************************************************************************/ - -/************************************************************************* - * Symbols used for interrupt-vector table generation - *************************************************************************/ -PROVIDE(_vector_spacing = 0x0001); -PROVIDE(_ebase_address = 0x9D000000); /* first 4 KiB of program flash */ - - -MEMORY -{ - boot_flash (rx) : ORIGIN = 0xBFC00000, LENGTH = 0xc00 - program_flash (rx) : ORIGIN = 0x9D000000, LENGTH = 256k - sram (w!x) : ORIGIN = 0x80000000, LENGTH = 64k - configsfrs : ORIGIN = 0xBFC00BF0, LENGTH = 0x10 -} - -REGION_ALIAS("exception_mem", program_flash) -REGION_ALIAS("program_mem", program_flash) -REGION_ALIAS("data_mem", sram) - -/* aliases for direct start without bootloader - * put the reset handler into the boot flash. - */ -REGION_ALIAS(reset_mem, boot_flash) - -/* aliases for bootloader support - * put the bootloader into the boot flash section and the reset handler at the - * beginning of the normal program flash memory. - */ -/* REGION_ALIAS(reset_mem, program_flash) -REGION_ALIAS(bootloader_mem, boot_flash) */ - -/************************************************************************* - * common part for all PIC32 devices - *************************************************************************/ -INPUT("device.x") /* interrupt vector symbols from Peripheral Access Crate */ -INPUT("pic32_common.ld") diff --git a/examples/blinky/Cargo.lock b/examples/blinky/Cargo.lock index 22a92f1..04469c6 100644 --- a/examples/blinky/Cargo.lock +++ b/examples/blinky/Cargo.lock @@ -4,11 +4,12 @@ version = 3 [[package]] name = "blinky" -version = "0.2.0" +version = "0.3.0" dependencies = [ "embedded-hal", "mips-mcu", "mips-rt", + "panic-halt", "pic32-config-sector", "pic32-hal", ] @@ -46,7 +47,7 @@ checksum = "5e9a1f9f7d83e59740248a6e14ecf93929ade55027844dfcea78beafccc15745" dependencies = [ "proc-macro2", "quote", - "syn 2.0.18", + "syn 2.0.23", ] [[package]] @@ -60,9 +61,9 @@ dependencies = [ [[package]] name = "mips-rt" -version = "0.3.1" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d5524ac83440e7e7d18012dc92c48ccb0447e4f2d0adbe0a8be72cc58e33a49" +checksum = "02d5422c1066894ce6c029bed692dfafc297d91e4056e1df8c85bb6b01b0f332" dependencies = [ "mips-rt-macros", ] @@ -94,16 +95,22 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8d5439c4ad607c3c23abf66de8c8bf57ba8adcd1f129e699851a6e43935d339d" [[package]] -name = "pic32-config-sector" +name = "panic-halt" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad21a2aff96011e7f7e917a013a9eb246e73d5dae1fe0d94ea1d7e452fa88498" +checksum = "de96540e0ebde571dc55c73d60ef407c653844e6f9a1e2fdbd40c07b9252d812" + +[[package]] +name = "pic32-config-sector" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5dfd36f1915570f83a10b3fda6f8c4aab461078281b99fc3ca9585cebd91420" [[package]] name = "pic32-hal" -version = "0.9.0" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f6393dd973e257ad9652c2aa8402de1ad71ce4fadd52579ea83e229db94748b" +checksum = "66035d2e0335987b58576c23e586444b5e83d30a9c74fee70818dad6efcc89ac" dependencies = [ "critical-section", "embedded-hal", @@ -127,18 +134,18 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.60" +version = "1.0.63" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dec2b086b7a862cf4de201096214fa870344cf922b2b30c167badb3af3195406" +checksum = "7b368fba921b0dce7e60f5e04ec15e565b3303972b42bcfde1d0713b881959eb" dependencies = [ "unicode-ident", ] [[package]] name = "quote" -version = "1.0.28" +version = "1.0.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b9ab9c7eadfd8df19006f1cf1a4aed13540ed5cbc047010ece5826e10825488" +checksum = "573015e8ab27661678357f27dc26460738fd2b6c86e46f386fde94cb5d913105" dependencies = [ "proc-macro2", ] @@ -156,9 +163,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.18" +version = "2.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32d41677bcbe24c20c52e7c70b0d8db04134c5d1066bf98662e2871ad200ea3e" +checksum = "59fb7d6d8281a51045d62b8eb3a7d1ce347b76f312af50cd3dc0af39c87c1737" dependencies = [ "proc-macro2", "quote", @@ -167,9 +174,9 @@ dependencies = [ [[package]] name = "unicode-ident" -version = "1.0.9" +version = "1.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b15811caf2415fb889178633e7724bad2509101cde276048e013b9def5e51fa0" +checksum = "22049a19f4a68748a168c0fc439f9516686aa045927ff767eca0a85101fb6e73" [[package]] name = "vcell" diff --git a/examples/blinky/Cargo.toml b/examples/blinky/Cargo.toml index 40e512b..2d3863a 100644 --- a/examples/blinky/Cargo.toml +++ b/examples/blinky/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "blinky" -version = "0.2.0" +version = "0.3.0" authors = ["Stephan "] license = "MIT OR Apache-2.0" edition = "2018" @@ -13,10 +13,13 @@ default = ["pic32mx2xxfxxxb"] [dependencies] mips-mcu = { version = "0.3.0", features = ["critical-section-single-core"] } -mips-rt = "0.3.0" +mips-rt = "0.3.2" +panic-halt = "0.2.0" embedded-hal = "0.2.7" -pic32-hal = "0.9.0" -pic32-config-sector = "0.2.0" +pic32-hal = "0.10.0" +pic32-config-sector = "0.3.0" + [profile.release] opt-level = 2 lto = true +debug = true diff --git a/examples/blinky/memory.x b/examples/blinky/memory.x new file mode 100644 index 0000000..368212b --- /dev/null +++ b/examples/blinky/memory.x @@ -0,0 +1,36 @@ +/* + * Memory region of PIC32MX devices + * + * LENGTH values need to be adapted to specific device variant. + * REGION_ALIAS functions are used to put the startup code either into the boot + * flash memory or into the program flash memory keeping the boot flash free for + * a boot loader. + */ + +/* Symbols used for interrupt-vector table generation */ +PROVIDE(_vector_spacing = 0x0001); +PROVIDE(_ebase_address = 0x9D000000); /* first 4 KiB of program flash */ + +MEMORY +{ + boot_flash (rx) : ORIGIN = 0xBFC00000, LENGTH = 3k - 0x10 + program_flash (rx) : ORIGIN = 0x9D000000, LENGTH = 128k + sram (w!x) : ORIGIN = 0x80000000, LENGTH = 32k + configsfrs : ORIGIN = ORIGIN(boot_flash) + LENGTH(boot_flash), LENGTH = 0x10 +} + +REGION_ALIAS("exception_mem", program_flash) +REGION_ALIAS("program_mem", program_flash) +REGION_ALIAS("data_mem", sram) + +/* aliases for direct start without bootloader + * put the reset handler into the boot flash. + */ +REGION_ALIAS(reset_mem, boot_flash) + +/* aliases for bootloader support + * put the bootloader into the boot flash memory and the reset handler at the + * beginning of the normal program flash memory. + */ +/* REGION_ALIAS(reset_mem, program_flash) +REGION_ALIAS(bootloader_mem, boot_flash) */ diff --git a/examples/blinky/src/main.rs b/examples/blinky/src/main.rs index eddc5dd..e41a222 100644 --- a/examples/blinky/src/main.rs +++ b/examples/blinky/src/main.rs @@ -9,10 +9,10 @@ #![no_main] #![no_std] -use core::{fmt::Write, panic::PanicInfo}; - +use core::fmt::Write; use embedded_hal::{blocking::delay::DelayMs, digital::v2::*, serial::Read}; use mips_rt::{self, entry}; +use panic_halt as _; use pic32_config_sector::pic32mx2xx::*; use pic32_hal::{ clock::Osc, @@ -48,8 +48,6 @@ pub static CONFIGSFRS: ConfigSector = ConfigSector::default() fn main() -> ! { let p = pac::Peripherals::take().unwrap(); - //pps.rpb0r.write(|w| unsafe { w.rpb0r().bits(0b0010) }); // U2TX on RPB0 - // setup clock control object let sysclock = 40_000_000_u32.hz(); let clock = Osc::new(p.OSC, sysclock); @@ -77,11 +75,7 @@ fn main() -> ! { let mut on = true; loop { writeln!(tx, "LED status: {}", on).unwrap(); - if on { - led.set_high().unwrap(); - } else { - led.set_low().unwrap(); - } + led.set_state(on.into()).unwrap(); on = !on; if let Ok(byte) = rx.read() { writeln!(tx, "read char: '{}'", byte as char).unwrap(); @@ -89,8 +83,3 @@ fn main() -> ! { timer.delay_ms(1000u32); } } - -#[panic_handler] -fn panic(_panic_info: &PanicInfo<'_>) -> ! { - loop {} -} diff --git a/examples/i2c_oled_display/.cargo/config b/examples/i2c_oled_display/.cargo/config index 263ebc9..7b512e5 100644 --- a/examples/i2c_oled_display/.cargo/config +++ b/examples/i2c_oled_display/.cargo/config @@ -1,6 +1,6 @@ [target.mipsel-unknown-none] -rustflags = ["-C", "link-arg=-T32MX270F256B_procdefs.ld"] +rustflags = ["-C", "link-arg=-Tlink.x"] [build] target = "mipsel-unknown-none" diff --git a/examples/i2c_oled_display/Cargo.lock b/examples/i2c_oled_display/Cargo.lock index 1009b40..d1e2e71 100644 --- a/examples/i2c_oled_display/Cargo.lock +++ b/examples/i2c_oled_display/Cargo.lock @@ -109,7 +109,7 @@ checksum = "5e9a1f9f7d83e59740248a6e14ecf93929ade55027844dfcea78beafccc15745" dependencies = [ "proc-macro2", "quote", - "syn 2.0.18", + "syn 2.0.23", ] [[package]] @@ -123,17 +123,17 @@ dependencies = [ [[package]] name = "i2c_oled_display" -version = "0.3.0" +version = "0.4.0" dependencies = [ "critical-section", "embedded-graphics", "embedded-hal", "mips-mcu", "mips-rt", + "panic-halt", "pic32-config-sector", "pic32-hal", "ssd1306", - "tinylog", ] [[package]] @@ -153,9 +153,9 @@ dependencies = [ [[package]] name = "mips-rt" -version = "0.3.1" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d5524ac83440e7e7d18012dc92c48ccb0447e4f2d0adbe0a8be72cc58e33a49" +checksum = "02d5422c1066894ce6c029bed692dfafc297d91e4056e1df8c85bb6b01b0f332" dependencies = [ "mips-rt-macros", ] @@ -196,16 +196,22 @@ dependencies = [ ] [[package]] -name = "pic32-config-sector" +name = "panic-halt" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad21a2aff96011e7f7e917a013a9eb246e73d5dae1fe0d94ea1d7e452fa88498" +checksum = "de96540e0ebde571dc55c73d60ef407c653844e6f9a1e2fdbd40c07b9252d812" + +[[package]] +name = "pic32-config-sector" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5dfd36f1915570f83a10b3fda6f8c4aab461078281b99fc3ca9585cebd91420" [[package]] name = "pic32-hal" -version = "0.9.0" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f6393dd973e257ad9652c2aa8402de1ad71ce4fadd52579ea83e229db94748b" +checksum = "66035d2e0335987b58576c23e586444b5e83d30a9c74fee70818dad6efcc89ac" dependencies = [ "critical-section", "embedded-hal", @@ -229,18 +235,18 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.60" +version = "1.0.63" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dec2b086b7a862cf4de201096214fa870344cf922b2b30c167badb3af3195406" +checksum = "7b368fba921b0dce7e60f5e04ec15e565b3303972b42bcfde1d0713b881959eb" dependencies = [ "unicode-ident", ] [[package]] name = "quote" -version = "1.0.28" +version = "1.0.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b9ab9c7eadfd8df19006f1cf1a4aed13540ed5cbc047010ece5826e10825488" +checksum = "573015e8ab27661678357f27dc26460738fd2b6c86e46f386fde94cb5d913105" dependencies = [ "proc-macro2", ] @@ -271,25 +277,20 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.18" +version = "2.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32d41677bcbe24c20c52e7c70b0d8db04134c5d1066bf98662e2871ad200ea3e" +checksum = "59fb7d6d8281a51045d62b8eb3a7d1ce347b76f312af50cd3dc0af39c87c1737" dependencies = [ "proc-macro2", "quote", "unicode-ident", ] -[[package]] -name = "tinylog" -version = "0.1.0" -source = "git+https://github.com/kiffie/pic32-rs.git#cd9c04013297983948cb472d575d559a2a88d2ac" - [[package]] name = "unicode-ident" -version = "1.0.9" +version = "1.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b15811caf2415fb889178633e7724bad2509101cde276048e013b9def5e51fa0" +checksum = "22049a19f4a68748a168c0fc439f9516686aa045927ff767eca0a85101fb6e73" [[package]] name = "vcell" diff --git a/examples/i2c_oled_display/Cargo.toml b/examples/i2c_oled_display/Cargo.toml index 42b940d..394b04a 100644 --- a/examples/i2c_oled_display/Cargo.toml +++ b/examples/i2c_oled_display/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "i2c_oled_display" -version = "0.3.0" +version = "0.4.0" authors = ["Stephan "] license = "MIT OR Apache-2.0" edition = "2018" @@ -13,14 +13,14 @@ default = ["pic32mx2xxfxxxb"] [dependencies] mips-mcu = { version = "0.3.0", features = ["critical-section-single-core"] } -mips-rt = "0.3.0" +mips-rt = "0.3.2" +panic-halt = "0.2.0" embedded-hal = "0.2.7" -critical-section = "1.0.0" -tinylog = { git = "https://github.com/kiffie/pic32-rs.git" } -pic32-hal = "0.9.0" +critical-section = "1.1.1" +pic32-hal = "0.10.0" ssd1306 = "0.8.0" embedded-graphics = "0.8.0" -pic32-config-sector = "0.2.0" +pic32-config-sector = "0.3.0" [profile.release] opt-level = 2 diff --git a/examples/i2c_oled_display/memory.x b/examples/i2c_oled_display/memory.x new file mode 100644 index 0000000..368212b --- /dev/null +++ b/examples/i2c_oled_display/memory.x @@ -0,0 +1,36 @@ +/* + * Memory region of PIC32MX devices + * + * LENGTH values need to be adapted to specific device variant. + * REGION_ALIAS functions are used to put the startup code either into the boot + * flash memory or into the program flash memory keeping the boot flash free for + * a boot loader. + */ + +/* Symbols used for interrupt-vector table generation */ +PROVIDE(_vector_spacing = 0x0001); +PROVIDE(_ebase_address = 0x9D000000); /* first 4 KiB of program flash */ + +MEMORY +{ + boot_flash (rx) : ORIGIN = 0xBFC00000, LENGTH = 3k - 0x10 + program_flash (rx) : ORIGIN = 0x9D000000, LENGTH = 128k + sram (w!x) : ORIGIN = 0x80000000, LENGTH = 32k + configsfrs : ORIGIN = ORIGIN(boot_flash) + LENGTH(boot_flash), LENGTH = 0x10 +} + +REGION_ALIAS("exception_mem", program_flash) +REGION_ALIAS("program_mem", program_flash) +REGION_ALIAS("data_mem", sram) + +/* aliases for direct start without bootloader + * put the reset handler into the boot flash. + */ +REGION_ALIAS(reset_mem, boot_flash) + +/* aliases for bootloader support + * put the bootloader into the boot flash memory and the reset handler at the + * beginning of the normal program flash memory. + */ +/* REGION_ALIAS(reset_mem, program_flash) +REGION_ALIAS(bootloader_mem, boot_flash) */ diff --git a/examples/i2c_oled_display/pic32_common.ld b/examples/i2c_oled_display/pic32_common.ld deleted file mode 100644 index 214af92..0000000 --- a/examples/i2c_oled_display/pic32_common.ld +++ /dev/null @@ -1,441 +0,0 @@ -/************************************************************************* - * common part of the linker script for all PIC32 devices - *************************************************************************/ - -/* Default value for General Exception handler */ -/* PROVIDE(_general_exception_context = _default_handler); */ - -/* The entry point is the reset handler */ -ENTRY(_reset); - -EXTERN(_gen_exception) - -/* stack */ -PROVIDE(_stack = ORIGIN(data_mem) + LENGTH(data_mem)); - -/* Pre-initialization function */ -/* If the user overrides this using the `pre_init!` macro or by creating a `__pre_init` function, - then the function this points to will be called before the RAM is initialized. */ -PROVIDE(__pre_init = DefaultPreInit); - -/* # Sections */ -SECTIONS -{ - /* boot loader */ - .bootloader : { - KEEP(*(.bootloader)) - } > bootloader_mem - - /* ## PIC32MX configuration registers */ - .configsfrs : { - KEEP(*(.configsfrs)); - } > configsfrs - - /* Reset Sections */ - .reset : - { - KEEP(*(.reset)) - KEEP(*(.reset.startup)) - } > reset_mem - /* .bev_excpt _BEV_EXCPT_ADDR : - { - KEEP(*(.bev_handler)) - } > kseg1_boot_mem */ - /* Debug exception vector */ - /* Space reserved for the debug executive */ -/* .dbg_code _DBG_CODE_ADDR (NOLOAD) : - { - . += (DEFINED (_DEBUGGER) ? _DBG_CODE_SIZE : 0x0); - } > debug_exec_mem */ - - /* Exception handlers */ - .app_excpt _ebase_address + 0x180: - { - KEEP(*(.gen_handler)) - } > exception_mem - - .vector_0 _ebase_address + 0x200 + ((_vector_spacing << 5) * 0) : - { - KEEP(*(.vector_0)) - } > exception_mem - ASSERT (_vector_spacing == 0 || SIZEOF(.vector_0) <= (_vector_spacing << 5), "function at exception vector 0 too large") - .vector_1 _ebase_address + 0x200 + ((_vector_spacing << 5) * 1) : - { - KEEP(*(.vector_1)) - } > exception_mem - ASSERT (_vector_spacing == 0 || SIZEOF(.vector_1) <= (_vector_spacing << 5), "function at exception vector 1 too large") - .vector_2 _ebase_address + 0x200 + ((_vector_spacing << 5) * 2) : - { - KEEP(*(.vector_2)) - } > exception_mem - ASSERT (_vector_spacing == 0 || SIZEOF(.vector_2) <= (_vector_spacing << 5), "function at exception vector 2 too large") - .vector_3 _ebase_address + 0x200 + ((_vector_spacing << 5) * 3) : - { - KEEP(*(.vector_3)) - } > exception_mem - ASSERT (_vector_spacing == 0 || SIZEOF(.vector_3) <= (_vector_spacing << 5), "function at exception vector 3 too large") - .vector_4 _ebase_address + 0x200 + ((_vector_spacing << 5) * 4) : - { - KEEP(*(.vector_4)) - } > exception_mem - ASSERT (_vector_spacing == 0 || SIZEOF(.vector_4) <= (_vector_spacing << 5), "function at exception vector 4 too large") - .vector_5 _ebase_address + 0x200 + ((_vector_spacing << 5) * 5) : - { - KEEP(*(.vector_5)) - } > exception_mem - ASSERT (_vector_spacing == 0 || SIZEOF(.vector_5) <= (_vector_spacing << 5), "function at exception vector 5 too large") - .vector_6 _ebase_address + 0x200 + ((_vector_spacing << 5) * 6) : - { - KEEP(*(.vector_6)) - } > exception_mem - ASSERT (_vector_spacing == 0 || SIZEOF(.vector_6) <= (_vector_spacing << 5), "function at exception vector 6 too large") - .vector_7 _ebase_address + 0x200 + ((_vector_spacing << 5) * 7) : - { - KEEP(*(.vector_7)) - } > exception_mem - ASSERT (_vector_spacing == 0 || SIZEOF(.vector_7) <= (_vector_spacing << 5), "function at exception vector 7 too large") - .vector_8 _ebase_address + 0x200 + ((_vector_spacing << 5) * 8) : - { - KEEP(*(.vector_8)) - } > exception_mem - ASSERT (_vector_spacing == 0 || SIZEOF(.vector_8) <= (_vector_spacing << 5), "function at exception vector 8 too large") - .vector_9 _ebase_address + 0x200 + ((_vector_spacing << 5) * 9) : - { - KEEP(*(.vector_9)) - } > exception_mem - ASSERT (_vector_spacing == 0 || SIZEOF(.vector_9) <= (_vector_spacing << 5), "function at exception vector 9 too large") - .vector_10 _ebase_address + 0x200 + ((_vector_spacing << 5) * 10) : - { - KEEP(*(.vector_10)) - } > exception_mem - ASSERT (_vector_spacing == 0 || SIZEOF(.vector_10) <= (_vector_spacing << 5), "function at exception vector 10 too large") - .vector_11 _ebase_address + 0x200 + ((_vector_spacing << 5) * 11) : - { - KEEP(*(.vector_11)) - } > exception_mem - ASSERT (_vector_spacing == 0 || SIZEOF(.vector_11) <= (_vector_spacing << 5), "function at exception vector 11 too large") - .vector_12 _ebase_address + 0x200 + ((_vector_spacing << 5) * 12) : - { - KEEP(*(.vector_12)) - } > exception_mem - ASSERT (_vector_spacing == 0 || SIZEOF(.vector_12) <= (_vector_spacing << 5), "function at exception vector 12 too large") - .vector_13 _ebase_address + 0x200 + ((_vector_spacing << 5) * 13) : - { - KEEP(*(.vector_13)) - } > exception_mem - ASSERT (_vector_spacing == 0 || SIZEOF(.vector_13) <= (_vector_spacing << 5), "function at exception vector 13 too large") - .vector_14 _ebase_address + 0x200 + ((_vector_spacing << 5) * 14) : - { - KEEP(*(.vector_14)) - } > exception_mem - ASSERT (_vector_spacing == 0 || SIZEOF(.vector_14) <= (_vector_spacing << 5), "function at exception vector 14 too large") - .vector_15 _ebase_address + 0x200 + ((_vector_spacing << 5) * 15) : - { - KEEP(*(.vector_15)) - } > exception_mem - ASSERT (_vector_spacing == 0 || SIZEOF(.vector_15) <= (_vector_spacing << 5), "function at exception vector 15 too large") - .vector_16 _ebase_address + 0x200 + ((_vector_spacing << 5) * 16) : - { - KEEP(*(.vector_16)) - } > exception_mem - ASSERT (_vector_spacing == 0 || SIZEOF(.vector_16) <= (_vector_spacing << 5), "function at exception vector 16 too large") - .vector_17 _ebase_address + 0x200 + ((_vector_spacing << 5) * 17) : - { - KEEP(*(.vector_17)) - } > exception_mem - ASSERT (_vector_spacing == 0 || SIZEOF(.vector_17) <= (_vector_spacing << 5), "function at exception vector 17 too large") - .vector_18 _ebase_address + 0x200 + ((_vector_spacing << 5) * 18) : - { - KEEP(*(.vector_18)) - } > exception_mem - ASSERT (_vector_spacing == 0 || SIZEOF(.vector_18) <= (_vector_spacing << 5), "function at exception vector 18 too large") - .vector_19 _ebase_address + 0x200 + ((_vector_spacing << 5) * 19) : - { - KEEP(*(.vector_19)) - } > exception_mem - ASSERT (_vector_spacing == 0 || SIZEOF(.vector_19) <= (_vector_spacing << 5), "function at exception vector 19 too large") - .vector_20 _ebase_address + 0x200 + ((_vector_spacing << 5) * 20) : - { - KEEP(*(.vector_20)) - } > exception_mem - ASSERT (_vector_spacing == 0 || SIZEOF(.vector_20) <= (_vector_spacing << 5), "function at exception vector 20 too large") - .vector_21 _ebase_address + 0x200 + ((_vector_spacing << 5) * 21) : - { - KEEP(*(.vector_21)) - } > exception_mem - ASSERT (_vector_spacing == 0 || SIZEOF(.vector_21) <= (_vector_spacing << 5), "function at exception vector 21 too large") - .vector_22 _ebase_address + 0x200 + ((_vector_spacing << 5) * 22) : - { - KEEP(*(.vector_22)) - } > exception_mem - ASSERT (_vector_spacing == 0 || SIZEOF(.vector_22) <= (_vector_spacing << 5), "function at exception vector 22 too large") - .vector_23 _ebase_address + 0x200 + ((_vector_spacing << 5) * 23) : - { - KEEP(*(.vector_23)) - } > exception_mem - ASSERT (_vector_spacing == 0 || SIZEOF(.vector_23) <= (_vector_spacing << 5), "function at exception vector 23 too large") - .vector_24 _ebase_address + 0x200 + ((_vector_spacing << 5) * 24) : - { - KEEP(*(.vector_24)) - } > exception_mem - ASSERT (_vector_spacing == 0 || SIZEOF(.vector_24) <= (_vector_spacing << 5), "function at exception vector 24 too large") - .vector_25 _ebase_address + 0x200 + ((_vector_spacing << 5) * 25) : - { - KEEP(*(.vector_25)) - } > exception_mem - ASSERT (_vector_spacing == 0 || SIZEOF(.vector_25) <= (_vector_spacing << 5), "function at exception vector 25 too large") - .vector_26 _ebase_address + 0x200 + ((_vector_spacing << 5) * 26) : - { - KEEP(*(.vector_26)) - } > exception_mem - ASSERT (_vector_spacing == 0 || SIZEOF(.vector_26) <= (_vector_spacing << 5), "function at exception vector 26 too large") - .vector_27 _ebase_address + 0x200 + ((_vector_spacing << 5) * 27) : - { - KEEP(*(.vector_27)) - } > exception_mem - ASSERT (_vector_spacing == 0 || SIZEOF(.vector_27) <= (_vector_spacing << 5), "function at exception vector 27 too large") - .vector_28 _ebase_address + 0x200 + ((_vector_spacing << 5) * 28) : - { - KEEP(*(.vector_28)) - } > exception_mem - ASSERT (_vector_spacing == 0 || SIZEOF(.vector_28) <= (_vector_spacing << 5), "function at exception vector 28 too large") - .vector_29 _ebase_address + 0x200 + ((_vector_spacing << 5) * 29) : - { - KEEP(*(.vector_29)) - } > exception_mem - ASSERT (_vector_spacing == 0 || SIZEOF(.vector_29) <= (_vector_spacing << 5), "function at exception vector 29 too large") - .vector_30 _ebase_address + 0x200 + ((_vector_spacing << 5) * 30) : - { - KEEP(*(.vector_30)) - } > exception_mem - ASSERT (_vector_spacing == 0 || SIZEOF(.vector_30) <= (_vector_spacing << 5), "function at exception vector 30 too large") - .vector_31 _ebase_address + 0x200 + ((_vector_spacing << 5) * 31) : - { - KEEP(*(.vector_31)) - } > exception_mem - ASSERT (_vector_spacing == 0 || SIZEOF(.vector_31) <= (_vector_spacing << 5), "function at exception vector 31 too large") - .vector_32 _ebase_address + 0x200 + ((_vector_spacing << 5) * 32) : - { - KEEP(*(.vector_32)) - } > exception_mem - ASSERT (_vector_spacing == 0 || SIZEOF(.vector_32) <= (_vector_spacing << 5), "function at exception vector 32 too large") - .vector_33 _ebase_address + 0x200 + ((_vector_spacing << 5) * 33) : - { - KEEP(*(.vector_33)) - } > exception_mem - ASSERT (_vector_spacing == 0 || SIZEOF(.vector_33) <= (_vector_spacing << 5), "function at exception vector 33 too large") - .vector_34 _ebase_address + 0x200 + ((_vector_spacing << 5) * 34) : - { - KEEP(*(.vector_34)) - } > exception_mem - ASSERT (_vector_spacing == 0 || SIZEOF(.vector_34) <= (_vector_spacing << 5), "function at exception vector 34 too large") - .vector_35 _ebase_address + 0x200 + ((_vector_spacing << 5) * 35) : - { - KEEP(*(.vector_35)) - } > exception_mem - ASSERT (_vector_spacing == 0 || SIZEOF(.vector_35) <= (_vector_spacing << 5), "function at exception vector 35 too large") - .vector_36 _ebase_address + 0x200 + ((_vector_spacing << 5) * 36) : - { - KEEP(*(.vector_36)) - } > exception_mem - ASSERT (_vector_spacing == 0 || SIZEOF(.vector_36) <= (_vector_spacing << 5), "function at exception vector 36 too large") - .vector_37 _ebase_address + 0x200 + ((_vector_spacing << 5) * 37) : - { - KEEP(*(.vector_37)) - } > exception_mem - ASSERT (_vector_spacing == 0 || SIZEOF(.vector_37) <= (_vector_spacing << 5), "function at exception vector 37 too large") - .vector_38 _ebase_address + 0x200 + ((_vector_spacing << 5) * 38) : - { - KEEP(*(.vector_38)) - } > exception_mem - ASSERT (_vector_spacing == 0 || SIZEOF(.vector_38) <= (_vector_spacing << 5), "function at exception vector 38 too large") - .vector_39 _ebase_address + 0x200 + ((_vector_spacing << 5) * 39) : - { - KEEP(*(.vector_39)) - } > exception_mem - ASSERT (_vector_spacing == 0 || SIZEOF(.vector_39) <= (_vector_spacing << 5), "function at exception vector 39 too large") - .vector_40 _ebase_address + 0x200 + ((_vector_spacing << 5) * 40) : - { - KEEP(*(.vector_40)) - } > exception_mem - ASSERT (_vector_spacing == 0 || SIZEOF(.vector_40) <= (_vector_spacing << 5), "function at exception vector 40 too large") - .vector_41 _ebase_address + 0x200 + ((_vector_spacing << 5) * 41) : - { - KEEP(*(.vector_41)) - } > exception_mem - ASSERT (_vector_spacing == 0 || SIZEOF(.vector_41) <= (_vector_spacing << 5), "function at exception vector 41 too large") - .vector_42 _ebase_address + 0x200 + ((_vector_spacing << 5) * 42) : - { - KEEP(*(.vector_42)) - } > exception_mem - ASSERT (_vector_spacing == 0 || SIZEOF(.vector_42) <= (_vector_spacing << 5), "function at exception vector 42 too large") - .vector_43 _ebase_address + 0x200 + ((_vector_spacing << 5) * 43) : - { - KEEP(*(.vector_43)) - } > exception_mem - ASSERT (_vector_spacing == 0 || SIZEOF(.vector_43) <= (_vector_spacing << 5), "function at exception vector 43 too large") - .vector_44 _ebase_address + 0x200 + ((_vector_spacing << 5) * 44) : - { - KEEP(*(.vector_44)) - } > exception_mem - ASSERT (_vector_spacing == 0 || SIZEOF(.vector_44) <= (_vector_spacing << 5), "function at exception vector 44 too large") - .vector_45 _ebase_address + 0x200 + ((_vector_spacing << 5) * 45) : - { - KEEP(*(.vector_45)) - } > exception_mem - ASSERT (_vector_spacing == 0 || SIZEOF(.vector_45) <= (_vector_spacing << 5), "function at exception vector 45 too large") - .vector_46 _ebase_address + 0x200 + ((_vector_spacing << 5) * 46) : - { - KEEP(*(.vector_46)) - } > exception_mem - ASSERT (_vector_spacing == 0 || SIZEOF(.vector_46) <= (_vector_spacing << 5), "function at exception vector 46 too large") - .vector_47 _ebase_address + 0x200 + ((_vector_spacing << 5) * 47) : - { - KEEP(*(.vector_47)) - } > exception_mem - ASSERT (_vector_spacing == 0 || SIZEOF(.vector_47) <= (_vector_spacing << 5), "function at exception vector 47 too large") - .vector_48 _ebase_address + 0x200 + ((_vector_spacing << 5) * 48) : - { - KEEP(*(.vector_48)) - } > exception_mem - ASSERT (_vector_spacing == 0 || SIZEOF(.vector_48) <= (_vector_spacing << 5), "function at exception vector 48 too large") - .vector_49 _ebase_address + 0x200 + ((_vector_spacing << 5) * 49) : - { - KEEP(*(.vector_49)) - } > exception_mem - ASSERT (_vector_spacing == 0 || SIZEOF(.vector_49) <= (_vector_spacing << 5), "function at exception vector 49 too large") - .vector_50 _ebase_address + 0x200 + ((_vector_spacing << 5) * 50) : - { - KEEP(*(.vector_50)) - } > exception_mem - ASSERT (_vector_spacing == 0 || SIZEOF(.vector_50) <= (_vector_spacing << 5), "function at exception vector 50 too large") - .vector_51 _ebase_address + 0x200 + ((_vector_spacing << 5) * 51) : - { - KEEP(*(.vector_51)) - } > exception_mem - ASSERT (_vector_spacing == 0 || SIZEOF(.vector_51) <= (_vector_spacing << 5), "function at exception vector 51 too large") - .vector_52 _ebase_address + 0x200 + ((_vector_spacing << 5) * 52) : - { - KEEP(*(.vector_52)) - } > exception_mem - ASSERT (_vector_spacing == 0 || SIZEOF(.vector_52) <= (_vector_spacing << 5), "function at exception vector 52 too large") - .vector_53 _ebase_address + 0x200 + ((_vector_spacing << 5) * 53) : - { - KEEP(*(.vector_53)) - } > exception_mem - ASSERT (_vector_spacing == 0 || SIZEOF(.vector_53) <= (_vector_spacing << 5), "function at exception vector 53 too large") - .vector_54 _ebase_address + 0x200 + ((_vector_spacing << 5) * 54) : - { - KEEP(*(.vector_54)) - } > exception_mem - ASSERT (_vector_spacing == 0 || SIZEOF(.vector_54) <= (_vector_spacing << 5), "function at exception vector 54 too large") - .vector_55 _ebase_address + 0x200 + ((_vector_spacing << 5) * 55) : - { - KEEP(*(.vector_55)) - } > exception_mem - ASSERT (_vector_spacing == 0 || SIZEOF(.vector_55) <= (_vector_spacing << 5), "function at exception vector 55 too large") - .vector_56 _ebase_address + 0x200 + ((_vector_spacing << 5) * 56) : - { - KEEP(*(.vector_56)) - } > exception_mem - ASSERT (_vector_spacing == 0 || SIZEOF(.vector_56) <= (_vector_spacing << 5), "function at exception vector 56 too large") - .vector_57 _ebase_address + 0x200 + ((_vector_spacing << 5) * 57) : - { - KEEP(*(.vector_57)) - } > exception_mem - ASSERT (_vector_spacing == 0 || SIZEOF(.vector_57) <= (_vector_spacing << 5), "function at exception vector 57 too large") - .vector_58 _ebase_address + 0x200 + ((_vector_spacing << 5) * 58) : - { - KEEP(*(.vector_58)) - } > exception_mem - ASSERT (_vector_spacing == 0 || SIZEOF(.vector_58) <= (_vector_spacing << 5), "function at exception vector 58 too large") - .vector_59 _ebase_address + 0x200 + ((_vector_spacing << 5) * 59) : - { - KEEP(*(.vector_59)) - } > exception_mem - ASSERT (_vector_spacing == 0 || SIZEOF(.vector_59) <= (_vector_spacing << 5), "function at exception vector 59 too large") - .vector_60 _ebase_address + 0x200 + ((_vector_spacing << 5) * 60) : - { - KEEP(*(.vector_60)) - } > exception_mem - ASSERT (_vector_spacing == 0 || SIZEOF(.vector_60) <= (_vector_spacing << 5), "function at exception vector 60 too large") - .vector_61 _ebase_address + 0x200 + ((_vector_spacing << 5) * 61) : - { - KEEP(*(.vector_61)) - } > exception_mem - ASSERT (_vector_spacing == 0 || SIZEOF(.vector_61) <= (_vector_spacing << 5), "function at exception vector 61 too large") - .vector_62 _ebase_address + 0x200 + ((_vector_spacing << 5) * 62) : - { - KEEP(*(.vector_62)) - } > exception_mem - ASSERT (_vector_spacing == 0 || SIZEOF(.vector_62) <= (_vector_spacing << 5), "function at exception vector 62 too large") - .vector_63 _ebase_address + 0x200 + ((_vector_spacing << 5) * 63) : - { - KEEP(*(.vector_63)) - } > exception_mem - ASSERT (_vector_spacing == 0 || SIZEOF(.vector_63) <= (_vector_spacing << 5), "function at exception vector 63 too large") - - /* ### .text */ - .text : - { - *(.text .text.*); - } > program_mem - - /* ### .rodata */ - .rodata : ALIGN(4) - { - *(.rodata .rodata.*); - - /* 4-byte align the end (VMA) of this section. - This is required by LLD to ensure the LMA of the following .data - section will have the correct alignment. */ - . = ALIGN(4); - } > program_mem - - /* ## Sections in RAM */ - /* ### .data */ - .data : ALIGN(4) - { - *(.data .data.*); - - . = ALIGN(4); /* 4-byte align the end (VMA) of this section */ - } > data_mem AT > program_mem - - /* VMA of .data */ - __sdata = ADDR(.data); - __edata = ADDR(.data) + SIZEOF(.data); - - /* LMA of .data */ - __sidata = LOADADDR(.data); - - /* ### .bss */ - .bss : ALIGN(4) - { - *(.bss .bss.*); - - . = ALIGN(4); /* 4-byte align the end (VMA) of this section */ - } > data_mem - - __sbss = ADDR(.bss); - __ebss = ADDR(.bss) + SIZEOF(.bss); - - /* Place the heap right after `.bss` */ - __sheap = ADDR(.bss) + SIZEOF(.bss); - - /* Stack usage metadata emitted by LLVM */ - .stack_sizes (INFO) : - { - KEEP(*(.stack_sizes)); - } - - /* ## Discarded sections */ - /DISCARD/ : - { - *(.reginfo); - *(.MIPS.abiflags); - *(.eh_frame_hdr); - *(.eh_frame); - *(.got); - } -} - diff --git a/examples/i2c_oled_display/src/main.rs b/examples/i2c_oled_display/src/main.rs index a8ea8d5..9e3ebec 100644 --- a/examples/i2c_oled_display/src/main.rs +++ b/examples/i2c_oled_display/src/main.rs @@ -2,11 +2,8 @@ #![no_main] #![no_std] -#![feature(panic_info_message)] -use core::cell::RefCell; -use core::panic::PanicInfo; -use critical_section::{self, Mutex}; +use core::fmt::Write; use embedded_graphics::{ image::{Image, ImageRaw}, mono_font::{ @@ -20,23 +17,21 @@ use embedded_graphics::{ use embedded_hal::{ blocking::delay::DelayMs, digital::v2::{OutputPin, ToggleableOutputPin}, - serial::Write, }; use mips_rt::{self, entry}; +use panic_halt as _; use pic32_hal::{ clock::Osc, coretimer::Delay, gpio::GpioExt, i2c::{Fscl, I2c}, pac, - pac::UART2, pps::{MapPin, NoPin, PpsExt}, pps_no_pin, time::U32Ext, - uart::{Tx, Uart}, + uart::Uart, }; use ssd1306::{prelude::*, I2CDisplayInterface, Ssd1306}; -use tinylog::{self, debug, error, info}; #[cfg(feature = "pic32mx1xxfxxxb")] use pic32_config_sector::pic32mx1xx::*; @@ -45,8 +40,6 @@ use pic32_config_sector::pic32mx2x4::*; #[cfg(feature = "pic32mx2xxfxxxb")] use pic32_config_sector::pic32mx2xx::*; -const TL_LOGLEVEL: tinylog::Level = tinylog::Level::Debug; - // PIC32 configuration registers for PIC32MX150 #[cfg(feature = "pic32mx1xxfxxxb")] #[link_section = ".configsfrs"] @@ -118,24 +111,6 @@ pub static CONFIGSFRS: ConfigSector = ConfigSector::default() .DEBUG(DEBUG::OFF) .build(); -static LOG_TX2: Mutex>>> = Mutex::new(RefCell::new(None)); - -fn log_bwrite_all(buffer: &[u8]) { - let is_none = critical_section::with(|cs| LOG_TX2.borrow(cs).borrow_mut().is_none()); - if is_none { - return; - } - for b in buffer { - loop { - if critical_section::with(|cs| LOG_TX2.borrow_ref_mut(cs).as_mut().unwrap().write(*b)) - .is_ok() - { - break; - } - } - } -} - #[entry] fn main() -> ! { //configure IO ports for UART @@ -159,13 +134,8 @@ fn main() -> ! { .map_pin(vpins.outputs.u2tx); let uart = Uart::uart2(p.UART2, &clock, 115200, pps_no_pin!(vpins.inputs.u2rx), txd); timer.delay_ms(10u32); - let (tx, _) = uart.split(); - critical_section::with(|cs| { - *LOG_TX2.borrow_ref_mut(cs) = Some(tx); - }); - tinylog::set_bwrite_all(log_bwrite_all); - info!("I2C oled display example"); - debug!("sysclock = {} Hz", sysclock.0); + let (mut tx, _) = uart.split(); + writeln!(tx, "I2C oled display example").unwrap(); /* LED */ let mut led = portb.rb5.into_push_pull_output(); @@ -178,7 +148,7 @@ fn main() -> ! { timer.delay_ms(100); } - info!("initializing display"); + writeln!(tx, "initializing display").unwrap(); let i2c = I2c::i2c1(p.I2C1, clock.pb_clock(), Fscl::F400KHZ); let interface = I2CDisplayInterface::new(i2c); let mut disp = Ssd1306::new(interface, DisplaySize128x64, DisplayRotation::Rotate0) @@ -215,7 +185,7 @@ fn main() -> ! { let raw: ImageRaw = ImageRaw::new(include_bytes!("./rust.raw"), 64); - info!("starting loop"); + writeln!(tx, "starting loop").unwrap(); let mut x = 0; let mut move_right = true; @@ -229,27 +199,16 @@ fn main() -> ! { if x < 64 { x += 1; } else { - debug!("left"); + writeln!(tx, "left").unwrap(); led.set_high().unwrap(); move_right = false; } } else if x > 0 { x -= 1; } else { - debug!("right"); + writeln!(tx, "right").unwrap(); led.set_low().unwrap(); move_right = true; } } } - -#[panic_handler] -fn panic(panic_info: &PanicInfo<'_>) -> ! { - if let Some(s) = panic_info.message() { - error!("Panic: {:?}", s); - } else { - error!("Panic"); - } - error!("entering endless loop."); - loop {} -} diff --git a/examples/usb_serial/.cargo/config b/examples/usb_serial/.cargo/config index 263ebc9..7b512e5 100644 --- a/examples/usb_serial/.cargo/config +++ b/examples/usb_serial/.cargo/config @@ -1,6 +1,6 @@ [target.mipsel-unknown-none] -rustflags = ["-C", "link-arg=-T32MX270F256B_procdefs.ld"] +rustflags = ["-C", "link-arg=-Tlink.x"] [build] target = "mipsel-unknown-none" diff --git a/examples/usb_serial/32MX270F256B_procdefs.ld b/examples/usb_serial/32MX270F256B_procdefs.ld deleted file mode 100644 index 858d8aa..0000000 --- a/examples/usb_serial/32MX270F256B_procdefs.ld +++ /dev/null @@ -1,40 +0,0 @@ -/************************************************************************* - * Processor-specific linker script for PIC32MX170 and PIC32MX270 - *************************************************************************/ - -/************************************************************************* - * Symbols used for interrupt-vector table generation - *************************************************************************/ -PROVIDE(_vector_spacing = 0x0001); -PROVIDE(_ebase_address = 0x9D000000); /* first 4 KiB of program flash */ - - -MEMORY -{ - boot_flash (rx) : ORIGIN = 0xBFC00000, LENGTH = 0xc00 - program_flash (rx) : ORIGIN = 0x9D000000, LENGTH = 256k - sram (w!x) : ORIGIN = 0x80000000, LENGTH = 64k - configsfrs : ORIGIN = 0xBFC00BF0, LENGTH = 0x10 -} - -REGION_ALIAS("exception_mem", program_flash) -REGION_ALIAS("program_mem", program_flash) -REGION_ALIAS("data_mem", sram) - -/* aliases for direct start without bootloader - * put the reset handler into the boot flash. - */ -REGION_ALIAS(reset_mem, boot_flash) - -/* aliases for bootloader support - * put the bootloader into the boot flash section and the reset handler at the - * beginning of the normal program flash memory. - */ -/* REGION_ALIAS(reset_mem, program_flash) -REGION_ALIAS(bootloader_mem, boot_flash) */ - -/************************************************************************* - * common part for all PIC32 devices - *************************************************************************/ -INPUT("device.x") /* interrupt vector symbols from Peripheral Access Crate */ -INPUT("pic32_common.ld") diff --git a/examples/usb_serial/Cargo.lock b/examples/usb_serial/Cargo.lock index f9d0952..71c9981 100644 --- a/examples/usb_serial/Cargo.lock +++ b/examples/usb_serial/Cargo.lock @@ -55,9 +55,9 @@ dependencies = [ [[package]] name = "mips-mcu-alloc" -version = "0.6.0" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70b64f77b28ceae4862a132ef77411bda6ef3c8f9e0e19a15338219681ee08ed" +checksum = "8d7fe7bfe28ddedea20ed71329ac6492cee700278b8f4c78c1638f2a54ff0bbf" dependencies = [ "critical-section", "linked_list_allocator", @@ -67,9 +67,9 @@ dependencies = [ [[package]] name = "mips-rt" -version = "0.3.1" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d5524ac83440e7e7d18012dc92c48ccb0447e4f2d0adbe0a8be72cc58e33a49" +checksum = "02d5422c1066894ce6c029bed692dfafc297d91e4056e1df8c85bb6b01b0f332" dependencies = [ "mips-rt-macros", ] @@ -108,15 +108,15 @@ checksum = "de96540e0ebde571dc55c73d60ef407c653844e6f9a1e2fdbd40c07b9252d812" [[package]] name = "pic32-config-sector" -version = "0.2.0" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad21a2aff96011e7f7e917a013a9eb246e73d5dae1fe0d94ea1d7e452fa88498" +checksum = "c5dfd36f1915570f83a10b3fda6f8c4aab461078281b99fc3ca9585cebd91420" [[package]] name = "pic32-hal" -version = "0.9.0" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f6393dd973e257ad9652c2aa8402de1ad71ce4fadd52579ea83e229db94748b" +checksum = "66035d2e0335987b58576c23e586444b5e83d30a9c74fee70818dad6efcc89ac" dependencies = [ "critical-section", "embedded-hal", diff --git a/examples/usb_serial/Cargo.toml b/examples/usb_serial/Cargo.toml index 4d363af..994d99c 100644 --- a/examples/usb_serial/Cargo.toml +++ b/examples/usb_serial/Cargo.toml @@ -12,15 +12,16 @@ default = ["pic32mx2xxfxxxb"] [dependencies] mips-mcu = { version = "0.3.0", features = ["critical-section-single-core"] } -mips-rt = "0.3.0" -mips-mcu-alloc = "0.6.0" -embedded-hal = "0.2.3" -pic32-hal = { version = "0.9.0", features = ["usb-device"] } +mips-rt = "0.3.2" +mips-mcu-alloc = "0.6.1" +embedded-hal = "0.2.7" +pic32-hal = { version = "0.10.0", features = ["usb-device"] } panic-halt = "0.2.0" -usb-device = "0.2.5" -usbd-serial = "0.1.0" -pic32-config-sector = "0.2.0" +usb-device = "0.2.9" +usbd-serial = "0.1.1" +pic32-config-sector = "0.3.0" [profile.release] opt-level = 2 lto = true +debug = true diff --git a/examples/usb_serial/memory.x b/examples/usb_serial/memory.x new file mode 100644 index 0000000..368212b --- /dev/null +++ b/examples/usb_serial/memory.x @@ -0,0 +1,36 @@ +/* + * Memory region of PIC32MX devices + * + * LENGTH values need to be adapted to specific device variant. + * REGION_ALIAS functions are used to put the startup code either into the boot + * flash memory or into the program flash memory keeping the boot flash free for + * a boot loader. + */ + +/* Symbols used for interrupt-vector table generation */ +PROVIDE(_vector_spacing = 0x0001); +PROVIDE(_ebase_address = 0x9D000000); /* first 4 KiB of program flash */ + +MEMORY +{ + boot_flash (rx) : ORIGIN = 0xBFC00000, LENGTH = 3k - 0x10 + program_flash (rx) : ORIGIN = 0x9D000000, LENGTH = 128k + sram (w!x) : ORIGIN = 0x80000000, LENGTH = 32k + configsfrs : ORIGIN = ORIGIN(boot_flash) + LENGTH(boot_flash), LENGTH = 0x10 +} + +REGION_ALIAS("exception_mem", program_flash) +REGION_ALIAS("program_mem", program_flash) +REGION_ALIAS("data_mem", sram) + +/* aliases for direct start without bootloader + * put the reset handler into the boot flash. + */ +REGION_ALIAS(reset_mem, boot_flash) + +/* aliases for bootloader support + * put the bootloader into the boot flash memory and the reset handler at the + * beginning of the normal program flash memory. + */ +/* REGION_ALIAS(reset_mem, program_flash) +REGION_ALIAS(bootloader_mem, boot_flash) */ diff --git a/examples/usb_serial/pic32_common.ld b/examples/usb_serial/pic32_common.ld deleted file mode 100644 index 214af92..0000000 --- a/examples/usb_serial/pic32_common.ld +++ /dev/null @@ -1,441 +0,0 @@ -/************************************************************************* - * common part of the linker script for all PIC32 devices - *************************************************************************/ - -/* Default value for General Exception handler */ -/* PROVIDE(_general_exception_context = _default_handler); */ - -/* The entry point is the reset handler */ -ENTRY(_reset); - -EXTERN(_gen_exception) - -/* stack */ -PROVIDE(_stack = ORIGIN(data_mem) + LENGTH(data_mem)); - -/* Pre-initialization function */ -/* If the user overrides this using the `pre_init!` macro or by creating a `__pre_init` function, - then the function this points to will be called before the RAM is initialized. */ -PROVIDE(__pre_init = DefaultPreInit); - -/* # Sections */ -SECTIONS -{ - /* boot loader */ - .bootloader : { - KEEP(*(.bootloader)) - } > bootloader_mem - - /* ## PIC32MX configuration registers */ - .configsfrs : { - KEEP(*(.configsfrs)); - } > configsfrs - - /* Reset Sections */ - .reset : - { - KEEP(*(.reset)) - KEEP(*(.reset.startup)) - } > reset_mem - /* .bev_excpt _BEV_EXCPT_ADDR : - { - KEEP(*(.bev_handler)) - } > kseg1_boot_mem */ - /* Debug exception vector */ - /* Space reserved for the debug executive */ -/* .dbg_code _DBG_CODE_ADDR (NOLOAD) : - { - . += (DEFINED (_DEBUGGER) ? _DBG_CODE_SIZE : 0x0); - } > debug_exec_mem */ - - /* Exception handlers */ - .app_excpt _ebase_address + 0x180: - { - KEEP(*(.gen_handler)) - } > exception_mem - - .vector_0 _ebase_address + 0x200 + ((_vector_spacing << 5) * 0) : - { - KEEP(*(.vector_0)) - } > exception_mem - ASSERT (_vector_spacing == 0 || SIZEOF(.vector_0) <= (_vector_spacing << 5), "function at exception vector 0 too large") - .vector_1 _ebase_address + 0x200 + ((_vector_spacing << 5) * 1) : - { - KEEP(*(.vector_1)) - } > exception_mem - ASSERT (_vector_spacing == 0 || SIZEOF(.vector_1) <= (_vector_spacing << 5), "function at exception vector 1 too large") - .vector_2 _ebase_address + 0x200 + ((_vector_spacing << 5) * 2) : - { - KEEP(*(.vector_2)) - } > exception_mem - ASSERT (_vector_spacing == 0 || SIZEOF(.vector_2) <= (_vector_spacing << 5), "function at exception vector 2 too large") - .vector_3 _ebase_address + 0x200 + ((_vector_spacing << 5) * 3) : - { - KEEP(*(.vector_3)) - } > exception_mem - ASSERT (_vector_spacing == 0 || SIZEOF(.vector_3) <= (_vector_spacing << 5), "function at exception vector 3 too large") - .vector_4 _ebase_address + 0x200 + ((_vector_spacing << 5) * 4) : - { - KEEP(*(.vector_4)) - } > exception_mem - ASSERT (_vector_spacing == 0 || SIZEOF(.vector_4) <= (_vector_spacing << 5), "function at exception vector 4 too large") - .vector_5 _ebase_address + 0x200 + ((_vector_spacing << 5) * 5) : - { - KEEP(*(.vector_5)) - } > exception_mem - ASSERT (_vector_spacing == 0 || SIZEOF(.vector_5) <= (_vector_spacing << 5), "function at exception vector 5 too large") - .vector_6 _ebase_address + 0x200 + ((_vector_spacing << 5) * 6) : - { - KEEP(*(.vector_6)) - } > exception_mem - ASSERT (_vector_spacing == 0 || SIZEOF(.vector_6) <= (_vector_spacing << 5), "function at exception vector 6 too large") - .vector_7 _ebase_address + 0x200 + ((_vector_spacing << 5) * 7) : - { - KEEP(*(.vector_7)) - } > exception_mem - ASSERT (_vector_spacing == 0 || SIZEOF(.vector_7) <= (_vector_spacing << 5), "function at exception vector 7 too large") - .vector_8 _ebase_address + 0x200 + ((_vector_spacing << 5) * 8) : - { - KEEP(*(.vector_8)) - } > exception_mem - ASSERT (_vector_spacing == 0 || SIZEOF(.vector_8) <= (_vector_spacing << 5), "function at exception vector 8 too large") - .vector_9 _ebase_address + 0x200 + ((_vector_spacing << 5) * 9) : - { - KEEP(*(.vector_9)) - } > exception_mem - ASSERT (_vector_spacing == 0 || SIZEOF(.vector_9) <= (_vector_spacing << 5), "function at exception vector 9 too large") - .vector_10 _ebase_address + 0x200 + ((_vector_spacing << 5) * 10) : - { - KEEP(*(.vector_10)) - } > exception_mem - ASSERT (_vector_spacing == 0 || SIZEOF(.vector_10) <= (_vector_spacing << 5), "function at exception vector 10 too large") - .vector_11 _ebase_address + 0x200 + ((_vector_spacing << 5) * 11) : - { - KEEP(*(.vector_11)) - } > exception_mem - ASSERT (_vector_spacing == 0 || SIZEOF(.vector_11) <= (_vector_spacing << 5), "function at exception vector 11 too large") - .vector_12 _ebase_address + 0x200 + ((_vector_spacing << 5) * 12) : - { - KEEP(*(.vector_12)) - } > exception_mem - ASSERT (_vector_spacing == 0 || SIZEOF(.vector_12) <= (_vector_spacing << 5), "function at exception vector 12 too large") - .vector_13 _ebase_address + 0x200 + ((_vector_spacing << 5) * 13) : - { - KEEP(*(.vector_13)) - } > exception_mem - ASSERT (_vector_spacing == 0 || SIZEOF(.vector_13) <= (_vector_spacing << 5), "function at exception vector 13 too large") - .vector_14 _ebase_address + 0x200 + ((_vector_spacing << 5) * 14) : - { - KEEP(*(.vector_14)) - } > exception_mem - ASSERT (_vector_spacing == 0 || SIZEOF(.vector_14) <= (_vector_spacing << 5), "function at exception vector 14 too large") - .vector_15 _ebase_address + 0x200 + ((_vector_spacing << 5) * 15) : - { - KEEP(*(.vector_15)) - } > exception_mem - ASSERT (_vector_spacing == 0 || SIZEOF(.vector_15) <= (_vector_spacing << 5), "function at exception vector 15 too large") - .vector_16 _ebase_address + 0x200 + ((_vector_spacing << 5) * 16) : - { - KEEP(*(.vector_16)) - } > exception_mem - ASSERT (_vector_spacing == 0 || SIZEOF(.vector_16) <= (_vector_spacing << 5), "function at exception vector 16 too large") - .vector_17 _ebase_address + 0x200 + ((_vector_spacing << 5) * 17) : - { - KEEP(*(.vector_17)) - } > exception_mem - ASSERT (_vector_spacing == 0 || SIZEOF(.vector_17) <= (_vector_spacing << 5), "function at exception vector 17 too large") - .vector_18 _ebase_address + 0x200 + ((_vector_spacing << 5) * 18) : - { - KEEP(*(.vector_18)) - } > exception_mem - ASSERT (_vector_spacing == 0 || SIZEOF(.vector_18) <= (_vector_spacing << 5), "function at exception vector 18 too large") - .vector_19 _ebase_address + 0x200 + ((_vector_spacing << 5) * 19) : - { - KEEP(*(.vector_19)) - } > exception_mem - ASSERT (_vector_spacing == 0 || SIZEOF(.vector_19) <= (_vector_spacing << 5), "function at exception vector 19 too large") - .vector_20 _ebase_address + 0x200 + ((_vector_spacing << 5) * 20) : - { - KEEP(*(.vector_20)) - } > exception_mem - ASSERT (_vector_spacing == 0 || SIZEOF(.vector_20) <= (_vector_spacing << 5), "function at exception vector 20 too large") - .vector_21 _ebase_address + 0x200 + ((_vector_spacing << 5) * 21) : - { - KEEP(*(.vector_21)) - } > exception_mem - ASSERT (_vector_spacing == 0 || SIZEOF(.vector_21) <= (_vector_spacing << 5), "function at exception vector 21 too large") - .vector_22 _ebase_address + 0x200 + ((_vector_spacing << 5) * 22) : - { - KEEP(*(.vector_22)) - } > exception_mem - ASSERT (_vector_spacing == 0 || SIZEOF(.vector_22) <= (_vector_spacing << 5), "function at exception vector 22 too large") - .vector_23 _ebase_address + 0x200 + ((_vector_spacing << 5) * 23) : - { - KEEP(*(.vector_23)) - } > exception_mem - ASSERT (_vector_spacing == 0 || SIZEOF(.vector_23) <= (_vector_spacing << 5), "function at exception vector 23 too large") - .vector_24 _ebase_address + 0x200 + ((_vector_spacing << 5) * 24) : - { - KEEP(*(.vector_24)) - } > exception_mem - ASSERT (_vector_spacing == 0 || SIZEOF(.vector_24) <= (_vector_spacing << 5), "function at exception vector 24 too large") - .vector_25 _ebase_address + 0x200 + ((_vector_spacing << 5) * 25) : - { - KEEP(*(.vector_25)) - } > exception_mem - ASSERT (_vector_spacing == 0 || SIZEOF(.vector_25) <= (_vector_spacing << 5), "function at exception vector 25 too large") - .vector_26 _ebase_address + 0x200 + ((_vector_spacing << 5) * 26) : - { - KEEP(*(.vector_26)) - } > exception_mem - ASSERT (_vector_spacing == 0 || SIZEOF(.vector_26) <= (_vector_spacing << 5), "function at exception vector 26 too large") - .vector_27 _ebase_address + 0x200 + ((_vector_spacing << 5) * 27) : - { - KEEP(*(.vector_27)) - } > exception_mem - ASSERT (_vector_spacing == 0 || SIZEOF(.vector_27) <= (_vector_spacing << 5), "function at exception vector 27 too large") - .vector_28 _ebase_address + 0x200 + ((_vector_spacing << 5) * 28) : - { - KEEP(*(.vector_28)) - } > exception_mem - ASSERT (_vector_spacing == 0 || SIZEOF(.vector_28) <= (_vector_spacing << 5), "function at exception vector 28 too large") - .vector_29 _ebase_address + 0x200 + ((_vector_spacing << 5) * 29) : - { - KEEP(*(.vector_29)) - } > exception_mem - ASSERT (_vector_spacing == 0 || SIZEOF(.vector_29) <= (_vector_spacing << 5), "function at exception vector 29 too large") - .vector_30 _ebase_address + 0x200 + ((_vector_spacing << 5) * 30) : - { - KEEP(*(.vector_30)) - } > exception_mem - ASSERT (_vector_spacing == 0 || SIZEOF(.vector_30) <= (_vector_spacing << 5), "function at exception vector 30 too large") - .vector_31 _ebase_address + 0x200 + ((_vector_spacing << 5) * 31) : - { - KEEP(*(.vector_31)) - } > exception_mem - ASSERT (_vector_spacing == 0 || SIZEOF(.vector_31) <= (_vector_spacing << 5), "function at exception vector 31 too large") - .vector_32 _ebase_address + 0x200 + ((_vector_spacing << 5) * 32) : - { - KEEP(*(.vector_32)) - } > exception_mem - ASSERT (_vector_spacing == 0 || SIZEOF(.vector_32) <= (_vector_spacing << 5), "function at exception vector 32 too large") - .vector_33 _ebase_address + 0x200 + ((_vector_spacing << 5) * 33) : - { - KEEP(*(.vector_33)) - } > exception_mem - ASSERT (_vector_spacing == 0 || SIZEOF(.vector_33) <= (_vector_spacing << 5), "function at exception vector 33 too large") - .vector_34 _ebase_address + 0x200 + ((_vector_spacing << 5) * 34) : - { - KEEP(*(.vector_34)) - } > exception_mem - ASSERT (_vector_spacing == 0 || SIZEOF(.vector_34) <= (_vector_spacing << 5), "function at exception vector 34 too large") - .vector_35 _ebase_address + 0x200 + ((_vector_spacing << 5) * 35) : - { - KEEP(*(.vector_35)) - } > exception_mem - ASSERT (_vector_spacing == 0 || SIZEOF(.vector_35) <= (_vector_spacing << 5), "function at exception vector 35 too large") - .vector_36 _ebase_address + 0x200 + ((_vector_spacing << 5) * 36) : - { - KEEP(*(.vector_36)) - } > exception_mem - ASSERT (_vector_spacing == 0 || SIZEOF(.vector_36) <= (_vector_spacing << 5), "function at exception vector 36 too large") - .vector_37 _ebase_address + 0x200 + ((_vector_spacing << 5) * 37) : - { - KEEP(*(.vector_37)) - } > exception_mem - ASSERT (_vector_spacing == 0 || SIZEOF(.vector_37) <= (_vector_spacing << 5), "function at exception vector 37 too large") - .vector_38 _ebase_address + 0x200 + ((_vector_spacing << 5) * 38) : - { - KEEP(*(.vector_38)) - } > exception_mem - ASSERT (_vector_spacing == 0 || SIZEOF(.vector_38) <= (_vector_spacing << 5), "function at exception vector 38 too large") - .vector_39 _ebase_address + 0x200 + ((_vector_spacing << 5) * 39) : - { - KEEP(*(.vector_39)) - } > exception_mem - ASSERT (_vector_spacing == 0 || SIZEOF(.vector_39) <= (_vector_spacing << 5), "function at exception vector 39 too large") - .vector_40 _ebase_address + 0x200 + ((_vector_spacing << 5) * 40) : - { - KEEP(*(.vector_40)) - } > exception_mem - ASSERT (_vector_spacing == 0 || SIZEOF(.vector_40) <= (_vector_spacing << 5), "function at exception vector 40 too large") - .vector_41 _ebase_address + 0x200 + ((_vector_spacing << 5) * 41) : - { - KEEP(*(.vector_41)) - } > exception_mem - ASSERT (_vector_spacing == 0 || SIZEOF(.vector_41) <= (_vector_spacing << 5), "function at exception vector 41 too large") - .vector_42 _ebase_address + 0x200 + ((_vector_spacing << 5) * 42) : - { - KEEP(*(.vector_42)) - } > exception_mem - ASSERT (_vector_spacing == 0 || SIZEOF(.vector_42) <= (_vector_spacing << 5), "function at exception vector 42 too large") - .vector_43 _ebase_address + 0x200 + ((_vector_spacing << 5) * 43) : - { - KEEP(*(.vector_43)) - } > exception_mem - ASSERT (_vector_spacing == 0 || SIZEOF(.vector_43) <= (_vector_spacing << 5), "function at exception vector 43 too large") - .vector_44 _ebase_address + 0x200 + ((_vector_spacing << 5) * 44) : - { - KEEP(*(.vector_44)) - } > exception_mem - ASSERT (_vector_spacing == 0 || SIZEOF(.vector_44) <= (_vector_spacing << 5), "function at exception vector 44 too large") - .vector_45 _ebase_address + 0x200 + ((_vector_spacing << 5) * 45) : - { - KEEP(*(.vector_45)) - } > exception_mem - ASSERT (_vector_spacing == 0 || SIZEOF(.vector_45) <= (_vector_spacing << 5), "function at exception vector 45 too large") - .vector_46 _ebase_address + 0x200 + ((_vector_spacing << 5) * 46) : - { - KEEP(*(.vector_46)) - } > exception_mem - ASSERT (_vector_spacing == 0 || SIZEOF(.vector_46) <= (_vector_spacing << 5), "function at exception vector 46 too large") - .vector_47 _ebase_address + 0x200 + ((_vector_spacing << 5) * 47) : - { - KEEP(*(.vector_47)) - } > exception_mem - ASSERT (_vector_spacing == 0 || SIZEOF(.vector_47) <= (_vector_spacing << 5), "function at exception vector 47 too large") - .vector_48 _ebase_address + 0x200 + ((_vector_spacing << 5) * 48) : - { - KEEP(*(.vector_48)) - } > exception_mem - ASSERT (_vector_spacing == 0 || SIZEOF(.vector_48) <= (_vector_spacing << 5), "function at exception vector 48 too large") - .vector_49 _ebase_address + 0x200 + ((_vector_spacing << 5) * 49) : - { - KEEP(*(.vector_49)) - } > exception_mem - ASSERT (_vector_spacing == 0 || SIZEOF(.vector_49) <= (_vector_spacing << 5), "function at exception vector 49 too large") - .vector_50 _ebase_address + 0x200 + ((_vector_spacing << 5) * 50) : - { - KEEP(*(.vector_50)) - } > exception_mem - ASSERT (_vector_spacing == 0 || SIZEOF(.vector_50) <= (_vector_spacing << 5), "function at exception vector 50 too large") - .vector_51 _ebase_address + 0x200 + ((_vector_spacing << 5) * 51) : - { - KEEP(*(.vector_51)) - } > exception_mem - ASSERT (_vector_spacing == 0 || SIZEOF(.vector_51) <= (_vector_spacing << 5), "function at exception vector 51 too large") - .vector_52 _ebase_address + 0x200 + ((_vector_spacing << 5) * 52) : - { - KEEP(*(.vector_52)) - } > exception_mem - ASSERT (_vector_spacing == 0 || SIZEOF(.vector_52) <= (_vector_spacing << 5), "function at exception vector 52 too large") - .vector_53 _ebase_address + 0x200 + ((_vector_spacing << 5) * 53) : - { - KEEP(*(.vector_53)) - } > exception_mem - ASSERT (_vector_spacing == 0 || SIZEOF(.vector_53) <= (_vector_spacing << 5), "function at exception vector 53 too large") - .vector_54 _ebase_address + 0x200 + ((_vector_spacing << 5) * 54) : - { - KEEP(*(.vector_54)) - } > exception_mem - ASSERT (_vector_spacing == 0 || SIZEOF(.vector_54) <= (_vector_spacing << 5), "function at exception vector 54 too large") - .vector_55 _ebase_address + 0x200 + ((_vector_spacing << 5) * 55) : - { - KEEP(*(.vector_55)) - } > exception_mem - ASSERT (_vector_spacing == 0 || SIZEOF(.vector_55) <= (_vector_spacing << 5), "function at exception vector 55 too large") - .vector_56 _ebase_address + 0x200 + ((_vector_spacing << 5) * 56) : - { - KEEP(*(.vector_56)) - } > exception_mem - ASSERT (_vector_spacing == 0 || SIZEOF(.vector_56) <= (_vector_spacing << 5), "function at exception vector 56 too large") - .vector_57 _ebase_address + 0x200 + ((_vector_spacing << 5) * 57) : - { - KEEP(*(.vector_57)) - } > exception_mem - ASSERT (_vector_spacing == 0 || SIZEOF(.vector_57) <= (_vector_spacing << 5), "function at exception vector 57 too large") - .vector_58 _ebase_address + 0x200 + ((_vector_spacing << 5) * 58) : - { - KEEP(*(.vector_58)) - } > exception_mem - ASSERT (_vector_spacing == 0 || SIZEOF(.vector_58) <= (_vector_spacing << 5), "function at exception vector 58 too large") - .vector_59 _ebase_address + 0x200 + ((_vector_spacing << 5) * 59) : - { - KEEP(*(.vector_59)) - } > exception_mem - ASSERT (_vector_spacing == 0 || SIZEOF(.vector_59) <= (_vector_spacing << 5), "function at exception vector 59 too large") - .vector_60 _ebase_address + 0x200 + ((_vector_spacing << 5) * 60) : - { - KEEP(*(.vector_60)) - } > exception_mem - ASSERT (_vector_spacing == 0 || SIZEOF(.vector_60) <= (_vector_spacing << 5), "function at exception vector 60 too large") - .vector_61 _ebase_address + 0x200 + ((_vector_spacing << 5) * 61) : - { - KEEP(*(.vector_61)) - } > exception_mem - ASSERT (_vector_spacing == 0 || SIZEOF(.vector_61) <= (_vector_spacing << 5), "function at exception vector 61 too large") - .vector_62 _ebase_address + 0x200 + ((_vector_spacing << 5) * 62) : - { - KEEP(*(.vector_62)) - } > exception_mem - ASSERT (_vector_spacing == 0 || SIZEOF(.vector_62) <= (_vector_spacing << 5), "function at exception vector 62 too large") - .vector_63 _ebase_address + 0x200 + ((_vector_spacing << 5) * 63) : - { - KEEP(*(.vector_63)) - } > exception_mem - ASSERT (_vector_spacing == 0 || SIZEOF(.vector_63) <= (_vector_spacing << 5), "function at exception vector 63 too large") - - /* ### .text */ - .text : - { - *(.text .text.*); - } > program_mem - - /* ### .rodata */ - .rodata : ALIGN(4) - { - *(.rodata .rodata.*); - - /* 4-byte align the end (VMA) of this section. - This is required by LLD to ensure the LMA of the following .data - section will have the correct alignment. */ - . = ALIGN(4); - } > program_mem - - /* ## Sections in RAM */ - /* ### .data */ - .data : ALIGN(4) - { - *(.data .data.*); - - . = ALIGN(4); /* 4-byte align the end (VMA) of this section */ - } > data_mem AT > program_mem - - /* VMA of .data */ - __sdata = ADDR(.data); - __edata = ADDR(.data) + SIZEOF(.data); - - /* LMA of .data */ - __sidata = LOADADDR(.data); - - /* ### .bss */ - .bss : ALIGN(4) - { - *(.bss .bss.*); - - . = ALIGN(4); /* 4-byte align the end (VMA) of this section */ - } > data_mem - - __sbss = ADDR(.bss); - __ebss = ADDR(.bss) + SIZEOF(.bss); - - /* Place the heap right after `.bss` */ - __sheap = ADDR(.bss) + SIZEOF(.bss); - - /* Stack usage metadata emitted by LLVM */ - .stack_sizes (INFO) : - { - KEEP(*(.stack_sizes)); - } - - /* ## Discarded sections */ - /DISCARD/ : - { - *(.reginfo); - *(.MIPS.abiflags); - *(.eh_frame_hdr); - *(.eh_frame); - *(.got); - } -} -