Rust 为什么在执行嵌入式发现教程时cargo build会无限期挂起

Rust 为什么在执行嵌入式发现教程时cargo build会无限期挂起,rust,compilation,embedded,freeze,Rust,Compilation,Embedded,Freeze,我目前正试图阅读《圣经》的第11章。可以找到本章的存储库 编译器挂起以下代码: #![拒绝(不安全代码)] #![无主] #![无标准] #[允许(未使用的_导入)] 使用aux11::{entry,iprint,iprintln}; #[条目] fn main()->!{ let(usart1,_mono_timer,_itm)=aux11::init(); 对于b中的char,“敏捷的棕色狐狸跳过了懒惰的狗。”{ //发送单个字符 usart1.tdr.write(| w | w.tdr()

我目前正试图阅读《圣经》的第11章。可以找到本章的存储库

编译器挂起以下代码:

#![拒绝(不安全代码)]
#![无主]
#![无标准]
#[允许(未使用的_导入)]
使用aux11::{entry,iprint,iprintln};
#[条目]
fn main()->!{
let(usart1,_mono_timer,_itm)=aux11::init();
对于b中的char,“敏捷的棕色狐狸跳过了懒惰的狗。”{
//发送单个字符
usart1.tdr.write(| w | w.tdr().bits(u16::from(*char));
}
循环{}
}
该目录的另一个变化是将
cortex-m
版本升级到
0.5.8

EDIT:我运行的命令是
cargo build--verbose
,因此运行的是编译器本身而不是程序。 这是完整的命令及其输出:

C:/Users/User/.cargo/bin/cargo.exe build --color=always --message-format=json-diagnostic-rendered-ansi --target thumbv7em-none-eabihf --verbose
       Fresh semver-parser v0.7.0
       Fresh nb v1.0.0
       Fresh unicode-xid v0.2.1
       Fresh vcell v0.1.3
       Fresh void v1.0.2
       Fresh aligned v0.2.0
       Fresh r0 v0.2.2
       Fresh bitfield v0.13.2
       Fresh byteorder v1.4.2
       Fresh semver v0.9.0
       Fresh rustc_version v0.2.3
       Fresh nb v0.1.3
       Fresh volatile-register v0.2.0
       Fresh hash32 v0.1.1
       Fresh proc-macro2 v1.0.24
       Fresh embedded-hal v0.2.4
       Fresh typenum v1.12.0
       Fresh quote v1.0.8
       Fresh generic-array v0.11.1
       Fresh bare-metal v0.2.5
       Fresh syn v1.0.58
       Fresh cast v0.2.3
       Fresh l3gd20 v0.2.0
       Fresh heapless v0.3.7
       Fresh cortex-m-rt-macros v0.1.8
       Fresh cortex-m v0.5.8
       Fresh cortex-m v0.7.2
       Fresh lsm303dlhc v0.2.0
       Fresh cortex-m-rt v0.6.13
       Fresh panic-itm v0.4.2
       Fresh stm32f30x v0.7.1
       Fresh stm32f30x-hal v0.2.0
       Fresh f3 v0.6.1
       Fresh aux11 v0.1.0 (C:\repos\discovery\src\11-usart\auxiliary)
   Compiling usart v0.1.0 (C:\repos\discovery\src\11-usart)
     Running `C:\Users\User\.cargo\bin\rustc.exe --crate-name usart --edition=2018 src\11-usart\src\main.rs --error-format=json --json=diagnostic-rendered-ansi --crate-type bin --emit=dep-info,link -C embed-bitcode=no -C debuginfo=2 -C metadata=b319e2d1d8d11eef -C extra-filename=-b319e2d1d8d11eef --out-dir C:\repos\discovery\target\thumbv7em-none-eabihf\debug\deps --target thumbv7em-none-eabihf -C incremental=C:\repos\discovery\target\thumbv7em-none-eabihf\debug\incremental -L dependency=C:\repos\discovery\target\thumbv7em-none-eabihf\debug\deps -L dependency=C:\repos\discovery\target\debug\deps --extern aux11=C:\repos\discovery\target\thumbv7em-none-eabihf\debug\deps\libaux11-2d2dac5f4230a287.rlib --extern heapless=C:\repos\discovery\target\thumbv7em-none-eabihf\debug\deps\libheapless-61d8b3c4b16d4842.rlib -C link-arg=-Tlink.x -L C:\repos\discovery\target\thumbv7em-none-eabihf\debug\build\cortex-m-7f60ed6e068039ff\out -L C:\repos\discovery\target\thumbv7em-none-eabihf\debug\build\cortex-m-rt-17f16ed1a0c77cc5\out -L C:\repos\discovery\target\thumbv7em-none-eabihf\debug\build\f3-1a08fdc1cbf64e81\out -L C:\repos\discovery\target\thumbv7em-none-eabihf\debug\build\stm32f30x-50ac612f864f84d1\out -L C:\repos\discovery\target\thumbv7em-none-eabihf\debug\build\cortex-m-2bd89fb5390eaa29\out`
它现在已经运行了10个多小时,所以Rust的长编译时间不应该是一个因素

以下是我的工具链版本:

  • rustc 1.51.0(2fd73fabe 2021-03-23)
  • 生锈1.23.1(3df2264a9 2020-11-30)
  • 货运1.51.0(43b129a20 2021-03-16)
编辑:这是我的
辅助/Cargo.toml
,它仅从
cortex-m
版本更改(由于0.5.6上的其他错误):

辅助/src/lib.rs

/!初始化代码
#![无标准]
#[允许(未使用的外部板条箱)]//注意(允许)bug rust lang/rust53964
外部板条箱恐慌;//恐慌处理程序
pub使用cortex_m:{asm::bkpt,iprint,iprintln,peripheral::ITM};
pub使用cortex_m_rt::entry;
pub使用f3::hal::{prelude,serial::serial,stm32f30x::usart1,time::MonoTimer};
使用f3::hal::{
序曲::*,
stm32f30x::{self,USART1},
};
pub fn init()->(&'static mut usart1::RegisterBlock,MonoTimer,ITM){
让cp=cortex_m::Peripherals::take().unwrap();
让dp=stm32f30x::外围设备::take().unwrap();
让mut flash=dp.flash.constraint();
让mut rcc=dp.rcc.constraint();
让时钟=rcc.cfgr.freeze(&mut flash.acr);
let(tx,rx)=匹配(){
#[cfg(feature=“adapter”)]
() => {
让mut gpioa=dp.gpioa.split(&mut rcc.ahb);
将tx=gpioa.pa9.放入_af7(&mut gpioa.moder,&mut gpioa.afrh);
将rx=gpioa.pa10.放入_af7(&mut gpioa.moder,&mut gpioa.afrh);
(发送、接收)
}
#[cfg(不是(feature=“adapter”)]
() => {
让mut gpioc=dp.gpioc.split(&mut rcc.ahb);
将tx=gpioc.pc4.放入_af7(&mut gpioc.moder,&mut gpioc.afrl);
将rx=gpioc.pc5.放入_af7(&mut gpioc.moder,&mut gpioc.afrl);
(发送、接收)
}
};
串行::usart1(dp.usart1,(tx,rx),115_200.bps(),时钟和mut rcc.apb2);
//如果您在向服务器发送/接收数据时遇到问题
//HC-05蓝牙模块,请尝试此配置:
//串行::usart1(dp.usart1,(tx,rx),9600.bps(),时钟和mut rcc.apb2);
不安全{
(
&mut*(USART1::ptr()作为*mut u),
单定时器::新(cp.DWT,时钟),
cp.ITM,
)
}
}

我在输出中没有发现任何线索,因此欢迎提出任何建议

因为。。。你的代码有一个无限循环<代码>循环{}。。。cargo已经编译完成
运行
@DenysSéguret@Stargateur似乎你错过了我没有运行代码,只是编译了它,在第一行:
…cargo.exe build…
。在最后一行,它不是在运行程序,而是在运行编译器:`running
C:\Users\User\.cargo\bin\rustc.exe
。另外,由于函数必须具有
的返回类型,因此在嵌入的rust程序的末尾有一个
循环{}
,意思是发散。删除循环会产生以下错误消息:
rust error:`#[entry]`函数必须具有签名`[safe]fn()->!`-->src\11 usart\src\main.rs:9:1 | 9 | fn main()->({| ^
您可以添加您的Cargo.toml文件进行复制吗?添加到@DenysSéguret,但您也可以添加
辅助/src/lib.rs
?@DenysSéguret添加了这两个文件:)
[package]
authors = ["Jorge Aparicio <jorge@japaric.io>"]
edition = "2018"
name = "aux11"
version = "0.1.0"

[dependencies]
cortex-m = "=0.5.8" # 0.5.11 introduces a breaking change.  Use 0.5.6, since we know it works for this example
cortex-m-rt = "0.6.3"
panic-itm = "0.4.0"

[dependencies.f3]
features = ["rt"]
version = "0.6.1"

[features]
adapter = []
[package]
authors = ["Jorge Aparicio <jorge@japaric.io>"]
edition = "2018"
name = "usart"
version = "0.1.0"

[dependencies.aux11]
path = "auxiliary"
# enable this if you are going to use an external serial adapter
# features = ["adapter"]

[dependencies.heapless]
default-features = false
version = "0.3.7"