From 97639138a13f79a514ef2cbe826b12ada7bb6f73 Mon Sep 17 00:00:00 2001 From: sawyer bristol Date: Tue, 4 Nov 2025 14:49:47 -0700 Subject: [PATCH] macros and improvements --- Cargo.lock | 53 +++++++++++++++++++------------- Cargo.toml | 1 + abi/Cargo.toml | 5 +-- abi/src/lib.rs | 16 ++++++++-- kernel/src/main.rs | 3 +- main_proc_macro/Cargo.toml | 11 +++++++ main_proc_macro/src/lib.rs | 21 +++++++++++++ user-apps/calculator/src/main.rs | 7 ----- user-apps/gallery/src/main.rs | 15 ++------- user-apps/gif/src/main.rs | 17 ++-------- user-apps/snake/src/main.rs | 8 +---- 11 files changed, 87 insertions(+), 70 deletions(-) create mode 100644 main_proc_macro/Cargo.toml create mode 100644 main_proc_macro/src/lib.rs diff --git a/Cargo.lock b/Cargo.lock index 88f54ea..40aa4f0 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -19,6 +19,7 @@ dependencies = [ "abi_sys", "embedded-graphics", "embedded-sdmmc", + "main_proc_macro", "once_cell", "rand_core 0.9.3", ] @@ -350,7 +351,7 @@ checksum = "e37549a379a9e0e6e576fd208ee60394ccb8be963889eebba3ffe0980364f472" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.108", ] [[package]] @@ -447,7 +448,7 @@ dependencies = [ "proc-macro2", "quote", "strsim 0.11.1", - "syn 2.0.104", + "syn 2.0.108", ] [[package]] @@ -458,7 +459,7 @@ checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead" dependencies = [ "darling_core", "quote", - "syn 2.0.104", + "syn 2.0.108", ] [[package]] @@ -496,7 +497,7 @@ dependencies = [ "proc-macro-error2", "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.108", ] [[package]] @@ -645,7 +646,7 @@ dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.108", ] [[package]] @@ -1019,7 +1020,7 @@ checksum = "4f6e621fe4c7e05b695274b722dc0a60bacd1c8696b58191baa0154713d52400" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.108", ] [[package]] @@ -1212,7 +1213,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.108", ] [[package]] @@ -1648,6 +1649,14 @@ version = "0.4.27" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" +[[package]] +name = "main_proc_macro" +version = "0.1.0" +dependencies = [ + "quote", + "syn 2.0.108", +] + [[package]] name = "memchr" version = "2.7.5" @@ -1728,7 +1737,7 @@ checksum = "77e878c846a8abae00dd069496dbe8751b16ac1c3d6bd2a7283a938e8228f90d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.108", ] [[package]] @@ -1920,7 +1929,7 @@ dependencies = [ "proc-macro-error2", "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.108", ] [[package]] @@ -1987,7 +1996,7 @@ dependencies = [ "proc-macro-error-attr2", "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.108", ] [[package]] @@ -2001,9 +2010,9 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.40" +version = "1.0.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" +checksum = "ce25767e7b499d1b604768e7cde645d14cc8584231ea6b295e9c9eb22c02e1d1" dependencies = [ "proc-macro2", ] @@ -2233,7 +2242,7 @@ checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.108", ] [[package]] @@ -2400,7 +2409,7 @@ dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.108", ] [[package]] @@ -2429,9 +2438,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.104" +version = "2.0.108" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17b6f705963418cdb9927482fa304bc562ece2fdd4f616084c50b7023b435a40" +checksum = "da58917d35242480a05c2897064da0a80589a2a0476c9a3f2fdc83b53502e917" dependencies = [ "proc-macro2", "quote", @@ -2528,7 +2537,7 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.108", ] [[package]] @@ -2539,7 +2548,7 @@ checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.108", ] [[package]] @@ -2607,7 +2616,7 @@ dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.108", "uuid", ] @@ -2766,7 +2775,7 @@ dependencies = [ "log", "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.108", "wasm-bindgen-shared", ] @@ -2788,7 +2797,7 @@ checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.108", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -2938,5 +2947,5 @@ checksum = "9ecf5b4cc5364572d7f4c329661bcc82724222973f2cab6f050a4e5c22f75181" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.108", ] diff --git a/Cargo.toml b/Cargo.toml index 9e88380..0d702fe 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -8,6 +8,7 @@ members = [ "user-apps/snake", "user-apps/gallery", "user-apps/gif", + "main_proc_macro", ] [profile.release] diff --git a/abi/Cargo.toml b/abi/Cargo.toml index a197d01..44574fd 100644 --- a/abi/Cargo.toml +++ b/abi/Cargo.toml @@ -4,8 +4,9 @@ version = "0.1.0" edition = "2024" [dependencies] -embedded-sdmmc = { version = "0.9.0", default-features = false } -embedded-graphics = "0.8.1" abi_sys = { path = "../abi_sys" } +main_proc_macro = { path = "../main_proc_macro" } +embedded-sdmmc = { version = "0.9", default-features = false } +embedded-graphics = "0.8.1" once_cell = { version = "1", default-features = false } rand_core = "0.9.3" diff --git a/abi/src/lib.rs b/abi/src/lib.rs index c18e83b..179d8bf 100644 --- a/abi/src/lib.rs +++ b/abi/src/lib.rs @@ -5,10 +5,20 @@ extern crate alloc; pub use abi_sys::{self, keyboard}; use abi_sys::{RngRequest, alloc, dealloc, keyboard::KeyEvent}; -pub use alloc::format; -use core::alloc::{GlobalAlloc, Layout}; +use alloc::format; +use core::{ + alloc::{GlobalAlloc, Layout}, + panic::PanicInfo, +}; +pub use main_proc_macro::main; use rand_core::RngCore; +#[panic_handler] +fn panic(info: &PanicInfo) -> ! { + print!("user panic: {} @ {:?}", info.message(), info.location(),); + loop {} +} + #[global_allocator] static ALLOC: Alloc = Alloc; @@ -27,7 +37,7 @@ unsafe impl GlobalAlloc for Alloc { #[macro_export] macro_rules! print { ($($arg:tt)*) => {{ - let s = $crate::format!($($arg)*); + let s = format!($($arg)*); $crate::abi_sys::print(s.as_ptr(), s.len()); }}; } diff --git a/kernel/src/main.rs b/kernel/src/main.rs index b6d5768..75977a9 100644 --- a/kernel/src/main.rs +++ b/kernel/src/main.rs @@ -29,7 +29,6 @@ use crate::{heap::init_qmi_psram_heap, psram::init_psram_qmi}; use crate::{ abi::{KEY_CACHE, MS_SINCE_LAUNCH}, display::{FRAMEBUFFER, display_handler, init_display}, - heap::HEAP, peripherals::{ conf_peripherals, keyboard::{KeyState, read_keyboard_fifo}, @@ -322,7 +321,7 @@ async fn kernel_task( watchdog: Peri<'static, WATCHDOG>, display: Display, sd: Sd, - psram: Psram, + _psram: Psram, mcu: Mcu, usb: Peri<'static, USB>, ) { diff --git a/main_proc_macro/Cargo.toml b/main_proc_macro/Cargo.toml new file mode 100644 index 0000000..29693c9 --- /dev/null +++ b/main_proc_macro/Cargo.toml @@ -0,0 +1,11 @@ +[package] +name = "main_proc_macro" +version = "0.1.0" +edition = "2024" + +[lib] +proc-macro = true + +[dependencies] +quote = "1.0.41" +syn = "2.0.108" diff --git a/main_proc_macro/src/lib.rs b/main_proc_macro/src/lib.rs new file mode 100644 index 0000000..51eadb4 --- /dev/null +++ b/main_proc_macro/src/lib.rs @@ -0,0 +1,21 @@ +use proc_macro::TokenStream; +use quote::quote; +use syn::{ItemFn, parse_macro_input}; + +#[proc_macro_attribute] +pub fn main(_attr: TokenStream, item: TokenStream) -> TokenStream { + let input = parse_macro_input!(item as ItemFn); + let name = &input.sig.ident; + + // ensure we emit _start in the same module as the fn + let expanded = quote! { + #input + + #[unsafe(no_mangle)] + pub extern "Rust" fn _start() { + #name(); + } + }; + + expanded.into() +} diff --git a/user-apps/calculator/src/main.rs b/user-apps/calculator/src/main.rs index 4bf802f..73f2532 100644 --- a/user-apps/calculator/src/main.rs +++ b/user-apps/calculator/src/main.rs @@ -9,7 +9,6 @@ use abi::{ print, }; use alloc::{format, string::String, vec, vec::Vec}; -use core::panic::PanicInfo; use embedded_graphics::{ Drawable, geometry::{Dimensions, Point}, @@ -26,12 +25,6 @@ use embedded_layout::{ prelude::Chain, }; -#[panic_handler] -fn panic(info: &PanicInfo) -> ! { - print!("user panic: {} @ {:?}", info.message(), info.location(),); - loop {} -} - #[unsafe(no_mangle)] pub extern "Rust" fn _start() { main() diff --git a/user-apps/gallery/src/main.rs b/user-apps/gallery/src/main.rs index 631ac37..36a8f12 100644 --- a/user-apps/gallery/src/main.rs +++ b/user-apps/gallery/src/main.rs @@ -8,27 +8,16 @@ use abi::{ fs::{list_dir, read_file}, get_key, keyboard::{KeyCode, KeyState}, - print, + main, print, }; use alloc::{format, string::ToString, vec}; -use core::panic::PanicInfo; use embedded_graphics::{ Drawable, image::Image, mono_font::MonoTextStyle, mono_font::ascii::FONT_6X10, pixelcolor::Rgb565, prelude::*, text::Text, }; use tinybmp::Bmp; -#[panic_handler] -fn panic(info: &PanicInfo) -> ! { - print!("user panic: {} @ {:?}", info.message(), info.location()); - loop {} -} - -#[unsafe(no_mangle)] -pub extern "Rust" fn _start() { - main() -} - +#[main] pub fn main() { print!("Starting Gallery app"); let mut bmp_buf = vec![0_u8; 100_000]; diff --git a/user-apps/gif/src/main.rs b/user-apps/gif/src/main.rs index 1d21b4d..a18e76b 100644 --- a/user-apps/gif/src/main.rs +++ b/user-apps/gif/src/main.rs @@ -7,26 +7,15 @@ use abi::{ fs::{file_len, read_file}, get_key, get_ms, keyboard::{KeyCode, KeyState}, - print, sleep, + main, print, sleep, }; -use alloc::vec; -use core::panic::PanicInfo; +use alloc::{format, vec}; use embedded_graphics::{ image::ImageDrawable, pixelcolor::Rgb565, prelude::Point, transform::Transform, }; use tinygif::Gif; -#[panic_handler] -fn panic(info: &PanicInfo) -> ! { - print!("user panic: {} @ {:?}", info.message(), info.location(),); - loop {} -} - -#[unsafe(no_mangle)] -pub extern "Rust" fn _start() { - main() -} - +#[main] pub fn main() { print!("Starting Gif app"); let mut display = Display; diff --git a/user-apps/snake/src/main.rs b/user-apps/snake/src/main.rs index 2324761..46184a0 100644 --- a/user-apps/snake/src/main.rs +++ b/user-apps/snake/src/main.rs @@ -9,16 +9,10 @@ use abi::{ keyboard::{KeyCode, KeyState}, print, sleep, }; -use core::panic::PanicInfo; +use alloc::format; use embedded_graphics::{pixelcolor::Rgb565, prelude::RgbColor}; use embedded_snake::{Direction, SnakeGame}; -#[panic_handler] -fn panic(info: &PanicInfo) -> ! { - print!("user panic: {} @ {:?}", info.message(), info.location(),); - loop {} -} - #[unsafe(no_mangle)] pub extern "Rust" fn _start() { main()