diff --git a/FreeRTOS/Test/Target/boards/pico/CMakeLists.txt b/FreeRTOS/Test/Target/boards/pico/CMakeLists.txt new file mode 100644 index 0000000000..c4dffb3dc0 --- /dev/null +++ b/FreeRTOS/Test/Target/boards/pico/CMakeLists.txt @@ -0,0 +1,34 @@ +# Note that this file can be used as a top level CMakeLists.txt to build all the Demos (it includes +# them all, but they are usable in their own right, which is why no common work is done here) + +# The tests are defined here: https://quip-amazon.com/78LdAeL2txGu/Test-Plan + +cmake_minimum_required(VERSION 3.13) + +set(UNITY_DIR ${CMAKE_CURRENT_LIST_DIR}/../../../CMock/CMock/vendor/unity) + +include(pico_sdk_import.cmake) + +PROJECT(Tests) + +include(CTest) + +add_library(unity STATIC + "${UNITY_DIR}/src/unity.c") +target_include_directories(unity PUBLIC + "${UNITY_DIR}/src/") + +# Find all subdirectories in tests folder then add them by add_subdirectory +file(GLOB_RECURSE SUBDIRS_TESTS_FILES tests/*) +SET(test_dir_list "") + +foreach(file_name ${SUBDIRS_TESTS_FILES}) + get_filename_component( dir_path ${file_name} PATH ) + LIST( APPEND test_dir_list ${dir_path}) +endforeach() +LIST(REMOVE_DUPLICATES test_dir_list) + +foreach(dir_name ${test_dir_list}) + message( STATUS "add subdirectory " ${dir_name} ) + add_subdirectory( ${dir_name} ) +endforeach() \ No newline at end of file diff --git a/FreeRTOS/Test/Target/boards/pico/FreeRTOSConfig.h b/FreeRTOS/Test/Target/boards/pico/FreeRTOSConfig.h new file mode 100644 index 0000000000..a947b7fdeb --- /dev/null +++ b/FreeRTOS/Test/Target/boards/pico/FreeRTOSConfig.h @@ -0,0 +1,140 @@ +/* + * FreeRTOS V202212.00 + * Copyright (C) 2022 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef FREERTOS_CONFIG_H +#define FREERTOS_CONFIG_H + +/*----------------------------------------------------------- +* Application specific definitions. +* +* These definitions should be adjusted for your particular hardware and +* application requirements. +* +* THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE +* FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE. +* +* See http://www.freertos.org/a00110.html +*----------------------------------------------------------*/ + +/* Scheduler Related */ +#define configUSE_TICKLESS_IDLE 0 +#define configUSE_IDLE_HOOK 0 +#define configUSE_TICK_HOOK 1 +#define configTICK_RATE_HZ ( ( TickType_t ) 1000 ) +#define configMAX_PRIORITIES 32 +#define configMINIMAL_STACK_SIZE ( configSTACK_DEPTH_TYPE ) 256 +#define configUSE_16_BIT_TICKS 0 +#define configIDLE_SHOULD_YIELD 1 + +/* Synchronization Related */ +#define configUSE_MUTEXES 1 +#define configUSE_RECURSIVE_MUTEXES 1 +#define configUSE_APPLICATION_TASK_TAG 0 +#define configUSE_COUNTING_SEMAPHORES 1 +#define configQUEUE_REGISTRY_SIZE 8 +#define configUSE_QUEUE_SETS 1 +#define configUSE_TIME_SLICING 1 +#define configUSE_NEWLIB_REENTRANT 0 +#define configENABLE_BACKWARD_COMPATIBILITY 0 +#define configNUM_THREAD_LOCAL_STORAGE_POINTERS 5 + +/* System */ +#define configSTACK_DEPTH_TYPE uint32_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 ( 128 * 1024 ) +#define configAPPLICATION_ALLOCATED_HEAP 0 + +/* Hook function related definitions. */ +#define configCHECK_FOR_STACK_OVERFLOW 2 +#define configUSE_MALLOC_FAILED_HOOK 1 +#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 1 +#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 ( configMAX_PRIORITIES - 1 ) +#define configTIMER_QUEUE_LENGTH 10 +#define configTIMER_TASK_STACK_DEPTH 1024 + +/* Interrupt nesting behaviour configuration. */ + +/* + #define configKERNEL_INTERRUPT_PRIORITY [dependent of processor] + #define configMAX_SYSCALL_INTERRUPT_PRIORITY [dependent on processor and application] + #define configMAX_API_CALL_INTERRUPT_PRIORITY [dependent on processor and application] + */ + +/* SMP port only */ +#define configNUMBER_OF_CORES 2 +#define configTICK_CORE 1 +#define configRUN_MULTIPLE_PRIORITIES 1 +#define configUSE_CORE_AFFINITY 1 +#define configUSE_MINIMAL_IDLE_HOOK 0 +#define configUSE_TASK_PREEMPTION_DISABLE 0 + +/* RP2040 specific */ +#define configSUPPORT_PICO_SYNC_INTEROP 1 +#define configSUPPORT_PICO_TIME_INTEROP 1 + +#include +/* Define to trap errors during development. */ +#define configASSERT( x ) assert( x ) + +/* Set the following definitions to 1 to include the API function, or zero + * to exclude the API function. */ +#define INCLUDE_vTaskPrioritySet 1 +#define INCLUDE_uxTaskPriorityGet 1 +#define INCLUDE_vTaskDelete 1 +#define INCLUDE_vTaskSuspend 1 +#define INCLUDE_vTaskDelayUntil 1 +#define INCLUDE_vTaskDelay 1 +#define INCLUDE_xTaskGetSchedulerState 1 +#define INCLUDE_xTaskGetCurrentTaskHandle 1 +#define INCLUDE_uxTaskGetStackHighWaterMark 1 +#define INCLUDE_xTaskGetIdleTaskHandle 1 +#define INCLUDE_eTaskGetState 1 +#define INCLUDE_xTimerPendFunctionCall 1 +#define INCLUDE_xTaskAbortDelay 1 +#define INCLUDE_xTaskGetHandle 1 +#define INCLUDE_xTaskResumeFromISR 1 +#define INCLUDE_xQueueGetMutexHolder 1 +/* A header file that defines trace macro can be included here. */ + +#include "test_config.h" + +#endif /* FREERTOS_CONFIG_H */ diff --git a/FreeRTOS/Test/Target/boards/pico/FreeRTOS_Kernel_import.cmake b/FreeRTOS/Test/Target/boards/pico/FreeRTOS_Kernel_import.cmake new file mode 100644 index 0000000000..30f4575889 --- /dev/null +++ b/FreeRTOS/Test/Target/boards/pico/FreeRTOS_Kernel_import.cmake @@ -0,0 +1,63 @@ +# This is a copy of /portable/ThirdParty/GCC/RP2040/FREERTOS_KERNEL_import.cmake + +# This can be dropped into an external project to help locate the FreeRTOS kernel +# It should be include()ed prior to project(). Alternatively this file may +# or the CMakeLists.txt in this directory may be included or added via add_subdirectory +# respectively. + +if (DEFINED ENV{FREERTOS_KERNEL_PATH} AND (NOT FREERTOS_KERNEL_PATH)) + set(FREERTOS_KERNEL_PATH $ENV{FREERTOS_KERNEL_PATH}) + message("Using FREERTOS_KERNEL_PATH from environment ('${FREERTOS_KERNEL_PATH}')") +endif () + +set(FREERTOS_KERNEL_RP2040_RELATIVE_PATH "portable/ThirdParty/GCC/RP2040") +# undo the above +set(FREERTOS_KERNEL_RP2040_BACK_PATH "../../../..") + +if (NOT FREERTOS_KERNEL_PATH) + # check if we are inside the FreeRTOS kernel tree (i.e. this file has been included directly) + get_filename_component(_ACTUAL_PATH ${CMAKE_CURRENT_LIST_DIR} REALPATH) + get_filename_component(_POSSIBLE_PATH ${CMAKE_CURRENT_LIST_DIR}/${FREERTOS_KERNEL_RP2040_BACK_PATH}/${FREERTOS_KERNEL_RP2040_RELATIVE_PATH} REALPATH) + if (_ACTUAL_PATH STREQUAL _POSSIBLE_PATH) + get_filename_component(FREERTOS_KERNEL_PATH ${CMAKE_CURRENT_LIST_DIR}/${FREERTOS_KERNEL_RP2040_BACK_PATH} REALPATH) + endif() + if (_ACTUAL_PATH STREQUAL _POSSIBLE_PATH) + get_filename_component(FREERTOS_KERNEL_PATH ${CMAKE_CURRENT_LIST_DIR}/${FREERTOS_KERNEL_RP2040_BACK_PATH} REALPATH) + message("Setting FREERTOS_KERNEL_PATH to ${FREERTOS_KERNEL_PATH} based on location of FreeRTOS-Kernel-import.cmake") + elseif (PICO_SDK_PATH AND EXISTS "${PICO_SDK_PATH}/../FreeRTOS-Kernel") + set(FREERTOS_KERNEL_PATH ${PICO_SDK_PATH}/../FreeRTOS-Kernel) + message("Defaulting FREERTOS_KERNEL_PATH as sibling of PICO_SDK_PATH: ${FREERTOS_KERNEL_PATH}") + endif() +endif () + +if (NOT FREERTOS_KERNEL_PATH) + foreach(POSSIBLE_SUFFIX Source FreeRTOS-Kernel FreeRTOS/Source) + # check if FreeRTOS-Kernel exists under directory that included us + set(SEARCH_ROOT ${CMAKE_CURRENT_SOURCE_DIR}}) + set(SEARCH_ROOT ../../../..) + get_filename_component(_POSSIBLE_PATH ${SEARCH_ROOT}/${POSSIBLE_SUFFIX} REALPATH) + if (EXISTS ${_POSSIBLE_PATH}/${FREERTOS_KERNEL_RP2040_RELATIVE_PATH}/CMakeLists.txt) + get_filename_component(FREERTOS_KERNEL_PATH ${_POSSIBLE_PATH} REALPATH) + message("Setting FREERTOS_KERNEL_PATH to '${FREERTOS_KERNEL_PATH}' found relative to enclosing project") + break() + endif() + endforeach() +endif() + +if (NOT FREERTOS_KERNEL_PATH) + message(FATAL_ERROR "FreeRTOS location was not specified. Please set FREERTOS_KERNEL_PATH.") +endif() + +set(FREERTOS_KERNEL_PATH "${FREERTOS_KERNEL_PATH}" CACHE PATH "Path to the FreeRTOS Kernel") + +get_filename_component(FREERTOS_KERNEL_PATH "${FREERTOS_KERNEL_PATH}" REALPATH BASE_DIR "${CMAKE_BINARY_DIR}") +if (NOT EXISTS ${FREERTOS_KERNEL_PATH}) + message(FATAL_ERROR "Directory '${FREERTOS_KERNEL_PATH}' not found") +endif() +if (NOT EXISTS ${FREERTOS_KERNEL_PATH}/${FREERTOS_KERNEL_RP2040_RELATIVE_PATH}/CMakeLists.txt) + message(FATAL_ERROR "Directory '${FREERTOS_KERNEL_PATH}' does not contain an RP2040 port here: ${FREERTOS_KERNEL_RP2040_RELATIVE_PATH}") +endif() +set(FREERTOS_KERNEL_PATH ${FREERTOS_KERNEL_PATH} CACHE PATH "Path to the FreeRTOS_KERNEL" FORCE) + +add_subdirectory(${FREERTOS_KERNEL_PATH}/${FREERTOS_KERNEL_RP2040_RELATIVE_PATH} FREERTOS_KERNEL) +set(TARGET_INCLUDE_PATH ${FREERTOS_KERNEL_PATH}/${FREERTOS_KERNEL_RP2040_RELATIVE_PATH}/include) \ No newline at end of file diff --git a/FreeRTOS/Test/Target/boards/pico/main.c b/FreeRTOS/Test/Target/boards/pico/main.c new file mode 100644 index 0000000000..b17dcacce9 --- /dev/null +++ b/FreeRTOS/Test/Target/boards/pico/main.c @@ -0,0 +1,123 @@ +/* + * FreeRTOS V202212.00 + * Copyright (C) 2022 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/** + * @file main.c + * @brief The implementation of main function to start test runner task. + * + * Procedure: + * - Initialize environment. + * - Run the test case. + */ + +/* Kernel includes. */ +#include "FreeRTOS.h" /* Must come first. */ +#include "task.h" /* RTOS task related API prototypes. */ + +/* Unity includes. */ +#include "unity.h" + +/* Pico includes. */ +#include "pico/multicore.h" +#include "pico/stdlib.h" + +/*-----------------------------------------------------------*/ + +/** + * Initialize required peripherals. + */ +static void prvInitializeHardware( void ); + +/** + * @brief Run test. + */ +extern void vRunTest( void ); +/*-----------------------------------------------------------*/ + +static void prvInitializeHardware( void ) +{ + /* Needed for printf. */ + stdio_init_all(); + + while( !stdio_usb_connected() ) + { + sleep_ms( 250 ); + } +} +/*-----------------------------------------------------------*/ + +void vApplicationStackOverflowHook( TaskHandle_t xTask, + char * pcTaskName ) +{ + ( void ) pcTaskName; + ( void ) xTask; + + printf( "ERROR: Stack Overflow\n\0" ); + + /* Run time stack overflow checking is performed if + * configCHECK_FOR_STACK_OVERFLOW is defined to 1 or 2. This hook + * function is called if a stack overflow is detected. pxCurrentTCB can be + * inspected in the debugger if the task name passed into this function is + * corrupt. */ + for( ; ; ) + { + /* Always running, put asm here to avoid optimization by compiler. */ + __asm volatile ( "nop" ); + } +} +/*-----------------------------------------------------------*/ + +void vApplicationTickHook( void ) +{ +} +/*-----------------------------------------------------------*/ + +void vApplicationMallocFailedHook( void ) +{ + printf( "ERROR: Malloc Failed\n\0" ); + + for( ; ; ) + { + /* Always running, put asm here to avoid optimization by compiler. */ + __asm volatile ( "nop" ); + } +} +/*-----------------------------------------------------------*/ + +int main( void ) +{ + prvInitializeHardware(); + + vRunTest(); + + vTaskStartScheduler(); + + /* Should never reach here. */ + panic_unsupported(); + + return 0; +} +/*-----------------------------------------------------------*/ diff --git a/FreeRTOS/Test/Target/boards/pico/pico_sdk_import.cmake b/FreeRTOS/Test/Target/boards/pico/pico_sdk_import.cmake new file mode 100644 index 0000000000..12ac53d01c --- /dev/null +++ b/FreeRTOS/Test/Target/boards/pico/pico_sdk_import.cmake @@ -0,0 +1,89 @@ +# This is a copy of /external/pico_sdk_import.cmake + +# This can be dropped into an external project to help locate this SDK +# It should be include()ed prior to project() + +set(BOARD_LINK_LIBRARIES pico_stdlib pico_multicore unity) +set(BOARD_DEFINES PICO_STACK_SIZE=0x1000 TARGET_RASPBERRY_PICO=1) +set(BOARD_INCLUDE_PATHS "${UNITY_DIR}/src/" + ${CMAKE_CURRENT_LIST_DIR}) +set(BOARD_LIBRARY_DIR ${CMAKE_CURRENT_LIST_DIR} CACHE INTERNAL "") + +if (DEFINED ENV{PICO_SDK_PATH} AND (NOT PICO_SDK_PATH)) + set(PICO_SDK_PATH $ENV{PICO_SDK_PATH}) + message("Using PICO_SDK_PATH from environment ('${PICO_SDK_PATH}')") +endif () + +if (DEFINED ENV{PICO_SDK_FETCH_FROM_GIT} AND (NOT PICO_SDK_FETCH_FROM_GIT)) + set(PICO_SDK_FETCH_FROM_GIT $ENV{PICO_SDK_FETCH_FROM_GIT}) + message("Using PICO_SDK_FETCH_FROM_GIT from environment ('${PICO_SDK_FETCH_FROM_GIT}')") +endif () + +if (DEFINED ENV{PICO_SDK_FETCH_FROM_GIT_PATH} AND (NOT PICO_SDK_FETCH_FROM_GIT_PATH)) + set(PICO_SDK_FETCH_FROM_GIT_PATH $ENV{PICO_SDK_FETCH_FROM_GIT_PATH}) + message("Using PICO_SDK_FETCH_FROM_GIT_PATH from environment ('${PICO_SDK_FETCH_FROM_GIT_PATH}')") +endif () + +set(PICO_SDK_PATH "${PICO_SDK_PATH}" CACHE PATH "Path to the Raspberry Pi Pico SDK") +set(PICO_SDK_FETCH_FROM_GIT "${PICO_SDK_FETCH_FROM_GIT}" CACHE BOOL "Set to ON to fetch copy of SDK from git if not otherwise locatable") +set(PICO_SDK_FETCH_FROM_GIT_PATH "${PICO_SDK_FETCH_FROM_GIT_PATH}" CACHE FILEPATH "location to download SDK") + +if (NOT PICO_SDK_PATH) + if (PICO_SDK_FETCH_FROM_GIT) + include(FetchContent) + set(FETCHCONTENT_BASE_DIR_SAVE ${FETCHCONTENT_BASE_DIR}) + if (PICO_SDK_FETCH_FROM_GIT_PATH) + get_filename_component(FETCHCONTENT_BASE_DIR "${PICO_SDK_FETCH_FROM_GIT_PATH}" REALPATH BASE_DIR "${CMAKE_SOURCE_DIR}") + endif () + FetchContent_Declare( + pico_sdk + GIT_REPOSITORY https://github.com/raspberrypi/pico-sdk + GIT_TAG master + ) + if (NOT pico_sdk) + message("Downloading Raspberry Pi Pico SDK") + FetchContent_Populate(pico_sdk) + set(PICO_SDK_PATH ${pico_sdk_SOURCE_DIR}) + endif () + set(FETCHCONTENT_BASE_DIR ${FETCHCONTENT_BASE_DIR_SAVE}) + else () + message(FATAL_ERROR + "SDK location was not specified. Please set PICO_SDK_PATH or set PICO_SDK_FETCH_FROM_GIT to on to fetch from git." + ) + endif () +endif () + +get_filename_component(PICO_SDK_PATH "${PICO_SDK_PATH}" REALPATH BASE_DIR "${CMAKE_BINARY_DIR}") +if (NOT EXISTS ${PICO_SDK_PATH}) + message(FATAL_ERROR "Directory '${PICO_SDK_PATH}' not found") +endif () + +set(PICO_SDK_INIT_CMAKE_FILE ${PICO_SDK_PATH}/pico_sdk_init.cmake) +if (NOT EXISTS ${PICO_SDK_INIT_CMAKE_FILE}) + message(FATAL_ERROR "Directory '${PICO_SDK_PATH}' does not appear to contain the Raspberry Pi Pico SDK") +endif () + +set(PICO_SDK_PATH ${PICO_SDK_PATH} CACHE PATH "Path to the Raspberry Pi Pico SDK" FORCE) + +include(${PICO_SDK_INIT_CMAKE_FILE}) + +include(${CMAKE_CURRENT_LIST_DIR}/FreeRTOS_Kernel_import.cmake) + +set(BOARD_INC_PATHS ${CMAKE_CURRENT_LIST_DIR} ${TARGET_INCLUDE_PATH}) + +pico_sdk_init() + +# one of the following directories need be included, why is it not? +# /home/ubuntu/pico/pico-sdk/src/host/pico_multicore/include +# /home/ubuntu/pico/pico-sdk/src/rp2_common/pico_multicore/include + +get_cmake_property(_variableNames VARIABLES) +list (SORT _variableNames) +foreach (_variableName ${_variableNames}) + message(STATUS "${_variableName}=${${_variableName}}") +endforeach() + +macro(enable_board_functions EXECUTABLE_NAME) + pico_enable_stdio_usb(${EXECUTABLE_NAME} 1) + pico_add_extra_outputs(${EXECUTABLE_NAME}) +endmacro() \ No newline at end of file diff --git a/FreeRTOS/Test/Target/boards/pico/tests/smp/multiple_tasks_running/CMakeLists.txt b/FreeRTOS/Test/Target/boards/pico/tests/smp/multiple_tasks_running/CMakeLists.txt new file mode 100644 index 0000000000..7a84dcf135 --- /dev/null +++ b/FreeRTOS/Test/Target/boards/pico/tests/smp/multiple_tasks_running/CMakeLists.txt @@ -0,0 +1,33 @@ +cmake_minimum_required(VERSION 3.13) + +project(example C CXX ASM) +set(CMAKE_C_STANDARD 11) +set(CMAKE_CXX_STANDARD 17) + +set(TEST_INCLUDE_PATHS ${CMAKE_CURRENT_LIST_DIR}/../../../../../tests/smp/multiple_tasks_running) +set(TEST_SOURCE_DIR ${CMAKE_CURRENT_LIST_DIR}/../../../../../tests/smp/multiple_tasks_running) + +add_library(multiple_tasks_running INTERFACE) +target_sources(multiple_tasks_running INTERFACE + ${BOARD_LIBRARY_DIR}/main.c + ${CMAKE_CURRENT_LIST_DIR}/multiple_tasks_running_test_runner.c + ${TEST_SOURCE_DIR}/multiple_tasks_running.c) + +target_include_directories(multiple_tasks_running INTERFACE + ${CMAKE_CURRENT_LIST_DIR}/../../.. + ${TEST_INCLUDE_PATHS} + ) + +target_link_libraries(multiple_tasks_running INTERFACE + FreeRTOS-Kernel + FreeRTOS-Kernel-Heap4 + ${BOARD_LINK_LIBRARIES}) + +add_executable(test_multiple_tasks_running) +enable_board_functions(test_multiple_tasks_running) +target_link_libraries(test_multiple_tasks_running multiple_tasks_running) +target_include_directories(test_multiple_tasks_running PUBLIC + ${BOARD_INCLUDE_PATHS}) +target_compile_definitions(test_multiple_tasks_running PRIVATE + ${BOARD_DEFINES} +) diff --git a/FreeRTOS/Test/Target/boards/pico/tests/smp/multiple_tasks_running/multiple_tasks_running_test_runner.c b/FreeRTOS/Test/Target/boards/pico/tests/smp/multiple_tasks_running/multiple_tasks_running_test_runner.c new file mode 100644 index 0000000000..fd2e299d21 --- /dev/null +++ b/FreeRTOS/Test/Target/boards/pico/tests/smp/multiple_tasks_running/multiple_tasks_running_test_runner.c @@ -0,0 +1,76 @@ +/* + * FreeRTOS V202212.00 + * Copyright (C) 2022 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/** + * @file multiple_tasks_running_test_runner.c + * @brief The implementation of test runner task which runs the test. + */ + +/* Kernel includes. */ +#include "FreeRTOS.h" /* Must come first. */ +#include "task.h" /* RTOS task related API prototypes. */ + +/* Unity includes. */ +#include "unity.h" + +/* Pico includes. */ +#include "pico/multicore.h" +#include "pico/stdlib.h" + +/*-----------------------------------------------------------*/ + +/** + * @brief The task that runs the test. + */ +static void prvTestRunnerTask( void * pvParameters ); + +/** + * @brief The test case to run. + */ +extern void vRunMultipleTasksRunningTest( void ); +/*-----------------------------------------------------------*/ + +static void prvTestRunnerTask( void * pvParameters ) +{ + ( void ) pvParameters; + + /* Run test case. */ + vRunMultipleTasksRunningTest(); + + vTaskDelete( NULL ); +} +/*-----------------------------------------------------------*/ + +void vRunTest( void ) +{ + xTaskCreate( prvTestRunnerTask, + "testRunner", + configMINIMAL_STACK_SIZE, + NULL, + configMAX_PRIORITIES - 1, + NULL ); +} +/*-----------------------------------------------------------*/ diff --git a/FreeRTOS/Test/Target/tests/smp/multiple_tasks_running/multiple_tasks_running.c b/FreeRTOS/Test/Target/tests/smp/multiple_tasks_running/multiple_tasks_running.c new file mode 100644 index 0000000000..035e2699d8 --- /dev/null +++ b/FreeRTOS/Test/Target/tests/smp/multiple_tasks_running/multiple_tasks_running.c @@ -0,0 +1,156 @@ +/* + * FreeRTOS V202212.00 + * Copyright (C) 2022 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/** + * @file multiple_tasks_running.c + * @brief The user shall be able to schedule tasks across multiple identical processor cores + * with one instance of FreeRTOS scheduler. + * + * Procedure: + * - Create ( num of cores - 1 ) tasks and keep them in busy loop. + * Expected: + * - All tasks are in running state. + */ + +/* Kernel includes. */ +#include "FreeRTOS.h" /* Must come first. */ +#include "task.h" /* RTOS task related API prototypes. */ + +/* Unity includes. */ +#include "unity.h" +/*-----------------------------------------------------------*/ + +#ifndef TEST_CONFIG_H + #error test_config.h must be included at the end of FreeRTOSConfig.h. +#endif + +#if ( configNUMBER_OF_CORES < 2 ) + #error This test is for FreeRTOS SMP and therefore, requires at least 2 cores. +#endif /* if configNUMBER_OF_CORES != 2 */ + +#if ( configRUN_MULTIPLE_PRIORITIES != 1 ) + #error configRUN_MULTIPLE_PRIORITIES must be set to 1 for this test. +#endif /* if ( configRUN_MULTIPLE_PRIORITIES != 1 ) */ + +#if ( configMAX_PRIORITIES <= 2 ) + #error configMAX_PRIORITIES must be larger than 2 to avoid scheduling idle tasks unexpectedly. +#endif /* if ( configMAX_PRIORITIES <= 2 ) */ +/*-----------------------------------------------------------*/ + +/** + * @brief Function that implements a never blocking FreeRTOS task. + */ +static void prvEverRunningTask( void * pvParameters ); + +/** + * @brief Test case "Multiple Tasks Running". + */ +static void Test_MultipleTasksRunning( void ); +/*-----------------------------------------------------------*/ + +/** + * @brief Handles of the tasks created in this test. + */ +static TaskHandle_t xTaskHandles[ configNUMBER_OF_CORES - 1 ]; +/*-----------------------------------------------------------*/ + +static void Test_MultipleTasksRunning( void ) +{ + int i; + eTaskState xTaskState; + + /* Delay for other cores to run tasks. */ + vTaskDelay( pdMS_TO_TICKS( 10 ) ); + + /* Ensure that all the tasks are running. */ + for( i = 0; i < ( configNUMBER_OF_CORES - 1 ); i++ ) + { + xTaskState = eTaskGetState( xTaskHandles[ i ] ); + + TEST_ASSERT_EQUAL_MESSAGE( eRunning, xTaskState, "Task is not running." ); + } +} +/*-----------------------------------------------------------*/ + +static void prvEverRunningTask( void * pvParameters ) +{ + /* Silence warnings about unused parameters. */ + ( void ) pvParameters; + + for( ; ; ) + { + /* Always running, put asm here to avoid optimization by compiler. */ + __asm volatile ( "nop" ); + } +} +/*-----------------------------------------------------------*/ + +/* Runs before every test, put init calls here. */ +void setUp( void ) +{ + int i; + BaseType_t xTaskCreationResult; + + /* Create configNUMBER_OF_CORES - 1 low priority tasks. */ + for( i = 0; i < ( configNUMBER_OF_CORES - 1 ); i++ ) + { + xTaskCreationResult = xTaskCreate( prvEverRunningTask, + "EverRunning", + configMINIMAL_STACK_SIZE, + NULL, + configMAX_PRIORITIES - 2, + &( xTaskHandles[ i ] ) ); + + TEST_ASSERT_EQUAL_MESSAGE( pdPASS, xTaskCreationResult, "Task creation failed." ); + } +} +/*-----------------------------------------------------------*/ + +/* Runs after every test, put clean-up calls here. */ +void tearDown( void ) +{ + int i; + + /* Delete all the tasks. */ + for( i = 0; i < ( configNUMBER_OF_CORES - 1 ); i++ ) + { + if( xTaskHandles[ i ] != NULL ) + { + vTaskDelete( xTaskHandles[ i ] ); + } + } +} +/*-----------------------------------------------------------*/ + +void vRunMultipleTasksRunningTest( void ) +{ + UNITY_BEGIN(); + + RUN_TEST( Test_MultipleTasksRunning ); + + UNITY_END(); +} +/*-----------------------------------------------------------*/ diff --git a/FreeRTOS/Test/Target/tests/smp/multiple_tasks_running/test_config.h b/FreeRTOS/Test/Target/tests/smp/multiple_tasks_running/test_config.h new file mode 100644 index 0000000000..a3d1d7245d --- /dev/null +++ b/FreeRTOS/Test/Target/tests/smp/multiple_tasks_running/test_config.h @@ -0,0 +1,64 @@ +/* + * FreeRTOS V202212.00 + * Copyright (C) 2022 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef TEST_CONFIG_H +#define TEST_CONFIG_H + +/* This file must be included at the end of the FreeRTOSConfig.h. It contains + * any FreeRTOS specific configurations that the test requires. */ + +#ifdef configRUN_MULTIPLE_PRIORITIES + #undef configRUN_MULTIPLE_PRIORITIES +#endif /* ifdef configRUN_MULTIPLE_PRIORITIES */ + +#ifdef configUSE_CORE_AFFINITY + #undef configUSE_CORE_AFFINITY +#endif /* ifdef configUSE_CORE_AFFINITY */ + +#ifdef configUSE_MINIMAL_IDLE_HOOK + #undef configUSE_MINIMAL_IDLE_HOOK +#endif /* ifdef configUSE_MINIMAL_IDLE_HOOK */ + +#ifdef configUSE_TASK_PREEMPTION_DISABLE + #undef configUSE_TASK_PREEMPTION_DISABLE +#endif /* ifdef configUSE_TASK_PREEMPTION_DISABLE */ + +#ifdef configUSE_TIME_SLICING + #undef configUSE_TIME_SLICING +#endif /* ifdef configUSE_TIME_SLICING */ + +#ifdef configUSE_PREEMPTION + #undef configUSE_PREEMPTION +#endif /* ifdef configUSE_PREEMPTION */ + +#define configRUN_MULTIPLE_PRIORITIES 1 +#define configUSE_CORE_AFFINITY 0 +#define configUSE_MINIMAL_IDLE_HOOK 0 +#define configUSE_TASK_PREEMPTION_DISABLE 0 +#define configUSE_TIME_SLICING 0 +#define configUSE_PREEMPTION 0 + +#endif /* ifndef TEST_CONFIG_H */ diff --git a/FreeRTOS/Test/Target/tests/smp/template/README.md b/FreeRTOS/Test/Target/tests/smp/template/README.md new file mode 100644 index 0000000000..8452554149 --- /dev/null +++ b/FreeRTOS/Test/Target/tests/smp/template/README.md @@ -0,0 +1,38 @@ +# How to add a new test? + +1. Create a directory in the `FreeRTOS/Test/Target/tests` directory which will + contain the test. For example: `FreeRTOS/Test/Target/tests/smp/multiple_tasks_running`. +1. Copy the `test_name.c` and `test_config.h` files from this template + directory to the newly created directory above. +1. Rename the `test_name.c` according to the test name. +1. Implement the test in the above test file. +1. Add any FreeRTOS specific configuration required for the test to `test_config.h`. + +# How to add a new target? + +1. Create a target specific directory in the `FreeRTOS/Test/Target/boards` directory. +1. Create required build files. + - Include `test_config.h` in `FreeRTOSConfig.h` at the end. + - Ensure that the following configurations are not defined in `FreeRTOSConfig.h` as those are defined in `test_config.h`: + - `configRUN_MULTIPLE_PRIORITIES` + - `configUSE_CORE_AFFINITY` + - `configUSE_MINIMAL_IDLE_HOOK` + - `configUSE_TASK_PREEMPTION_DISABLE` + - `configUSE_TIME_SLICING` + - `configUSE_PREEMPTION` + +# How to add a test to a target + +1. Create a directory in the target's directory which will contain + the test. For example: `FreeRTOS/Test/Target/boards/pico/tests/smp/multiple_tasks_running`. +1. Create a C file and invoke the test case from a task. The invocation + usually looks like the following: + ```c + void prvTestRunnerTask( void * pvParameters ) + { + /* Invoke the test case. */ + vRunTestCaseName(); + } + ``` +1. Add the file created above and the test case file to the build system used + for the target. diff --git a/FreeRTOS/Test/Target/tests/smp/template/test_config.h b/FreeRTOS/Test/Target/tests/smp/template/test_config.h new file mode 100644 index 0000000000..86dfb51eb7 --- /dev/null +++ b/FreeRTOS/Test/Target/tests/smp/template/test_config.h @@ -0,0 +1,57 @@ +/* + * FreeRTOS V202212.00 + * Copyright (C) 2022 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +#ifndef TEST_CONFIG_H +#define TEST_CONFIG_H + +/* This file must be included at the end of the FreeRTOSConfig.h. It contains + * any FreeRTOS specific configurations that the test requires. */ + +#ifdef configRUN_MULTIPLE_PRIORITIES + #undef configRUN_MULTIPLE_PRIORITIES +#endif /* ifdef configRUN_MULTIPLE_PRIORITIES */ + +#ifdef configUSE_CORE_AFFINITY + #undef configUSE_CORE_AFFINITY +#endif /* ifdef configUSE_CORE_AFFINITY */ + +#ifdef configUSE_MINIMAL_IDLE_HOOK + #undef configUSE_MINIMAL_IDLE_HOOK +#endif /* ifdef configUSE_MINIMAL_IDLE_HOOK */ + +#ifdef configUSE_TASK_PREEMPTION_DISABLE + #undef configUSE_TASK_PREEMPTION_DISABLE +#endif /* ifdef configUSE_TASK_PREEMPTION_DISABLE */ + +#ifdef configUSE_TIME_SLICING + #undef configUSE_TIME_SLICING +#endif /* ifdef configUSE_TIME_SLICING */ + +#ifdef configUSE_PREEMPTION + #undef configUSE_PREEMPTION +#endif /* ifdef configUSE_PREEMPTION */ + +#endif /* ifndef TEST_CONFIG_H */ diff --git a/FreeRTOS/Test/Target/tests/smp/template/test_name.c b/FreeRTOS/Test/Target/tests/smp/template/test_name.c new file mode 100644 index 0000000000..6ce7b7d4c1 --- /dev/null +++ b/FreeRTOS/Test/Target/tests/smp/template/test_name.c @@ -0,0 +1,97 @@ +/* + * FreeRTOS V202212.00 + * Copyright (C) 2022 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +/** + * @file test.c + * @brief Describe the test here briefly. + * + * Describe the test here in detail. + */ + +/* Kernel includes. */ +#include "FreeRTOS.h" +#include "task.h" + +/* Unity testing includes. */ +#include "unity.h" + +/*-----------------------------------------------------------*/ + +#if ( configNUMBER_OF_CORES < 2 ) + #error This test is for FreeRTOS SMP and therefore, requires at least 2 cores. +#endif + +#ifndef TEST_CONFIG_H + #error test_config.h must be included at the end of FreeRTOSConfig.h. +#endif + +/*-----------------------------------------------------------*/ + +/* Declare #defines used in this file here. */ + +/*-----------------------------------------------------------*/ + +/* Declare local functions used in this file here. */ + +/*-----------------------------------------------------------*/ + +/* Declare local variables used in this file here. */ + +/*-----------------------------------------------------------*/ + +/* Runs before every test, put init calls here. */ +void setUp( void ) +{ + /* Create FreeRTOS resources required for the test. */ +} +/*-----------------------------------------------------------*/ + +/* Runs after every test, put clean-up calls here. */ +void tearDown( void ) +{ + /* Delete all the FreeRTOS resources created in setUp. */ +} +/*-----------------------------------------------------------*/ + +void Test_TestCaseName( void ) +{ + /* Perform any API call needed for the test. */ + + /* Verify the result. */ +} +/*-----------------------------------------------------------*/ + +/* Function that runs the test case. This function must be called + * from a FreeRTOS task. */ +void vRunTestCaseName( void ) +{ + UNITY_BEGIN(); + + RUN_TEST( Test_TestCaseName ); + + UNITY_END(); +} +/*-----------------------------------------------------------*/ diff --git a/lexicon.txt b/lexicon.txt index 047589b57f..f3574d5432 100644 --- a/lexicon.txt +++ b/lexicon.txt @@ -1715,6 +1715,7 @@ phostname php phy pic +pico pidr pingreq pingresp