aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/main.c106
-rw-r--r--src/main_posix.c60
-rw-r--r--src/main_rtos.c147
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(;;)
+ {
+ }
+}