aboutsummaryrefslogtreecommitdiff
path: root/crates/qemu/src/lib.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/qemu/src/lib.rs')
-rw-r--r--crates/qemu/src/lib.rs37
1 files changed, 37 insertions, 0 deletions
diff --git a/crates/qemu/src/lib.rs b/crates/qemu/src/lib.rs
new file mode 100644
index 0000000..dc91465
--- /dev/null
+++ b/crates/qemu/src/lib.rs
@@ -0,0 +1,37 @@
+#![no_std]
+
+use cortex_m_rt as _;
+use lm3s6965 as _;
+
+use rust_threadx_cortex_m as _;
+use rust_threadx_stdio_semihosting as _;
+
+pub fn exit_success() -> ! {
+ use cortex_m_semihosting::debug::*;
+ exit(EXIT_SUCCESS);
+ unreachable!()
+}
+
+// Designed for ARMv6-M. Just enough to get the example
+// running in QEMU with a meaningless system tick.
+#[unsafe(no_mangle)]
+pub extern "C" fn _tx_initialize_low_level() {
+ use cortex_m::{Peripherals, peripheral::scb::SystemHandler};
+
+ cortex_m::interrupt::disable();
+
+ let Peripherals {
+ mut SYST, mut SCB, ..
+ } = Peripherals::take().unwrap();
+
+ SYST.set_reload(80000 - 1);
+ SYST.clear_current();
+ SYST.enable_interrupt();
+ SYST.enable_counter();
+
+ unsafe {
+ SCB.set_priority(SystemHandler::SysTick, 0x40);
+ SCB.set_priority(SystemHandler::PendSV, 0xff);
+ SCB.set_priority(SystemHandler::SVCall, 0xff);
+ }
+}