From c65341c6626cfafb1b91d4245b2824059916c32a Mon Sep 17 00:00:00 2001 From: Erick Ahmed Date: Sun, 14 Jun 2026 14:18:07 +0200 Subject: [PATCH 01/22] Change periodic timers to one shot timers --- Core/Src/main.c | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/Core/Src/main.c b/Core/Src/main.c index ce25a02..70e1f62 100644 --- a/Core/Src/main.c +++ b/Core/Src/main.c @@ -151,11 +151,8 @@ int main(void) /* USER CODE END RTOS_SEMAPHORES */ /* USER CODE BEGIN RTOS_TIMERS */ - xHeartbeatTimerCAN1 = osTimerNew(vLEDHeartbeat, osTimerPeriodic, &led_can1, NULL); - osTimerStart(xHeartbeatTimerCAN1, 250U); - - xHeartbeatTimerCAN2 = osTimerNew(vLEDHeartbeat, osTimerPeriodic, &led_can2, NULL); - osTimerStart(xHeartbeatTimerCAN2, 250U); + xHeartbeatTimerCAN1 = osTimerNew(vLEDHeartbeat, osTimerOnce, &led_can1, NULL); + xHeartbeatTimerCAN2 = osTimerNew(vLEDHeartbeat, osTimerOnce, &led_can2, NULL); if (xHeartbeatTimerCAN1 == NULL || xHeartbeatTimerCAN2 == NULL) Error_Handler(); /* USER CODE END RTOS_TIMERS */ From 7c7d7745225f8bc47ed17ac24f9576fd9f0aae3e Mon Sep 17 00:00:00 2001 From: Erick Ahmed Date: Sun, 14 Jun 2026 14:18:28 +0200 Subject: [PATCH 02/22] Create semaphores for signalling new message in FIFO buffer --- Core/Src/main.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/Core/Src/main.c b/Core/Src/main.c index 70e1f62..f6cf1ad 100644 --- a/Core/Src/main.c +++ b/Core/Src/main.c @@ -147,7 +147,13 @@ int main(void) /* USER CODE END RTOS_MUTEX */ /* USER CODE BEGIN RTOS_SEMAPHORES */ - /* add semaphores, ... */ + osSemaphoreId_t xLEDSemaphoreCAN1; + xLEDSemaphoreCAN1 = osSemaphoreNew(255, 0, NULL); + + osSemaphoreId_t xLEDSemaphoreCAN2; + xLEDSemaphoreCAN2 = osSemaphoreNew(255, 0, NULL); + + if (xLEDSemaphoreCAN1 == NULL || xLEDSemaphoreCAN2 == NULL) Error_Handler(); /* USER CODE END RTOS_SEMAPHORES */ /* USER CODE BEGIN RTOS_TIMERS */ From d6ea04e33ed63cfc8b696ddfbe82d409c75fb860 Mon Sep 17 00:00:00 2001 From: Erick Ahmed Date: Sun, 14 Jun 2026 14:18:40 +0200 Subject: [PATCH 03/22] Change variable name --- Core/Src/canlog.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Core/Src/canlog.c b/Core/Src/canlog.c index 85a5a6f..21e3395 100644 --- a/Core/Src/canlog.c +++ b/Core/Src/canlog.c @@ -109,7 +109,7 @@ void vCANLoggerListen(void *argument) for (;;) { - if (osMessageQueueGet(queue, &msg, NULL, osWaitForever) == osOK) + if (osMessageQueueGet(queue, &message, NULL, osWaitForever) == osOK) { // TODO: parse message send message to serial/uart // TODO: add rtos semaphore to blink the LED with the timer already set From 2e2150ebd2ef9ab425d22e168a32ad31776d7b00 Mon Sep 17 00:00:00 2001 From: Erick Ahmed Date: Sun, 14 Jun 2026 14:19:30 +0200 Subject: [PATCH 04/22] Write HIGH status on LED on incoming CAN message and start 25ms timer --- Core/Src/canlog.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Core/Src/canlog.c b/Core/Src/canlog.c index 21e3395..4090915 100644 --- a/Core/Src/canlog.c +++ b/Core/Src/canlog.c @@ -112,7 +112,9 @@ void vCANLoggerListen(void *argument) if (osMessageQueueGet(queue, &message, NULL, osWaitForever) == osOK) { // TODO: parse message send message to serial/uart - // TODO: add rtos semaphore to blink the LED with the timer already set + + HAL_GPIO_WritePin(led_can1.port, led_can1.pin, GPIO_PIN_SET); + osTimerStart(xHeartbeatTimerCAN1, 25U); } } /* CODE END */ From ebbd1816fa986ee4f1cb101c9dcb4cef0f60ad28 Mon Sep 17 00:00:00 2001 From: Erick Ahmed Date: Sun, 14 Jun 2026 14:19:44 +0200 Subject: [PATCH 05/22] Write LOW status on LED when timer triggers --- Core/Src/canlog.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Core/Src/canlog.c b/Core/Src/canlog.c index 4090915..2f1d3ed 100644 --- a/Core/Src/canlog.c +++ b/Core/Src/canlog.c @@ -131,7 +131,7 @@ void vLEDHeartbeat(void *argument) { /* CODE BEGIN */ LED_Config *led = (LED_Config*)argument; - HAL_GPIO_TogglePin(led->port, led->pin); + HAL_GPIO_WritePin(led->port, led->pin, GPIO_PIN_RESET); /* CODE END */ } /* END vLEDHeartbeat */ From 7ece650f725fb09e4b64ebb01da929ac07490700 Mon Sep 17 00:00:00 2001 From: Erick Ahmed Date: Sun, 14 Jun 2026 14:49:54 +0200 Subject: [PATCH 06/22] Move declaration on top --- Core/Src/main.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Core/Src/main.c b/Core/Src/main.c index f6cf1ad..5a0b414 100644 --- a/Core/Src/main.c +++ b/Core/Src/main.c @@ -66,8 +66,14 @@ LED_Config led_can1 = {GPIOB, GPIO_PIN_2}; LED_Config led_can2 = {GPIOB, GPIO_PIN_5}; LED_Config led_error = {GPIOB, GPIO_PIN_3}; +osSemaphoreId_t xLEDSemaphoreCAN1; +osSemaphoreId_t xLEDSemaphoreCAN2; + osTimerId_t xHeartbeatTimerCAN1; osTimerId_t xHeartbeatTimerCAN2; + +osMessageQueueId_t xCAN1RxQueue; +osMessageQueueId_t xCAN2RxQueue; /* USER CODE END PV */ /* Private function prototypes -----------------------------------------------*/ @@ -147,10 +153,7 @@ int main(void) /* USER CODE END RTOS_MUTEX */ /* USER CODE BEGIN RTOS_SEMAPHORES */ - osSemaphoreId_t xLEDSemaphoreCAN1; xLEDSemaphoreCAN1 = osSemaphoreNew(255, 0, NULL); - - osSemaphoreId_t xLEDSemaphoreCAN2; xLEDSemaphoreCAN2 = osSemaphoreNew(255, 0, NULL); if (xLEDSemaphoreCAN1 == NULL || xLEDSemaphoreCAN2 == NULL) Error_Handler(); @@ -164,10 +167,7 @@ int main(void) /* USER CODE END RTOS_TIMERS */ /* USER CODE BEGIN RTOS_QUEUES */ - osMessageQueueId_t xCAN1RxQueue; xCAN1RxQueue = osMessageQueueNew(32, sizeof(CanMessage_t), NULL); - - osMessageQueueId_t xCAN2RxQueue; xCAN2RxQueue = osMessageQueueNew(32, sizeof(CanMessage_t), NULL); if (xCAN1RxQueue == NULL || xCAN2RxQueue == NULL) Error_Handler(); From 1b38c0f29ae8c77fa91f0a2504d04ea7ed7355a7 Mon Sep 17 00:00:00 2001 From: Erick Ahmed Date: Sun, 14 Jun 2026 14:50:43 +0200 Subject: [PATCH 07/22] Release semaphore on incoming message - Discard previous solution with timer only --- Core/Src/canlog.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Core/Src/canlog.c b/Core/Src/canlog.c index 2f1d3ed..8f2b8d3 100644 --- a/Core/Src/canlog.c +++ b/Core/Src/canlog.c @@ -113,9 +113,11 @@ void vCANLoggerListen(void *argument) { // TODO: parse message send message to serial/uart - HAL_GPIO_WritePin(led_can1.port, led_can1.pin, GPIO_PIN_SET); - osTimerStart(xHeartbeatTimerCAN1, 25U); + + bus = (hcan->Instance == CAN1) ? xLEDSemaphoreCAN1 : xLEDSemaphoreCAN2 + osSemaphoreRelease(bus); } + } /* CODE END */ } From de6dc24dd30641bcd1ca241e3f8310c9500fe373 Mon Sep 17 00:00:00 2001 From: Erick Ahmed Date: Sun, 14 Jun 2026 14:51:33 +0200 Subject: [PATCH 08/22] Acquire semaphore and restart timer if new message incoming --- Core/Src/canlog.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/Core/Src/canlog.c b/Core/Src/canlog.c index 8f2b8d3..d7962ea 100644 --- a/Core/Src/canlog.c +++ b/Core/Src/canlog.c @@ -133,7 +133,17 @@ void vLEDHeartbeat(void *argument) { /* CODE BEGIN */ LED_Config *led = (LED_Config*)argument; - HAL_GPIO_WritePin(led->port, led->pin, GPIO_PIN_RESET); + + if (osSemaphoreAcquire(xCanActivitySemaphore, 0U) == osOK) + { + HAL_GPIO_WritePin(led->port, led->pin, GPIO_PIN_SET); + osTimerStart(xHeartbeatTimerCAN1, 25U); + } + else + { + HAL_GPIO_WritePin(led->port, led->pin, GPIO_PIN_RESET); + } + /* CODE END */ } /* END vLEDHeartbeat */ From 5f1695dc0d1bff4e3366997c5f0e4b0d9b943d62 Mon Sep 17 00:00:00 2001 From: Erick Ahmed Date: Sun, 14 Jun 2026 14:51:46 +0200 Subject: [PATCH 09/22] Start timer once for automatic rearming with semaphore release --- Core/Src/main.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Core/Src/main.c b/Core/Src/main.c index 5a0b414..e67881e 100644 --- a/Core/Src/main.c +++ b/Core/Src/main.c @@ -163,6 +163,9 @@ int main(void) xHeartbeatTimerCAN1 = osTimerNew(vLEDHeartbeat, osTimerOnce, &led_can1, NULL); xHeartbeatTimerCAN2 = osTimerNew(vLEDHeartbeat, osTimerOnce, &led_can2, NULL); + osTimerStart(xHeartbeatTimerCAN1, 25U); + osTimerStart(xHeartbeatTimerCAN2, 25U); + if (xHeartbeatTimerCAN1 == NULL || xHeartbeatTimerCAN2 == NULL) Error_Handler(); /* USER CODE END RTOS_TIMERS */ From 5b500d72ff3da16e31308107dad3327b2b089dff Mon Sep 17 00:00:00 2001 From: Erick Ahmed Date: Sun, 14 Jun 2026 14:56:32 +0200 Subject: [PATCH 10/22] Avoid having to declare additional variable --- Core/Src/canlog.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/Core/Src/canlog.c b/Core/Src/canlog.c index d7962ea..784e805 100644 --- a/Core/Src/canlog.c +++ b/Core/Src/canlog.c @@ -113,9 +113,7 @@ void vCANLoggerListen(void *argument) { // TODO: parse message send message to serial/uart - - bus = (hcan->Instance == CAN1) ? xLEDSemaphoreCAN1 : xLEDSemaphoreCAN2 - osSemaphoreRelease(bus); + osSemaphoreRelease( (hcan->Instance == CAN1) ? xLEDSemaphoreCAN1 : xLEDSemaphoreCAN2 ); } } From a75d42faebbfc8d44ee0c0bb5ce944058c1eee4d Mon Sep 17 00:00:00 2001 From: Erick Ahmed Date: Sun, 14 Jun 2026 15:16:23 +0200 Subject: [PATCH 11/22] Create context structure for timer callback Strucure is made of - LED (port, pin) - Semaphore - Timer handle --- Core/Src/canlog.c | 1 - Core/Src/main.c | 15 +++++++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/Core/Src/canlog.c b/Core/Src/canlog.c index 784e805..5164a5a 100644 --- a/Core/Src/canlog.c +++ b/Core/Src/canlog.c @@ -141,7 +141,6 @@ void vLEDHeartbeat(void *argument) { HAL_GPIO_WritePin(led->port, led->pin, GPIO_PIN_RESET); } - /* CODE END */ } /* END vLEDHeartbeat */ diff --git a/Core/Src/main.c b/Core/Src/main.c index e67881e..13e4cae 100644 --- a/Core/Src/main.c +++ b/Core/Src/main.c @@ -41,6 +41,12 @@ typedef struct { //uint32_t timestamp; //Enable TIM2: 42 MHz / (41+1) = 1 MHz → 1 µs tick; 32bit autoreload freerunning // this is for getting timestamps on can messages } CanMessage_t; + +typedef struct { + LED_Config *led; + osSemaphoreId_t sem; + osTimerId_t timer; +} LEDContext; /* USER CODE END PTD */ /* Private define ------------------------------------------------------------*/ @@ -66,6 +72,9 @@ LED_Config led_can1 = {GPIOB, GPIO_PIN_2}; LED_Config led_can2 = {GPIOB, GPIO_PIN_5}; LED_Config led_error = {GPIOB, GPIO_PIN_3}; +LEDContext ledCtxCAN1; +LEDContext ledCtxCAN2; + osSemaphoreId_t xLEDSemaphoreCAN1; osSemaphoreId_t xLEDSemaphoreCAN2; @@ -109,7 +118,13 @@ int main(void) HAL_Init(); /* USER CODE BEGIN Init */ + ledCtxCAN1.led = &led_can1; + ledCtxCAN1.sem = xLEDSemaphoreCAN1; + ledCtxCAN1.timer = xHeartbeatTimerCAN1; + ledCtxCAN2.led = &led_can2; + ledCtxCAN2.sem = xLEDSemaphoreCAN2; + ledCtxCAN2.timer = xHeartbeatTimerCAN2; /* USER CODE END Init */ /* Configure the system clock */ From 75efc4840d33a9cc2a37c53140f10ad2001ed18d Mon Sep 17 00:00:00 2001 From: Erick Ahmed Date: Sun, 14 Jun 2026 15:17:03 +0200 Subject: [PATCH 12/22] Use new context structure instead of direct pass --- Core/Src/canlog.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Core/Src/canlog.c b/Core/Src/canlog.c index 5164a5a..0017e6b 100644 --- a/Core/Src/canlog.c +++ b/Core/Src/canlog.c @@ -130,16 +130,16 @@ void vCANLoggerListen(void *argument) void vLEDHeartbeat(void *argument) { /* CODE BEGIN */ - LED_Config *led = (LED_Config*)argument; + LEDContext *ctx = (LEDContext*)argument; - if (osSemaphoreAcquire(xCanActivitySemaphore, 0U) == osOK) + if (osSemaphoreAcquire(ctx->sem, 0U) == osOK) { - HAL_GPIO_WritePin(led->port, led->pin, GPIO_PIN_SET); - osTimerStart(xHeartbeatTimerCAN1, 25U); + HAL_GPIO_WritePin(ctx->led->port, ctx->led->pin, GPIO_PIN_SET); + osTimerStart(ctx->timer, 25U); } else { - HAL_GPIO_WritePin(led->port, led->pin, GPIO_PIN_RESET); + HAL_GPIO_WritePin(ctx->led->port, ctx->led->pin, GPIO_PIN_RESET); } /* CODE END */ } From 151bac7a13e1c8b6171743226da09dac9339f80d Mon Sep 17 00:00:00 2001 From: Erick Ahmed Date: Sun, 14 Jun 2026 16:08:21 +0200 Subject: [PATCH 13/22] Fix typo --- Core/Inc/canlog.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Core/Inc/canlog.h b/Core/Inc/canlog.h index db865b1..86ec046 100644 --- a/Core/Inc/canlog.h +++ b/Core/Inc/canlog.h @@ -44,7 +44,7 @@ extern const osThreadAttr_t vLED_CAN2_Heartbeat_attributes; * @param hcan1 Pointer to the CAN1 handle * @param hcan2 Pointer to the CAN2 handle */ -void vCANLoggerInit(CAN_HandleTypeDef *hcan1, CAN_HandleTypeDef *hcan2); +void CAN_Logger_Init(CAN_HandleTypeDef *hcan1, CAN_HandleTypeDef *hcan2); void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *hcan); void vCANLoggerListen(void *argument); void vLEDHeartbeat(void *argument); From 2a3d5d17b3aa9ff92bb78057485ae817826e83ab Mon Sep 17 00:00:00 2001 From: Erick Ahmed Date: Sun, 14 Jun 2026 16:08:37 +0200 Subject: [PATCH 14/22] Remove unnecessary declarations --- Core/Inc/canlog.h | 14 ++------------ 1 file changed, 2 insertions(+), 12 deletions(-) diff --git a/Core/Inc/canlog.h b/Core/Inc/canlog.h index 86ec046..3effcc3 100644 --- a/Core/Inc/canlog.h +++ b/Core/Inc/canlog.h @@ -24,20 +24,10 @@ #include "main.h" -/* Decladerations for queues */ extern osMessageQueueId_t xCAN1RxQueue; extern osMessageQueueId_t xCAN2RxQueue; - -/* Decladerations for thread handles and attributes */ -extern osThreadId_t vCAN1_rx; -extern osThreadId_t vCAN2_rx; -extern osThreadId_t vLED_CAN1_Heartbeat; -extern osThreadId_t vLED_CAN2_Heartbeat; - -extern const osThreadAttr_t vCAN1_rx_attributes; -extern const osThreadAttr_t vCAN2_rx_attributes; -extern const osThreadAttr_t vLED_CAN1_Heartbeat_attributes; -extern const osThreadAttr_t vLED_CAN2_Heartbeat_attributes; +extern osSemaphoreId_t xLEDSemaphoreCAN1; +extern osSemaphoreId_t xLEDSemaphoreCAN2; /** * @brief Initializes the CAN logger modules, OS threads, queues, and hardware. From 72ffb2644e764522d23d241fb1cffd4659532cf1 Mon Sep 17 00:00:00 2001 From: Erick Ahmed Date: Sun, 14 Jun 2026 16:09:45 +0200 Subject: [PATCH 15/22] Use more clear variable names --- Core/Src/main.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Core/Src/main.c b/Core/Src/main.c index 13e4cae..36c4b79 100644 --- a/Core/Src/main.c +++ b/Core/Src/main.c @@ -44,7 +44,7 @@ typedef struct { typedef struct { LED_Config *led; - osSemaphoreId_t sem; + osSemaphoreId_t semaphore; osTimerId_t timer; } LEDContext; /* USER CODE END PTD */ @@ -72,8 +72,8 @@ LED_Config led_can1 = {GPIOB, GPIO_PIN_2}; LED_Config led_can2 = {GPIOB, GPIO_PIN_5}; LED_Config led_error = {GPIOB, GPIO_PIN_3}; -LEDContext ledCtxCAN1; -LEDContext ledCtxCAN2; +LEDContext ledContextCAN1; +LEDContext ledContextCAN2; osSemaphoreId_t xLEDSemaphoreCAN1; osSemaphoreId_t xLEDSemaphoreCAN2; @@ -175,8 +175,8 @@ int main(void) /* USER CODE END RTOS_SEMAPHORES */ /* USER CODE BEGIN RTOS_TIMERS */ - xHeartbeatTimerCAN1 = osTimerNew(vLEDHeartbeat, osTimerOnce, &led_can1, NULL); - xHeartbeatTimerCAN2 = osTimerNew(vLEDHeartbeat, osTimerOnce, &led_can2, NULL); + xHeartbeatTimerCAN1 = osTimerNew(vLEDHeartbeat, osTimerOnce, &ledContextCAN1, NULL); + xHeartbeatTimerCAN2 = osTimerNew(vLEDHeartbeat, osTimerOnce, &ledContextCAN2, NULL); osTimerStart(xHeartbeatTimerCAN1, 25U); osTimerStart(xHeartbeatTimerCAN2, 25U); From f0d2990b8d025f9c1dc18ebe3594ef28adfe1c3f Mon Sep 17 00:00:00 2001 From: Erick Ahmed Date: Sun, 14 Jun 2026 16:10:00 +0200 Subject: [PATCH 16/22] Move below timer setup --- Core/Src/main.c | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/Core/Src/main.c b/Core/Src/main.c index 36c4b79..21dfd1b 100644 --- a/Core/Src/main.c +++ b/Core/Src/main.c @@ -118,13 +118,7 @@ int main(void) HAL_Init(); /* USER CODE BEGIN Init */ - ledCtxCAN1.led = &led_can1; - ledCtxCAN1.sem = xLEDSemaphoreCAN1; - ledCtxCAN1.timer = xHeartbeatTimerCAN1; - ledCtxCAN2.led = &led_can2; - ledCtxCAN2.sem = xLEDSemaphoreCAN2; - ledCtxCAN2.timer = xHeartbeatTimerCAN2; /* USER CODE END Init */ /* Configure the system clock */ @@ -200,6 +194,16 @@ int main(void) /* add events, ... */ /* USER CODE END RTOS_EVENTS */ + /* USER CODE BEGIN 3 */ + ledContextCAN1.led = &led_can1; + ledContextCAN1.semaphore = xLEDSemaphoreCAN1; + ledContextCAN1.timer = xHeartbeatTimerCAN1; + + ledContextCAN2.led = &led_can2; + ledContextCAN2.semaphore = xLEDSemaphoreCAN2; + ledContextCAN2.timer = xHeartbeatTimerCAN2; + /* USER CODE END 3 */ + /* Start scheduler */ osKernelStart(); From ac16f8150eb7682426bdc9ea2f8a6193648363a6 Mon Sep 17 00:00:00 2001 From: Erick Ahmed Date: Sun, 14 Jun 2026 16:10:18 +0200 Subject: [PATCH 17/22] Use a more sensible number of semaphores --- Core/Src/main.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Core/Src/main.c b/Core/Src/main.c index 21dfd1b..fbefc62 100644 --- a/Core/Src/main.c +++ b/Core/Src/main.c @@ -162,8 +162,8 @@ int main(void) /* USER CODE END RTOS_MUTEX */ /* USER CODE BEGIN RTOS_SEMAPHORES */ - xLEDSemaphoreCAN1 = osSemaphoreNew(255, 0, NULL); - xLEDSemaphoreCAN2 = osSemaphoreNew(255, 0, NULL); + xLEDSemaphoreCAN1 = osSemaphoreNew(10, 0, NULL); + xLEDSemaphoreCAN2 = osSemaphoreNew(10, 0, NULL); if (xLEDSemaphoreCAN1 == NULL || xLEDSemaphoreCAN2 == NULL) Error_Handler(); /* USER CODE END RTOS_SEMAPHORES */ From 4aafa810097b9114330377c67a44ab0fa7d923d2 Mon Sep 17 00:00:00 2001 From: Erick Ahmed Date: Sun, 14 Jun 2026 16:14:20 +0200 Subject: [PATCH 18/22] Change CODE BEGIN N value --- Core/Src/main.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Core/Src/main.c b/Core/Src/main.c index fbefc62..f2e11c7 100644 --- a/Core/Src/main.c +++ b/Core/Src/main.c @@ -215,9 +215,9 @@ int main(void) { /* USER CODE END WHILE */ - /* USER CODE BEGIN 3 */ + /* USER CODE BEGIN 4 */ } - /* USER CODE END 3 */ + /* USER CODE END 4 */ } /** @@ -467,9 +467,9 @@ static void MX_GPIO_Init(void) /* USER CODE END MX_GPIO_Init_2 */ } -/* USER CODE BEGIN 4 */ +/* USER CODE BEGIN 5 */ -/* USER CODE END 4 */ +/* USER CODE END 5 */ /** * @brief Period elapsed callback in non blocking mode From 8777f742aca8239b377a704762954490cbfdaffd Mon Sep 17 00:00:00 2001 From: Erick Ahmed Date: Sun, 14 Jun 2026 16:15:33 +0200 Subject: [PATCH 19/22] Move typedef to header --- Core/Inc/canlog.h | 6 ++++++ Core/Src/main.c | 6 ------ 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Core/Inc/canlog.h b/Core/Inc/canlog.h index 3effcc3..f95a9ff 100644 --- a/Core/Inc/canlog.h +++ b/Core/Inc/canlog.h @@ -29,6 +29,12 @@ extern osMessageQueueId_t xCAN2RxQueue; extern osSemaphoreId_t xLEDSemaphoreCAN1; extern osSemaphoreId_t xLEDSemaphoreCAN2; +typedef struct { + LED_Config *led; + osSemaphoreId_t semaphore; + osTimerId_t timer; +} LEDContext; + /** * @brief Initializes the CAN logger modules, OS threads, queues, and hardware. * @param hcan1 Pointer to the CAN1 handle diff --git a/Core/Src/main.c b/Core/Src/main.c index f2e11c7..7b5df2f 100644 --- a/Core/Src/main.c +++ b/Core/Src/main.c @@ -41,12 +41,6 @@ typedef struct { //uint32_t timestamp; //Enable TIM2: 42 MHz / (41+1) = 1 MHz → 1 µs tick; 32bit autoreload freerunning // this is for getting timestamps on can messages } CanMessage_t; - -typedef struct { - LED_Config *led; - osSemaphoreId_t semaphore; - osTimerId_t timer; -} LEDContext; /* USER CODE END PTD */ /* Private define ------------------------------------------------------------*/ From 5ec806ffea3522984b03686350e0648d22c12257 Mon Sep 17 00:00:00 2001 From: Erick Ahmed Date: Sun, 14 Jun 2026 16:16:14 +0200 Subject: [PATCH 20/22] Add CMSIS include --- Core/Inc/canlog.h | 1 + Core/Src/main.c | 1 - 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/Core/Inc/canlog.h b/Core/Inc/canlog.h index f95a9ff..0ba9cb4 100644 --- a/Core/Inc/canlog.h +++ b/Core/Inc/canlog.h @@ -23,6 +23,7 @@ #define CANLOG_H #include "main.h" +#include "cmsis_os.h" extern osMessageQueueId_t xCAN1RxQueue; extern osMessageQueueId_t xCAN2RxQueue; diff --git a/Core/Src/main.c b/Core/Src/main.c index 7b5df2f..e3ea066 100644 --- a/Core/Src/main.c +++ b/Core/Src/main.c @@ -23,7 +23,6 @@ /* Private includes ----------------------------------------------------------*/ /* USER CODE BEGIN Includes */ #include "canlog.h" -#include /* USER CODE END Includes */ /* Private typedef -----------------------------------------------------------*/ From 9d4d807cfb7c79165c7771109142a77a641b892c Mon Sep 17 00:00:00 2001 From: Erick Ahmed Date: Sun, 14 Jun 2026 16:21:55 +0200 Subject: [PATCH 21/22] Fix race condition that could cause a hard fault --- Core/Src/main.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/Core/Src/main.c b/Core/Src/main.c index e3ea066..82611d8 100644 --- a/Core/Src/main.c +++ b/Core/Src/main.c @@ -159,6 +159,11 @@ int main(void) xLEDSemaphoreCAN2 = osSemaphoreNew(10, 0, NULL); if (xLEDSemaphoreCAN1 == NULL || xLEDSemaphoreCAN2 == NULL) Error_Handler(); + + ledContextCAN1.led = &led_can1; + ledContextCAN1.semaphore = xLEDSemaphoreCAN1; + ledContextCAN2.led = &led_can2; + ledContextCAN2.semaphore = xLEDSemaphoreCAN2; /* USER CODE END RTOS_SEMAPHORES */ /* USER CODE BEGIN RTOS_TIMERS */ @@ -169,6 +174,9 @@ int main(void) osTimerStart(xHeartbeatTimerCAN2, 25U); if (xHeartbeatTimerCAN1 == NULL || xHeartbeatTimerCAN2 == NULL) Error_Handler(); + + ledContextCAN1.timer = xHeartbeatTimerCAN1; + ledContextCAN2.timer = xHeartbeatTimerCAN2; /* USER CODE END RTOS_TIMERS */ /* USER CODE BEGIN RTOS_QUEUES */ From 53772ccb7d784315c2060b598c31031b03958d55 Mon Sep 17 00:00:00 2001 From: Erick Ahmed Date: Sun, 14 Jun 2026 16:45:02 +0200 Subject: [PATCH 22/22] Remove error handling as it would cause crash on full queue --- Core/Src/canlog.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Core/Src/canlog.c b/Core/Src/canlog.c index 0017e6b..509a9b2 100644 --- a/Core/Src/canlog.c +++ b/Core/Src/canlog.c @@ -82,12 +82,12 @@ void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *hcan) memcpy(message.payload, data, rxHeader.DLC); osMessageQueueId_t queue = (hcan->Instance == CAN1) ? xCAN1RxQueue : xCAN2RxQueue; - if (osMessageQueuePut(queue, &message, 0U, 0U) != osOK) Error_Handler(); - // TODO: better handling: flash error_led on osTimeout, call Error_Handler() when other errors - - // Issue #1: set an event flag for led task - // osEventFlagsSet(xCanEventFlags, (hcan->Instance == CAN1) ? 0x01 : 0x02); + if (osMessageQueuePut(queue, &message, 0U, 0U) != osOK) + { + // TODO: better handling: flash error_led on osTimeout, call Error_Handler() when other errors + // send errors like queue full via UART + } /* CODE END */ } /* END HAL_CAN_RxFifo0MsgPendingCallback */