我正在探索在多目标嵌入式项目中使用 Rust 的想法。
我目前的想法是为每个MCU都有一个板条箱。MCU板条箱将包含该特定设备的GPIO,SPI和UART等实现。
系统的设计应使MCU板条箱可以换成另一个MCU的板条箱,以针对该新MCU。它也应该尽可能简单。
要立即进行该切换,您还需要更改自己开始构建的可执行项目中的 .cargo/config 文件。这使得切换成为一个两步过程,在某些时候会被遗忘。
基本上,我希望板条箱的目标适用于整个构建。
我已经在网上搜索了一些,看看它以前是否存在过,但要么它不存在,要么我的搜索技能不足。
我的想法是,MCU 板条箱中的构建脚本可以将其设置复制到构建实例化的 .cargo/config 文件中。
我想象构建脚本可能是什么样子(伪):
// Open the config file of the directory from which the build is done
dir = build_dir
config_file = open_or_create(dir + .cargo/config)
// Read the target of our own crate
my_target = open(.cargo/config).get_option(option: target)
// Set the target in the config file of the source
config_file.add_or_replace_option(option: target, value: my_target)
有了这样的东西,切换到不同的MCU将非常容易。只需更改 toml 文件中的依赖项即可。
或者,可以颠倒过来。可执行文件可能有一个构建脚本,该脚本查找MCU板条箱并复制设置。
我的问题:
- 这可能吗?
- 这合理吗?
- 有没有更好的方法?
如果您担心配置开关是"在某个时候会被遗忘"的东西,那么如果目标三元组错误,您可以使用一些条件编译来创建错误。
例如,启动板条箱.lib
文件
#[cfg(not(all(target_arch="...",...)))]
compile_error!("rustc is not correctly configured for this crate - the correct triple is ...");
然后切换板条箱而不更新货物配置将引发错误。