• Rust嵌入式编程---#![no_std]和中断处理


    #[no_std]

    使用 #[no_std] 执行数学功能,如果要执行与数学相关的功能(如计算数字的平方根或指数),并且有完整的标准库可用,则代码可能如下所示:

    fn main() {
        let float: f32 = 4.82832;
        let floored_float = float.floor();
    
        let sqrt_of_four = floored_float.sqrt();
    
        let sinus_of_four = floored_float.sin();
    
        let exponential_of_four = floored_float.exp();
        println!("Floored test float {} to {}", float, floored_float);
        println!("The square root of {} is {}", floored_float, sqrt_of_four);
        println!("The sinus of four is {}", sinus_of_four);
        println!(
            "The exponential of four to the base e is {}",
            exponential_of_four
        )
    }
    

    如果没有标准库支持,这些功能将不可用。可以使用像libm这样的库。然后,示例代码将如下所示:

    #![no_main]
    #![no_std]
    
    use panic_halt as _;
    
    use cortex_m_rt::entry;
    use cortex_m_semihosting::{debug, hprintln};
    use libm::{exp, floorf, sin, sqrtf};
    
    #[entry]
    fn main() -> ! {
        let float = 4.82832;
        let floored_float = floorf(float);
        let sqrt_of_four = sqrtf(floored_float);
        let sinus_of_four = sin(floored_float.into());
    
        let exponential_of_four = exp(floored_float.into());
        hprintln!("Floored test float {} to {}", float, floored_float).unwrap();
        hprintln!("The square root of {} is {}", floored_float, sqrt_of_four).unwrap();
        hprintln!("The sinus of four is {}", sinus_of_four).unwrap();
        hprintln!(
            "The exponential of four to the base e is {}",
            exponential_of_four
        )
        .unwrap();
        // exit QEMU
        // NOTE do not run this on hardware; it can corrupt OpenOCD state
        // debug::exit(debug::EXIT_SUCCESS);
    
        loop {}
    }
    

    中断处理

    上一节讲了一下异常处理和panic处理,中断在各种方面与异常不同,但它们的操作和使用在很大程度上是相似的,并且它们也由相同的中断控制器处理。虽然异常是由Cortex-M架构定义的,但中断在命名和功能上始终是供应商(甚至通常是芯片)特定的实现。

    中断确实允许很大的灵活性,在尝试以高级方式使用它们时需要考虑这些灵活性。最好牢记以下几点:
    1.中断具有可编程的优先级,这些优先级决定了其处理程序的执行顺序。
    2.中断可以嵌套和抢占,即中断处理程序的执行可能会被另一个优先级较高的中断中断。
    3.通常,需要清除导致中断触发的原因,以防止无休止地重新进入中断处理程序。
    运行时的常规初始化步骤始终相同:
    设置外设以在所需场合生成中断请求。
    在中断控制器中设置中断处理程序的所需优先级。
    在中断控制器中启用中断处理程序。

    Cortex-m的中断属性声明:
    与异常类似,rust中,cortex-m crate外部库提供了一个中断属性来声明中断处理程序:

    // 中断处理函数
    #[interrupt]
    fn EXTI0() {
    //中断处理代码...
    }
    

    中断处理程序看起来像类似于异常处理程序的普通函数(缺少参数除外)。但是,由于特殊的调用约定,它们不能由固件的其他部分直接调用。但是,可以在软件中生成中断请求,以触发对中断处理程序的转移。
    与异常处理程序类似,也可以在中断处理程序中声明变量以实现安全状态。

    #[interrupt]
    fn TIM2() {
        static mut COUNT: u32 = 0;
        // `COUNT` has type `&mut u32` and it's safe to use
        *COUNT += 1;
    }
    

    以下是详细的中断处理代码,其实和异常处理差别不大,但是后面后期的改进空间比较大,功能会更多一些。

    //device for stm32f405 
    #![no_main]
    #![no_std]
    
    #[allow(unused_extern_crates)]
    use panic_halt as _;
    
    use cortex_m::peripheral::syst::SystClkSource;
    use cortex_m_rt::entry;
    use cortex_m_semihosting::hprint;
    use stm32f4xx_hal as hal;
    use crate::hal::{
        gpio::{gpiob, Output, PushPull},
        prelude::*,
        stm32::{interrupt, Interrupt, Peripherals, TIM2,NVIC},
        timer::{Event, Timer},
       };
    #[entry]
    fn main() -> ! {
        let p = cortex_m::Peripherals::take().unwrap();
    
        let mut syst = p.SYST;
        let mut nvic = p.NVIC;
        //使能外部中断Exti0
        nvic.enable(Interrupt::EXTI0);
    
        // 将系统计时器配置为每秒钟循环启动一次
        syst.set_clock_source(SystClkSource::Core);
        syst.set_reload(8_000_000); // 1s
        syst.enable_counter();
    
        loop {
            // 等待直到一次计时器循环结束
            while !syst.has_wrapped() {}
    
            // 软件触发 EXTI0中断
            NVIC::pend(Interrupt::EXTI0);
        }
    }
    //外部中断EXTI0处理函数
    #[interrupt]
    fn EXTI0() {
        //打印字符"+"到终端
        hprint!("+").unwrap();
    }
    
  • 相关阅读:
    中国1km分辨率月最低温和最高温度数据集(1901-2020)
    前端 对数据进行aes加密
    为什么在springboot中使用thymeleaf无法实现网络请求
    扩展 Calcite 中的 SQL 解析语法
    vue动态修改浏览器title和icon图标
    运动品牌推荐:2022年最值得入手的一些运动装备
    Linux安装JDK
    用MapStruct复制Bean
    Android毕业论文选题基于Uniapp+Springboot实现的校园论坛
    字节迎来新 CFO,或重启上市;马斯克以 440 亿美元收购 Twitter;FFmpeg 支持 JPEG-XL|极客头条
  • 原文地址:https://blog.csdn.net/phthon1997/article/details/127105647