Hello,
Contexte
I am trying to compile for a minimal RISC-V target the [task example](h ttps://github.com/rtic-rs/rtic/blob/master/examples/hifive1/examples/task.rs). This is the lined that I changed. I named the file rtic_task in src/bin of a rust project.
- use hifive1::hal::e310x;
+ use panic_halt as _;
- #[cfg_attr(feature = "riscv-mecall-backend", rtic::app(device = e310x))]
- #[cfg_attr(feature = "riscv-clint-backend", rtic::app(device = e310x, backend = H0))]
+ use my-chip_pac_from_svd2rust;
+ #[rtic::app(device = my-chip_pac_from_svd2rust)]
The my-chip_pac_from_svd2rust
is generated using [update.sh script ](h ttps://github.com/riscv-rust/e310x/blob/master/e310x/update.sh) with same [e310x.svd](h ttps://github.com/riscv-rust/e310x/blob/master/e310x/e310x.svd) and [settings.yaml](h ttps://github.com/riscv-rust/e310x/blob/master/e310x/settings.yaml).
I get the following error running cargo build --bin rtic_task
with this Cargo.toml
[dependencies]
my-chip-hal = { path = "../my-chip-hal" }
riscv-rt = { version = "0.14.0", features = ["single-hart"] }
embassy-sync = "0.6.2"
riscv = { version = "0.13.0", features = ["critical-section-single-hart"] }
panic-halt = "1.0.0"
embassy-time = "0.4.0"
embassy-executor = { version = "0.7.0", features = [
"executor-thread",
"arch-riscv32",
] }
# Examples
my-chip-semihosting = { path = "../my-chip-semihosting/" }
heapless = "0.8.0"
embedded-alloc = "0.6.0"
hashbrown = "0.15"
rand = { version = "0.9.1", default-features = false, features = ["small_rng"] }
# RTIC
rtic = { version = "2.2.0", features = [
"riscv-mecall-backend",
"test-critical-section",
] }
my-chip-pac = { path = "../my-chip-pac/" }
my-chip-pac-from-svd2rust = { path = "../my-chip-pac-from-svd2rust/", default-features = false }
error: linking with `rust-lld` failed: exit status: 1
|
= note: "rust-lld" "-flavor" "gnu" "/tmp/rustck1aLee/symbols.o" "<52 object files omitted>" "--as-needed" "-Bstatic" "/my-chip-hal/tes
t-my-chip/target/riscv32im-unknown-none-elf/debug/deps/{libmy-chip_semihosting-2ffbf42f5a1c0b2b.rlib,libembassy_sync-87b9119bfe00654a.rlib,libfutures_sink-7c98d367e6868ba0.rlib,libembedded_io_asy
nc-6332518b4e0af9e1.rlib,libembedded_io-5a7a05882103caa1.rlib,libfutures_util-d70cd5914d6416bd.rlib,libpin_project_lite-1859dfb40d3b8df4.rlib,libfutures_task-9ce427ef940865dd.rlib,libpin_util
s-ff398133d360329c.rlib,libfutures_core-4dc0f3f50c08b2b2.rlib,librtic-c6ff90d7d03e9bce.rlib,libriscv_slic-037ca3eb600b6a02.rlib,libheapless-9be483b3723099fb.rlib,libhash32-a1720725e97bdabe.rl
ib,libbyteorder-276e6e17804c2b5e.rlib,libriscv-2b6b4891b309942b.rlib,libportable_atomic-d4113a794ead99e7.rlib,libbare_metal-0e51519dd53d7ec1.rlib,librtic_core-006ab86be720f86c.rlib,libmy-chip_p
ac_from_svd2rust-3f2d93f5074198d7.rlib,libvcell-6766a3ae69eeb921.rlib,libmy-chip_pac-99a5ea606d2af385.rlib,libriscv_rt-4d802197c67b9db8.rlib,libriscv-ce7d11ce67ab26e3.rlib,libcritical_section-4
e5b9e256e06c46b.rlib,libriscv_pac-2b64b5252652eb28.rlib,libembedded_hal-ada048c45269068b.rlib,libpanic_halt-e71b09e24a3f2b28.rlib}.rlib" "<sysroot>/lib/rustlib/riscv32im-unknown-none-elf/lib/
{librustc_std_workspace_core-*,libcore-*,libcompiler_builtins-*}.rlib" "-L" "/tmp/rustck1aLee/raw-dylibs" "-Bdynamic" "-z" "noexecstack" "-L" "my-chip-hal/test-my-chip" "-L" "/my-chip-hal/test-my-chip/target/riscv32im-unknown-none-elf/debug/build/riscv-rt-43ba08c2bfeca675/out"
"-o" "/my-chip-hal/test-my-chip/target/riscv32im-unknown-none-elf/debug/deps/rtic_task-b1dc03ec8a5af0be" "--gc-sections" "-Tmemory.x" "-Tl
ink.x"
= note: some arguments are omitted. use `--verbose` to show all linker arguments
= note: rust-lld: error: duplicate symbol: _dispatch_core_interrupt
>>> defined at interrupt.rs:2 (src/interrupt.rs:2)
>>> my-chip_pac_from_svd2rust-3f2d93f5074198d7.c6zc17v4kqt7gdf7wpco3txyf.rcgu.o:(_dispatch_core_interrupt) in archive
my-chip-hal/test-my-chip/target/riscv32im-unknown-none-elf/debug/deps/libmy-chip_pac_from_svd2rust-3f2d93f5074198d7.rlib
>>> defined at interrupts.rs:21 (src/interrupts.rs:21)
>>> riscv_rt-4d802197c67b9db8.riscv_rt.35be41d95d78462b-cgu.0.rcgu.o:(.text._dispatch_core_interrupt+0x0) in archive my-chip-hal/test-my-chip/target/riscv32im-unknown-none-elf/debug/deps/libriscv_rt-4d802197c67b9db8.rlib
rust-lld: error: duplicate symbol: __CORE_INTERRUPTS
>>> defined at interrupt.rs:2 (src/interrupt.rs:2)
>>> my-chip_pac_from_svd2rust-3f2d93f5074198d7.c6zc17v4kqt7gdf7wpco3txyf.rcgu.o:(__CORE_INTERRUPTS) in archive /stxp
5-hal/test-my-chip/target/riscv32im-unknown-none-elf/debug/deps/libmy-chip_pac_from_svd2rust-3f2d93f5074198d7.rlib
>>> defined at interrupts.rs:21 (src/interrupts.rs:21)
>>> riscv_rt-4d802197c67b9db8.riscv_rt.35be41d95d78462b-cgu.0.rcgu.o:(.rodata.__CORE_INTERRUPTS+0x0) in archive /s
txp5-hal/test-my-chip/target/riscv32im-unknown-none-elf/debug/deps/libriscv_rt-4d802197c67b9db8.rlib```
What I did
Remove th intterupt module
To prevent duplicate symbol from the intterupt module and riscv_rt.
If I remove the intterupt module from which the error is refering to (defined at interrupt.rs:2) by ommiting the settings.yaml in my svd2rust command I get the following error :
error[E0433]: failed to resolve: could not find `interrupt` in `my-chip_pac_from_svd2rust`
--> src/bin/rtic_task.rs:9:1
|
9 | #[rtic::app(device = my-chip_pac_from_svd2rust)]
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ could not find `interrupt` in `my-chip_pac_from_svd2rust`
|
= help: consider importing one of these enums:
crate::app::slic::riscv::interrupt::Exception
crate::app::slic::riscv::interrupt::supervisor::Exception
riscv::interrupt::Exception
riscv::interrupt::supervisor::Exception
= note: this error originates in the macro `rtic::export::codegen` (in Nightly builds, run with -Z macro-backtrace for more info)
rt feature
In the Cargo.toml of chip_pac_from_svd2rust
[dependencies]
critical-section = { version = "1.2.0", optional = true }
riscv = "0.13.0"
riscv-peripheral = "0.2.1"
riscv-rt = { version = "0.14.0", optional = true }
vcell = "0.1.3"
[features]
rt = ["riscv-rt"]
v-trap = ["rt", "riscv-rt/v-trap"]
The feature rt is not default but to make sure I set default-features = false
to chip_pac_from_svd2rust in my Cargo.toml at the top.
Question
Why do I have duplicate symbol, with my configuration and not with the hifive example of the rtic repository ? Altough I generated the pac with the same script.
Thank you advance for your answer