Skip to content
Snippets Groups Projects
Commit e34885f7 authored by Per's avatar Per
Browse files

Merge branch 'klee' of gitlab.henriktjader.com:KLEE/cortex-m-rtfm-klee into klee

parents c224e43b ee15ce17
No related branches found
No related tags found
No related merge requests found
...@@ -73,7 +73,7 @@ fn exti2(t: &mut Threshold, mut r: EXTI2::Resources) { ...@@ -73,7 +73,7 @@ fn exti2(t: &mut Threshold, mut r: EXTI2::Resources) {
fn exti3(t: &mut Threshold, mut r: EXTI3::Resources) { fn exti3(t: &mut Threshold, mut r: EXTI3::Resources) {
r.X.claim_mut(t, |x, _| { r.X.claim_mut(t, |x, _| {
*x += 1; *x += 1;
}); })
} }
#[inline(never)] #[inline(never)]
...@@ -172,6 +172,12 @@ fn idle() -> ! { ...@@ -172,6 +172,12 @@ fn idle() -> ! {
// The --features wcet_bkpt will insert a `bkpt` instruction on LOCK ond UNLOCK of // The --features wcet_bkpt will insert a `bkpt` instruction on LOCK ond UNLOCK of
// of each resource. This allows you to monitor the number of clock cyckles using gdb. // of each resource. This allows you to monitor the number of clock cyckles using gdb.
// //
// Connect your Nucleo64 board with the `stm32f401re` (or `stm32f411re`) MCU.
// Start openocd in a separate terminal (and let it run there).
//
// > openocd -f interface/stlink.cfg -f target/stm32f4x.cfg
// (You may use `-f inteface/stlink-v2-1.cfg`, if `stlink.cfg` is missing.)
//
// Start gdb. // Start gdb.
// > arm-none-eabi-gdb -x gdbinit_manual target/thumbv7em-none-eabihf/release/examples/resource // > arm-none-eabi-gdb -x gdbinit_manual target/thumbv7em-none-eabihf/release/examples/resource
// //
...@@ -183,15 +189,15 @@ fn idle() -> ! { ...@@ -183,15 +189,15 @@ fn idle() -> ! {
// tb main // tb main
// continue // continue
// //
// Line by line it // Line by line, it:
// - connects to the target (the MCU) // - connects to the target (the MCU)
// - resets the MCU // - resets the MCU
// - loads the binary, in this case set to target/thumbv7em-none-eabihf/release/examples/resource // - loads the binary, in this case set to target/thumbv7em-none-eabihf/release/examples/resource
// - sets a temporary breakpoint to `main` // - sets a temporary breakpoint to `main`, and
// - continues executing until `main` is reached. // - continues executing until `main` is reached.
// //
// At the point the MCU hits `main` you will be promted to continue working <return> or quit // At the point the MCU hits `main` it stops.
// press <return> // (You may be promted to continue working <return> or quit, in such case press <return>.)
// //
// Now you can inspect where the processor halted. // Now you can inspect where the processor halted.
// > (gdb) list // > (gdb) list
...@@ -250,16 +256,16 @@ fn idle() -> ! { ...@@ -250,16 +256,16 @@ fn idle() -> ! {
// 0x08000276 <+14>: bx lr // 0x08000276 <+14>: bx lr
// End of assembler dump. // End of assembler dump.
// //
// Here you go, cannot be simpler that this, it // Here you go, cannot be simpler that this, it:
// - sets up the address to X in r0 // - sets up the address to X in r0
// - reads the old value // - reads the old value
// - adds 1 (wrapping arithmetics) // - adds 1 (wrapping arithmetics)
// - stores the new value in X // - stores the new value in X, and
// - it returns // - it returns
// (On Cortex M functions and inerrupt handlers are essentially treated the same way) // (On Cortex M functions and inerrupt handlers are essentially treated the same way)
// //
// So now you can check the value of X. See above... // So now you can check the value of X. See above...
// ++ your answer here ** // ** your answer here **
// //
// Now let us turn to EXTI2. // Now let us turn to EXTI2.
// (gdb) mon mww 0xe0001004 0 // (gdb) mon mww 0xe0001004 0
...@@ -267,7 +273,7 @@ fn idle() -> ! { ...@@ -267,7 +273,7 @@ fn idle() -> ! {
// (gdb) mon mrw 0xe0001004 // (gdb) mon mrw 0xe0001004
// 13 // 13
// //
// Also in this case we see that the resource (Y) was granted without overhead // Also in this case we see that the resource (`Y`) was granted without overhead
// The code took a few additional clock cycles (its contians a condition, right). // The code took a few additional clock cycles (its contians a condition, right).
// Figure out which path was triggered by this test. // Figure out which path was triggered by this test.
// ** your answer here ** // ** your answer here **
...@@ -303,10 +309,12 @@ fn idle() -> ! { ...@@ -303,10 +309,12 @@ fn idle() -> ! {
// End of assembler dump. // End of assembler dump.
// //
// This one is a bit harder to understand. // This one is a bit harder to understand.
// What it does essentially is to store -1 in r2 // What it does essentially is:
// and conditionally overwrite the r2 by a 1 if `Y < 10` // - read `Y` into r1,
// and then add r2 to r1 (the current value of `Y`) // - store -1 in r2
// and update `Y` to r1. // - conditionally overwrite the r2 by a 1 if `Y < 10`
// - add r2 to r1 (the value of `Y`),
// - update `Y`.
// //
// So this is beautiful, the COSTLY branch is replaced by a CHEAP // So this is beautiful, the COSTLY branch is replaced by a CHEAP
// condtitonal assigmnet `movcc`. // condtitonal assigmnet `movcc`.
...@@ -462,11 +470,11 @@ fn idle() -> ! { ...@@ -462,11 +470,11 @@ fn idle() -> ! {
// At this point you should find that the worst case time stays the same ... // At this point you should find that the worst case time stays the same ...
// //
// Well, this one is not due to RTFM, its due to Rust and the cleverness of LLVM. // Well, this one is not due to RTFM, its due to Rust and the cleverness of LLVM.
// What it does is that it figures out that we actually incleas Y, by the value of X. // What it does is that it figures out that we actually increase `Y`, by the value of `X`.
// So the loop is all gone, optimized out, and replaced by a simple addition. // So the loop is all gone, optimized out, and replaced by a simple addition.
// //
// Now lets look at best case execution time. // Now lets look at best case execution time.
// Figure out an assignment of X, that might actually reduce the execution time. // Figure out an assignment of `X`, that might actually reduce the execution time.
// ** your answer here ** // ** your answer here **
// //
// Redo the experiment with this value. How many clock cycles did you get? // Redo the experiment with this value. How many clock cycles did you get?
...@@ -489,7 +497,7 @@ fn idle() -> ! { ...@@ -489,7 +497,7 @@ fn idle() -> ! {
// //
// Look at the generated tests. // Look at the generated tests.
// Motivate for each of the 5 test cases, which one it matches of the hand generated tests from Assignment 2. // Motivate for each of the 5 test cases, which one it matches of the hand generated tests from Assignment 2.
// ** your asnwers (5) here ** // ** your answers (5) here **
// //
// Were the optimized tests sufficient to cover the execution time behavior. // Were the optimized tests sufficient to cover the execution time behavior.
// ** your answer here ** // ** your answer here **
...@@ -511,4 +519,4 @@ fn idle() -> ! { ...@@ -511,4 +519,4 @@ fn idle() -> ! {
// //
// For the future we intend the framework to cover the reading and writing to peripherals, and the // For the future we intend the framework to cover the reading and writing to peripherals, and the
// sequenced access to resources. In class we will further discuss current limitations, and // sequenced access to resources. In class we will further discuss current limitations, and
// oportunitios to improvements. // oportunities to improvements.
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment