我正在用rust语言开发Quactel模块。我有一个对象(Tracking_mgr(,我想从中断处理程序(CallBack_NMEA_Hdlr(调用该对象的方法(parse_from_byte(。但我不能,因为对象的作用域(main(和中断的作用域不同。
#![no_std]
#![feature(core_intrinsics)]
#![feature(lang_items)]
#![feature(destructuring_assignment)]
include!("./bindings.rs");
extern crate alloc;
extern crate cty;
extern crate nmea0183;
extern crate ql_alloc;
use alloc::format;
use alloc::string::String;
use alloc::string::ToString;
use core::convert::TryInto;
use core::slice;
use nmea0183::{ParseResult, Parser};
#[panic_handler]
fn my_panic(_info: &core::panic::PanicInfo) -> ! {
loop {}
}
#[lang = "eh_personality"]
extern "C" fn eh_personality() {}
pub fn printUart(mut string: String) {
unsafe {
Ql_UART_Write(10, string.as_mut_ptr(), string.len() as u32);
}
}
pub struct Tracking_mgr {
point: Point,
parser: Parser,
}
impl Tracking_mgr {
pub fn new() -> Tracking_mgr {
Tracking_mgr {
point: Point::new(),
parser: Parser::new(),
}
}
pub fn parse_from_byte(&mut self, buff: u8) {
self.parser.parse_from_byte(buff);
}
}
pub trait GpsInterface {
fn power_on();
fn power_off();
}
impl GpsInterface for Tracking_mgr {
fn power_on() {
unsafe {
Ql_GNSS_PowerOn(4, Some(CallBack_NMEA_Hdlr), ::core::ptr::null_mut());
}
}
fn power_off() {
unsafe {
Ql_GNSS_PowerDown();
}
}
}
pub struct Point {
point: [u8; 5],
}
impl Point {
pub fn new() -> Point {
Point {
point: [0, 0, 0, 0, 0],
}
}
}
pub extern "C" fn CallBack_NMEA_Hdlr(
nmea_buff: *mut u8,
len: u16,
customizePara: *mut cty::c_void,
) {
}
pub extern "C" fn CallBack_UART_Notify(
port: Enum_SerialPort,
event: Enum_UARTEventType,
pinLevel: bool,
customizePara: *mut cty::c_void,
) {
printUart("CallBack_UART_Notify".to_string());
}
#[no_mangle]
pub extern "C" fn proc_main_task(taskId: i32) {
let mut msg = ST_MSG {
message: 0,
param1: 0,
param2: 0,
srcTaskId: 0,
};
loop {
unsafe {
Ql_OS_GetMessage(&mut msg);
}
match msg.message {
MSG_ID_RIL_READY => unsafe {
Ql_UART_Register(10, Some(CallBack_UART_Notify), ::core::ptr::null_mut());
Ql_UART_Open(10, 115200, 1);
Ql_GPIO_Init(0, 1, 1, 0);
Ql_GNSS_PowerOn(4, Some(CallBack_NMEA_Hdlr), ::core::ptr::null_mut());
},
_ => (),
}
}
}
我以前尝试过CCD_ 1,但我得到了这个错误";静态中的调用仅限于常量函数、元组结构和元组变体";有人能帮我吗?如何从中断处理程序调用main((中定义的对象的方法?谢谢
如错误消息所示,您只能调用const
函数来初始化静态。原则上,您可以尝试将Tracking_mgr::new
设置为const
函数(pub const fn new()
(,但这不起作用,因为它调用的其他方法本身不是const
(我认为Point::new
可以是const
,但Parser::new
不能(。
为了解决这个问题,您可以在static mut tracking_mgr: Tracking_mgr = Tracking_mgr::new();
1:中存储一个Option
static mut tracking_mgr: Option<Tracking_mgr> = None;
并在main
函数中初始化它:
unsafe { tracking_mgr = Some(Tracking_mgr::new()); }
看起来您不是在标准嵌入式Rust堆栈(cortex-m
/cortex-m-rt
(之上构建的。如果你是,我建议你使用RTIC,因为它以一种更安全、更优雅的方式解决了同样的问题。