summaryrefslogtreecommitdiff
path: root/include/arch
diff options
context:
space:
mode:
authorDaniel Friesel <daniel.friesel@uos.de>2020-07-22 14:28:32 +0200
committerDaniel Friesel <daniel.friesel@uos.de>2020-07-22 14:28:32 +0200
commitd0ea0a521a582549dfd9a98b47e7c12d8bcd0de6 (patch)
tree894d784c1fb526b4e95b7e75bd335f40f67e435f /include/arch
parente704cc1193babd25db46055a6de436be687aba18 (diff)
add timed_resistive_load for µs-scale model generation timing benchmarks
Diffstat (limited to 'include/arch')
-rw-r--r--include/arch/msp430fr5994lp/driver/timed_resistive_load.h72
1 files changed, 72 insertions, 0 deletions
diff --git a/include/arch/msp430fr5994lp/driver/timed_resistive_load.h b/include/arch/msp430fr5994lp/driver/timed_resistive_load.h
new file mode 100644
index 0000000..6e7996c
--- /dev/null
+++ b/include/arch/msp430fr5994lp/driver/timed_resistive_load.h
@@ -0,0 +1,72 @@
+#ifndef TIMED_RESISTIVE_LOAD_H
+#define TIMED_RESISTIVE_LOAD_H
+
+/*
+ * Resistance at 25°c
+ * R1: 986R
+ * R2: 3K25
+ * R3: 46K3
+ * R4: 9K86
+ */
+
+class TimedResistiveLoad {
+ private:
+ TimedResistiveLoad(const TimedResistiveLoad &copy);
+
+ public:
+ TimedResistiveLoad() {}
+ void setup();
+ void switchToNone();
+ void switchTo750(); // 576R (R1 || R2)
+ void switchTo1K0(); // 986R (R1)
+ void switchTo2K4(); // 2K44 (R2 || 4)
+ void switchTo3K3(); // 3K25 (R2)
+ void switchTo10K(); // 9K86 (R4)
+ void switchTo47K(); // 46K3 (R3)
+
+ /*
+ * These functions must be inline, as __delay_cycles only works with
+ * compile-time constants. So they must be part of the compilation unit
+ * which uses them and cannot easily be wrapped by a function without
+ * losing accuracy.
+ */
+
+ inline void __attribute__((always_inline)) nop1K0(unsigned long long int const duration_us)
+ {
+ switchTo1K0();
+ __delay_cycles(F_CPU / 1000000UL * duration_us);
+ switchToNone();
+ }
+
+ inline void __attribute__((always_inline)) nop2K4(unsigned long long int const duration_us)
+ {
+ switchTo2K4();
+ __delay_cycles(F_CPU / 1000000UL * duration_us);
+ switchToNone();
+ }
+
+ inline void __attribute__((always_inline)) nop3K3(unsigned long long int const duration_us)
+ {
+ switchTo3K3();
+ __delay_cycles(F_CPU / 1000000UL * duration_us);
+ switchToNone();
+ }
+
+ inline void __attribute__((always_inline)) nop10K(unsigned long long int const duration_us)
+ {
+ switchTo10K();
+ __delay_cycles(F_CPU / 1000000UL * duration_us);
+ switchToNone();
+ }
+
+ inline void __attribute__((always_inline)) nop47K(unsigned long long int const duration_us)
+ {
+ switchTo47K();
+ __delay_cycles(F_CPU / 1000000UL * duration_us);
+ switchToNone();
+ }
+};
+
+extern TimedResistiveLoad timedResistiveLoad;
+
+#endif