chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

未來嵌入式系統(tǒng)的黃金搭檔 MCX N947遇上Rust

恩智浦MCU加油站 ? 來源: 恩智浦MCU加油站 ? 2024-07-25 09:14 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

Rust 介紹Rust 是一門注重安全的語言,相比于 C/C++/ASM 有著更高級的抽象能力、編譯器帶來的安全特性與廣泛友好的社區(qū)支持。Linux 與 Windows 內(nèi)核也都基于 Rust 的安全性和性能引入了 Rust。

Rust 有很多優(yōu)勢,內(nèi)存安全、并發(fā)安全、生態(tài)系統(tǒng)、包管理與構(gòu)建管理,同時(shí)也有與 C/C++ 相同等級的性能。Rust 通過強(qiáng)化所有權(quán)和借用的概念,盡力消除了開發(fā)過程中可能出現(xiàn)的內(nèi)存問題。同時(shí)作為一門現(xiàn)代語言,有著許多方便的特性與豐富的生態(tài)資源,如統(tǒng)一的包管理,高可讀代碼等等。

但 Rust 也有美中不足,如缺乏對底層的完全控制,學(xué)習(xí)難度高,編譯時(shí)間長等。由于 Rust 的安全與高抽象能力,許多非安全操作被禁止,許多在 C 中能夠通過指針進(jìn)行的簡單操作在 Rust 中需要十分復(fù)雜的操作,這也導(dǎo)致 Rust 的學(xué)習(xí)難度更高。

本文會(huì)對在 NXP MCX 平臺(tái)上使用 Rust 進(jìn)行簡單介紹。在本文中使用 FRDM-MCXN947 為例,所有的例子均運(yùn)行在 Core0 上。

安裝Rust工具鏈Rust 工具鏈的安裝十分簡單,參考Rustup即可。默認(rèn)狀態(tài)下,Rustup 工具只會(huì)安裝本機(jī)的 TARGET ,為了能夠在我們的 MCU 上運(yùn)行編譯產(chǎn)物, 需要安裝對應(yīng)的 TARGET ??梢酝ㄟ^運(yùn)行如下命令來添加 armv8m hard-float 支持。

rustup target add thumbv8m.main-none-eabihf

同樣,如果我們想為其他平臺(tái)編譯,像 cortex-m3 ,則需要運(yùn)行:

rustup target add thumbv8m.main-none-eabihf

如果要在沒有 FPU 的 Core1 上運(yùn)行,則需要使用命令rustup target add thumbv8m.main-none-eabi添加thumbv8m.main-none-eabi target,注意無 hf 尾綴, 代表不使用硬件浮點(diǎn)數(shù) ABI

創(chuàng)建項(xiàng)目

在添加支持后,在我們想要保存項(xiàng)目的文件夾運(yùn)行命令cargo new mcx-example創(chuàng)建一個(gè)名為 mcx-example 的工程, 同時(shí)創(chuàng)建一個(gè)配置文件 .cargo/config.toml 來指定編譯參數(shù)和默認(rèn) target。

創(chuàng)建的 .cargo/config.toml 文件內(nèi)容如下:

[build]
target = "thumbv8m.main-none-eabihf"


[target.thumbv8m.main-none-eabihf]
rustflags = ["-C", "link-arg=-Tlink.x"]

接下來添加必要的依賴, Cargo.toml 的內(nèi)容應(yīng)該與下面的內(nèi)容類似:

[package]
name = "mcx-example"
version = "0.1.0"
edition = "2021"


[dependencies]
cortex-m = { version = "0.7.7", features = ["critical-section-single-core"] }
cortex-m-rt = "0.7.3"
mcxn947-pac = "0.0.3"
panic-halt = "0.2.0"

讓我簡單介紹各個(gè)依賴的作用:

  • cortex-m 該庫引入了 Cortex-M 架構(gòu)的定義和一些抽象,如常見的匯編指令,中斷等

  • cortex-m-rt 這個(gè)庫是 Cortex-M 架構(gòu)的通用運(yùn)行時(shí),提供一套內(nèi)置的linker script 和 ResetHandler 的實(shí)現(xiàn)等等

  • mcxn947-pac 包含了 MCXN947 的寄存器定義,中斷定義

  • panic-halt 實(shí)現(xiàn)默認(rèn)的 panic handler

示例:點(diǎn)燈

說起具體介紹,當(dāng)然舉個(gè)例子-點(diǎn)燈:

