From 1003723788f533947652b37be5b57c302f6e9d74 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dawid=20Ci=C4=99=C5=BCarkiewicz?= Date: Thu, 28 Aug 2014 22:03:06 -0700 Subject: [PATCH] k20: Introduce `app_blink_k20_isr`. --- Rakefile | 2 +- apps/app_blink_k20_isr.rs | 54 +++++++++++++++++++++++++++++++++++++++ src/zinc/util/support.rs | 12 +++++++++ 3 files changed, 67 insertions(+), 1 deletion(-) create mode 100644 apps/app_blink_k20_isr.rs diff --git a/Rakefile b/Rakefile index a0ce4b87..cbe58595 100644 --- a/Rakefile +++ b/Rakefile @@ -175,7 +175,7 @@ end desc "Build all applications" case ENV['PLATFORM'] when 'k20' - task :build_all => [:build_blink_k20] + task :build_all => [:build_blink_k20, :build_blink_k20_isr] when 'stm32f4' task :build_all => [:build_blink_stm32f4] else diff --git a/apps/app_blink_k20_isr.rs b/apps/app_blink_k20_isr.rs new file mode 100644 index 00000000..b5f3b267 --- /dev/null +++ b/apps/app_blink_k20_isr.rs @@ -0,0 +1,54 @@ +#![feature(phase)] +#![feature(asm)] +#![crate_type="staticlib"] +#![no_std] + +extern crate core; +extern crate zinc; + +use core::intrinsics::volatile_load; + +use core::option::Some; +use zinc::hal::k20::{pin, watchdog}; +use zinc::hal::pin::GPIO; +use zinc::hal::cortex_m4::systick; +use zinc::util::support::wfi; + +static mut i: u32 = 0; +static mut global_on: u32 = 0; + +#[allow(dead_code)] +#[no_split_stack] +#[no_mangle] +pub unsafe extern fn isr_systick() { + i += 1; + if i > 100 { + i = 0; + global_on = !global_on; + } +} + +#[no_mangle] +#[no_split_stack] +#[allow(dead_code)] +pub fn main() { + zinc::hal::mem_init::init_stack(); + zinc::hal::mem_init::init_data(); + watchdog::init(watchdog::Disabled); + + // Pins for MC HCK (http://www.mchck.org/) + let led1 = pin::Pin::new(pin::PortB, 16, pin::GPIO, Some(zinc::hal::pin::Out)); + + systick::setup(systick::ten_ms().unwrap_or(480000)); + systick::enable(); + systick::enable_irq(); + + loop { + let on: bool = unsafe { volatile_load(&global_on as *const u32) == 0 }; + match on { + true => led1.set_high(), + false => led1.set_low(), + } + wfi(); + } +} diff --git a/src/zinc/util/support.rs b/src/zinc/util/support.rs index f36129c8..61ef6aab 100644 --- a/src/zinc/util/support.rs +++ b/src/zinc/util/support.rs @@ -69,3 +69,15 @@ pub fn nop() { /// NOP instruction (mock) pub fn nop() { } + +#[cfg(not(test))] +#[inline(always)] +/// WFI instruction +pub fn wfi() { + unsafe { asm!("wfi" :::: "volatile"); } +} + +#[cfg(test)] +/// WFI instruction (mock) +pub fn wfi() { +}