Skip to content

Commit 857b4dd

Browse files
xTaskDelayUntil and vTaskDelayUntil implemented.
1 parent d713b1c commit 857b4dd

File tree

2 files changed

+49
-0
lines changed

2 files changed

+49
-0
lines changed

cpputest-for-freertos-lib/src/cpputest_for_freertos_task.cpp

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,3 +95,17 @@ extern "C" TickType_t xTaskGetTickCount(void)
9595
return cms::test::s_tickCount;
9696
}
9797
}
98+
99+
extern "C" BaseType_t xTaskDelayUntil(TickType_t * const previous, const TickType_t increment)
100+
{
101+
configASSERT(previous != nullptr);
102+
auto current = xTaskGetTickCount();
103+
auto next = *previous + increment;
104+
if (next <= current)
105+
{
106+
return pdFALSE;
107+
}
108+
109+
vTaskDelay(next - current);
110+
return pdTRUE;
111+
}

cpputest-for-freertos-lib/tests/cpputest_for_freertos_task_tests.cpp

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,3 +59,38 @@ TEST(TaskTests, task_delay_method_will_move_timers_time_forward_if_timers_are_ac
5959
CHECK_TRUE(std::chrono::milliseconds(pdTICKS_TO_MS(100)) == fromTimers);
6060
cms::test::TimersDestroy();
6161
}
62+
63+
TEST(TaskTests, task_delay_until_method_is_available)
64+
{
65+
auto lastWakeTime = xTaskGetTickCount();
66+
auto count1 = lastWakeTime;
67+
vTaskDelayUntil(&lastWakeTime, 10);
68+
auto count2 = xTaskGetTickCount();
69+
CHECK_EQUAL(10, count2 - count1);
70+
}
71+
72+
TEST(TaskTests, task_delay_until_method_returns_false_if_next_is_already_happened)
73+
{
74+
auto lastWakeTime = xTaskGetTickCount();
75+
76+
//simulate a task switch which means the next delay until deadline has passed
77+
vTaskDelay(11);
78+
79+
auto didSleep = xTaskDelayUntil(&lastWakeTime, 10);
80+
CHECK_EQUAL(pdFALSE, didSleep);
81+
}
82+
83+
TEST(TaskTests, task_delay_until_method_returns_true_if_sleep_was_needed)
84+
{
85+
auto lastWakeTime = xTaskGetTickCount();
86+
auto count1 = lastWakeTime;
87+
88+
//simulate a brief task switch, but the next deadline is still in the future
89+
vTaskDelay(3);
90+
91+
auto didSleep = xTaskDelayUntil(&lastWakeTime, 10);
92+
CHECK_EQUAL(pdTRUE, didSleep);
93+
94+
auto count2 = xTaskGetTickCount();
95+
CHECK_EQUAL(10, count2 - count1);
96+
}

0 commit comments

Comments
 (0)