// src/main.rs


#![no_std] // 無標(biāo)準(zhǔn)庫
#![no_main] // 無入口


// 提供一個(gè) panic 實(shí)現(xiàn)
extern crate panic_halt;


use cortex_m_rt::entry;
use mcxn947_pac as pac;


// entry 標(biāo)志在 Reset 中跳轉(zhuǎn)到此
#[entry]
fn main() -> ! {
    let dp = pac::take().unwrap();
    let cp = pac::take().unwrap();


    // 啟用 PORT0 和 GPIO0 的時(shí)鐘
    dp.SYSCON0
        .ahbclkctrl0()
        .modify(|_r, w| w.port0().enable().gpio0().enable());


    // 設(shè)置 PIO0_10 為推挽輸出
    dp.PORT0.pcr(10).modify(|_r, w| w.mux().mux00());
    dp.GPIO0.pdor().modify(|_r, w| w.pdo10().clear_bit());
    dp.GPIO0.pddr().modify(|_r, w| w.pdd10().set_bit());


    // cortex-m 庫提供的方便的抽象,使用 SysTick timer 來進(jìn)行延時(shí)
    // 在默認(rèn)情況下 SysTick 的頻率與主頻相同,在這段代碼中我們沒有對時(shí)鐘進(jìn)行配置,所以默認(rèn)為48MHz
    let mut delay = cortex_m::new(cp.SYST, 48_000_000u32);


    loop {
        delay.delay_ms(1000u32);
        dp.GPIO0.ptor().write(|w| w.ptto10().set_bit());
    }
}

#![no_main] 指定不向外暴露符號 main, 所以即使我們的代碼中有 main 函數(shù),它也不會(huì)被當(dāng)作真正的 “main” 函數(shù)看待。同時(shí) #[entry] 標(biāo)志該函數(shù)被鏈接到 cortex-m-rt 庫中內(nèi)置鏈接腳本中的 “main” 函數(shù)。

添加一份 memory.x ,這是一份 linker script ,在 cortex-m-rt 庫中包含的默認(rèn) linker script 中有 include memory.x 的定義。所以我們需要添加一份,顧名思義,這份文件包含內(nèi)存定義,同時(shí)如果我們想把特定數(shù)據(jù)或函數(shù)放在某個(gè)段也是可以在這定義。

MEMORY {
     FLASH : ORIGIN = 0x00000000, LENGTH = 2M
RAM:ORIGIN=0x20000000,LENGTH=320K
}

運(yùn)行命令 cargo build 進(jìn)行構(gòu)建,產(chǎn)物位于 target/thumbv8m.main-none-eabihf/debug/mcx-example 格式為 elf 。

使用任意工具把產(chǎn)物加載到 MCU 上, 就以 jlink 為例,首先把產(chǎn)物轉(zhuǎn)成 hex 格式,arm-none-eabi-objcopy -O ihex target/thumbv8m.main-none-eabihf/debug/mcx-example mcx-example.hex, 然后使用 jflashLite 加載。

3cc56cae-4a20-11ef-b8af-92fbcf53809c.png

功能正常實(shí)現(xiàn)。

如果需要 Debug, 請參考使用VSCode調(diào)試嵌入式程序:配置與使用多樣化的gdb server:

3cd8cb96-4a20-11ef-b8af-92fbcf53809c.png

示例:按鍵開燈

此示例主要是介紹中斷用法及Rust 的線程安全用法:

#![no_std]
#![no_main]


extern crate panic_halt;


use core::cell::{Cell, RefCell};


use cortex_m::{asm::wfi, interrupt::Mutex};
use cortex_m_rt::entry;
use mcxn947_pac as pac;
use pac::interrupt;


// Rust 的安全特性要求
static FLAG_BTN_PRESSED: Mutex> = Mutex::new(false));
static GPIO0: Mutex>> = Mutex::new(None));


