From b882d5350c4f91d60d95af969f8968d22952155c Mon Sep 17 00:00:00 2001 From: D4VID Date: Sat, 3 May 2025 21:54:08 +0200 Subject: [PATCH] Display test --- test/.cargo/config.toml | 8 +++ test/.gitignore | 3 + test/.vscode/settings.json | 5 ++ test/Cargo.lock | 116 +++++++++++++++++++++++++++++++++++++ test/Cargo.toml | 19 ++++++ test/Makefile | 20 +++++++ test/memory.x | 14 +++++ test/src/main.rs | 33 +++++++++++ 8 files changed, 218 insertions(+) create mode 100644 test/.cargo/config.toml create mode 100644 test/.gitignore create mode 100644 test/.vscode/settings.json create mode 100644 test/Cargo.lock create mode 100644 test/Cargo.toml create mode 100644 test/Makefile create mode 100644 test/memory.x create mode 100644 test/src/main.rs diff --git a/test/.cargo/config.toml b/test/.cargo/config.toml new file mode 100644 index 0000000..6dfb735 --- /dev/null +++ b/test/.cargo/config.toml @@ -0,0 +1,8 @@ +[build] +target = "riscv32i-unknown-none-elf" + +[target.riscv32i-unknown-none-elf] +rustflags = [ + "-C", "link-arg=-Tmemory.x", + "-C", "link-arg=-Tlink.x", +] diff --git a/test/.gitignore b/test/.gitignore new file mode 100644 index 0000000..5ad8f69 --- /dev/null +++ b/test/.gitignore @@ -0,0 +1,3 @@ +/target +text.bin +rodata.bin diff --git a/test/.vscode/settings.json b/test/.vscode/settings.json new file mode 100644 index 0000000..1f30ed8 --- /dev/null +++ b/test/.vscode/settings.json @@ -0,0 +1,5 @@ +{ + "rust-analyzer.check.allTargets": false, + "rust-analyzer.cargo.allTargets": false, + "rust-analyzer.cargo.target": "riscv32i-unknown-none-elf" +} diff --git a/test/Cargo.lock b/test/Cargo.lock new file mode 100644 index 0000000..ff3ed61 --- /dev/null +++ b/test/Cargo.lock @@ -0,0 +1,116 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "critical-section" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "790eea4361631c5e7d22598ecd5723ff611904e3344ce8720784c93e3d83d40b" + +[[package]] +name = "embedded-hal" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "361a90feb7004eca4019fb28352a9465666b24f840f5c3cddf0ff13920590b89" + +[[package]] +name = "paste" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" + +[[package]] +name = "proc-macro2" +version = "1.0.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37d3544b3f2748c54e147655edb5025752e2303145b5aefb3c3ea2c78b973bb0" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.38" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e4dccaaaf89514f546c693ddc140f729f958c247918a13380cccc6078391acc" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "riscv" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ea8ff73d3720bdd0a97925f0bf79ad2744b6da8ff36be3840c48ac81191d7a7" +dependencies = [ + "critical-section", + "embedded-hal", + "paste", + "riscv-macros", + "riscv-pac", +] + +[[package]] +name = "riscv-macros" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f265be5d634272320a7de94cea15c22a3bfdd4eb42eb43edc528415f066a1f25" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "riscv-pac" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8188909339ccc0c68cfb5a04648313f09621e8b87dc03095454f1a11f6c5d436" + +[[package]] +name = "riscv-rt" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "753f1bd7eb4e0003cec5e2fb60ea8e253a71d0b041bc7d1ba0fffe22e3c0294d" +dependencies = [ + "riscv", + "riscv-pac", + "riscv-rt-macros", +] + +[[package]] +name = "riscv-rt-macros" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30f19a85fe107b65031e0ba8ec60c34c2494069fe910d6c297f5e7cb5a6f76d0" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "syn" +version = "2.0.93" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c786062daee0d6db1132800e623df74274a0a87322d8e183338e01b3d98d058" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "test" +version = "0.1.0" +dependencies = [ + "riscv", + "riscv-rt", +] + +[[package]] +name = "unicode-ident" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adb9e6ca4f869e1180728b7950e35922a7fc6397f7b641499e8f3ef06e50dc83" diff --git a/test/Cargo.toml b/test/Cargo.toml new file mode 100644 index 0000000..805e70a --- /dev/null +++ b/test/Cargo.toml @@ -0,0 +1,19 @@ +[package] +name = "test" +version = "0.1.0" +edition = "2021" + +[dependencies] +riscv = "0.12.1" +riscv-rt = "0.13.0" + +# https://docs.rust-embedded.org/book/unsorted/speed-vs-size.html +[profile.release] +# symbols are nice and they don't increase the size on Flash +debug = true +codegen-units = 1 +opt-level = "z" + +[profile.dev.package."*"] +codegen-units = 1 +opt-level = "z" diff --git a/test/Makefile b/test/Makefile new file mode 100644 index 0000000..b8ac56d --- /dev/null +++ b/test/Makefile @@ -0,0 +1,20 @@ +NAME=test + +default: extract + +build: + cargo build --release + +extract: build + riscv32-elf-objcopy -O binary --only-section=.text "target/riscv32i-unknown-none-elf/release/${NAME}" ~/text.bin + riscv32-elf-objcopy -O binary --only-section=.rodata "target/riscv32i-unknown-none-elf/release/${NAME}" ~/rodata.bin + +size: extract + cargo size --release -- -A + +disassemble: build + riscv32-elf-objdump -Cd "target/riscv32i-unknown-none-elf/release/${NAME}" | less + +clean: + cargo clean + rm text.bin diff --git a/test/memory.x b/test/memory.x new file mode 100644 index 0000000..a92306f --- /dev/null +++ b/test/memory.x @@ -0,0 +1,14 @@ +MEMORY +{ + INST : ORIGIN = 0x00000000, LENGTH = 256K + IO : ORIGIN = 0x20000000, LENGTH = 1K + CONST : ORIGIN = 0x40000000, LENGTH = 16K + RAM : ORIGIN = 0x80000000, LENGTH = 16K +} + +REGION_ALIAS("REGION_TEXT", INST); +REGION_ALIAS("REGION_RODATA", CONST); +REGION_ALIAS("REGION_DATA", RAM); +REGION_ALIAS("REGION_BSS", RAM); +REGION_ALIAS("REGION_HEAP", RAM); +REGION_ALIAS("REGION_STACK", RAM); diff --git a/test/src/main.rs b/test/src/main.rs new file mode 100644 index 0000000..6bbe614 --- /dev/null +++ b/test/src/main.rs @@ -0,0 +1,33 @@ +#![no_std] +#![no_main] + +use core::panic::PanicInfo; +use riscv_rt::entry; + +#[panic_handler] +fn panic_handler(_info: &PanicInfo) -> ! { + unsafe { + OUTPUT.write_volatile(0xDEADC0DE); + } + loop {} +} + +const OUTPUT: *mut u32 = 0x2000_0000 as *mut u32; +const BTNS: *mut u8 = 0x2000_0008 as *mut u8; +const SCREEN: *mut u32 = 0x2000_0080 as *mut u32; + +#[entry] +fn main() -> ! { + loop { + unsafe { + SCREEN.write_volatile(0b101); + } + for i in 0..31 { + unsafe { + let mut x = SCREEN.offset(i).read_volatile(); + x <<= 1; + SCREEN.offset(i+1).write_volatile(x); + } + } + } +}