diff options
author | ActoryOu <ousc@amazon.com> | 2023-03-06 15:47:27 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-03-06 13:17:27 +0530 |
commit | 67911f83a6b4caa5ca3fa1c99ed4e8e136a1d616 (patch) | |
tree | 65f9c8a2a229a7b39f53759bdebe29d9ad326afc | |
parent | 93a35f87d2afa8e531b0d75e35431755cb3eb438 (diff) | |
download | freertos-git-67911f83a6b4caa5ca3fa1c99ed4e8e136a1d616.tar.gz |
Create SMP on target test framework. (#911)
* Framework initialization.
* Move testRunner.c to test case subfolder.
* Update README doc and formatting.
* Add default configurations in test_config.h.
* Fix License & formatting check.
* Fix typo.
* Move setup/teardown functions to main.c file.
* Move setup/teardown functions back.
* Update README doc.
* Patch for comments.
* Correct test runner file name.
* Move test_config.h to the end of FreeRTOSConfig.h.
* Add undef in test_config.h and description in README doc.
* Correct the file format.
* Fix chinglee-iot comments.
* Code review suggestions
Signed-off-by: Gaurav Aggarwal <aggarg@amazon.com>
* Fix spell check
Signed-off-by: Gaurav Aggarwal <aggarg@amazon.com>
---------
Signed-off-by: Gaurav Aggarwal <aggarg@amazon.com>
Co-authored-by: Gaurav Aggarwal <aggarg@amazon.com>
13 files changed, 971 insertions, 0 deletions
diff --git a/FreeRTOS/Test/Target/boards/pico/CMakeLists.txt b/FreeRTOS/Test/Target/boards/pico/CMakeLists.txt new file mode 100644 index 000000000..c4dffb3dc --- /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 000000000..a947b7fde --- /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 <assert.h> +/* 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 000000000..30f457588 --- /dev/null +++ b/FreeRTOS/Test/Target/boards/pico/FreeRTOS_Kernel_import.cmake @@ -0,0 +1,63 @@ +# This is a copy of <FREERTOS_KERNEL_PATH>/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 000000000..b17dcacce --- /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 000000000..12ac53d01 --- /dev/null +++ b/FreeRTOS/Test/Target/boards/pico/pico_sdk_import.cmake @@ -0,0 +1,89 @@ +# This is a copy of <PICO_SDK_PATH>/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 000000000..7a84dcf13 --- /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 000000000..fd2e299d2 --- /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 000000000..035e2699d --- /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 000000000..a3d1d7245 --- /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 000000000..845255414 --- /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 000000000..86dfb51eb --- /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 000000000..6ce7b7d4c --- /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 047589b57..f3574d543 100644 --- a/lexicon.txt +++ b/lexicon.txt @@ -1715,6 +1715,7 @@ phostname php phy pic +pico pidr pingreq pingresp |