From 22c732be02094c2f576229f9aaba85656fbf3316 Mon Sep 17 00:00:00 2001 From: Hector van der Aa Date: Tue, 2 Jun 2026 20:11:07 +0200 Subject: [PATCH] Refactor handler to external Moved task handler functions to external functions, signatures are in tasks.h, each function has its own .c file in Src/tasks --- STM32/CM7/CMakeLists.txt | 2 + STM32/CM7/Core/Inc/main.h | 34 ++--- STM32/CM7/Core/Inc/tasks.h | 7 + STM32/CM7/Core/Src/main.c | 220 +++++++++++++------------------ STM32/CM7/Core/Src/tasks/cam.c | 25 ++++ STM32/CM7/Core/Src/tasks/crank.c | 25 ++++ STM32/STM32.ioc | 2 +- 7 files changed, 173 insertions(+), 142 deletions(-) create mode 100644 STM32/CM7/Core/Inc/tasks.h create mode 100644 STM32/CM7/Core/Src/tasks/cam.c create mode 100644 STM32/CM7/Core/Src/tasks/crank.c diff --git a/STM32/CM7/CMakeLists.txt b/STM32/CM7/CMakeLists.txt index 80b2f14..845f7af 100644 --- a/STM32/CM7/CMakeLists.txt +++ b/STM32/CM7/CMakeLists.txt @@ -62,6 +62,8 @@ target_sources(${CMAKE_PROJECT_NAME} PRIVATE Core/Src/ring_buffer.c Core/Src/SEGGER_RTT.c Core/Src/SEGGER_RTT_printf.c + Core/Src/tasks/crank.c + Core/Src/tasks/cam.c ) # Link directories setup diff --git a/STM32/CM7/Core/Inc/main.h b/STM32/CM7/Core/Inc/main.h index 30f88eb..7cc1344 100644 --- a/STM32/CM7/Core/Inc/main.h +++ b/STM32/CM7/Core/Inc/main.h @@ -1,21 +1,21 @@ /* USER CODE BEGIN Header */ /** - ****************************************************************************** - * @file : main.h - * @brief : Header for main.c file. - * This file contains the common defines of the application. - ****************************************************************************** - * @attention - * - * Copyright (c) 2026 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ + ****************************************************************************** + * @file : main.h + * @brief : Header for main.c file. + * This file contains the common defines of the application. + ****************************************************************************** + * @attention + * + * Copyright (c) 2026 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + */ /* USER CODE END Header */ /* Define to prevent recursive inclusion -------------------------------------*/ @@ -31,6 +31,7 @@ extern "C" { /* Private includes ----------------------------------------------------------*/ /* USER CODE BEGIN Includes */ +#include "global_state.h" /* USER CODE END Includes */ @@ -41,6 +42,7 @@ extern "C" { /* Exported constants --------------------------------------------------------*/ /* USER CODE BEGIN EC */ +extern volatile global_state_t state_g; /* USER CODE END EC */ diff --git a/STM32/CM7/Core/Inc/tasks.h b/STM32/CM7/Core/Inc/tasks.h new file mode 100644 index 0000000..1c426f4 --- /dev/null +++ b/STM32/CM7/Core/Inc/tasks.h @@ -0,0 +1,7 @@ +// Copyright (C) 2026 Hector van der Aa +// Copyright (C) 2026 Pierre Barbier +// Copyright (C) 2026 Association Exergie +// SPDX-License-Identifier: GPL-3.0-or-later + +void crankHandler(void *argument); +void camHandler(void *argument); diff --git a/STM32/CM7/Core/Src/main.c b/STM32/CM7/Core/Src/main.c index c0b385f..d6cebad 100644 --- a/STM32/CM7/Core/Src/main.c +++ b/STM32/CM7/Core/Src/main.c @@ -11,8 +11,9 @@ /* Private includes ----------------------------------------------------------*/ /* USER CODE BEGIN Includes */ -#include "global_state.h" #include "ring_buffer.h" +#include "tasks.h" +#include #ifdef DEBUG #include "SEGGER_RTT.h" #endif @@ -53,36 +54,36 @@ TIM_HandleTypeDef htim2; /* Definitions for defaultTask */ osThreadId_t defaultTaskHandle; const osThreadAttr_t defaultTask_attributes = { - .name = "defaultTask", - .stack_size = 128 * 4, - .priority = (osPriority_t)osPriorityNormal, + .name = "defaultTask", + .stack_size = 128 * 4, + .priority = (osPriority_t) osPriorityNormal, }; /* Definitions for crankTask */ osThreadId_t crankTaskHandle; -uint32_t crankTaskBuffer[128]; +uint32_t crankTaskBuffer[ 128 ]; osStaticThreadDef_t crankTaskControlBlock; const osThreadAttr_t crankTask_attributes = { - .name = "crankTask", - .cb_mem = &crankTaskControlBlock, - .cb_size = sizeof(crankTaskControlBlock), - .stack_mem = &crankTaskBuffer[0], - .stack_size = sizeof(crankTaskBuffer), - .priority = (osPriority_t)osPriorityRealtime7, + .name = "crankTask", + .cb_mem = &crankTaskControlBlock, + .cb_size = sizeof(crankTaskControlBlock), + .stack_mem = &crankTaskBuffer[0], + .stack_size = sizeof(crankTaskBuffer), + .priority = (osPriority_t) osPriorityRealtime7, }; /* Definitions for camTask */ osThreadId_t camTaskHandle; -uint32_t camTaskBuffer[128]; +uint32_t camTaskBuffer[ 128 ]; osStaticThreadDef_t camTaskControlBlock; const osThreadAttr_t camTask_attributes = { - .name = "camTask", - .cb_mem = &camTaskControlBlock, - .cb_size = sizeof(camTaskControlBlock), - .stack_mem = &camTaskBuffer[0], - .stack_size = sizeof(camTaskBuffer), - .priority = (osPriority_t)osPriorityRealtime7, + .name = "camTask", + .cb_mem = &camTaskControlBlock, + .cb_size = sizeof(camTaskControlBlock), + .stack_mem = &camTaskBuffer[0], + .stack_size = sizeof(camTaskBuffer), + .priority = (osPriority_t) osPriorityRealtime7, }; /* USER CODE BEGIN PV */ -static volatile global_state_t state_g = {0}; +volatile global_state_t state_g = {0}; /* USER CODE END PV */ /* Private function prototypes -----------------------------------------------*/ @@ -91,8 +92,8 @@ static void MPU_Config(void); static void MX_GPIO_Init(void); static void MX_TIM2_Init(void); void StartDefaultTask(void *argument); -void crankHandler(void *argument); -void camHandler(void *argument); +extern void crankHandler(void *argument); +extern void camHandler(void *argument); /* USER CODE BEGIN PFP */ @@ -124,10 +125,11 @@ void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim) { /* USER CODE END 0 */ /** - * @brief The application entry point. - * @retval int - */ -int main(void) { + * @brief The application entry point. + * @retval int + */ +int main(void) +{ /* USER CODE BEGIN 1 */ @@ -136,7 +138,7 @@ int main(void) { #if defined(DUAL_CORE_BOOT_SYNC_SEQUENCE) int32_t timeout; #endif /* DUAL_CORE_BOOT_SYNC_SEQUENCE */ - /* USER CODE END Boot_Mode_Sequence_0 */ +/* USER CODE END Boot_Mode_Sequence_0 */ /* MPU Configuration--------------------------------------------------------*/ MPU_Config(); @@ -151,11 +153,10 @@ int main(void) { Error_Handler(); } #endif /* DUAL_CORE_BOOT_SYNC_SEQUENCE */ - /* USER CODE END Boot_Mode_Sequence_1 */ +/* USER CODE END Boot_Mode_Sequence_1 */ /* MCU Configuration--------------------------------------------------------*/ - /* Reset of all peripherals, Initializes the Flash interface and the Systick. - */ + /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ HAL_Init(); /* USER CODE BEGIN Init */ @@ -182,7 +183,7 @@ int main(void) { Error_Handler(); } #endif /* DUAL_CORE_BOOT_SYNC_SEQUENCE */ - /* USER CODE END Boot_Mode_Sequence_2 */ +/* USER CODE END Boot_Mode_Sequence_2 */ /* USER CODE BEGIN SysInit */ @@ -222,8 +223,7 @@ int main(void) { /* Create the thread(s) */ /* creation of defaultTask */ - defaultTaskHandle = - osThreadNew(StartDefaultTask, NULL, &defaultTask_attributes); + defaultTaskHandle = osThreadNew(StartDefaultTask, NULL, &defaultTask_attributes); /* creation of crankTask */ crankTaskHandle = osThreadNew(crankHandler, NULL, &crankTask_attributes); @@ -255,27 +255,27 @@ int main(void) { } /** - * @brief System Clock Configuration - * @retval None - */ -void SystemClock_Config(void) { + * @brief System Clock Configuration + * @retval None + */ +void SystemClock_Config(void) +{ RCC_OscInitTypeDef RCC_OscInitStruct = {0}; RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; /** Supply configuration update enable - */ + */ HAL_PWREx_ConfigSupply(PWR_LDO_SUPPLY); /** Configure the main internal regulator output voltage - */ + */ __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE0); - while (!__HAL_PWR_GET_FLAG(PWR_FLAG_VOSRDY)) { - } + while(!__HAL_PWR_GET_FLAG(PWR_FLAG_VOSRDY)) {} /** Initializes the RCC Oscillators according to the specified parameters - * in the RCC_OscInitTypeDef structure. - */ + * in the RCC_OscInitTypeDef structure. + */ RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; RCC_OscInitStruct.HSEState = RCC_HSE_ON; RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; @@ -288,15 +288,16 @@ void SystemClock_Config(void) { RCC_OscInitStruct.PLL.PLLRGE = RCC_PLL1VCIRANGE_3; RCC_OscInitStruct.PLL.PLLVCOSEL = RCC_PLL1VCOWIDE; RCC_OscInitStruct.PLL.PLLFRACN = 0; - if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) { + if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) + { Error_Handler(); } /** Initializes the CPU, AHB and APB buses clocks - */ - RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK | - RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2 | - RCC_CLOCKTYPE_D3PCLK1 | RCC_CLOCKTYPE_D1PCLK1; + */ + RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK + |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2 + |RCC_CLOCKTYPE_D3PCLK1|RCC_CLOCKTYPE_D1PCLK1; RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; RCC_ClkInitStruct.SYSCLKDivider = RCC_SYSCLK_DIV1; RCC_ClkInitStruct.AHBCLKDivider = RCC_HCLK_DIV2; @@ -305,17 +306,19 @@ void SystemClock_Config(void) { RCC_ClkInitStruct.APB2CLKDivider = RCC_APB2_DIV2; RCC_ClkInitStruct.APB4CLKDivider = RCC_APB4_DIV2; - if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK) { + if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK) + { Error_Handler(); } } /** - * @brief TIM2 Initialization Function - * @param None - * @retval None - */ -static void MX_TIM2_Init(void) { + * @brief TIM2 Initialization Function + * @param None + * @retval None + */ +static void MX_TIM2_Init(void) +{ /* USER CODE BEGIN TIM2_Init 0 */ @@ -334,44 +337,52 @@ static void MX_TIM2_Init(void) { htim2.Init.Period = 4294967295; htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV4; htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; - if (HAL_TIM_Base_Init(&htim2) != HAL_OK) { + if (HAL_TIM_Base_Init(&htim2) != HAL_OK) + { Error_Handler(); } sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL; - if (HAL_TIM_ConfigClockSource(&htim2, &sClockSourceConfig) != HAL_OK) { + if (HAL_TIM_ConfigClockSource(&htim2, &sClockSourceConfig) != HAL_OK) + { Error_Handler(); } - if (HAL_TIM_IC_Init(&htim2) != HAL_OK) { + if (HAL_TIM_IC_Init(&htim2) != HAL_OK) + { Error_Handler(); } sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; - if (HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig) != HAL_OK) { + if (HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig) != HAL_OK) + { Error_Handler(); } sConfigIC.ICPolarity = TIM_INPUTCHANNELPOLARITY_FALLING; sConfigIC.ICSelection = TIM_ICSELECTION_DIRECTTI; sConfigIC.ICPrescaler = TIM_ICPSC_DIV1; sConfigIC.ICFilter = 0; - if (HAL_TIM_IC_ConfigChannel(&htim2, &sConfigIC, TIM_CHANNEL_1) != HAL_OK) { + if (HAL_TIM_IC_ConfigChannel(&htim2, &sConfigIC, TIM_CHANNEL_1) != HAL_OK) + { Error_Handler(); } sConfigIC.ICPolarity = TIM_INPUTCHANNELPOLARITY_RISING; - if (HAL_TIM_IC_ConfigChannel(&htim2, &sConfigIC, TIM_CHANNEL_2) != HAL_OK) { + if (HAL_TIM_IC_ConfigChannel(&htim2, &sConfigIC, TIM_CHANNEL_2) != HAL_OK) + { Error_Handler(); } /* USER CODE BEGIN TIM2_Init 2 */ HAL_TIM_IC_Start_IT(&htim2, TIM_CHANNEL_1); HAL_TIM_IC_Start_IT(&htim2, TIM_CHANNEL_2); /* USER CODE END TIM2_Init 2 */ + } /** - * @brief GPIO Initialization Function - * @param None - * @retval None - */ -static void MX_GPIO_Init(void) { + * @brief GPIO Initialization Function + * @param None + * @retval None + */ +static void MX_GPIO_Init(void) +{ GPIO_InitTypeDef GPIO_InitStruct = {0}; /* USER CODE BEGIN MX_GPIO_Init_1 */ @@ -407,7 +418,8 @@ static void MX_GPIO_Init(void) { * @retval None */ /* USER CODE END Header_StartDefaultTask */ -void StartDefaultTask(void *argument) { +void StartDefaultTask(void *argument) +{ /* USER CODE BEGIN 5 */ /* Infinite loop */ for (;;) { @@ -416,62 +428,17 @@ void StartDefaultTask(void *argument) { /* USER CODE END 5 */ } -/* USER CODE BEGIN Header_crankHandler */ -/** - * @brief Function implementing the crankTask thread. - * @param argument: Not used - * @retval None - */ -/* USER CODE END Header_crankHandler */ -void crankHandler(void *argument) { - /* USER CODE BEGIN crankHandler */ - /* Infinite loop */ - for (;;) { - osThreadFlagsWait(0x01, osFlagsWaitAny, osWaitForever); -#ifdef DEBUG - SEGGER_RTT_printf(0, "Crank pulse detected at: %lu\n\r", - ringBufferRead(&state_g.crank_RB, 0)); -#endif /* ifdef DEBUG */ - if (state_g.sync == SYNC_OK) { - // TODO complete algorithm for scheduling spark - } - } - /* USER CODE END crankHandler */ -} + /* MPU Configuration */ -/* USER CODE BEGIN Header_camHandler */ -/** - * @brief Function implementing the camTask thread. - * @param argument: Not used - * @retval None - */ -/* USER CODE END Header_camHandler */ -void camHandler(void *argument) { - /* USER CODE BEGIN camHandler */ - /* Infinite loop */ - for (;;) { - osThreadFlagsWait(0x01, osFlagsWaitAny, osWaitForever); -#ifdef DEBUG - SEGGER_RTT_printf(0, "Cam pulse detected at: %lu\n\r", - ringBufferRead(&state_g.cam_RB, 0)); -#endif /* ifdef DEBUG */ - if (state_g.sync == SYNC_OK) { - // TODO complete algorithm for scheduling spark - } - } - /* USER CODE END camHandler */ -} - -/* MPU Configuration */ - -void MPU_Config(void) { +void MPU_Config(void) +{ MPU_Region_InitTypeDef MPU_InitStruct = {0}; /* Disables the MPU */ HAL_MPU_Disable(); /** Initializes and configures the Region and the memory to be protected - */ + */ MPU_InitStruct.Enable = MPU_REGION_ENABLE; MPU_InitStruct.Number = MPU_REGION_NUMBER0; MPU_InitStruct.BaseAddress = 0x0; @@ -487,13 +454,15 @@ void MPU_Config(void) { HAL_MPU_ConfigRegion(&MPU_InitStruct); /* Enables the MPU */ HAL_MPU_Enable(MPU_PRIVILEGED_DEFAULT); + } /** - * @brief This function is executed in case of error occurrence. - * @retval None - */ -void Error_Handler(void) { + * @brief This function is executed in case of error occurrence. + * @retval None + */ +void Error_Handler(void) +{ /* USER CODE BEGIN Error_Handler_Debug */ /* User can add his own implementation to report the HAL error return state */ __disable_irq(); @@ -503,13 +472,14 @@ void Error_Handler(void) { } #ifdef USE_FULL_ASSERT /** - * @brief Reports the name of the source file and the source line number - * where the assert_param error has occurred. - * @param file: pointer to the source file name - * @param line: assert_param error line source number - * @retval None - */ -void assert_failed(uint8_t *file, uint32_t line) { + * @brief Reports the name of the source file and the source line number + * where the assert_param error has occurred. + * @param file: pointer to the source file name + * @param line: assert_param error line source number + * @retval None + */ +void assert_failed(uint8_t *file, uint32_t line) +{ /* USER CODE BEGIN 6 */ /* User can add his own implementation to report the file name and line number, ex: printf("Wrong parameters value: file %s on line %d\r\n", file, diff --git a/STM32/CM7/Core/Src/tasks/cam.c b/STM32/CM7/Core/Src/tasks/cam.c new file mode 100644 index 0000000..ab5a39a --- /dev/null +++ b/STM32/CM7/Core/Src/tasks/cam.c @@ -0,0 +1,25 @@ +// Copyright (C) 2026 Hector van der Aa +// Copyright (C) 2026 Pierre Barbier +// Copyright (C) 2026 Association Exergie +// SPDX-License-Identifier: GPL-3.0-or-later + +#include "cmsis_os2.h" +#include "main.h" +#include "ring_buffer.h" +#include "tasks.h" +#ifdef DEBUG +#include "SEGGER_RTT.h" +#endif + +void camHandler(void *argument) { + for (;;) { + osThreadFlagsWait(0x01, osFlagsWaitAny, osWaitForever); +#ifdef DEBUG + SEGGER_RTT_printf(0, "Cam pulse detected at: %lu\n\r", + ringBufferRead(&state_g.cam_RB, 0)); +#endif /* ifdef DEBUG */ + if (state_g.sync == SYNC_OK) { + // TODO complete algorithm for scheduling spark + } + } +} diff --git a/STM32/CM7/Core/Src/tasks/crank.c b/STM32/CM7/Core/Src/tasks/crank.c new file mode 100644 index 0000000..9664726 --- /dev/null +++ b/STM32/CM7/Core/Src/tasks/crank.c @@ -0,0 +1,25 @@ +// Copyright (C) 2026 Hector van der Aa +// Copyright (C) 2026 Pierre Barbier +// Copyright (C) 2026 Association Exergie +// SPDX-License-Identifier: GPL-3.0-or-later + +#include "cmsis_os2.h" +#include "main.h" +#include "ring_buffer.h" +#include "tasks.h" +#ifdef DEBUG +#include "SEGGER_RTT.h" +#endif + +void crankHandler(void *argument) { + for (;;) { + osThreadFlagsWait(0x01, osFlagsWaitAny, osWaitForever); +#ifdef DEBUG + SEGGER_RTT_printf(0, "Crank pulse detected at: %lu\n\r", + ringBufferRead(&state_g.crank_RB, 0)); +#endif /* ifdef DEBUG */ + if (state_g.sync == SYNC_OK) { + // TODO complete algorithm for scheduling spark + } + } +} diff --git a/STM32/STM32.ioc b/STM32/STM32.ioc index ab09ad3..d1bd666 100644 --- a/STM32/STM32.ioc +++ b/STM32/STM32.ioc @@ -9,7 +9,7 @@ CortexM7.IPs=CORTEX_M7\:I,FATFS_M7\:I,FREERTOS_M7\:I,IWDG1\:I,OPENAMP_M7\:I,PDM2 CortexM7.Pins=PI12 FREERTOS_M7.FootprintOK=true FREERTOS_M7.IPParameters=Tasks01,configENABLE_FPU,FootprintOK -FREERTOS_M7.Tasks01=defaultTask,24,128,StartDefaultTask,Default,NULL,Dynamic,NULL,NULL;crankTask,55,128,crankHandler,Default,NULL,Static,crankTaskBuffer,crankTaskControlBlock;camTask,55,128,camHandler,Default,NULL,Static,camTaskBuffer,camTaskControlBlock +FREERTOS_M7.Tasks01=defaultTask,24,128,StartDefaultTask,Default,NULL,Dynamic,NULL,NULL;crankTask,55,128,crankHandler,As external,NULL,Static,crankTaskBuffer,crankTaskControlBlock;camTask,55,128,camHandler,As external,NULL,Static,camTaskBuffer,camTaskControlBlock FREERTOS_M7.configENABLE_FPU=1 File.Version=6 GPIO.groupedBy=Group By Peripherals