3 Commits

Author SHA1 Message Date
eeeck 2c14d095f7 Better way to avoid race condition, only notification lives in CAN task
- Runs only once
- Only critical notification is inside task
- CAN message during boot will not be lost, instead put inside FIFO0
2026-06-15 14:30:35 +02:00
eeeck 975acb8c3e Indentation fixes 2026-06-15 14:27:05 +02:00
eeeck b1744ce941 Fix double semaphore release 2026-06-15 14:17:12 +02:00
2 changed files with 12 additions and 15 deletions
+11 -14
View File
@@ -47,14 +47,11 @@ void CAN_Logger_Init(CAN_HandleTypeDef *hcan1, CAN_HandleTypeDef *hcan2)
filter.FilterBank = 0; filter.FilterBank = 0;
if (HAL_CAN_ConfigFilter(hcan1, &filter) != HAL_OK) Error_Handler(); if (HAL_CAN_ConfigFilter(hcan1, &filter) != HAL_OK) Error_Handler();
if (HAL_CAN_Start(hcan1) != HAL_OK) Error_Handler();
filter.FilterBank = 14; filter.FilterBank = 14;
if (HAL_CAN_ConfigFilter(hcan2, &filter) != HAL_OK) Error_Handler(); if (HAL_CAN_ConfigFilter(hcan2, &filter) != HAL_OK) Error_Handler();
if (HAL_CAN_Start(hcan1) != HAL_OK) Error_Handler();
if (HAL_CAN_Start(hcan2) != HAL_OK) Error_Handler(); if (HAL_CAN_Start(hcan2) != HAL_OK) Error_Handler();
if (HAL_CAN_ActivateNotification(hcan1, CAN_IT_RX_FIFO0_MSG_PENDING) != HAL_OK) Error_Handler();
if (HAL_CAN_ActivateNotification(hcan2, CAN_IT_RX_FIFO0_MSG_PENDING) != HAL_OK) Error_Handler();
} }
/* END CAN_Logger_Init */ /* END CAN_Logger_Init */
@@ -101,19 +98,19 @@ void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *hcan)
void vCANLoggerListen(void *argument) void vCANLoggerListen(void *argument)
{ {
/* CODE BEGIN */ /* CODE BEGIN */
CAN_HandleTypeDef *hcan = (CAN_HandleTypeDef*)argument; CAN_HandleTypeDef *hcan = (CAN_HandleTypeDef*)argument;
osMessageQueueId_t queue; osMessageQueueId_t queue = (hcan->Instance == CAN1) ? xCAN1RxQueue : xCAN2RxQueue;
CanMessage_t message; CanMessage_t message;
queue = (hcan->Instance == CAN1) ? xCAN1RxQueue : xCAN2RxQueue; HAL_CAN_ActivateNotification(hcan, CAN_IT_RX_FIFO0_MSG_PENDING);
for (;;) for (;;)
{
if (osMessageQueueGet(queue, &message, NULL, osWaitForever) == osOK)
{ {
if (osMessageQueueGet(queue, &message, NULL, osWaitForever) == osOK) //
{
osSemaphoreRelease( (hcan->Instance == CAN1) ? xSemaphoreCAN1 : xSemaphoreCAN2 );
}
} }
}
/* CODE END */ /* CODE END */
} }
/* END vCANLoggerListen */ /* END vCANLoggerListen */
+1 -1
View File
@@ -110,6 +110,7 @@ int main(void)
MX_SDIO_SD_Init(); MX_SDIO_SD_Init();
/* USER CODE BEGIN 2 */ /* USER CODE BEGIN 2 */
CAN_Logger_Init(&hcan1, &hcan2);
/* USER CODE END 2 */ /* USER CODE END 2 */
/* Init scheduler */ /* Init scheduler */
@@ -184,7 +185,6 @@ int main(void)
/* USER CODE END RTOS_EVENTS */ /* USER CODE END RTOS_EVENTS */
/* USER CODE BEGIN 3 */ /* USER CODE BEGIN 3 */
CAN_Logger_Init(&hcan1, &hcan2);
/* USER CODE END 3 */ /* USER CODE END 3 */
/* Start scheduler */ /* Start scheduler */