代码在我的 main.rs 中工作正常 copy/pasted,但是当 运行 来自它自己的外部板条箱时被忽略

Code works fine copy/pasted into my main.rs, but is ignored when run from its own external crate

tl;dr 我想弄清楚为什么 avr-delay::delay 函数在作为外部板条箱导入时不会造成任何延迟,但是当 copy/pasting 来自 [=15= 的代码时] 进入我的 main.rs,一切都按预期工作,并产生了我预期的 1000 毫秒延迟。 Source code for avr-delay here and my modified and working correctly avr-rust/blink code is here

我正在努力学习 Arduino,使用 Rust,我正在通过使 LED 闪烁来做一种 Hello World。当我将 avr-delaylib.rs 的内容复制粘贴到我的 main.rs 中时,我已经让灯以 1000 毫秒的间隔闪烁,但当我导入 avr-delay 装箱并以这种方式使用它,延迟几乎察觉不到。

我已经通过克隆 avr-delay 存储库并将本地副本导入我的 Cargo.toml 来确保我正在做 1:1 测试,并且我已经尝试 hardcoding the CPU frequency on this line 在我本地的 avr-delay 副本中以防万一读取我正在设置的环境变量或其他东西时出现问题。

我真的很困惑,为什么完全相同的代码在我的 main.rs 中有效,但在它自己的 crate 中却不行?由于这似乎是构建或 Cargo.toml 的问题,下面是我实际构建垃圾箱的方式。能有关系吗?我每次都使用相同的命令进行构建:

cargo +nightly-2021-01-07 build -Z build-std=core --target avr-atmega328p.json --release --verbose

还值得一提的是,我正在玩仿制的 Arduino,但它仍然是与 Arduino Uno 相同的微控制器 (atmega328p),而且由于有时我可以让闪烁工作,这让我觉得这不是问题所在要么。

任何帮助表示赞赏,我知道这是一个非常具体的问题,但我希望有一些我不理解的构建或货物,因为代码本身似乎很好。

解决方案是将#[inline(always)]添加到avr-delay中的函数,或者将lto = true添加到我项目的Cargo.toml中。延迟代码在未内联时根本不起作用。我仍然不完全理解为什么,但我猜一些低级的东西在没有内联时不起作用。