#[entry]
fn main() -> ! {
    let dp = pac::take().unwrap();
    let cp = pac::take().unwrap();


    // 啟用 PORT0 和 GPIO0 的時(shí)鐘
    dp.SYSCON0
        .ahbclkctrl0()
        .modify(|_r, w| w.port0().enable().gpio0().enable());


    // 設(shè)置 PIO0_10 為推挽輸出
    dp.PORT0.pcr(10).modify(|_r, w| w.mux().mux00());
    dp.GPIO0.pdor().modify(|_r, w| w.pdo10().clear_bit());
    dp.GPIO0.pddr().modify(|_r, w| w.pdd10().set_bit());


    // 設(shè)置 PIO0_6
    dp.PORT0.pcr(6).modify(|_r, w| w.mux().mux00());
    dp.GPIO0.pddr().modify(|_r, w| w.pdd6().clear_bit());
    dp.GPIO0
        .icr(6)
        .write(|w| w.isf().clear_bit_by_one().irqs().irqs0().irqc().irqc10());


    // 啟用 GPIO00 中斷
    unsafe { pac::GPIO00) }


    // 在關(guān)閉中斷的情況下向全局變量寫入數(shù)據(jù)
    // why: GPIO0 可能在 main 與 GPIO00 中共享
    cortex_m::free(|cs| {
        GPIO0.borrow(cs).replace(dp.GPIO0.into());
    });


    loop {
        wfi();


        cortex_m::free(|cs| {
            if FLAG_BTN_PRESSED.borrow(cs).get() {
                GPIO0
                    .borrow(cs)
                    .borrow_mut()
                    .as_mut()
                    .unwrap()
                    .ptor()
                    .write(|w| w.ptto10().set_bit());
            }
        })
    }
}


// GPIO00 中斷
#[interrupt]
fn GPIO00() {
    cortex_m::free(|cs| {
        let mut gpio = GPIO0.borrow(cs).borrow_mut();
        gpio.as_mut()
            .unwrap()
            .icr(6)
            .modify(|_r, w| w.isf().clear_bit_by_one());
        FLAG_BTN_PRESSED.borrow(cs).set(true);
    })
}

在上面這段代碼中我們當(dāng)然可以不使用 Mutex ,而是直接使用一個(gè) static mut FLAG_BTN_PRESSED: bool = false ,但有關(guān)于該變量的所有操作都需要使用 unsafe 標(biāo)簽,這在正常的開發(fā)過程中應(yīng)該是極力避免的,因?yàn)檫@種 unsafe 操作會(huì)導(dǎo)致 data race 。Mutex 是一個(gè)簡單包裝,使用一個(gè) CriticalSection 標(biāo)志來實(shí)現(xiàn),cortex_m::free 提供一個(gè)簡單的臨界區(qū)實(shí)現(xiàn),即關(guān)閉所有中斷?;蛘呖梢允褂迷硬僮?core::AtomicBool, static FLAG_BTN_PRESSED: AtomicBool = AtomicBool::new(false);

cortex_m::free 使用一個(gè) lambda 函數(shù)來在其操作前后添加關(guān)閉、打開中斷的操作。

雖然看起來寫起來很麻煩,但實(shí)際上編譯結(jié)果并沒有多余的操作,所有看上去繁瑣的操作實(shí)際上只是指導(dǎo)編譯器如何編譯,并不會(huì)生成實(shí)際的代碼,例如中斷中的 cs 變量,它并沒有實(shí)際的大小。

同樣燒錄進(jìn) MCU ,按下 ISP 按鍵即可控制燈的開關(guān)。

使用HAL

上述兩個(gè)例子均直接使用寄存器進(jìn)行操作,方法過于原始,可以使用 HAL 庫來簡化操作。HAL 庫正在積極開發(fā)中,所以使用 GitHub 上的最新版本。添加依賴。

[package]
name = "mcx-example"
version = "0.1.0"
edition = "2021"


[dependencies]
cortex-m = { version = "0.7.7", features = ["critical-section-single-core"] }
cortex-m-rt = "0.7.3"
mcxn947-pac = "0.0.3"
panic-halt = "0.2.0"
mcx-hal = { git = "https://github.com/mcx-rs/mcx-hal.git" }
#![no_std]
#![no_main]


use embedded_hal::digital::StatefulOutputPin;
use panic_halt as _;


use core::cell::{Cell, RefCell};
use cortex_m::asm::wfi;
use cortex_m::interrupt::Mutex;
use cortex_m_rt::entry;
use mcx_hal::{self as hal, pac, pac::interrupt};


type BtnType = hal::PIO0_6>;


static FLAG_BTN_PRESSED: Mutex> = Mutex::new(false));
static BTN: Mutex>> = Mutex::new(None));


