summaryrefslogtreecommitdiff
path: root/FreeRTOS/Test/Target/boards
diff options
context:
space:
mode:
Diffstat (limited to 'FreeRTOS/Test/Target/boards')
-rw-r--r--FreeRTOS/Test/Target/boards/pico/CMakeLists.txt34
-rw-r--r--FreeRTOS/Test/Target/boards/pico/FreeRTOSConfig.h140
-rw-r--r--FreeRTOS/Test/Target/boards/pico/FreeRTOS_Kernel_import.cmake63
-rw-r--r--FreeRTOS/Test/Target/boards/pico/main.c123
-rw-r--r--FreeRTOS/Test/Target/boards/pico/pico_sdk_import.cmake89
-rw-r--r--FreeRTOS/Test/Target/boards/pico/tests/smp/multiple_tasks_running/CMakeLists.txt33
-rw-r--r--FreeRTOS/Test/Target/boards/pico/tests/smp/multiple_tasks_running/multiple_tasks_running_test_runner.c76
7 files changed, 558 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 );
+}
+/*-----------------------------------------------------------*/