From 9f573d73b2c94326e1ab76bcfabcdbd1fa796001 Mon Sep 17 00:00:00 2001 From: Kitlith Date: Sat, 24 Feb 2018 18:26:31 -0800 Subject: [PATCH] Update examples to newer svd2rust api. Similarly, the cortex-m crate API was also updated. --- Cargo.toml | 2 +- examples/allocator.rs | 39 +++++++++++++++++------------------- examples/device.rs | 19 +++++++++++------- examples/itm.rs | 9 ++++----- src/examples/_1_itm.rs | 9 ++++----- src/examples/_5_device.rs | 19 +++++++++++------- src/examples/_6_allocator.rs | 39 +++++++++++++++++------------------- 7 files changed, 69 insertions(+), 67 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index e61a454..f405894 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -9,7 +9,7 @@ repository = "https://github.com/japaric/cortex-m-quickstart" version = "0.2.4" [dependencies] -cortex-m = "0.3.0" +cortex-m = "0.4.0" cortex-m-semihosting = "0.2.0" [dependencies.cortex-m-rt] diff --git a/examples/allocator.rs b/examples/allocator.rs index 7f61af1..4e51944 100644 --- a/examples/allocator.rs +++ b/examples/allocator.rs @@ -1,6 +1,6 @@ //! How to use the heap and a dynamic memory allocator //! -//! To compile this example you'll need to build the collections crate as part +//! To compile this example you'll need to build the alloc crate as part //! of the Xargo sysroot. To do that change the Xargo.toml file to look like //! this: //! @@ -8,7 +8,7 @@ //! [dependencies.core] //! stage = 0 //! -//! [dependencies.collections] # NEW +//! [dependencies.alloc] # NEW //! stage = 0 //! //! [dependencies.compiler_builtins] @@ -25,15 +25,16 @@ //! //! --- -#[allow(deprecated)] -#![feature(collections)] +#![feature(alloc)] #![feature(used)] +#![feature(global_allocator)] #![no_std] +#[allow(deprecated)] // This is the allocator crate; you can use a different one extern crate alloc_cortex_m; #[macro_use] -extern crate collections; +extern crate alloc; extern crate cortex_m; extern crate cortex_m_rt; extern crate cortex_m_semihosting; @@ -42,25 +43,21 @@ use core::fmt::Write; use cortex_m::asm; use cortex_m_semihosting::hio; +use alloc_cortex_m::CortexMHeap; + +#[global_allocator] +static ALLOCATOR: CortexMHeap = CortexMHeap::empty(); + +extern "C" { + static mut _sheap: u32; + static mut _eheap: u32; +} fn main() { // Initialize the allocator - unsafe { - extern "C" { - // Start of the heap - static mut _sheap: usize; - } - - // Size of the heap in words (1 word = 4 bytes) - // NOTE The bigger the heap the greater the chance to run into a stack - // overflow (collision between the stack and the heap) - const SIZE: isize = 256; - - // End of the heap - let _eheap = (&mut _sheap as *mut _).offset(SIZE); - - alloc_cortex_m::init(&mut _sheap, _eheap); - } + let start = unsafe { &mut _sheap as *mut u32 as usize }; + let end = unsafe { &mut _sheap as *mut u32 as usize }; + unsafe { ALLOCATOR.init(start, end - start) } // Growable array allocated on the heap let xs = vec![0, 1, 2]; diff --git a/examples/device.rs b/examples/device.rs index 0b28e19..4cc8f63 100644 --- a/examples/device.rs +++ b/examples/device.rs @@ -19,7 +19,7 @@ //! $ edit Cargo.toml && cat $_ //! [dependencies.stm32f103xx] //! features = ["rt"] -//! version = "0.7.0" +//! version = "0.8.0" //! ``` //! //! --- @@ -37,24 +37,29 @@ use core::cell::RefCell; use core::fmt::Write; use cortex_m::interrupt::{self, Mutex}; -use cortex_m::peripheral::SystClkSource; +use cortex_m::peripheral::syst::SystClkSource; use cortex_m_semihosting::hio::{self, HStdout}; use stm32f103xx::Interrupt; static HSTDOUT: Mutex>> = Mutex::new(RefCell::new(None)); +static NVIC: Mutex>> = + Mutex::new(RefCell::new(None)); + fn main() { + let global_p = cortex_m::Peripherals::take().unwrap(); interrupt::free(|cs| { let hstdout = HSTDOUT.borrow(cs); if let Ok(fd) = hio::hstdout() { *hstdout.borrow_mut() = Some(fd); } - let nvic = stm32f103xx::NVIC.borrow(cs); + let mut nvic = global_p.NVIC; nvic.enable(Interrupt::TIM2); + *NVIC.borrow(cs).borrow_mut() = Some(nvic); - let syst = stm32f103xx::SYST.borrow(cs); + let mut syst = global_p.SYST; syst.set_clock_source(SystClkSource::Core); syst.set_reload(8_000_000); // 1s syst.enable_counter(); @@ -71,9 +76,9 @@ fn tick() { writeln!(*hstdout, "Tick").ok(); } - let nvic = stm32f103xx::NVIC.borrow(cs); - - nvic.set_pending(Interrupt::TIM2); + if let Some(nvic) = NVIC.borrow(cs).borrow_mut().as_mut() { + nvic.set_pending(Interrupt::TIM2); + } }); } diff --git a/examples/itm.rs b/examples/itm.rs index 4159c43..77f3149 100644 --- a/examples/itm.rs +++ b/examples/itm.rs @@ -20,14 +20,13 @@ extern crate cortex_m; extern crate cortex_m_rt; -use cortex_m::{asm, interrupt, peripheral}; +use cortex_m::{asm, Peripherals}; fn main() { - interrupt::free(|cs| { - let itm = peripheral::ITM.borrow(&cs); + let p = Peripherals::take().unwrap(); + let mut itm = p.ITM; - iprintln!(&itm.stim[0], "Hello, world!"); - }); + iprintln!(&mut itm.stim[0], "Hello, world!"); } // As we are not using interrupts, we just register a dummy catch all handler diff --git a/src/examples/_1_itm.rs b/src/examples/_1_itm.rs index 2f85edc..349dc4b 100644 --- a/src/examples/_1_itm.rs +++ b/src/examples/_1_itm.rs @@ -22,14 +22,13 @@ //! extern crate cortex_m; //! extern crate cortex_m_rt; //! -//! use cortex_m::{asm, interrupt, peripheral}; +//! use cortex_m::{asm, Peripherals}; //! //! fn main() { -//! interrupt::free(|cs| { -//! let itm = peripheral::ITM.borrow(&cs); +//! let p = Peripherals::take().unwrap(); +//! let mut itm = p.ITM; //! -//! iprintln!(&itm.stim[0], "Hello, world!"); -//! }); +//! iprintln!(&mut itm.stim[0], "Hello, world!"); //! } //! //! // As we are not using interrupts, we just register a dummy catch all handler diff --git a/src/examples/_5_device.rs b/src/examples/_5_device.rs index e0b296a..700fedb 100644 --- a/src/examples/_5_device.rs +++ b/src/examples/_5_device.rs @@ -19,7 +19,7 @@ //! $ edit Cargo.toml && cat $_ //! [dependencies.stm32f103xx] //! features = ["rt"] -//! version = "0.7.0" +//! version = "0.8.0" //! ``` //! //! --- @@ -39,24 +39,29 @@ //! use core::fmt::Write; //! //! use cortex_m::interrupt::{self, Mutex}; -//! use cortex_m::peripheral::SystClkSource; +//! use cortex_m::peripheral::syst::SystClkSource; //! use cortex_m_semihosting::hio::{self, HStdout}; //! use stm32f103xx::Interrupt; //! //! static HSTDOUT: Mutex>> = //! Mutex::new(RefCell::new(None)); //! +//! static NVIC: Mutex>> = +//! Mutex::new(RefCell::new(None)); +//! //! fn main() { +//! let global_p = cortex_m::Peripherals::take().unwrap(); //! interrupt::free(|cs| { //! let hstdout = HSTDOUT.borrow(cs); //! if let Ok(fd) = hio::hstdout() { //! *hstdout.borrow_mut() = Some(fd); //! } //! -//! let nvic = stm32f103xx::NVIC.borrow(cs); +//! let mut nvic = global_p.NVIC; //! nvic.enable(Interrupt::TIM2); +//! *NVIC.borrow(cs).borrow_mut() = Some(nvic); //! -//! let syst = stm32f103xx::SYST.borrow(cs); +//! let mut syst = global_p.SYST; //! syst.set_clock_source(SystClkSource::Core); //! syst.set_reload(8_000_000); // 1s //! syst.enable_counter(); @@ -73,9 +78,9 @@ //! writeln!(*hstdout, "Tick").ok(); //! } //! -//! let nvic = stm32f103xx::NVIC.borrow(cs); -//! -//! nvic.set_pending(Interrupt::TIM2); +//! if let Some(nvic) = NVIC.borrow(cs).borrow_mut().as_mut() { +//! nvic.set_pending(Interrupt::TIM2); +//! } //! }); //! } //! diff --git a/src/examples/_6_allocator.rs b/src/examples/_6_allocator.rs index 6adfbe8..6168be8 100644 --- a/src/examples/_6_allocator.rs +++ b/src/examples/_6_allocator.rs @@ -1,6 +1,6 @@ //! How to use the heap and a dynamic memory allocator //! -//! To compile this example you'll need to build the collections crate as part +//! To compile this example you'll need to build the alloc crate as part //! of the Xargo sysroot. To do that change the Xargo.toml file to look like //! this: //! @@ -8,7 +8,7 @@ //! [dependencies.core] //! stage = 0 //! -//! [dependencies.collections] # NEW +//! [dependencies.alloc] # NEW //! stage = 0 //! //! [dependencies.compiler_builtins] @@ -27,15 +27,16 @@ //! //! ``` //! -//! #[allow(deprecated)] -//! #![feature(collections)] +//! #![feature(alloc)] //! #![feature(used)] +//! #![feature(global_allocator)] //! #![no_std] +//! #[allow(deprecated)] //! //! // This is the allocator crate; you can use a different one //! extern crate alloc_cortex_m; //! #[macro_use] -//! extern crate collections; +//! extern crate alloc; //! extern crate cortex_m; //! extern crate cortex_m_rt; //! extern crate cortex_m_semihosting; @@ -44,25 +45,21 @@ //! //! use cortex_m::asm; //! use cortex_m_semihosting::hio; +//! use alloc_cortex_m::CortexMHeap; +//! +//! #[global_allocator] +//! static ALLOCATOR: CortexMHeap = CortexMHeap::empty(); +//! +//! extern "C" { +//! static mut _sheap: u32; +//! static mut _eheap: u32; +//! } //! //! fn main() { //! // Initialize the allocator -//! unsafe { -//! extern "C" { -//! // Start of the heap -//! static mut _sheap: usize; -//! } -//! -//! // Size of the heap in words (1 word = 4 bytes) -//! // NOTE The bigger the heap the greater the chance to run into a stack -//! // overflow (collision between the stack and the heap) -//! const SIZE: isize = 256; -//! -//! // End of the heap -//! let _eheap = (&mut _sheap as *mut _).offset(SIZE); -//! -//! alloc_cortex_m::init(&mut _sheap, _eheap); -//! } +//! let start = unsafe { &mut _sheap as *mut u32 as usize }; +//! let end = unsafe { &mut _sheap as *mut u32 as usize }; +//! unsafe { ALLOCATOR.init(start, end - start) } //! //! // Growable array allocated on the heap //! let xs = vec![0, 1, 2];