#[entry]
fn main() -> ! {
    let dp = pac::take().unwrap();


    // 設(shè)置 pin 的狀態(tài)更方便了
    let gpio0 = hal::split(dp.GPIO0, dp.PORT0);
    let mut btn = gpio0.pio0_6.into_floating_input(); 
    let mut led_r = gpio0.pio0_10.into_push_pull_output();
    btn.enable_irq(
        hal::FallingEdge,
        hal::IRQ0,
    );
    cortex_m::free(|cs| {
        BTN.borrow(cs).replace(Some(btn));
    });


    // enable GPIO0 irq
    unsafe {
        pac::GPIO00);
    }


    loop {
        wfi();


        cortex_m::free(|cs| {
            if FLAG_BTN_PRESSED.borrow(cs).get() {
                FLAG_BTN_PRESSED.borrow(cs).set(false);
                led_r.toggle().unwrap();
            }
        });
    }
}


#[interrupt]
fn GPIO00() {
    cortex_m::free(|cs| {
        let mut btn = BTN.borrow(cs).borrow_mut();
        btn.as_mut().unwrap().clear_irq_flag();
        FLAG_BTN_PRESSED.borrow(cs).set(true);
    });
}

如果我們想要使用其他中斷,該怎么知道它的名字呢?十分簡單,所有的中斷定義都在 mcxn947-pac::Interrupt 中。

3cdd4266-4a20-11ef-b8af-92fbcf53809c.png

這個(gè)例子同樣是使用 ISP 按鍵來控制紅燈的開關(guān)。

Linkerscript

將特定的數(shù)據(jù)放置在特定的位置,也是嵌入式開發(fā)中常見的操作,那么怎么在 Rust 上實(shí)現(xiàn)呢?

修改 memory.x 即可:

MEMORY { 
FLASH:ORIGIN=0x00000000,LENGTH=1M
RAM:ORIGIN=0x20000000,LENGTH=128K
MY_RAM:ORIGIN=0x04000000,LENGTH=16K
}


SECTIONS { 
    .my_custom_data_in_my_ram (NOLOAD) : ALIGN(4) { 
(.my_custom_data_in_my_ram.my_custom_data_in_my_ram.);
.=ALIGN(4);
}>MY_RAM
}

如果要把中斷函數(shù)放在 RAM 里,需要一點(diǎn)額外操作,首先需要去掉過程宏#[interrupt]
#[interrupt]可以看作是#[export_name = ...]和一段代碼展開的縮寫。
我們可以去掉它,手動(dòng)加上一些宏來達(dá)到同樣的效果。首先添加
#[no_mangle]防止編譯器對它重新命名,或者使用#[export_name = ...]來讓它的名字是中斷名。
然后添加
#[link_section = ...]來讓它鏈接到MY_RAM中。
#[link_section=".my_custom_data_in_my_ram.my_custom_name"]
#[no_mangle]
fn GPIO00() {
    cortex_m::free(|cs| {
        let mut btn = BTN.borrow(cs).borrow_mut();
        btn.as_mut().unwrap().clear_irq_flag();
        FLAG_BTN_PRESSED.borrow(cs).set(true);
    });
}

使用命令 arm-none-eabi-size -Ax target/thumbv8m.main-none-eabihf/debug/mcx-example 或者使用命令 cargo install cargo-binutils && rustup component add llvm-tools ,之后就可以 cargo size -- -Ax.

查看編譯結(jié)果,確認(rèn)中斷被我們放進(jìn)了 MY_RAM 里:

3cea4628-4a20-11ef-b8af-92fbcf53809c.png

在 Debug 下,也可以看到中斷時(shí) PC 的地址:

3cee4d68-4a20-11ef-b8af-92fbcf53809c.png

希望以上內(nèi)容可以對想使用 Rust 進(jìn)行嵌入式開發(fā)的伙伴們提供指引與助力。

接下來,我們還將深入探索Rust 中的RTOS與實(shí)時(shí)工具,會(huì)為大家揭開更多技術(shù)奧秘,敬請持續(xù)關(guān)注,精彩不容錯(cuò)過!


聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • 嵌入式系統(tǒng)
    +關(guān)注

    關(guān)注

    41

    文章

    3817

    瀏覽量

    133861
  • RTOS
    +關(guān)注

    關(guān)注

    25

    文章

    868

    瀏覽量

    123202
  • Rust
    +關(guān)注

    關(guān)注

    1

    文章

    241

    瀏覽量

    7647

