diff --git a/examples/timing_resources.rs b/examples/timing_resources.rs index 193d633c25673d5aec853c1fe62514c3592f39de..6c00759987950a2af9c17be7a2c0ee99fade497d 100644 --- a/examples/timing_resources.rs +++ b/examples/timing_resources.rs @@ -40,9 +40,9 @@ const APP: () = { rtic::pend(stm32f411::Interrupt::EXTI0); asm::bkpt(); cx.resources.shared.lock(|shared| { - // asm::bkpt(); + asm::bkpt(); *shared += 1; - // asm::bkpt(); + asm::bkpt(); }); asm::bkpt(); } @@ -72,6 +72,18 @@ const APP: () = { // Explain what is happening here in your own words. // // [Your code here] +// movw r1, #0 = Set registery r1 to 0. +// mrs r0, basepri = Write the contents of the coprocessor register basepri to r0. +// bkpt #0 = breakpoint +// movt r1, #8192 = Set the fist 16-bits to 8192 +// ldrd r2, r3, [r1] = +// adds r2, #1 = Adds one to r2. +// adc r3, r3, #0 = Adds r3 and 0 with carry and stores it in r3. +// strd r2, r3, [r1] = +// msr basepri, r0 = Writes the value of r0 into coprocessor register basepri. +// bx lr = +// +// // // > cargo run --example timing_resources --release --features nightly // Then continue to the first breakpoint instruction: @@ -91,10 +103,25 @@ const APP: () = { // (gdb) x 0xe0001004 // // [Your answer here] +// 0xe0001004: 0x00000010 // // (gdb) disassemble // // [Your answer here] +// (gdb) disassemble +// Dump of assembler code for function timing_resources::APP::EXTI0: +// 0x08000232 <+0>: movw r1, #0 +// 0x08000236 <+4>: mrs r0, BASEPRI +// => 0x0800023a <+8>: bkpt 0x0000 +// 0x0800023c <+10>: movt r1, #8192 ; 0x2000 +// 0x08000240 <+14>: ldrd r2, r3, [r1] +// 0x08000244 <+18>: adds r2, #1 +// 0x08000246 <+20>: adc.w r3, r3, #0 +// 0x0800024a <+24>: strd r2, r3, [r1] +// 0x0800024e <+28>: msr BASEPRI, r0 +// 0x08000252 <+32>: bx lr +// End of assembler dump. +// // // You should see that we hit the breakpoint in `exti0`, and // that the code complies to the objdump EXTI disassembly. @@ -102,10 +129,12 @@ const APP: () = { // What was the software latency observed to enter the task? // // [Your answer here] +// 16 - 2 = 14 // // Does RTIC infer any overhead? // // [Your answer here] +// Yes, it add 2 cycles. Because Cortex-M4 interupt takes 12 cycles. // // The debugger reports that the breakpoint was hit in the `run<closure>`. // The reason is that the RTIC implements the actual interrupt handler, @@ -124,6 +153,7 @@ const APP: () = { // (gdb) x 0xe0001004 // // [Your answer here] +// 0xe0001004: 0x00000025 // // You should have a total execution time in the range of 30-40 cycles. // @@ -131,6 +161,7 @@ const APP: () = { // `exti0` was safe without locking the resource. // // [Your answer here] +// TODO // // In `exti1` we also access `shared` but this time through a lock. // @@ -160,10 +191,12 @@ const APP: () = { // (gdb) x 0xe0001004 // // [Your answer here] +// 0xe0001004: 0x00000034 // // Calculate the total time (in cycles), for this section of code. // // [Your answer here] +// 52 - 37 = 15 // // You should get a value around 15 cycles. // @@ -204,6 +237,7 @@ const APP: () = { // (gdb) x 0xe0001004 // // [Your answer here] +// 0xe0001004: 0x00000028 // // (gdb) c // @@ -214,6 +248,7 @@ const APP: () = { // (gdb) x 0xe0001004 // // [Your answer here] +// 0xe0001004: 0x00000032 // // From a real-time perspective the critical section infers // blocking (of higher priority tasks). @@ -221,6 +256,7 @@ const APP: () = { // How many clock cycles is the blocking? // // [Your answer here] +// 50 - 40 = 10 // // Finally continue out of the closure. // @@ -231,6 +267,7 @@ const APP: () = { // (gdb) x 0xe0001004 // // [Your answer here] +// 0xe0001004: 0x00000034 // // This is the total execution time of: // @@ -254,6 +291,7 @@ const APP: () = { // Motivate your answer (not just a number). // // [Your answer here] +// TODO // // Notice, the Rust implementation is significantly faster than the C code version // of Real-Time For the Masses back in 2013. @@ -264,3 +302,4 @@ const APP: () = { // (Hint, what possible optimization can safely be applied by RTIC + Rust + LLVM.) // // [Your answer here] +// TODO diff --git a/timing_resources.objdump b/timing_resources.objdump new file mode 100644 index 0000000000000000000000000000000000000000..821acf61dcd632a88fd0fc7dc81d2193f225545a --- /dev/null +++ b/timing_resources.objdump @@ -0,0 +1,148 @@ + +timing_resources: file format elf32-littlearm + + +Disassembly of section .text: + +08000198 <Reset>: + 8000198: 80 b5 push {r7, lr} + 800019a: 6f 46 mov r7, sp + 800019c: 00 f0 aa f8 bl #340 + 80001a0: 40 f2 08 00 movw r0, #8 + 80001a4: 40 f2 00 01 movw r1, #0 + 80001a8: c2 f2 00 00 movt r0, #8192 + 80001ac: c2 f2 00 01 movt r1, #8192 + 80001b0: 81 42 cmp r1, r0 + 80001b2: 14 d2 bhs #40 <Reset+0x46> + 80001b4: 40 f2 00 01 movw r1, #0 + 80001b8: 00 22 movs r2, #0 + 80001ba: c2 f2 00 01 movt r1, #8192 + 80001be: 41 f8 04 2b str r2, [r1], #4 + 80001c2: 81 42 cmp r1, r0 + 80001c4: 3c bf itt lo + 80001c6: 41 f8 04 2b strlo r2, [r1], #4 + 80001ca: 81 42 cmplo r1, r0 + 80001cc: 07 d2 bhs #14 <Reset+0x46> + 80001ce: 41 f8 04 2b str r2, [r1], #4 + 80001d2: 81 42 cmp r1, r0 + 80001d4: 03 d2 bhs #6 <Reset+0x46> + 80001d6: 41 f8 04 2b str r2, [r1], #4 + 80001da: 81 42 cmp r1, r0 + 80001dc: ef d3 blo #-34 <Reset+0x26> + 80001de: 40 f2 00 00 movw r0, #0 + 80001e2: 40 f2 00 01 movw r1, #0 + 80001e6: c2 f2 00 00 movt r0, #8192 + 80001ea: c2 f2 00 01 movt r1, #8192 + 80001ee: 81 42 cmp r1, r0 + 80001f0: 1c d2 bhs #56 <Reset+0x94> + 80001f2: 40 f2 0c 31 movw r1, #780 + 80001f6: 40 f2 00 02 movw r2, #0 + 80001fa: c0 f6 00 01 movt r1, #2048 + 80001fe: c2 f2 00 02 movt r2, #8192 + 8000202: 0b 68 ldr r3, [r1] + 8000204: 42 f8 04 3b str r3, [r2], #4 + 8000208: 82 42 cmp r2, r0 + 800020a: 0f d2 bhs #30 <Reset+0x94> + 800020c: 4b 68 ldr r3, [r1, #4] + 800020e: 42 f8 04 3b str r3, [r2], #4 + 8000212: 82 42 cmp r2, r0 + 8000214: 0a d2 bhs #20 <Reset+0x94> + 8000216: 8b 68 ldr r3, [r1, #8] + 8000218: 42 f8 04 3b str r3, [r2], #4 + 800021c: 82 42 cmp r2, r0 + 800021e: 05 d2 bhs #10 <Reset+0x94> + 8000220: cb 68 ldr r3, [r1, #12] + 8000222: 10 31 adds r1, #16 + 8000224: 42 f8 04 3b str r3, [r2], #4 + 8000228: 82 42 cmp r2, r0 + 800022a: ea d3 blo #-44 <Reset+0x6a> + 800022c: 00 f0 35 f8 bl #106 + 8000230: fe de trap + +08000232 <EXTI0>: + 8000232: 40 f2 00 01 movw r1, #0 + 8000236: ef f3 11 80 mrs r0, basepri + 800023a: 00 be bkpt #0 + 800023c: c2 f2 00 01 movt r1, #8192 + 8000240: d1 e9 00 23 ldrd r2, r3, [r1] + 8000244: 01 32 adds r2, #1 + 8000246: 43 f1 00 03 adc r3, r3, #0 + 800024a: c1 e9 00 23 strd r2, r3, [r1] + 800024e: 80 f3 11 88 msr basepri, r0 + 8000252: 70 47 bx lr + +08000254 <EXTI1>: + 8000254: 41 f2 04 00 movw r0, #4100 + 8000258: 00 21 movs r1, #0 + 800025a: ce f2 00 00 movt r0, #57344 + 800025e: 40 22 movs r2, #64 + 8000260: 01 60 str r1, [r0] + 8000262: 4e f2 00 20 movw r0, #57856 + 8000266: ce f2 00 00 movt r0, #57344 + 800026a: 00 be bkpt #0 + 800026c: 02 60 str r2, [r0] + 800026e: e0 20 movs r0, #224 + 8000270: 00 be bkpt #0 + 8000272: 80 f3 11 88 msr basepri, r0 + 8000276: 40 f2 00 00 movw r0, #0 + 800027a: c2 f2 00 00 movt r0, #8192 + 800027e: d0 e9 00 23 ldrd r2, r3, [r0] + 8000282: 01 32 adds r2, #1 + 8000284: 43 f1 00 03 adc r3, r3, #0 + 8000288: c0 e9 00 23 strd r2, r3, [r0] + 800028c: f0 20 movs r0, #240 + 800028e: 80 f3 11 88 msr basepri, r0 + 8000292: 00 be bkpt #0 + 8000294: 81 f3 11 88 msr basepri, r1 + 8000298: 70 47 bx lr + +0800029a <main>: + 800029a: 4e f2 06 40 movw r0, #58374 + 800029e: e0 21 movs r1, #224 + 80002a0: ce f2 00 00 movt r0, #57344 + 80002a4: 72 b6 cpsid i + 80002a6: 40 22 movs r2, #64 + 80002a8: 01 70 strb r1, [r0] + 80002aa: 4e f2 00 11 movw r1, #57600 + 80002ae: ce f2 00 01 movt r1, #57344 + 80002b2: 0a 60 str r2, [r1] + 80002b4: f0 22 movs r2, #240 + 80002b6: 42 70 strb r2, [r0, #1] + 80002b8: 4e f6 10 52 movw r2, #60688 + 80002bc: 80 20 movs r0, #128 + 80002be: ce f2 00 02 movt r2, #57344 + 80002c2: 08 60 str r0, [r1] + 80002c4: 13 68 ldr r3, [r2] + 80002c6: 43 f0 02 03 orr r3, r3, #2 + 80002ca: 13 60 str r3, [r2] + 80002cc: d2 f8 ec 30 ldr.w r3, [r2, #236] + 80002d0: 43 f0 80 73 orr r3, r3, #16777216 + 80002d4: c2 f8 ec 30 str.w r3, [r2, #236] + 80002d8: 41 f2 00 02 movw r2, #4096 + 80002dc: ce f2 00 02 movt r2, #57344 + 80002e0: 13 68 ldr r3, [r2] + 80002e2: 43 f0 01 03 orr r3, r3, #1 + 80002e6: 13 60 str r3, [r2] + 80002e8: c1 f8 00 01 str.w r0, [r1, #256] + 80002ec: 62 b6 cpsie i + 80002ee: 30 bf wfi + 80002f0: fd e7 b #-6 <main+0x54> + +080002f2 <WWDG>: + 80002f2: fe e7 b #-4 <WWDG> + +080002f4 <__pre_init>: + 80002f4: 70 47 bx lr + +080002f6 <HardFaultTrampoline>: + 80002f6: 70 46 mov r0, lr + 80002f8: 04 21 movs r1, #4 + 80002fa: 08 42 tst r0, r1 + 80002fc: 02 d1 bne #4 <HardFaultTrampoline+0xe> + 80002fe: ef f3 08 80 mrs r0, msp + 8000302: 02 e0 b #4 <HardFault_> + 8000304: ef f3 09 80 mrs r0, psp + 8000308: ff e7 b #-2 <HardFault_> + +0800030a <HardFault_>: + 800030a: fe e7 b #-4 <HardFault_>