-
Notifications
You must be signed in to change notification settings - Fork 2
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
feat(hardware-test): automated hw test for freertos queue
Checks: - creation of FreeRTOS queue - basic message exchange - changing message dynamically before pushing to queue - overflow of queue
- Loading branch information
Jan
committed
Feb 13, 2025
1 parent
36afabe
commit dfb7180
Showing
2 changed files
with
131 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,116 @@ | ||
#define SOURCE_FILE "FREERTOS-HWTEST" | ||
|
||
#include "Common.h" | ||
#include "EnV5HwController.h" | ||
#include "FreeRtosQueueWrapper.h" | ||
#include "FreeRtosTaskWrapper.h" | ||
#include "stdlib.h" | ||
#include "string.h" | ||
#include "unity.h" | ||
|
||
#include "pico/bootrom.h" | ||
#include "pico/stdio_usb.h" | ||
|
||
#define QUEUE_SIZE 5 | ||
|
||
typedef struct message { | ||
uint16_t messageId; | ||
char content[15]; | ||
} message_t; | ||
|
||
queue_t messageQueue; | ||
char staticMessage[] = "STATIC MSG"; | ||
char dynamicMessage[] = "DYNAMIC MSG"; | ||
|
||
void init(void) { | ||
stdio_init_all(); | ||
while ((!stdio_usb_connected())) {} | ||
env5HwControllerInit(); | ||
} | ||
|
||
void testCreateQueue(void) { | ||
TEST_ASSERT_NOT_NULL(messageQueue); | ||
} | ||
|
||
// tests basic message exchange | ||
void testMessageExchange() { | ||
message_t sentMessage = {.messageId = 1}; | ||
strcpy(sentMessage.content, staticMessage); | ||
|
||
TEST_ASSERT_TRUE(freeRtosQueueWrapperPush(messageQueue, &sentMessage)); | ||
|
||
message_t receivedMessage; | ||
TEST_ASSERT_TRUE(freeRtosQueueWrapperPop(messageQueue, &receivedMessage)); | ||
TEST_ASSERT_EQUAL_UINT16(1, receivedMessage.messageId); | ||
TEST_ASSERT_EQUAL_STRING(staticMessage, receivedMessage.content); | ||
} | ||
|
||
// tests if message content is dynamically changed before pushing to queue | ||
void testDynamicMessageReplacement(void) { | ||
message_t sentMessage = {.messageId = 3}; | ||
strcpy(sentMessage.content, staticMessage); | ||
if (sentMessage.messageId % 2) { | ||
strcpy(sentMessage.content, dynamicMessage); | ||
} | ||
|
||
TEST_ASSERT_TRUE(freeRtosQueueWrapperPush(messageQueue, &sentMessage)); | ||
|
||
message_t receivedMessage; | ||
TEST_ASSERT_TRUE(freeRtosQueueWrapperPop(messageQueue, &receivedMessage)); | ||
TEST_ASSERT_EQUAL_UINT16(3, receivedMessage.messageId); | ||
TEST_ASSERT_EQUAL_STRING(dynamicMessage, receivedMessage.content); | ||
} | ||
|
||
// tests if push to queue is successful up until the queue size is reached | ||
void testQueueOverflow(void) { | ||
message_t message; | ||
for (int i = 0; i < QUEUE_SIZE; i++) { | ||
message.messageId = i; | ||
strcpy(message.content, staticMessage); | ||
TEST_ASSERT_TRUE(freeRtosQueueWrapperPush(messageQueue, &message)); | ||
} | ||
|
||
message.messageId = QUEUE_SIZE + 1; | ||
strcpy(message.content, staticMessage); | ||
TEST_ASSERT_FALSE(freeRtosQueueWrapperPush(messageQueue, &message)); | ||
} | ||
|
||
void setUp(void) {} | ||
void tearDown(void) {} | ||
void deInit() { | ||
rom_reset_usb_boot(0, 0); | ||
} | ||
|
||
// runs unit tests | ||
void testRunnerTask() { | ||
PRINT_DEBUG("Starting Unity tests..."); | ||
UNITY_BEGIN(); | ||
RUN_TEST(testCreateQueue); | ||
RUN_TEST(testMessageExchange); | ||
RUN_TEST(testDynamicMessageReplacement); | ||
RUN_TEST(testQueueOverflow); | ||
UNITY_END(); | ||
PRINT_DEBUG("Unity tests finished..."); | ||
deInit(); | ||
} | ||
|
||
// task for second core | ||
_Noreturn void idleTask() { | ||
while (1) { | ||
freeRtosTaskWrapperTaskSleep(1000); | ||
} | ||
} | ||
|
||
int main(void) { | ||
init(); | ||
|
||
PRINT_DEBUG("Creating queue..."); | ||
messageQueue = freeRtosQueueWrapperCreate(QUEUE_SIZE, sizeof(message_t)); | ||
|
||
PRINT_DEBUG("Registering test task..."); | ||
freeRtosTaskWrapperRegisterTask(testRunnerTask, "test_runner", 1, FREERTOS_CORE_0); | ||
freeRtosTaskWrapperRegisterTask(idleTask, "idle_task", 0, FREERTOS_CORE_1); | ||
|
||
PRINT_DEBUG("Starting FreeRTOS scheduler..."); | ||
freeRtosTaskWrapperStartScheduler(); | ||
} |