< 返回版块

wuya 发表于 2021-06-14 10:57

Tags:core大小

环境情况

  1. --target thumbv7m-none-eabi --release
  2. thumbv7m-none-eabi的core库是直接rustup装的
  3. rust代码编译生成staticlib嵌入到keil中编译最终bin文件

实际发现当实现了Write并使用其做一些格式化字符串并实现打印函数后,最终bin相差接近20KB。 代码如下:

macro_rules! println {
    () => { puts("\r\n".as_bytes()); };
    ($fmt: expr) => { puts(concat!("[", file!(), ":", line!(), "] ", $fmt, "\r\n\0").as_bytes()); };
    ($fmt: expr, $($arg:tt)*) => {{
        if cfg!(feature = "no_fmt_str") {
            //puts(concat!("[", file!(), ":", line!(), "] fmt_str is disabled\r\n\0").as_bytes());
        } else {
            let mut buf = [0u8; 256];
            let mut wb = WriteBuf::new(&mut buf);
            let _ = write!(&mut wb, concat!("[{}:{}] ", $fmt, "\r\n"), file!(), line!(), $($arg)*);
            puts(buf.as_ref());
        }
    }};
}

使用Write Trait后KEIL map文件:

Code (inc. data)         RO Data    RW Data    ZI Data      Debug   Library Member Name
       358          0          0          0          0       3499   compiler_builtins-19e25674e7d0fac3.compiler_builtins.1u0h3z3x-cgu.117.rcgu.o
      9612         96       3909          0          0     569329   core-e44ff3898b5c1dc9.core.3d6vvluw-cgu.0.rcgu.o

不使用Write这2个是直接没有的,一直挺疑惑rust是在那个阶段完成字符串转换的,这个看起来有点像直接代码内置字符串映射表

请问下是否有办法可以解决这个问题,20KB为了一个格式化字符串,开销有点大,有没有办法裁剪?

评论区

写评论
作者 wuya 2021-06-14 13:50

感谢! 这个是自己实现了一套格式化方法,意思是core::fmt::Write没法裁剪或自定义吗?

--
👇
12101111: https://crates.io/crates/ufmt

12101111 2021-06-14 13:11

https://crates.io/crates/ufmt

1 共 2 条评论, 1 页