Estoy usando Rust 1.51 y esta caja mínima:
#![no_std]
fn main() {
let a = 2.0.cos();
}
Lo estoy compilando con cargo check --target thumbv7em-none-eabihf y el compilador se queja con este mensaje: no se encontró ningún método llamado 'cos' para el tipo '{float}' en el alcance actual. Lo mismo para sin() y log10().
Encontré https://docs.rust-embedded.org/cortex-m-quickstart/cortex_m_quickstart/ y esperaría el mensaje anterior para los objetivos thumbv6m-none-eabi o thumbv7em-none-eabi pero no para thumbv7em- none-eabihf que tiene soporte FPU.
¿Cómo puedo solucionar esto?
2
quieres usar la función estándar pero solicitas no incluirla. Hay un problema obvio en tu lógica
- Stargateur
28/03/2021 a las 10:05
1
github.com/rust-lang/rfcs/issues/2505
- Stargateur
28/03/2021 a las 10:11
gracias, no sabía que estos están solo en std pero no en core
-phip1611
28/03/2021 a las 10:21
1
Cree una respuesta propia cuando la resuelva. Creo que esa pregunta será útil para muchos futuros lectores.
- Stargateur
28/03/2021 a las 10:27
------------------------------------
Lo que dijo @phip1611 es correcto, porque ya no forma parte de la biblioteca principal y, por lo tanto, no se puede utilizar enno_std listo para usar. Puede usar libm directamente O mediante un contenedor estándar usando la caja num-traits con la función libm habilitada. Esto le permite escribir código no_std como lo haría con código estándar. Por ejemplo
# cargo.toml
num-traits = { version = "0.2", default-features = false, features = ["libm"] }
Y luego en tu código:
#![no_std]
#[allow(unused_imports)]
use num_traits::real::Real;
fn main() {
let a = 2.0.cos();
}
------------------------------------
En Rust 1.51 (y versiones anteriores), funciones como sin, cos o log10 no forman parte de la biblioteca principal (core::) sino solo de la biblioteca estándar (std::), por lo que no están disponibles.
Una solución práctica es utilizar crate libm, que ofrece funciones matemáticas típicas para entornos no_std.
#![no_std]
fn main() {
let a = libm::cosf(2.0);
}
Ver:
caja libm: https://crates.io/crates/libm
Discusión para mover funciones matemáticas a la biblioteca principal https://github.com/rust-lang/rfcs/issues/2505
1
Sin embargo, tenga en cuenta que libm no contiene aceleración de hardware, incluso si la plataforma de destino la admite. Esto no es relevante para sin() o cos() para thumbv7em-none-eabihf, porque su FPU no los admite, pero, por ejemplo, abs() o sqrt() son compatibles y serán mucho más lentos con libm. . Puede encontrar más información en la discusión sobre rfc que ya está vinculada en la respuesta.
-Finomnis
31 de mayo de 2023 a las 10:04