diff --git a/components/freertos/test/test_timers.c b/components/freertos/test/test_timers.c new file mode 100644 index 000000000..a46cd846d --- /dev/null +++ b/components/freertos/test/test_timers.c @@ -0,0 +1,70 @@ +/* FreeRTOS timer tests +*/ +#include +#include "unity.h" +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" +#include "freertos/timers.h" + +static void timer_callback(TimerHandle_t timer) +{ + volatile int *count; + count = (volatile int *)pvTimerGetTimerID( timer ); + (*count)++; + printf("Callback timer %p count %p = %d\n", timer, count, *count); +} + +TEST_CASE("Oneshot FreeRTOS timers", "[freertos]") +{ + volatile int count = 0; + TimerHandle_t oneshot = xTimerCreate("oneshot", 100 / portTICK_PERIOD_MS, pdFALSE, + (void *)&count, timer_callback); + TEST_ASSERT(oneshot); + TEST_ASSERT_EQUAL(pdFALSE, xTimerIsTimerActive(oneshot)); + TEST_ASSERT_EQUAL(0, count); + + TEST_ASSERT( xTimerStart(oneshot, 1) ); + vTaskDelay(2); /* give the timer task a chance to process the message */ + + TEST_ASSERT_EQUAL(pdTRUE, xTimerIsTimerActive(oneshot)); + TEST_ASSERT_EQUAL(0, count); + + vTaskDelay(250 / portTICK_PERIOD_MS); // 2.5 timer periods + + TEST_ASSERT_EQUAL(1, count); + TEST_ASSERT_EQUAL(pdFALSE, xTimerIsTimerActive(oneshot)); + + TEST_ASSERT( xTimerDelete(oneshot, 1) ); +} + + +TEST_CASE("Recurring FreeRTOS timers", "[freertos]") +{ + volatile int count = 0; + TimerHandle_t recurring = xTimerCreate("oneshot", 100 / portTICK_PERIOD_MS, pdTRUE, + (void *)&count, timer_callback); + TEST_ASSERT(recurring); + TEST_ASSERT_EQUAL(pdFALSE, xTimerIsTimerActive(recurring)); + TEST_ASSERT_EQUAL(0, count); + + TEST_ASSERT( xTimerStart(recurring, 1) ); + + vTaskDelay(2); // let timer task process the queue + TEST_ASSERT_EQUAL(pdTRUE, xTimerIsTimerActive(recurring)); + TEST_ASSERT_EQUAL(0, count); + + vTaskDelay(250 / portTICK_PERIOD_MS); // 2.5 timer periods + + TEST_ASSERT_EQUAL(2, count); + TEST_ASSERT_EQUAL(pdTRUE, xTimerIsTimerActive(recurring)); + + TEST_ASSERT( xTimerStop(recurring, 1) ); + + TEST_ASSERT_EQUAL(2, count); + + vTaskDelay(100 / portTICK_PERIOD_MS); // One more timer period + TEST_ASSERT_EQUAL(2, count); // hasn't gone up + TEST_ASSERT_EQUAL(pdFALSE, xTimerIsTimerActive(recurring)); + + TEST_ASSERT( xTimerDelete(recurring, 1) ); +} diff --git a/tools/unit-test-app/sdkconfig b/tools/unit-test-app/sdkconfig index 467da45da..e4b897348 100644 --- a/tools/unit-test-app/sdkconfig +++ b/tools/unit-test-app/sdkconfig @@ -144,6 +144,7 @@ CONFIG_ESP32_TIME_SYSCALL_USE_RTC_FRC1=y # CONFIG_ESP32_TIME_SYSCALL_USE_NONE is not set CONFIG_ESP32_RTC_CLOCK_SOURCE_INTERNAL_RC=y # CONFIG_ESP32_RTC_CLOCK_SOURCE_EXTERNAL_CRYSTAL is not set +CONFIG_ESP32_RTC_CLK_CAL_CYCLES=1024 CONFIG_ESP32_DEEP_SLEEP_WAKEUP_DELAY=0 # CONFIG_ESP32_XTAL_FREQ_40 is not set # CONFIG_ESP32_XTAL_FREQ_26 is not set