examples/rust: Avoid the infinite loop on sim for hello_rust_cargo

On the sim target (Windows/macOS/Linux), hello_rust_cargo_main() ended
with an infinite `loop {}` that never returned control to NSH, so the
example could not exit and the shell prompt hung.

Introduce a Cargo `sim` feature that is enabled only when CONFIG_ARCH_SIM
is set, and use it to compile out the trailing infinite loop and return 0
instead. Other embedded targets keep the original looping behavior.

Signed-off-by: Shoji Tokunaga <toku@mac.com>
This commit is contained in:
Shoji Tokunaga 2026-06-15 17:28:54 +09:00 • committed by Alan C. Assis
parent ee4727fdba
commit d1202bd501
6 changed files with 35 additions and 7 deletions

View file

@ -21,7 +21,12 @@
if(CONFIG_EXAMPLES_HELLO_RUST_CARGO)
# Build the Rust crate using nuttx_add_rust
nuttx_add_rust(CRATE_NAME hello CRATE_PATH ${CMAKE_CURRENT_SOURCE_DIR})
if(CONFIG_ARCH_SIM)
nuttx_add_rust(CRATE_NAME hello CRATE_PATH ${CMAKE_CURRENT_SOURCE_DIR}
FEATURES sim)
else()
nuttx_add_rust(CRATE_NAME hello CRATE_PATH ${CMAKE_CURRENT_SOURCE_DIR})
endif()
nuttx_add_application(
NAME ${CONFIG_EXAMPLES_HELLO_RUST_CARGO_PROGNAME} STACKSIZE

View file

@ -6,6 +6,9 @@ edition = "2021"
[lib]
crate-type = ["staticlib"]
[features]
sim = []
[profile.dev]
panic = "abort"

View file

@ -30,8 +30,12 @@ MODULE = $(CONFIG_EXAMPLES_HELLO_RUST_CARGO)
RUST_LIB := $(call RUST_GET_BINDIR,hello,$(APPDIR)/examples/rust)
RUST_SRCS := $(call RUST_CARGO_SRCS,hello,$(APPDIR)/examples/rust)
ifeq ($(CONFIG_ARCH_SIM),y)
HELLO_RUST_FEATURES := sim
endif
$(RUST_LIB): $(RUST_SRCS)
$(call RUST_CARGO_BUILD,hello,$(APPDIR)/examples/rust)
$(call RUST_CARGO_BUILD,hello,$(APPDIR)/examples/rust,$(HELLO_RUST_FEATURES))
context:: $(RUST_LIB)

View file

@ -1,6 +1,7 @@
extern crate serde;
extern crate serde_json;
use core::ffi::{c_char, c_int};
use serde::{Deserialize, Serialize};
#[derive(Serialize, Deserialize)]
@ -11,7 +12,7 @@ struct Person {
// Function hello_rust_cargo without manglng
#[no_mangle]
pub extern "C" fn hello_rust_cargo_main() {
pub extern "C" fn hello_rust_cargo_main(_argc: c_int, _argv: *mut *mut c_char) -> c_int {
// Print hello world to stdout
let john = Person {
@ -50,7 +51,11 @@ pub extern "C" fn hello_rust_cargo_main() {
println!("Hello world from tokio!");
});
#[cfg(not(feature = "sim"))]
loop {
// Do nothing
}
#[cfg(feature = "sim")]
0
}