summaryrefslogtreecommitdiff
path: root/tmk_core/tool/mbed/mbed-sdk/libraries/tests/mbed/vtor_reloc/main.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tmk_core/tool/mbed/mbed-sdk/libraries/tests/mbed/vtor_reloc/main.cpp')
-rw-r--r--tmk_core/tool/mbed/mbed-sdk/libraries/tests/mbed/vtor_reloc/main.cpp76
1 files changed, 76 insertions, 0 deletions
diff --git a/tmk_core/tool/mbed/mbed-sdk/libraries/tests/mbed/vtor_reloc/main.cpp b/tmk_core/tool/mbed/mbed-sdk/libraries/tests/mbed/vtor_reloc/main.cpp
new file mode 100644
index 0000000000..c7e654e8c0
--- /dev/null
+++ b/tmk_core/tool/mbed/mbed-sdk/libraries/tests/mbed/vtor_reloc/main.cpp
@@ -0,0 +1,76 @@
+// Interrupt table relocation test, based on the 'interrupt_in' test
+// It will test an interrupt pin before and after the interrupt table is relocated
+// Works only on LPC1768
+
+#include "test_env.h"
+#include "cmsis_nvic.h"
+#include <string.h>
+
+#define PIN_IN (p5)
+#define PIN_OUT (p25)
+#define NUM_VECTORS (16+33)
+
+DigitalOut out(PIN_OUT);
+DigitalOut myled(LED1);
+
+volatile int checks = 0;
+uint32_t int_table[NUM_VECTORS] __attribute__ ((aligned(256)));
+
+#define FALLING_EDGE_COUNT 5
+
+void flipper() {
+ for (int i = 0; i < FALLING_EDGE_COUNT; i++) {
+ out = 1;
+ wait(0.2);
+ out = 0;
+ wait(0.2);
+ }
+}
+
+void in_handler() {
+ checks++;
+ myled = !myled;
+}
+
+static bool test_once() {
+ InterruptIn in(PIN_IN);
+ checks = 0;
+ printf("Interrupt table location: 0x%08X\r\n", SCB->VTOR);
+ in.rise(NULL);
+ in.fall(in_handler);
+ flipper();
+ in.fall(NULL);
+ bool result = (checks == FALLING_EDGE_COUNT);
+ printf("Falling edge checks counted: %d ... [%s]\r\n", checks, result ? "OK" : "FAIL");
+ return result;
+}
+
+int main() {
+ MBED_HOSTTEST_TIMEOUT(15);
+ MBED_HOSTTEST_SELECT(default_auto);
+ MBED_HOSTTEST_DESCRIPTION(Interrupt vector relocation);
+ MBED_HOSTTEST_START("MBED_A18");
+
+ // First test, no table reallocation
+ {
+ printf("Starting first test (interrupts not relocated).\r\n");
+ bool ret = test_once();
+ if (ret == false) {
+ MBED_HOSTTEST_RESULT(false);
+ }
+ }
+
+ // Relocate interrupt table and test again
+ {
+ printf("Starting second test (interrupts relocated).\r\n");
+ memcpy(int_table, (void*)SCB->VTOR, sizeof(int_table));
+ SCB->VTOR = (uint32_t)int_table;
+
+ bool ret = test_once();
+ if (ret == false) {
+ MBED_HOSTTEST_RESULT(false);
+ }
+ }
+
+ MBED_HOSTTEST_RESULT(true);
+}