From d348159c204fd0b5eb2005a3d23d742ecf0c4d6c Mon Sep 17 00:00:00 2001 From: Erick Ahmed Date: Tue, 16 Jun 2026 00:33:56 +0200 Subject: [PATCH 1/7] Allocate CAN stack arrays into CCMRAM --- Core/Src/main.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Core/Src/main.c b/Core/Src/main.c index d6ac9e5..3f5cb91 100644 --- a/Core/Src/main.c +++ b/Core/Src/main.c @@ -33,7 +33,11 @@ /* Private macro -------------------------------------------------------------*/ /* USER CODE BEGIN PM */ +__attribute__((section(".ccmram"))) +StackType_t xCAN1_Stack[CAN_TASK_STACK_WORDS]; +__attribute__((section(".ccmram"))) +StackType_t xCAN2_Stack[CAN_TASK_STACK_WORDS]; /* USER CODE END PM */ /* Private variables ---------------------------------------------------------*/ -- 2.52.0 From 92b59615d5fe03d064ff893a2955adae1b42828e Mon Sep 17 00:00:00 2001 From: Erick Ahmed Date: Tue, 16 Jun 2026 00:35:33 +0200 Subject: [PATCH 2/7] Configure thread attributes to use memory stacks in CCRAM --- Core/Src/main.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/Core/Src/main.c b/Core/Src/main.c index 3f5cb91..ebf9707 100644 --- a/Core/Src/main.c +++ b/Core/Src/main.c @@ -131,14 +131,20 @@ int main(void) osThreadId_t xCAN2rx; const osThreadAttr_t CAN2rxAttributes = { .name = "CAN2rx", - .stack_size = 128 * 4, + .cb_mem = NULL, + .cb_size = 0U, + .stack_mem = xCAN1_Stack, + .stack_size = sizeof(xCAN1_Stack), .priority = (osPriority_t) osPriorityRealtime, }; osThreadId_t xLEDHeartbeatCAN1; const osThreadAttr_t LEDHeartbeatCAN1Attributes = { .name = "LED_HB_CAN1", - .stack_size = 128 * 4, + .cb_mem = NULL, + .cb_size = 0U, + .stack_mem = xCAN2_Stack, + .stack_size = sizeof(xCAN2_Stack), .priority = (osPriority_t) osPriorityVeryLow1, }; -- 2.52.0 From a9e6bbecba2a940074e6726dce5dc1652a23cb53 Mon Sep 17 00:00:00 2001 From: Erick Ahmed Date: Tue, 16 Jun 2026 00:41:40 +0200 Subject: [PATCH 3/7] Use private define for queue length --- Core/Src/main.c | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/Core/Src/main.c b/Core/Src/main.c index ebf9707..3165a7f 100644 --- a/Core/Src/main.c +++ b/Core/Src/main.c @@ -28,7 +28,9 @@ /* Private define ------------------------------------------------------------*/ /* USER CODE BEGIN PD */ - +#define CAN_QUEUE_DEPTH 32 +#define CAN_TASK_STACK_WORDS 128 +#define CAN_MSG_SIZE sizeof(CanMessage_t) /* USER CODE END PD */ /* Private macro -------------------------------------------------------------*/ @@ -161,8 +163,8 @@ int main(void) /* USER CODE END RTOS_MUTEX */ /* USER CODE BEGIN RTOS_SEMAPHORES */ - xSemaphoreCAN1 = osSemaphoreNew(32, 0, NULL); - xSemaphoreCAN2 = osSemaphoreNew(32, 0, NULL); + xSemaphoreCAN1 = osSemaphoreNew(CAN_QUEUE_DEPTH, 0, NULL); + xSemaphoreCAN2 = osSemaphoreNew(CAN_QUEUE_DEPTH, 0, NULL); if (xSemaphoreCAN1 == NULL || xSemaphoreCAN2 == NULL) Error_Handler(); @@ -177,8 +179,8 @@ int main(void) /* USER CODE END RTOS_TIMERS */ /* USER CODE BEGIN RTOS_QUEUES */ - xCAN1RxQueue = osMessageQueueNew(32, sizeof(CanMessage_t), NULL); - xCAN2RxQueue = osMessageQueueNew(32, sizeof(CanMessage_t), NULL); + xCAN1RxQueue = osMessageQueueNew(CAN_QUEUE_DEPTH, sizeof(CanMessage_t), NULL); + xCAN2RxQueue = osMessageQueueNew(CAN_QUEUE_DEPTH, sizeof(CanMessage_t), NULL); if (xCAN1RxQueue == NULL || xCAN2RxQueue == NULL) Error_Handler(); /* USER CODE END RTOS_QUEUES */ -- 2.52.0 From 52b373c82efb55a7105ffd1a3d3f94817897f6fe Mon Sep 17 00:00:00 2001 From: Erick Ahmed Date: Tue, 16 Jun 2026 00:45:22 +0200 Subject: [PATCH 4/7] Put control banks and queue memories into CCRAM --- Core/Src/main.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/Core/Src/main.c b/Core/Src/main.c index 3165a7f..4503b86 100644 --- a/Core/Src/main.c +++ b/Core/Src/main.c @@ -35,11 +35,20 @@ /* Private macro -------------------------------------------------------------*/ /* USER CODE BEGIN PM */ +//CCRAM: stack; control bank; queue memory __attribute__((section(".ccmram"))) StackType_t xCAN1_Stack[CAN_TASK_STACK_WORDS]; +__attribute__((section(".ccmram"), aligned(4))) +uint8_t can1_queue_cb[osMessageQueueGetMemSize(CAN_QUEUE_DEPTH, CAN_MSG_SIZE)]; +__attribute__((section(".ccmram"), aligned(4))) +uint8_t can1_queue_mq[CAN_QUEUE_DEPTH * CAN_MSG_SIZE]; __attribute__((section(".ccmram"))) StackType_t xCAN2_Stack[CAN_TASK_STACK_WORDS]; +__attribute__((section(".ccmram"), aligned(4))) +uint8_t can2_queue_cb[osMessageQueueGetMemSize(CAN_QUEUE_DEPTH, CAN_MSG_SIZE)]; +__attribute__((section(".ccmram"), aligned(4))) +uint8_t can2_queue_mq[CAN_QUEUE_DEPTH * CAN_MSG_SIZE]; /* USER CODE END PM */ /* Private variables ---------------------------------------------------------*/ -- 2.52.0 From 498d19fd90180429ace7128324ab61a89007ca7f Mon Sep 17 00:00:00 2001 From: Erick Ahmed Date: Tue, 16 Jun 2026 00:56:22 +0200 Subject: [PATCH 5/7] Add queue attributes --- Core/Src/main.c | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/Core/Src/main.c b/Core/Src/main.c index 4503b86..c88dda9 100644 --- a/Core/Src/main.c +++ b/Core/Src/main.c @@ -188,8 +188,24 @@ int main(void) /* USER CODE END RTOS_TIMERS */ /* USER CODE BEGIN RTOS_QUEUES */ - xCAN1RxQueue = osMessageQueueNew(CAN_QUEUE_DEPTH, sizeof(CanMessage_t), NULL); - xCAN2RxQueue = osMessageQueueNew(CAN_QUEUE_DEPTH, sizeof(CanMessage_t), NULL); + const osMessageQueueAttr_t can1_queue_attr = { + .name = "CAN1_Q", + .cb_mem = can1_queue_cb, + .cb_size = sizeof(can1_queue_cb), + .mq_mem = can1_queue_mq, + .mq_size = sizeof(can1_queue_mq) + }; + + const osMessageQueueAttr_t can2_queue_attr = { + .name = "CAN2_Q", + .cb_mem = can2_queue_cb, + .cb_size = sizeof(can2_queue_cb), + .mq_mem = can2_queue_mq, + .mq_size = sizeof(can2_queue_mq) + }; + + xCAN1RxQueue = osMessageQueueNew(CAN_QUEUE_DEPTH, sizeof(CanMessage_t), &can1_queue_attr); + xCAN2RxQueue = osMessageQueueNew(CAN_QUEUE_DEPTH, sizeof(CanMessage_t), &can2_queue_attr); if (xCAN1RxQueue == NULL || xCAN2RxQueue == NULL) Error_Handler(); /* USER CODE END RTOS_QUEUES */ -- 2.52.0 From e8ffa4cd051b8e6792be825a84c0b10ec1706345 Mon Sep 17 00:00:00 2001 From: Erick Ahmed Date: Tue, 16 Jun 2026 00:56:32 +0200 Subject: [PATCH 6/7] Fix array bound not integer error --- Core/Src/main.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/Core/Src/main.c b/Core/Src/main.c index c88dda9..27ba3c9 100644 --- a/Core/Src/main.c +++ b/Core/Src/main.c @@ -30,6 +30,7 @@ /* USER CODE BEGIN PD */ #define CAN_QUEUE_DEPTH 32 #define CAN_TASK_STACK_WORDS 128 +#define CAN_QUEUE_CB_SIZE 128 #define CAN_MSG_SIZE sizeof(CanMessage_t) /* USER CODE END PD */ @@ -39,14 +40,14 @@ __attribute__((section(".ccmram"))) StackType_t xCAN1_Stack[CAN_TASK_STACK_WORDS]; __attribute__((section(".ccmram"), aligned(4))) -uint8_t can1_queue_cb[osMessageQueueGetMemSize(CAN_QUEUE_DEPTH, CAN_MSG_SIZE)]; +uint8_t can1_queue_cb[CAN_QUEUE_CB_SIZE]; __attribute__((section(".ccmram"), aligned(4))) uint8_t can1_queue_mq[CAN_QUEUE_DEPTH * CAN_MSG_SIZE]; __attribute__((section(".ccmram"))) StackType_t xCAN2_Stack[CAN_TASK_STACK_WORDS]; __attribute__((section(".ccmram"), aligned(4))) -uint8_t can2_queue_cb[osMessageQueueGetMemSize(CAN_QUEUE_DEPTH, CAN_MSG_SIZE)]; +uint8_t can2_queue_cb[CAN_QUEUE_CB_SIZE]; __attribute__((section(".ccmram"), aligned(4))) uint8_t can2_queue_mq[CAN_QUEUE_DEPTH * CAN_MSG_SIZE]; /* USER CODE END PM */ @@ -144,8 +145,8 @@ int main(void) .name = "CAN2rx", .cb_mem = NULL, .cb_size = 0U, - .stack_mem = xCAN1_Stack, - .stack_size = sizeof(xCAN1_Stack), + .stack_mem = xCAN2_Stack, + .stack_size = sizeof(xCAN2_Stack), .priority = (osPriority_t) osPriorityRealtime, }; -- 2.52.0 From 7f461970f25886681703a021a18d1077b70aa713 Mon Sep 17 00:00:00 2001 From: Erick Ahmed Date: Tue, 16 Jun 2026 00:57:48 +0200 Subject: [PATCH 7/7] Fix allocation on wrong line --- 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 27ba3c9..f8c4c96 100644 --- a/Core/Src/main.c +++ b/Core/Src/main.c @@ -136,7 +136,7 @@ int main(void) osThreadId_t xCAN1rx; const osThreadAttr_t CAN1rxAttributes = { .name = "CAN1rx", - .stack_size = 128 * 4, + .stack_size = sizeof(xCAN1_Stack), .priority = (osPriority_t) osPriorityRealtime1, }; @@ -156,7 +156,7 @@ int main(void) .cb_mem = NULL, .cb_size = 0U, .stack_mem = xCAN2_Stack, - .stack_size = sizeof(xCAN2_Stack), + .stack_size = 128 * 4, .priority = (osPriority_t) osPriorityVeryLow1, }; -- 2.52.0