diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/main.c | 106 | ||||
| -rw-r--r-- | src/main_posix.c | 60 | ||||
| -rw-r--r-- | src/main_rtos.c | 147 |
3 files changed, 313 insertions, 0 deletions
diff --git a/src/main.c b/src/main.c new file mode 100644 index 0000000..b7c84d9 --- /dev/null +++ b/src/main.c @@ -0,0 +1,106 @@ +/** +****************************************************************************** +* @file : main.c +* @brief : Main program body +****************************************************************************** +* @attention +* +* +****************************************************************************** +*/ + +/* Standard library includes */ +#include <stdio.h> + +/* Library includes */ + +/* Project includes */ +#include "main.h" + +/** + * @brief The application entry point. + * @retval int + */ +int main(void) +{ + /* MCU Configuration */ + + /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ + HAL_Init(); + /* Configure the system clock */ + SystemClock_Config(); + + while (1) { + + } +} + +/** + * @brief System Clock Configuration + * @retval None + */ +void SystemClock_Config(void) +{ + RCC_OscInitTypeDef RCC_OscInitStruct = {0}; + RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; + + /** Configure the main internal regulator output voltage + */ + __HAL_RCC_PWR_CLK_ENABLE(); + __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE2); + /** Initializes the CPU, AHB and APB busses clocks + */ + RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI; + RCC_OscInitStruct.HSIState = RCC_HSI_ON; + RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT; + RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE; + if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) + { + Error_Handler(); + } + /** Initializes the CPU, AHB and APB busses clocks + */ + RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK + |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2; + RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI; + RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; + RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1; + RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; + + if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK) + { + Error_Handler(); + } +} + +/** + * @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 */ + while (1) { + HAL_GPIO_TogglePin(led_GPIO_Port, led_Pin); + HAL_Delay(1000); + } + /* USER CODE END Error_Handler_Debug */ +} + +#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) +{ + /* USER CODE BEGIN 6 */ + /* User can add his own implementation to report the file name and line number, + tex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */ + /* USER CODE END 6 */ +} +#endif /* USE_FULL_ASSERT */ diff --git a/src/main_posix.c b/src/main_posix.c new file mode 100644 index 0000000..ca48ef7 --- /dev/null +++ b/src/main_posix.c @@ -0,0 +1,60 @@ + +/* + * TODO Do conditional includes based on which target we are building for. + * Actually, target-specific includes should go in the port folder + * This should be specified in the master config file + * TODO This file should be moved to the posix port folder + * + */ + +/* FreeRTOS includes. */ +/* #include "FreeRTOS_POSIX.h" */ + +/* System headers. */ +#include <stdbool.h> +#include <string.h> +#include <stdio.h> + +/* (Ideally) platform-agnostic project includes. */ +#include "master_posix.h" +#include "main.h" +#include "port.h" + +/* FreeRTOS+POSIX. should go in the port folder */ +/* #include "FreeRTOS_POSIX/pthread.h" */ +/* #include "FreeRTOS_POSIX/mqueue.h" */ +/* #include "FreeRTOS_POSIX/time.h" */ +/* #include "FreeRTOS_POSIX/fcntl.h" */ +/* #include "FreeRTOS_POSIX/errno.h" */ + +/*-----------------------------------------------------------*/ + +/** + * @brief Main function; + * + * See the top of this file for detailed description. + */ +void vStartPOSIXMaster(void *pvParams) +{ + pthread_t handshake_thread, dataflow_thread, routing_thread; + + /* Stream initializations should be handled by the devicetree library once that's set up */ + + /* pthread_create(&handshake_thread, NULL, handshake_func, NULL); */ + pthread_create(&dataflow_thread, NULL, dataflow_func, NULL); + /* pthread_create(&routing_thread, NULL, routing_func, NULL); */ + + + /* This function will be defined for the port + * Each port will have a configuration file that includes details about the bus, + * either in a custom format or in a devicetree format (preferred) + * + */ + + /* Add device-specific stream/thread declerations here, if needed */ + /* ... */ + + /* This task was created with the native xTaskCreate() API function, so + must not run off the end of its implementing thread. */ + /* vTaskDelete(NULL); */ +} diff --git a/src/main_rtos.c b/src/main_rtos.c new file mode 100644 index 0000000..bcde7cf --- /dev/null +++ b/src/main_rtos.c @@ -0,0 +1,147 @@ +/* FreeRTOS includes. */ +#include "FreeRTOS.h" +#include "task.h" + +/* System headers */ +/* #include <stdio.h> */ + +/* Master include */ +#include "master_posix.h" + +/* Master task priority */ +#define mainPOSIX_MASTER_PRIORITY (tskIDLE_PRIORITY + 4) + +int main(void) +{ + configASSERT((mainPOSIX_MASTER_PRIORITY < configMAX_PRIORITIES)); + + /* const uint32_t ulLongTime_ms = pdMS_TO_TICKS(1000UL); */ + + /* Start the task to run POSIX Master */ + xTaskCreate(vStartPOSIXMaster, + "posix", + configMINIMAL_STACK_SIZE, + NULL, + mainPOSIX_MASTER_PRIORITY, + NULL); + + vTaskStartScheduler(); + + /* If all is well, the scheduler will now be running, and the following + * line will never be reached. If the following line does execute, then + * there was insufficient FreeRTOS heap memory available for the idle and/or + * timer tasks to be created. + */ + /* for(; ;) */ + /* { */ + /* /\* Sleep(ulLongTime_ms); *\/ */ + /* } */ + + return 0; +} + + +/*-----------------------------------------------------------*/ + +void vAssertCalled(const char * pcFile, + uint32_t ulLine) +{ + /* const uint32_t ulLongSleep = 1000UL; */ + volatile uint32_t ulBlockVariable = 0UL; + volatile char * pcFileName = ( volatile char * ) pcFile; + volatile uint32_t ulLineNumber = ulLine; + + (void) pcFileName; + (void) ulLineNumber; + + /* printf("vAssertCalled %s, %ld\n", pcFile, (long) ulLine); */ + /* fflush(stdout); */ + + /* Setting ulBlockVariable to a non-zero value in the debugger will allow + * this function to be exited. */ + taskDISABLE_INTERRUPTS(); + { + while(ulBlockVariable == 0UL) + { + /* Sleep(ulLongSleep); */ + } + } + taskENABLE_INTERRUPTS(); +} + +/*-----------------------------------------------------------*/ + +/* configUSE_STATIC_ALLOCATION is set to 1, so the application must provide an + * implementation of vApplicationGetIdleTaskMemory() to provide the memory that is + * used by the Idle task. */ +void vApplicationGetIdleTaskMemory(StaticTask_t ** ppxIdleTaskTCBBuffer, + StackType_t ** ppxIdleTaskStackBuffer, + uint32_t * pulIdleTaskStackSize) +{ + /* If the buffers to be provided to the Idle task are declared inside this + * function then they must be declared static - otherwise they will be allocated on + * the stack and so not exists after this function exits. */ + static StaticTask_t xIdleTaskTCB; + static StackType_t uxIdleTaskStack[ configMINIMAL_STACK_SIZE ]; + + /* Pass out a pointer to the StaticTask_t structure in which the Idle + * task's state will be stored. */ + *ppxIdleTaskTCBBuffer = &xIdleTaskTCB; + + /* Pass out the array that will be used as the Idle task's stack. */ + *ppxIdleTaskStackBuffer = uxIdleTaskStack; + + /* Pass out the size of the array pointed to by *ppxIdleTaskStackBuffer. + * Note that, as the array is necessarily of type StackType_t, + * configMINIMAL_STACK_SIZE is specified in words, not bytes. */ + *pulIdleTaskStackSize = configMINIMAL_STACK_SIZE; +} + +/*-----------------------------------------------------------*/ + +/* configUSE_STATIC_ALLOCATION and configUSE_TIMERS are both set to 1, so the + * application must provide an implementation of vApplicationGetTimerTaskMemory() + * to provide the memory that is used by the Timer service task. */ +void vApplicationGetTimerTaskMemory(StaticTask_t ** ppxTimerTaskTCBBuffer, + StackType_t ** ppxTimerTaskStackBuffer, + uint32_t * pulTimerTaskStackSize) +{ + /* If the buffers to be provided to the Timer task are declared inside this + * function then they must be declared static - otherwise they will be allocated on + * the stack and so not exists after this function exits. */ + static StaticTask_t xTimerTaskTCB; + static StackType_t uxTimerTaskStack[ configTIMER_TASK_STACK_DEPTH ]; + + /* Pass out a pointer to the StaticTask_t structure in which the Timer + * task's state will be stored. */ + *ppxTimerTaskTCBBuffer = &xTimerTaskTCB; + + /* Pass out the array that will be used as the Timer task's stack. */ + *ppxTimerTaskStackBuffer = uxTimerTaskStack; + + /* Pass out the size of the array pointed to by *ppxTimerTaskStackBuffer. + * Note that, as the array is necessarily of type StackType_t, + * configTIMER_TASK_STACK_DEPTH is specified in words, not bytes. */ + *pulTimerTaskStackSize = configTIMER_TASK_STACK_DEPTH; +} + +/*-----------------------------------------------------------*/ + +/** + * @brief Warn user if pvPortMalloc fails. + * + * Called if a call to pvPortMalloc() fails because there is insufficient + * free memory available in the FreeRTOS heap. pvPortMalloc() is called + * internally by FreeRTOS API functions that create tasks, queues, software + * timers, and semaphores. The size of the FreeRTOS heap is set by the + * configTOTAL_HEAP_SIZE configuration constant in FreeRTOSConfig.h. + * + */ +void vApplicationMallocFailedHook() +{ + taskDISABLE_INTERRUPTS(); + + for(;;) + { + } +} |