原文標(biāo)題:當(dāng)MCX N947遇上Rust,打造未來嵌入式系統(tǒng)的黃金搭檔!

文章出處:【微信號:NXP_SMART_HARDWARE,微信公眾號:恩智浦MCU加油站】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點(diǎn)推薦

    MCXN947 EVK 無法初始化 PHY是怎么回事?如何處理?

    我正在使用 MCXN947 開始一個(gè)新項(xiàng)目。我有 FRDM-MCXN947MCX-N9XX-EVK 演示板。我將使用 LWIP,因此我下載了兩塊板的 LWIP-PING 示例。該示例在
    發(fā)表于 04-17 08:39

    知識分享-嵌入式系統(tǒng)可靠性模型

    嵌入式系統(tǒng)可靠性設(shè)計(jì)技術(shù)及案例解析1.3嵌入式系統(tǒng)可靠性模型嵌入式系統(tǒng)可靠性模型分為兩種:串聯(lián)結(jié)
    的頭像 發(fā)表于 03-11 16:43 ?361次閱讀
    知識分享-<b class='flag-5'>嵌入式</b><b class='flag-5'>系統(tǒng)</b>可靠性模型

    嵌入式系統(tǒng)安全設(shè)計(jì)原則

    隨著物聯(lián)網(wǎng)、工業(yè)控制和智能設(shè)備的普及,嵌入式系統(tǒng)的安全問題越來越突出。一個(gè)小小的漏洞,就可能導(dǎo)致設(shè)備被入侵、數(shù)據(jù)泄露,甚至對人身安全產(chǎn)生威脅。因此,從設(shè)計(jì)階段開始就考慮安全,是每一個(gè)嵌入式開發(fā)者必須
    的頭像 發(fā)表于 01-19 09:06 ?455次閱讀
    <b class='flag-5'>嵌入式</b><b class='flag-5'>系統(tǒng)</b>安全設(shè)計(jì)原則

    什么是嵌入式應(yīng)用開發(fā)?

    概述 所謂的嵌入式應(yīng)用開發(fā)就是在嵌入式操作系統(tǒng)下進(jìn)行開發(fā)、軟硬件綜合開發(fā) ?嵌入式應(yīng)用開發(fā)?是指在嵌入式操作
    發(fā)表于 01-12 16:13

    嵌入式與FPGA的區(qū)別

    ,一是嵌入式軟件開發(fā),主要與嵌入式cao作系統(tǒng)、應(yīng)用軟件等有關(guān)。第二是嵌入式硬件開發(fā),需要掌握硬件設(shè)計(jì)、模擬仿真、 PCB設(shè)計(jì)等技能。 ?2、FPGA:它是在PAL、GAL、CPLD等
    發(fā)表于 11-20 07:12

    嵌入式和FPGA的區(qū)別

    嵌入式系統(tǒng)與FPGA的核心差異:軟件定義功能VS硬件可重構(gòu)。嵌入式適合通用計(jì)算,開發(fā)門檻低;FPGA憑借并行處理實(shí)現(xiàn)納秒級響應(yīng),但成本高、開發(fā)難。二者融合的SoC器件正成為未來趨勢,平
    發(fā)表于 11-19 06:55

    嵌入式系統(tǒng)的定義和應(yīng)用領(lǐng)域

    嵌入式系統(tǒng),簡而言之,就是一種專為特定設(shè)備或裝置設(shè)計(jì)的計(jì)算機(jī)系統(tǒng)。它們通常配備一個(gè)嵌入式處理器,其控制程序被存儲(chǔ)在ROM中。這些系統(tǒng)在許多日
    發(fā)表于 11-17 06:49

    2025年最佳的嵌入式編程語言有哪些呢?

    嵌入式系統(tǒng)是現(xiàn)代科技不可或缺的一部分。它們存在于家用電器、汽車、住宅、醫(yī)院、商店等各個(gè)領(lǐng)域。它們與我們的社會(huì)緊密相連。選擇合適的語言來構(gòu)建嵌入式系統(tǒng)對于成功至關(guān)重要。那么,2025年最
    的頭像 發(fā)表于 11-14 10:27 ?1733次閱讀
    2025年最佳的<b class='flag-5'>嵌入式</b>編程語言有哪些呢?

    嵌入式實(shí)時(shí)操作系統(tǒng)的特點(diǎn)

    實(shí)時(shí)嵌入式操作系統(tǒng)(Real-Time Embedded Operating System)是專門設(shè)計(jì)用于嵌入式系統(tǒng)的實(shí)時(shí)操作系統(tǒng)。
    發(fā)表于 11-13 06:30

    RusT-Thread:基于Rust面向資源受限嵌入式設(shè)備的操作系統(tǒng)的實(shí)踐 | 技術(shù)集結(jié)

    摘要隨著物聯(lián)網(wǎng)和嵌入式系統(tǒng)的發(fā)展,實(shí)時(shí)操作系統(tǒng)(RTOS)的安全性和性能需求日益提高。傳統(tǒng)基于C語言的RTOS在內(nèi)存安全和并發(fā)控制方面存在局限,容易導(dǎo)致緩沖區(qū)溢出、數(shù)據(jù)競爭等問題。本項(xiàng)目以
    的頭像 發(fā)表于 11-07 17:37 ?7030次閱讀
    <b class='flag-5'>RusT</b>-Thread:基于<b class='flag-5'>Rust</b>面向資源受限<b class='flag-5'>嵌入式</b>設(shè)備的操作<b class='flag-5'>系統(tǒng)</b>的實(shí)踐 | 技術(shù)集結(jié)

    嵌入式Linux新手入門:為什么迅為RK3568+迅為資料是黃金組合

    嵌入式Linux新手入門:為什么迅為RK3568+迅為資料是黃金組合
    的頭像 發(fā)表于 11-04 14:05 ?666次閱讀
    <b class='flag-5'>嵌入式</b>Linux新手入門:為什么迅為RK3568+迅為資料是<b class='flag-5'>黃金</b>組合

    2025嵌入式行業(yè)現(xiàn)狀如何?

    2025嵌入式行業(yè)現(xiàn)狀如何? 一、市場規(guī)模與增長趨勢1.1 全球市場概況總體規(guī)模:2025年全球嵌入式系統(tǒng)市場規(guī)模預(yù)計(jì)突破1.2萬億美元,相當(dāng)于每天誕生3個(gè)“光谷”級產(chǎn)業(yè)集群。 驅(qū)動(dòng)因素:物聯(lián)網(wǎng)
    發(fā)表于 08-25 11:34

    RT-Thread 遇上 Rust:安全內(nèi)核 RusT-Thread 的誕生

    大家好,我們是中國科學(xué)技術(shù)大學(xué)操作系統(tǒng)原理與設(shè)計(jì)(H)課oooooS小組。這個(gè)項(xiàng)目是我們的課程大作業(yè):參考RT-Thread架構(gòu),使用Rust搭建一個(gè)原生的嵌入式操作系統(tǒng)內(nèi)核。初識
    的頭像 發(fā)表于 08-02 11:03 ?3695次閱讀
    RT-Thread <b class='flag-5'>遇上</b> <b class='flag-5'>Rust</b>:安全內(nèi)核 <b class='flag-5'>RusT</b>-Thread 的誕生

    為什么GNSS/INS組合被譽(yù)為導(dǎo)航界的&amp;quot;黃金搭檔&amp;quot;?

    在導(dǎo)航技術(shù)領(lǐng)域,GNSS(全球?qū)Ш叫l(wèi)星系統(tǒng))和INS(慣性導(dǎo)航系統(tǒng))的結(jié)合,一直被業(yè)界譽(yù)為"黃金搭檔"。它們優(yōu)勢互補(bǔ),克服了單一系統(tǒng)的局限性,為高精度、高可靠性的導(dǎo)航提供了完美
    的頭像 發(fā)表于 07-09 17:12 ?1122次閱讀
    為什么GNSS/INS組合被譽(yù)為導(dǎo)航界的&amp;quot;<b class='flag-5'>黃金搭檔</b>&amp;quot;?

    運(yùn)行在嵌入式系統(tǒng)上的emApps

    在當(dāng)今快節(jié)奏的嵌入式系統(tǒng)世界中,靈活性和適應(yīng)性是嵌入式系統(tǒng)實(shí)現(xiàn)的關(guān)鍵。SEGGER推出了其最新創(chuàng)新:Embedded apps(emApps)應(yīng)用,類似于手機(jī)上的應(yīng)用程序,可以運(yùn)行在
    的頭像 發(fā)表于 06-18 09:53 ?1029次閱讀
    運(yùn)行在<b class='flag-5'>嵌入式</b><b class='flag-5'>系統(tǒng)</b>上的emApps