Неопределенная ссылка на main при использовании Real-Time For the Masses - PullRequest
0 голосов
/ 20 сентября 2018

Я пытаюсь написать многопоточное голое железное приложение для STM32F4Discovery с использованием Real-Time For Masses (RTFM) crate .Я собрал воедино минимальное приложение из примера для платы STM32F3Discovery и этого примера :

#![deny(unsafe_code)]
#![no_main]
#![no_std]

extern crate cortex_m;
extern crate cortex_m_rtfm as rtfm;
extern crate cortex_m_semihosting;
extern crate panic_semihosting;
extern crate stm32f4;

use stm32f4::stm32f407;

use rtfm::app;

app! {
    device: stm32f407,
}

fn init(_p: init::Peripherals) {
}

fn idle() -> ! {
    loop {
        rtfm::wfi();
    }
}

Я могу получить его для компиляции, но связывая с ржавчиной-lld завершается с

= note: rust-lld: error: undefined symbol: main

Я в замешательстве, потому что когда я запускаю cargo expand, я получаю основную функцию:

fn main() {
    #![allow(path_statements)]
    let init: fn(init::Peripherals) = init;
    rtfm::atomic(unsafe { &mut rtfm::Threshold::new(0) },
                 |_t|
                     unsafe {
                         let _late_resources =
                             init(init::Peripherals{core:
                                                        ::stm32f407::CorePeripherals::steal(),
                                                    device:
                                                        ::stm32f407::Peripherals::steal(),});
                     });
    let idle: fn() -> ! = idle;
    idle();
}

Я новичок в Rust (на самом деле я былнадеясь выучить язык с помощью этого проекта) и не знаю, где может быть ошибка.

1 Ответ

0 голосов
/ 20 сентября 2018

Когда вы просите компилятор не вставлять main, в вашей программе нет главного символа.

Rust использует искажение символов, поэтому ваша функция main не имеет символа с именем main.

Ответ зависит от вашего контекста, но обычно это следует делать:

#[no_mangle] // ensure that this symbol is called `main` in the output
pub extern fn main(argc: i32, argv: *const *const u8) -> i32 {

}

Всю дополнительную информацию можно найти здесь

...