]> granicus.if.org Git - esp-idf/commitdiff
ulp: add tests for jumps instruction
authorIvan Grokhotkov <ivan@espressif.com>
Tue, 7 Aug 2018 13:13:26 +0000 (16:13 +0300)
committerbot <bot@espressif.com>
Mon, 13 Aug 2018 16:48:27 +0000 (16:48 +0000)
components/ulp/test/component.mk
components/ulp/test/test_ulp_as.c [new file with mode: 0644]
components/ulp/test/ulp/test_jumps.S [new file with mode: 0644]

index ce464a212a6ae8526bdd5fc5178740b99f524935..41228b2576963216d814875831081f980c883ac7 100644 (file)
@@ -1 +1,11 @@
-COMPONENT_ADD_LDFLAGS = -Wl,--whole-archive -l$(COMPONENT_NAME) -Wl,--no-whole-archive
+ULP_APP_NAME = ulp_test
+
+ULP_S_SOURCES = $(addprefix $(COMPONENT_PATH)/ulp/, \
+       test_jumps.S \
+       )
+
+ULP_EXP_DEP_OBJECTS := test_ulp_as.o
+include $(IDF_PATH)/components/ulp/component_ulp_common.mk
+
+COMPONENT_ADD_LDFLAGS += -Wl,--whole-archive -l$(COMPONENT_NAME) -Wl,--no-whole-archive
diff --git a/components/ulp/test/test_ulp_as.c b/components/ulp/test/test_ulp_as.c
new file mode 100644 (file)
index 0000000..b0a0807
--- /dev/null
@@ -0,0 +1,25 @@
+#include <unistd.h>
+#include "unity.h"
+#include "soc/rtc_cntl_reg.h"
+#include "esp32/ulp.h"
+#include "ulp_test.h"
+
+
+extern const uint8_t ulp_test_bin_start[] asm("_binary_ulp_test_bin_start");
+extern const uint8_t ulp_test_bin_end[]   asm("_binary_ulp_test_bin_end");
+
+
+TEST_CASE("jumps condition", "[ulp]")
+{
+    esp_err_t err = ulp_load_binary(0, ulp_test_bin_start,
+            (ulp_test_bin_end - ulp_test_bin_start) / sizeof(uint32_t));
+    TEST_ESP_OK(err);
+
+    REG_CLR_BIT(RTC_CNTL_INT_RAW_REG, RTC_CNTL_ULP_CP_INT_RAW);
+    TEST_ESP_OK(ulp_run(&ulp_test_jumps - RTC_SLOW_MEM));
+    usleep(10000);
+
+    TEST_ASSERT_NOT_EQUAL(0, REG_GET_BIT(RTC_CNTL_INT_RAW_REG, RTC_CNTL_ULP_CP_INT_RAW));
+    TEST_ASSERT_EQUAL(0, ulp_jumps_fail & UINT16_MAX);
+    TEST_ASSERT_EQUAL(1, ulp_jumps_pass & UINT16_MAX);
+}
diff --git a/components/ulp/test/ulp/test_jumps.S b/components/ulp/test/ulp/test_jumps.S
new file mode 100644 (file)
index 0000000..65df226
--- /dev/null
@@ -0,0 +1,101 @@
+#include "soc/rtc_cntl_reg.h"
+#include "soc/rtc_io_reg.h"
+#include "soc/soc_ulp.h"
+
+       .bss
+
+       .global jumps_pass
+jumps_pass:
+       .long 0
+
+       .global jumps_fail
+jumps_fail:
+       .long 0
+
+       .text
+       .global test_jumps
+test_jumps:
+
+       /* tests for LT (less than) condition */
+       stage_rst           /* cnt = 0 */
+       jumps test_fail, 0, LT /* 0 < 0: false, should not jump */
+       jumps 1f, 1, LT     /* 0 < 1: true, should jump */
+       jump test_fail
+1:
+       stage_inc 2         /* cnt = 2 */
+       jumps 1f, 3, LT     /* 2 < 1: true */
+       jump test_fail
+1:
+       jumps test_fail, 1, LT  /* 2 < 1: false */
+       jumps test_fail, 2, LT  /* 2 < 2: false */
+
+       /* tests for LE (less or equal) condition */
+       stage_rst           /* cnt = 0 */
+       jumps 1f, 0, LE     /* 0 <= 0: true */
+       jump test_fail
+1:
+       jumps 1f, 1, LE     /* 0 <= 1: true */
+       jump test_fail
+1:
+       stage_inc 2         /* cnt = 2 */
+       jumps test_fail, 1, LE  /* 2 <= 1: false */
+
+       /* tests for EQ (equal) condition */
+       stage_rst           /* cnt = 0 */
+       jumps 1f, 0, EQ     /* 0 = 0: true */
+       jump test_fail
+1:
+       jumps test_fail, 1, EQ  /* 0 = 1: false */
+
+       stage_inc 1         /* cnt = 1 */
+       jumps test_fail, 0, EQ  /* 1 = 0: false */
+       jumps test_fail, 2, EQ  /* 1 = 2: false */
+       jumps 1f, 1, EQ         /* 1 = 1: true */
+1:
+
+       /* tests for GE (greater or equal) condition */
+       stage_rst           /* cnt = 0 */
+       jumps 1f, 0, GE     /* 0 >= 0: true */
+       jump test_fail
+1:
+       jumps test_fail, 1, GE  /* 0 >= 1: false */
+
+       stage_inc 1         /* cnt = 1 */
+       jumps 1f, 0, GE     /* 1 >= 0: true */
+       jump test_fail
+1:
+       jumps 1f, 1, GE     /* 1 >= 1: true */
+       jump test_fail
+1:
+       jumps test_fail, 2, GE  /* 1 >= 2: false */
+
+       /* tests for GT (greater than) condition */
+       stage_rst           /* cnt = 0 */
+       jumps test_fail, 0, GT  /* 0 > 0: false */
+       jumps test_fail, 1, GE  /* 0 > 1: false */
+
+       stage_inc 1         /* cnt = 1 */
+       jumps 1f, 0, GT     /* 1 > 0: true */
+       jump test_fail
+1:
+       jumps test_fail, 1, GT  /* 1 > 1: false */
+       jumps test_fail, 2, GT  /* 1 > 2: false */
+
+       jump test_pass
+
+test_fail:
+       move r0, jumps_fail
+       move r1, 1
+       st r1, r0, 0
+       jump done
+
+test_pass:
+       move r0, jumps_pass
+       move r1, 1
+       st r1, r0, 0
+       jump done
+
+       .global done
+done:
+       wake
+       halt