diff --git a/.gitmodules b/.gitmodules index 9539495..2ccac16 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,6 @@ [submodule "SDK"] path = SDK url = https://git.minori.work/Embedded_SDK/MCUXpresso_MIMXRT1052xxxxB.git +[submodule "lib/FreeRTOS"] + path = lib/FreeRTOS + url = https://github.com/FreeRTOS/FreeRTOS-Kernel.git diff --git a/CMakeLists.txt b/CMakeLists.txt index 723bf2c..ab376ce 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -10,6 +10,7 @@ set(TARGET_LDSCRIPT_FLASH "${CMAKE_SOURCE_DIR}/SDK/devices/MIMXRT1052/gcc/MIMXRT set(TARGET_LDSCRIPT_RAM "${CMAKE_SOURCE_DIR}/SDK/devices/MIMXRT1052/gcc/MIMXRT1052xxxxx_ram.ld") set(TARGET_SOURCES + "SDK/components/lists/fsl_component_generic_list.c" "SDK/components/serial_manager/fsl_component_serial_manager.c" "SDK/components/serial_manager/fsl_component_serial_port_uart.c" "SDK/components/uart/fsl_adapter_lpuart.c" @@ -95,13 +96,16 @@ set(TARGET_SOURCES "board/dcd.c" "board/peripherals.c" "board/pin_mux.c" + "src/freertos_helpers.c" "src/main.c" "xip/lq_va1_flexspi_nor_config.c" ) set(TARGET_C_DEFINES "CPU_MIMXRT1052DVL6B" + "DEBUG_CONSOLE_TRANSFER_NON_BLOCKING" "MCUXPRESSO_SDK" + "SDK_OS_FREE_RTOS" "SERIAL_PORT_TYPE_UART" "__STARTUP_CLEAR_BSS" "__STARTUP_INITIALIZE_NONCACHEDATA" @@ -114,6 +118,7 @@ set(TARGET_C_DEFINES_XIP set(TARGET_C_INCLUDES "SDK/CMSIS/Core/Include" + "SDK/components/lists" "SDK/components/serial_manager" "SDK/components/uart" "SDK/devices/MIMXRT1052" @@ -127,6 +132,7 @@ set(TARGET_C_INCLUDES # Shared libraries linked with application set(TARGET_LIBS + "freertos_kernel" ) # Shared library and linker script search paths @@ -155,6 +161,11 @@ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${TARGET_CFLAGS_HARDWARE} -Wall - set(CMAKE_ASM_FLAGS "${CMAKE_ASM_FLAGS} ${CMAKE_C_FLAGS} -x assembler-with-cpp") set(CMAKE_EXE_LINKER_FLAGS "-specs=nano.specs -specs=nosys.specs -Wl,--gc-sections -Wl,--print-memory-usage -lc -lm -lnosys ") +# Add subdirectories here. +set(FREERTOS_CONFIG_FILE_DIRECTORY "${CMAKE_SOURCE_DIR}/include" CACHE STRING "") +set(FREERTOS_PORT "GCC_ARM_CM7" CACHE STRING "") +add_subdirectory(lib/FreeRTOS) + # Shared sources, includes and definitions add_compile_definitions(${TARGET_C_DEFINES}) include_directories(${TARGET_C_INCLUDES}) diff --git a/SDK b/SDK new file mode 160000 index 0000000..de50ed4 --- /dev/null +++ b/SDK @@ -0,0 +1 @@ +Subproject commit de50ed4c3da5fb2343a3e8f92b157a50a466452a diff --git a/include/FreeRTOSConfig.h b/include/FreeRTOSConfig.h new file mode 100644 index 0000000..3b20dd1 --- /dev/null +++ b/include/FreeRTOSConfig.h @@ -0,0 +1,132 @@ +#ifndef FREERTOS_CONFIG_H +#define FREERTOS_CONFIG_H + +/* Ensure definitions are only used by the compiler, and not by the assembler. */ +#if defined(__ICCARM__) || defined(__CC_ARM) || defined(__GNUC__) + #include + extern uint32_t SystemCoreClock; +#endif + +#define configUSE_PREEMPTION 1 +#define configUSE_PORT_OPTIMISED_TASK_SELECTION 0 +#define configUSE_TICKLESS_IDLE 0 +#define configCPU_CLOCK_HZ (SystemCoreClock) +#define configTICK_RATE_HZ 1000 +#define configMAX_PRIORITIES 63 +#define configMINIMAL_STACK_SIZE 128 +#define configMAX_TASK_NAME_LEN 16 +#define configUSE_16_BIT_TICKS 0 +#define configIDLE_SHOULD_YIELD 1 +#define configUSE_TASK_NOTIFICATIONS 1 +#define configTASK_NOTIFICATION_ARRAY_ENTRIES 3 +#define configUSE_MUTEXES 1 +#define configUSE_RECURSIVE_MUTEXES 1 +#define configUSE_COUNTING_SEMAPHORES 0 +#define configUSE_ALTERNATIVE_API 0 /* Deprecated! */ +#define configQUEUE_REGISTRY_SIZE 10 +#define configUSE_QUEUE_SETS 0 +#define configUSE_TIME_SLICING 0 +#define configUSE_NEWLIB_REENTRANT 1 +#define configENABLE_BACKWARD_COMPATIBILITY 0 +#define configNUM_THREAD_LOCAL_STORAGE_POINTERS 5 +#define configSTACK_DEPTH_TYPE uint16_t +#define configMESSAGE_BUFFER_LENGTH_TYPE size_t + +/* Memory allocation related definitions. */ +#define configSUPPORT_STATIC_ALLOCATION 0 +#define configSUPPORT_DYNAMIC_ALLOCATION 1 +#define configTOTAL_HEAP_SIZE 57344 +#define configAPPLICATION_ALLOCATED_HEAP 1 +#define configSTACK_ALLOCATION_FROM_SEPARATE_HEAP 0 + +/* Hook function related definitions. */ +#define configUSE_IDLE_HOOK 0 +#define configUSE_TICK_HOOK 0 +#define configCHECK_FOR_STACK_OVERFLOW 2 +#define configUSE_MALLOC_FAILED_HOOK 0 +#define configUSE_DAEMON_TASK_STARTUP_HOOK 0 + +/* Run time and task stats gathering related definitions. */ +#define configGENERATE_RUN_TIME_STATS 0 +#define configUSE_TRACE_FACILITY 0 +#define configUSE_STATS_FORMATTING_FUNCTIONS 0 + +/* Co-routine related definitions. */ +#define configUSE_CO_ROUTINES 0 +#define configMAX_CO_ROUTINE_PRIORITIES 1 + +/* Software timer related definitions. */ +#define configUSE_TIMERS 1 +#define configTIMER_TASK_PRIORITY 53 +#define configTIMER_QUEUE_LENGTH 10 +#define configTIMER_TASK_STACK_DEPTH configMINIMAL_STACK_SIZE + +/* =============================================================================================================== */ + +/* Cortex-M specific definitions. */ +#ifdef __NVIC_PRIO_BITS + /* __BVIC_PRIO_BITS will be specified when CMSIS is being used. */ + #define configPRIO_BITS __NVIC_PRIO_BITS +#else + #define configPRIO_BITS 4 +#endif +/* The lowest interrupt priority that can be used in a call to a "set priority" +function. */ +#define configLIBRARY_LOWEST_INTERRUPT_PRIORITY 15 +/* The highest interrupt priority that can be used by any interrupt service +routine that makes calls to interrupt safe FreeRTOS API functions. DO NOT CALL +INTERRUPT SAFE FREERTOS API FUNCTIONS FROM ANY INTERRUPT THAT HAS A HIGHER +PRIORITY THAN THIS! (higher priorities are lower numeric values. */ +#define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY 5 +/* Interrupt priorities used by the kernel port layer itself. These are generic +to all Cortex-M ports, and do not rely on any particular library functions. */ +#define configKERNEL_INTERRUPT_PRIORITY ( configLIBRARY_LOWEST_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) ) +/* !!!! configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to zero !!!! +See http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html. */ +#define configMAX_SYSCALL_INTERRUPT_PRIORITY ( configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) ) +/* Normal assert() semantics without relying on the provision of an assert.h +header file. */ +/* USER CODE BEGIN 1 */ +#define configASSERT( x ) if ((x) == 0) {taskDISABLE_INTERRUPTS(); for( ;; );} +/* USER CODE END 1 */ +/* Definitions that map the FreeRTOS port interrupt handlers to their CMSIS +standard names. */ +#define vPortSVCHandler SVC_Handler +#define xPortPendSVHandler PendSV_Handler +#define xPortSysTickHandler SysTick_Handler + +/* =============================================================================================================== */ + +/* FreeRTOS MPU specific definitions. */ +#define configINCLUDE_APPLICATION_DEFINED_PRIVILEGED_FUNCTIONS 0 +#define configTOTAL_MPU_REGIONS 8 /* Default value. */ +#define configTEX_S_C_B_FLASH 0x07UL /* Default value. */ +#define configTEX_S_C_B_SRAM 0x07UL /* Default value. */ +#define configENFORCE_SYSTEM_CALLS_FROM_KERNEL_ONLY 1 +#define configALLOW_UNPRIVILEGED_CRITICAL_SECTIONS 1 + +/* ARMv8-M secure side port related definitions. */ +#define secureconfigMAX_SECURE_CONTEXTS 5 + +/* Optional functions - most linkers will remove unused functions anyway. */ +#define INCLUDE_vTaskPrioritySet 1 +#define INCLUDE_uxTaskPriorityGet 1 +#define INCLUDE_vTaskDelete 1 +#define INCLUDE_vTaskSuspend 1 +#define INCLUDE_xResumeFromISR 1 +#define INCLUDE_vTaskDelayUntil 1 +#define INCLUDE_vTaskDelay 1 +#define INCLUDE_xTaskGetSchedulerState 1 +#define INCLUDE_xTaskGetCurrentTaskHandle 1 +#define INCLUDE_uxTaskGetStackHighWaterMark 1 +#define INCLUDE_xTaskGetIdleTaskHandle 0 +#define INCLUDE_eTaskGetState 0 +#define INCLUDE_xEventGroupSetBitFromISR 1 +#define INCLUDE_xTimerPendFunctionCall 1 +#define INCLUDE_xTaskAbortDelay 0 +#define INCLUDE_xTaskGetHandle 0 +#define INCLUDE_xTaskResumeFromISR 1 + +/* A header file that defines trace macro can be included here. */ + +#endif /* FREERTOS_CONFIG_H */ \ No newline at end of file diff --git a/lib/FreeRTOS b/lib/FreeRTOS new file mode 160000 index 0000000..daf544f --- /dev/null +++ b/lib/FreeRTOS @@ -0,0 +1 @@ +Subproject commit daf544fbc4973d57a08906a6ac40ec35b913e729 diff --git a/src/freertos_helpers.c b/src/freertos_helpers.c new file mode 100644 index 0000000..a3f0a0d --- /dev/null +++ b/src/freertos_helpers.c @@ -0,0 +1,12 @@ +#include "FreeRTOS.h" +#include "task.h" + +#include "fsl_debug_console.h" + +uint8_t ucHeap[configTOTAL_HEAP_SIZE] __attribute__((section(".freertos_heap"))); + +void vApplicationStackOverflowHook(TaskHandle_t pxTask, char *pcTaskName) { + for(;;) { + __WFI(); + } +} \ No newline at end of file diff --git a/src/main.c b/src/main.c index 457bf1b..9e1f1d2 100644 --- a/src/main.c +++ b/src/main.c @@ -1,10 +1,18 @@ +/* FreeRTOS */ +#include "FreeRTOS.h" +#include "task.h" + +/* Board support package */ #include "board.h" #include "clock_config.h" #include "peripherals.h" #include "pin_mux.h" +/* Debug console */ #include "fsl_debug_console.h" +static void vTaskHello(void *pvParameters); + int main(void) { BOARD_InitBootPins(); BOARD_InitBootClocks(); @@ -14,11 +22,29 @@ int main(void) { CLOCK_SetMode(kCLOCK_ModeRun); - GPIO_WritePinOutput(BOARD_INITPINS_LED_R_GPIO, BOARD_INITPINS_LED_R_PIN, 0U); - GPIO_WritePinOutput(BOARD_INITPINS_LED_G_GPIO, BOARD_INITPINS_LED_G_PIN, 0U); - GPIO_WritePinOutput(BOARD_INITPINS_LED_B_GPIO, BOARD_INITPINS_LED_B_PIN, 0U); + xTaskCreate(vTaskHello, "tHELLO", 128, NULL, 32, NULL); + + vTaskStartScheduler(); for (;;) { __WFI(); } } + +static void vTaskHello(void *pvParameters) { + uint8_t i = 0; + + PRINTF("Hello world task started.\r\n"); + + for(;;) { + vTaskDelay(pdMS_TO_TICKS(100)); + + GPIO_WritePinOutput(BOARD_INITPINS_LED_R_GPIO, BOARD_INITPINS_LED_R_PIN, ((i & 1U) ? 1 : 0)); + GPIO_WritePinOutput(BOARD_INITPINS_LED_G_GPIO, BOARD_INITPINS_LED_G_PIN, ((i & 2U) ? 1 : 0)); + GPIO_WritePinOutput(BOARD_INITPINS_LED_B_GPIO, BOARD_INITPINS_LED_B_PIN, ((i & 4U) ? 1 : 0)); + + if(i++ == 7) { + i = 0; + } + } +} \ No newline at end of file