diff --git a/components/ulp/test/component.mk b/components/ulp/test/component.mk index ce464a212..41228b257 100644 --- a/components/ulp/test/component.mk +++ b/components/ulp/test/component.mk @@ -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 index 000000000..b0a080717 --- /dev/null +++ b/components/ulp/test/test_ulp_as.c @@ -0,0 +1,25 @@ +#include +#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 index 000000000..65df22603 --- /dev/null +++ b/components/ulp/test/ulp/test_jumps.S @@ -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