代码可以很好地复制/粘贴到我的main.rs中,但在从自己的外部机箱运行时会被忽略



tl;dr我正试图弄清楚为什么avr-delay::delay函数在作为外部机箱导入时不会造成任何延迟,但当将代码从avr-delay/src/lib.rs复制/粘贴到我的main.rs时,它都能按预期工作,并产生了我预期的1000ms延迟。avr延迟的源代码在这里,我修改并正确工作的avr rust/blink代码在这里

我正试图用Rust的方式艰难地学习Arduino,我正在做一个LED闪烁的Hello World。当我将avr-delaylib.rs的内容复制粘贴到我的main.rs中时,我已经让灯以1000ms的间隔闪烁,正如预期的那样,但当我导入avr-delay机箱并以这种方式使用时,延迟几乎无法察觉。

我已经通过克隆avr-delayrepo并在我的Cargo.toml中导入本地副本来确保我正在进行1:1的测试,我已经尝试在avr延迟的本地副本中硬编码这一行的CPU频率,以防读取我正在设置的env-var或其他问题。

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

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

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

感谢您的帮助,我知道这是一个非常具体的问题,但我希望关于构建或Cargo有一些我不理解的地方,因为代码本身似乎很好。

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

最新更新