summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMonika Singh <108652024+moninom1@users.noreply.github.com>2023-03-07 17:23:06 +0530
committerGitHub <noreply@github.com>2023-03-07 17:23:06 +0530
commitc7d96d61b96ab0b9f1ce3a983cc705e1af8a487f (patch)
tree050bfb14272fcc915acf29819fc061cb0a52b805
parent546af36281904ee00fc9b88dfef40147aebd66fd (diff)
downloadfreertos-git-c7d96d61b96ab0b9f1ce3a983cc705e1af8a487f.tar.gz
Merge main to devIPv6 (#953)
* update the freertos + TCP demos to use the neew API for getting the UDP pyaload buffer [FreeRTOS_GetUDPPayloadBuffer_ByIPType] (#938) * Add CBMC proof-running GitHub Action (#924) * Added two config options to the FreeRTOSConfig file to get the demo running again. Fixed a typo in a file. Added a section to the link file (#940) * Create SMP on target test framework. (#911) * Fix CBMC proof failures (#946) These were introduced in PR #620. * Make static IP address configurable (#947) * Fix issues in TCP QEMU Demo (#948)
-rw-r--r--.github/workflows/ci.yml18
-rwxr-xr-x[-rw-r--r--]FreeRTOS-Plus/Demo/FreeRTOS_Plus_TCP_Echo_Qemu_mps2/CMSIS/CMSDK_CM3.h2
-rwxr-xr-x[-rw-r--r--]FreeRTOS-Plus/Demo/FreeRTOS_Plus_TCP_Echo_Qemu_mps2/FreeRTOSConfig.h4
-rwxr-xr-x[-rw-r--r--]FreeRTOS-Plus/Demo/FreeRTOS_Plus_TCP_Echo_Qemu_mps2/TCPEchoClient_SingleTasks.c5
-rw-r--r--FreeRTOS-Plus/VisualStudio_StaticProjects/FreeRTOS+TCP/plus_tcp_hooks_winsim.c51
-rw-r--r--FreeRTOS/Demo/CORTEX_MPU_Static_Simulator_Keil_GCC/FreeRTOSConfig.h7
-rw-r--r--FreeRTOS/Demo/CORTEX_MPU_Static_Simulator_Keil_GCC/GCC_Specific/sections.ld7
-rw-r--r--FreeRTOS/Demo/CORTEX_MPU_Static_Simulator_Keil_GCC/GCC_Specific/startup_ARMCM4.S2
m---------FreeRTOS/Source0
-rw-r--r--FreeRTOS/Test/CBMC/patches/0005-Remove-volatile-qualifier-from-tasks-variables.patch24
-rw-r--r--FreeRTOS/Test/CBMC/proofs/Task/TaskIncrementTick/Configurations.json2
-rw-r--r--FreeRTOS/Test/CBMC/proofs/Task/TaskResumeAll/Configurations.json2
-rwxr-xr-xFreeRTOS/Test/CBMC/proofs/lib/print_tool_versions.py74
-rwxr-xr-xFreeRTOS/Test/CBMC/proofs/lib/summarize.py143
-rwxr-xr-xFreeRTOS/Test/CBMC/proofs/run-cbmc-proofs.py7
-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
-rw-r--r--FreeRTOS/Test/Target/tests/smp/multiple_tasks_running/multiple_tasks_running.c156
-rw-r--r--FreeRTOS/Test/Target/tests/smp/multiple_tasks_running/test_config.h64
-rw-r--r--FreeRTOS/Test/Target/tests/smp/template/README.md38
-rw-r--r--FreeRTOS/Test/Target/tests/smp/template/test_config.h57
-rw-r--r--FreeRTOS/Test/Target/tests/smp/template/test_name.c97
-rw-r--r--lexicon.txt1
-rw-r--r--manifest.yml2
29 files changed, 1274 insertions, 47 deletions
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 24e630380..5887c1172 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -172,7 +172,17 @@ jobs:
path: ./freertos_lts_memory_estimates.json
retention-days: 2
-
-
-
-
+ proof_ci:
+ runs-on: cbmc_ubuntu-latest_16-core
+ steps:
+ - uses: actions/checkout@v2
+ - run: |
+ git submodule update --init --checkout --recursive --depth 1
+ sudo apt-get update
+ sudo apt-get install --yes --no-install-recommends gcc-multilib
+ - name: Set up CBMC runner
+ uses: FreeRTOS/CI-CD-Github-Actions/set_up_cbmc_runner@main
+ - name: Run CBMC
+ uses: FreeRTOS/CI-CD-Github-Actions/run_cbmc@main
+ with:
+ proofs_dir: FreeRTOS/Test/CBMC/proofs
diff --git a/FreeRTOS-Plus/Demo/FreeRTOS_Plus_TCP_Echo_Qemu_mps2/CMSIS/CMSDK_CM3.h b/FreeRTOS-Plus/Demo/FreeRTOS_Plus_TCP_Echo_Qemu_mps2/CMSIS/CMSDK_CM3.h
index b63b2bff0..da3cbe16c 100644..100755
--- a/FreeRTOS-Plus/Demo/FreeRTOS_Plus_TCP_Echo_Qemu_mps2/CMSIS/CMSDK_CM3.h
+++ b/FreeRTOS-Plus/Demo/FreeRTOS_Plus_TCP_Echo_Qemu_mps2/CMSIS/CMSDK_CM3.h
@@ -103,7 +103,7 @@ typedef enum IRQn
/* -------- Configuration of the Cortex-M3 Processor and Core Peripherals ------- */
#define __CM3_REV 0x0201 /* Core revision r2p1 */
#define __MPU_PRESENT 1 /* MPU present or not */
-#define __NVIC_PRIO_BITS 3 /* Number of Bits used for Priority Levels */
+#define __NVIC_PRIO_BITS 8 /* Number of Bits used for Priority Levels */
#define __Vendor_SysTickConfig 0 /* Set to 1 if different SysTick Config is used */
#include <core_cm3.h> /* Processor and core peripherals */
diff --git a/FreeRTOS-Plus/Demo/FreeRTOS_Plus_TCP_Echo_Qemu_mps2/FreeRTOSConfig.h b/FreeRTOS-Plus/Demo/FreeRTOS_Plus_TCP_Echo_Qemu_mps2/FreeRTOSConfig.h
index 21949013d..5704118e9 100644..100755
--- a/FreeRTOS-Plus/Demo/FreeRTOS_Plus_TCP_Echo_Qemu_mps2/FreeRTOSConfig.h
+++ b/FreeRTOS-Plus/Demo/FreeRTOS_Plus_TCP_Echo_Qemu_mps2/FreeRTOSConfig.h
@@ -78,11 +78,11 @@ to exclude the API function. */
#define INCLUDE_vTaskDelay 1
-#define configKERNEL_INTERRUPT_PRIORITY 252
+#define configKERNEL_INTERRUPT_PRIORITY 255
/* !!!! configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to zero !!!!
See http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html. */
#define configMAX_SYSCALL_INTERRUPT_PRIORITY 5 /* equivalent to 0xa0, or priority 5. */
-#define configMAC_INTERRUPT_PRIORITY 2
+#define configMAC_INTERRUPT_PRIORITY 5
/* networking definitions */
diff --git a/FreeRTOS-Plus/Demo/FreeRTOS_Plus_TCP_Echo_Qemu_mps2/TCPEchoClient_SingleTasks.c b/FreeRTOS-Plus/Demo/FreeRTOS_Plus_TCP_Echo_Qemu_mps2/TCPEchoClient_SingleTasks.c
index 7c0bcaf96..457d6fcb7 100644..100755
--- a/FreeRTOS-Plus/Demo/FreeRTOS_Plus_TCP_Echo_Qemu_mps2/TCPEchoClient_SingleTasks.c
+++ b/FreeRTOS-Plus/Demo/FreeRTOS_Plus_TCP_Echo_Qemu_mps2/TCPEchoClient_SingleTasks.c
@@ -45,6 +45,8 @@
#include "FreeRTOS.h"
#include "task.h"
#include "queue.h"
+#include "CMSIS/CMSDK_CM3.h"
+#include "CMSIS/core_cm3.h"
/* FreeRTOS+TCP includes. */
#include "FreeRTOS_IP.h"
@@ -108,6 +110,9 @@
{
BaseType_t x;
+ /* Set Ethernet interrupt priority to configMAC_INTERRUPT_PRIORITY. */
+ NVIC_SetPriority( ETHERNET_IRQn , configMAC_INTERRUPT_PRIORITY );
+
/* Create the echo client tasks. */
for( x = 0; x < echoNUM_ECHO_CLIENTS; x++ )
{
diff --git a/FreeRTOS-Plus/VisualStudio_StaticProjects/FreeRTOS+TCP/plus_tcp_hooks_winsim.c b/FreeRTOS-Plus/VisualStudio_StaticProjects/FreeRTOS+TCP/plus_tcp_hooks_winsim.c
index 941b051de..876b65660 100644
--- a/FreeRTOS-Plus/VisualStudio_StaticProjects/FreeRTOS+TCP/plus_tcp_hooks_winsim.c
+++ b/FreeRTOS-Plus/VisualStudio_StaticProjects/FreeRTOS+TCP/plus_tcp_hooks_winsim.c
@@ -160,29 +160,34 @@ void vApplicationIPNetworkEventHook( eIPCallbackEvent_t eNetworkEvent )
void vPlatformInitIpStack( void )
{
- UBaseType_t uxRandomNumber;
BaseType_t xResult;
uint8_t ucIPAddress[ 4 ];
- uint8_t ucNetMask[ 4 ] = { 255, 255, 0, 0 };
- uint8_t ucNullAddress[ 4 ] = { 0, 0, 0, 0 };
+ uint8_t ucNetMask[ 4 ] = { configNET_MASK0, configNET_MASK1, configNET_MASK2, configNET_MASK3 };
uint8_t ucMACAddress[ 6 ];
-
- /* Generate a random number */
- uxRandomNumber = uxRand();
-
- /* Generate a random MAC address in the reserved range */
- ucMACAddress[ 0 ] = 0x00;
- ucMACAddress[ 1 ] = 0x11;
- ucMACAddress[ 2 ] = ( uxRandomNumber & 0xFF );
- ucMACAddress[ 3 ] = ( ( uxRandomNumber >> 8 ) & 0xFF );
- ucMACAddress[ 4 ] = ( ( uxRandomNumber >> 16 ) & 0xFF );
- ucMACAddress[ 5 ] = ( ( uxRandomNumber >> 24 ) & 0xFF );
-
- /* Assign a link-local address in the 169.254.0.0/16 range */
- ucIPAddress[ 0 ] = 169U;
- ucIPAddress[ 1 ] = 254U;
- ucIPAddress[ 2 ] = ( ( uxRandomNumber >> 16 ) & 0xFF );
- ucIPAddress[ 3 ] = ( ( uxRandomNumber >> 24 ) & 0xFF );
+ uint8_t ucDNSServerAddress[ 4 ];
+ uint8_t ucGatewayAddress[ 4 ];
+
+ ucMACAddress[ 0 ] = configMAC_ADDR0;
+ ucMACAddress[ 1 ] = configMAC_ADDR1;
+ ucMACAddress[ 2 ] = configMAC_ADDR2;
+ ucMACAddress[ 3 ] = configMAC_ADDR3;
+ ucMACAddress[ 4 ] = configMAC_ADDR4;
+ ucMACAddress[ 5 ] = configMAC_ADDR5;
+
+ ucIPAddress[ 0 ] = configIP_ADDR0;
+ ucIPAddress[ 1 ] = configIP_ADDR1;
+ ucIPAddress[ 2 ] = configIP_ADDR2;
+ ucIPAddress[ 3 ] = configIP_ADDR3;
+
+ ucDNSServerAddress[ 0 ] = configDNS_SERVER_ADDR0;
+ ucDNSServerAddress[ 1 ] = configDNS_SERVER_ADDR1;
+ ucDNSServerAddress[ 2 ] = configDNS_SERVER_ADDR2;
+ ucDNSServerAddress[ 3 ] = configDNS_SERVER_ADDR3;
+
+ ucGatewayAddress[ 0 ] = configGATEWAY_ADDR0;
+ ucGatewayAddress[ 1 ] = configGATEWAY_ADDR1;
+ ucGatewayAddress[ 2 ] = configGATEWAY_ADDR2;
+ ucGatewayAddress[ 3 ] = configGATEWAY_ADDR3;
/* Initialise the network interface.*/
FreeRTOS_debug_printf( ( "FreeRTOS_IPInit\r\n" ) );
@@ -192,7 +197,7 @@ void vPlatformInitIpStack( void )
pxWinPcap_FillInterfaceDescriptor( 0, &( xInterfaces[ 0 ] ) );
/* === End-point 0 === */
- FreeRTOS_FillEndPoint( &( xInterfaces[ 0 ] ), &( xEndPoints[ 0 ] ), ucIPAddress, ucNetMask, ucNullAddress, ucNullAddress, ucMACAddress );
+ FreeRTOS_FillEndPoint( &( xInterfaces[ 0 ] ), &( xEndPoints[ 0 ] ), ucIPAddress, ucNetMask, ucGatewayAddress, ucDNSServerAddress, ucMACAddress );
#if ( ipconfigUSE_DHCP != 0 )
{
/* End-point 0 wants to use DHCPv4. */
@@ -203,7 +208,7 @@ void vPlatformInitIpStack( void )
xResult = FreeRTOS_IPStart();
#else
/* Using the old /single /IPv4 library, or using backward compatible mode of the new /multi library. */
- xResult = FreeRTOS_IPInit( ucIPAddress, ucNetMask, ucNullAddress, ucNullAddress, ucMACAddress );
+ xResult = FreeRTOS_IPInit( ucIPAddress, ucNetMask, ucGatewayAddress, ucDNSServerAddress, ucMACAddress );
#endif /* if defined( FREERTOS_PLUS_TCP_VERSION ) && ( FREERTOS_PLUS_TCP_VERSION >= 10 ) */
configASSERT( xResult == pdTRUE );
@@ -228,4 +233,4 @@ eDHCPCallbackAnswer_t xApplicationDHCPHook( eDHCPCallbackPhase_t eDHCPPhase,
}
#endif
-/*-----------------------------------------------------------*/ \ No newline at end of file
+/*-----------------------------------------------------------*/
diff --git a/FreeRTOS/Demo/CORTEX_MPU_Static_Simulator_Keil_GCC/FreeRTOSConfig.h b/FreeRTOS/Demo/CORTEX_MPU_Static_Simulator_Keil_GCC/FreeRTOSConfig.h
index ec5860f13..46d287735 100644
--- a/FreeRTOS/Demo/CORTEX_MPU_Static_Simulator_Keil_GCC/FreeRTOSConfig.h
+++ b/FreeRTOS/Demo/CORTEX_MPU_Static_Simulator_Keil_GCC/FreeRTOSConfig.h
@@ -148,7 +148,7 @@ standard names. */
/* Normal assert() semantics without relying on the provision of an assert.h
header file. */
-#define configASSERT( x ) if( ( x ) == 0UL ) { portDISABLE_INTERRUPTS(); for( ;; ); }
+#define configASSERT( x ) if( ! ( x ) ) { portDISABLE_INTERRUPTS(); for( ;; ); }
/* LED not used at present, so just increment a variable to keep a count of the
number of times the LED would otherwise have been toggled. */
@@ -166,6 +166,11 @@ solely for the purpose of ensuring parameters are passed into tasks correctly. *
#define configREG_TEST_TASK_3_PARAMETER ( ( void * ) 0x12345678 )
#define configREG_TEST_TASK_4_PARAMETER ( ( void * ) 0x87654321 )
+/* Ensure that all system calls are coming from the kernel
+Additionally allow unprivileged tasks to have critical sections. */
+#define configENFORCE_SYSTEM_CALLS_FROM_KERNEL_ONLY 1
+#define configALLOW_UNPRIVILEGED_CRITICAL_SECTIONS 1
+
#ifdef __cplusplus
}
#endif
diff --git a/FreeRTOS/Demo/CORTEX_MPU_Static_Simulator_Keil_GCC/GCC_Specific/sections.ld b/FreeRTOS/Demo/CORTEX_MPU_Static_Simulator_Keil_GCC/GCC_Specific/sections.ld
index 723631644..e6c41f9c4 100644
--- a/FreeRTOS/Demo/CORTEX_MPU_Static_Simulator_Keil_GCC/GCC_Specific/sections.ld
+++ b/FreeRTOS/Demo/CORTEX_MPU_Static_Simulator_Keil_GCC/GCC_Specific/sections.ld
@@ -156,6 +156,13 @@ SECTIONS
PROVIDE_HIDDEN (__fini_array_end = .);
. = ALIGN(4);
+ /* Set start of system calls to here */
+ __syscalls_flash_start__ = .;
+ /* Place all FreeRTOS System calls here */
+ *(freertos_system_calls)
+ __syscalls_flash_end__ = .;
+ /* Mark the end of the system calls */
+
. = ALIGN(4);
*(.text*) /* all remaining code */
diff --git a/FreeRTOS/Demo/CORTEX_MPU_Static_Simulator_Keil_GCC/GCC_Specific/startup_ARMCM4.S b/FreeRTOS/Demo/CORTEX_MPU_Static_Simulator_Keil_GCC/GCC_Specific/startup_ARMCM4.S
index fb2af495a..7c853953b 100644
--- a/FreeRTOS/Demo/CORTEX_MPU_Static_Simulator_Keil_GCC/GCC_Specific/startup_ARMCM4.S
+++ b/FreeRTOS/Demo/CORTEX_MPU_Static_Simulator_Keil_GCC/GCC_Specific/startup_ARMCM4.S
@@ -4,7 +4,7 @@
* Version: V2.0
* Date: 16 August 2013
*
-/* Copyright (c) 2011 - 2013 ARM LIMITED
+ * Copyright (c) 2011 - 2013 ARM LIMITED
All rights reserved.
Redistribution and use in source and binary forms, with or without
diff --git a/FreeRTOS/Source b/FreeRTOS/Source
-Subproject bb6071e1df3168a64dc2ce79de8aa91b7995ba2
+Subproject ddd50d9a80fd80e2bca7e93d49baf5c71986cbb
diff --git a/FreeRTOS/Test/CBMC/patches/0005-Remove-volatile-qualifier-from-tasks-variables.patch b/FreeRTOS/Test/CBMC/patches/0005-Remove-volatile-qualifier-from-tasks-variables.patch
index 3eadf82d9..847bc5673 100644
--- a/FreeRTOS/Test/CBMC/patches/0005-Remove-volatile-qualifier-from-tasks-variables.patch
+++ b/FreeRTOS/Test/CBMC/patches/0005-Remove-volatile-qualifier-from-tasks-variables.patch
@@ -41,21 +41,21 @@ Here, `uxPendedTicks` could return any value, making it impossible to unwind
as a regular variable so that the loop can be unwound.
diff --git a/FreeRTOS/Source/tasks.c b/FreeRTOS/Source/tasks.c
-index c7be57cb2..9f76465d5 100644
+index 0e7a56c60..b29c19ea5 100644
--- a/FreeRTOS/Source/tasks.c
+++ b/FreeRTOS/Source/tasks.c
-@@ -343,8 +343,8 @@ PRIVILEGED_DATA TCB_t * volatile pxCurrentTCB = NULL;
- PRIVILEGED_DATA static List_t pxReadyTasksLists[ configMAX_PRIORITIES ]; /*< Prioritised ready tasks. */
- PRIVILEGED_DATA static List_t xDelayedTaskList1; /*< Delayed tasks. */
- PRIVILEGED_DATA static List_t xDelayedTaskList2; /*< Delayed tasks (two lists are used - one for delays that have overflowed the current tick count. */
--PRIVILEGED_DATA static List_t * volatile pxDelayedTaskList; /*< Points to the delayed task list currently being used. */
--PRIVILEGED_DATA static List_t * volatile pxOverflowDelayedTaskList; /*< Points to the delayed task list currently being used to hold tasks that have overflowed the current tick count. */
-+PRIVILEGED_DATA static List_t * pxDelayedTaskList; /*< Points to the delayed task list currently being used. */
-+PRIVILEGED_DATA static List_t * pxOverflowDelayedTaskList; /*< Points to the delayed task list currently being used to hold tasks that have overflowed the current tick count. */
- PRIVILEGED_DATA static List_t xPendingReadyList; /*< Tasks that have been readied while the scheduler was suspended. They will be moved to the ready list when the scheduler is resumed. */
-
+@@ -339,8 +339,8 @@ portDONT_DISCARD PRIVILEGED_DATA TCB_t * volatile pxCurrentTCB = NULL;
+ PRIVILEGED_DATA static List_t pxReadyTasksLists[ configMAX_PRIORITIES ]; /**< Prioritised ready tasks. */
+ PRIVILEGED_DATA static List_t xDelayedTaskList1; /**< Delayed tasks. */
+ PRIVILEGED_DATA static List_t xDelayedTaskList2; /**< Delayed tasks (two lists are used - one for delays that have overflowed the current tick count. */
+-PRIVILEGED_DATA static List_t * volatile pxDelayedTaskList; /**< Points to the delayed task list currently being used. */
+-PRIVILEGED_DATA static List_t * volatile pxOverflowDelayedTaskList; /**< Points to the delayed task list currently being used to hold tasks that have overflowed the current tick count. */
++PRIVILEGED_DATA static List_t * pxDelayedTaskList; /**< Points to the delayed task list currently being used. */
++PRIVILEGED_DATA static List_t * pxOverflowDelayedTaskList; /**< Points to the delayed task list currently being used to hold tasks that have overflowed the current tick count. */
+ PRIVILEGED_DATA static List_t xPendingReadyList; /**< Tasks that have been readied while the scheduler was suspended. They will be moved to the ready list when the scheduler is resumed. */
+
#if ( INCLUDE_vTaskDelete == 1 )
-@@ -371,7 +371,7 @@ PRIVILEGED_DATA static volatile UBaseType_t uxCurrentNumberOfTasks = ( UBaseType
+@@ -367,7 +367,7 @@ PRIVILEGED_DATA static volatile UBaseType_t uxCurrentNumberOfTasks = ( UBaseType
PRIVILEGED_DATA static volatile TickType_t xTickCount = ( TickType_t ) configINITIAL_TICK_COUNT;
PRIVILEGED_DATA static volatile UBaseType_t uxTopReadyPriority = tskIDLE_PRIORITY;
PRIVILEGED_DATA static volatile BaseType_t xSchedulerRunning = pdFALSE;
diff --git a/FreeRTOS/Test/CBMC/proofs/Task/TaskIncrementTick/Configurations.json b/FreeRTOS/Test/CBMC/proofs/Task/TaskIncrementTick/Configurations.json
index 12cc4e7b4..bad8abdd0 100644
--- a/FreeRTOS/Test/CBMC/proofs/Task/TaskIncrementTick/Configurations.json
+++ b/FreeRTOS/Test/CBMC/proofs/Task/TaskIncrementTick/Configurations.json
@@ -48,7 +48,7 @@
"CBMCFLAGS":
[
"--unwind 1",
- "--unwindset prvInitialiseTaskLists.0:8,vListInsert.0:2,xTaskIncrementTick.0:4"
+ "--unwindset prvInitialiseTaskLists.0:8,vListInsert.0:2,xTaskIncrementTick.5:4"
],
"OBJS":
[
diff --git a/FreeRTOS/Test/CBMC/proofs/Task/TaskResumeAll/Configurations.json b/FreeRTOS/Test/CBMC/proofs/Task/TaskResumeAll/Configurations.json
index d2d1ab1f3..a52dad739 100644
--- a/FreeRTOS/Test/CBMC/proofs/Task/TaskResumeAll/Configurations.json
+++ b/FreeRTOS/Test/CBMC/proofs/Task/TaskResumeAll/Configurations.json
@@ -53,7 +53,7 @@
"CBMCFLAGS":
[
"--unwind 1",
- "--unwindset prvInitialiseTaskLists.0:8,xTaskResumeAll.0:2,vListInsert.0:5,xTaskIncrementTick.0:4"
+ "--unwindset prvInitialiseTaskLists.0:8,xTaskResumeAll.4:2,vListInsert.0:5,xTaskIncrementTick.5:4"
],
"OBJS":
diff --git a/FreeRTOS/Test/CBMC/proofs/lib/print_tool_versions.py b/FreeRTOS/Test/CBMC/proofs/lib/print_tool_versions.py
new file mode 100755
index 000000000..bdeb429e3
--- /dev/null
+++ b/FreeRTOS/Test/CBMC/proofs/lib/print_tool_versions.py
@@ -0,0 +1,74 @@
+#!/usr/bin/env python3
+#
+# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
+# SPDX-License-Identifier: MIT-0
+
+
+import logging
+import pathlib
+import shutil
+import subprocess
+
+
+_TOOLS = [
+ "cadical",
+ "cbmc",
+ "cbmc-viewer",
+ "cbmc-starter-kit-update",
+ "kissat",
+ "litani",
+]
+
+
+def _format_versions(table):
+ lines = [
+ "<table>",
+ '<tr><td colspan="2" style="font-weight: bold">Tool Versions</td></tr>',
+ ]
+ for tool, version in table.items():
+ if version:
+ v_str = f'<code><pre style="margin: 0">{version}</pre></code>'
+ else:
+ v_str = '<em>not found</em>'
+ lines.append(
+ f'<tr><td style="font-weight: bold; padding-right: 1em; '
+ f'text-align: right;">{tool}:</td>'
+ f'<td>{v_str}</td></tr>')
+ lines.append("</table>")
+ return "\n".join(lines)
+
+
+def _get_tool_versions():
+ ret = {}
+ for tool in _TOOLS:
+ err = f"Could not determine version of {tool}: "
+ ret[tool] = None
+ if not shutil.which(tool):
+ logging.error("%s'%s' not found on $PATH", err, tool)
+ continue
+ cmd = [tool, "--version"]
+ proc = subprocess.Popen(cmd, text=True, stdout=subprocess.PIPE)
+ try:
+ out, _ = proc.communicate(timeout=10)
+ except subprocess.TimeoutExpired:
+ logging.error("%s'%s --version' timed out", err, tool)
+ continue
+ if proc.returncode:
+ logging.error(
+ "%s'%s --version' returned %s", err, tool, str(proc.returncode))
+ continue
+ ret[tool] = out.strip()
+ return ret
+
+
+def main():
+ exe_name = pathlib.Path(__file__).name
+ logging.basicConfig(format=f"{exe_name}: %(message)s")
+
+ table = _get_tool_versions()
+ out = _format_versions(table)
+ print(out)
+
+
+if __name__ == "__main__":
+ main()
diff --git a/FreeRTOS/Test/CBMC/proofs/lib/summarize.py b/FreeRTOS/Test/CBMC/proofs/lib/summarize.py
new file mode 100755
index 000000000..50dbcc33c
--- /dev/null
+++ b/FreeRTOS/Test/CBMC/proofs/lib/summarize.py
@@ -0,0 +1,143 @@
+# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
+# SPDX-License-Identifier: MIT-0
+
+import argparse
+import json
+import logging
+import os
+import sys
+
+
+DESCRIPTION = """Print 2 tables in GitHub-flavored Markdown that summarize
+an execution of CBMC proofs."""
+
+
+def get_args():
+ """Parse arguments for summarize script."""
+ parser = argparse.ArgumentParser(description=DESCRIPTION)
+ for arg in [{
+ "flags": ["--run-file"],
+ "help": "path to the Litani run.json file",
+ "required": True,
+ }]:
+ flags = arg.pop("flags")
+ parser.add_argument(*flags, **arg)
+ return parser.parse_args()
+
+
+def _get_max_length_per_column_list(data):
+ ret = [len(item) + 1 for item in data[0]]
+ for row in data[1:]:
+ for idx, item in enumerate(row):
+ ret[idx] = max(ret[idx], len(item) + 1)
+ return ret
+
+
+def _get_table_header_separator(max_length_per_column_list):
+ line_sep = ""
+ for max_length_of_word_in_col in max_length_per_column_list:
+ line_sep += "|" + "-" * (max_length_of_word_in_col + 1)
+ line_sep += "|\n"
+ return line_sep
+
+
+def _get_entries(max_length_per_column_list, row_data):
+ entries = []
+ for row in row_data:
+ entry = ""
+ for idx, word in enumerate(row):
+ max_length_of_word_in_col = max_length_per_column_list[idx]
+ space_formatted_word = (max_length_of_word_in_col - len(word)) * " "
+ entry += "| " + word + space_formatted_word
+ entry += "|\n"
+ entries.append(entry)
+ return entries
+
+
+def _get_rendered_table(data):
+ table = []
+ max_length_per_column_list = _get_max_length_per_column_list(data)
+ entries = _get_entries(max_length_per_column_list, data)
+ for idx, entry in enumerate(entries):
+ if idx == 1:
+ line_sep = _get_table_header_separator(max_length_per_column_list)
+ table.append(line_sep)
+ table.append(entry)
+ table.append("\n")
+ return "".join(table)
+
+
+def _get_status_and_proof_summaries(run_dict):
+ """Parse a dict representing a Litani run and create lists summarizing the
+ proof results.
+
+ Parameters
+ ----------
+ run_dict
+ A dictionary representing a Litani run.
+
+
+ Returns
+ -------
+ A list of 2 lists.
+ The first sub-list maps a status to the number of proofs with that status.
+ The second sub-list maps each proof to its status.
+ """
+ count_statuses = {}
+ proofs = [["Proof", "Status"]]
+ for proof_pipeline in run_dict["pipelines"]:
+ status_pretty_name = proof_pipeline["status"].title().replace("_", " ")
+ try:
+ count_statuses[status_pretty_name] += 1
+ except KeyError:
+ count_statuses[status_pretty_name] = 1
+ if proof_pipeline["name"] == "print_tool_versions":
+ continue
+ proofs.append([proof_pipeline["name"], status_pretty_name])
+ statuses = [["Status", "Count"]]
+ for status, count in count_statuses.items():
+ statuses.append([status, str(count)])
+ return [statuses, proofs]
+
+
+def print_proof_results(out_file):
+ """
+ Print 2 strings that summarize the proof results.
+ When printing, each string will render as a GitHub flavored Markdown table.
+ """
+ output = "## Summary of CBMC proof results\n\n"
+ with open(out_file, encoding='utf-8') as run_json:
+ run_dict = json.load(run_json)
+ status_table, proof_table = _get_status_and_proof_summaries(run_dict)
+ for summary in (status_table, proof_table):
+ output += _get_rendered_table(summary)
+
+ print(output)
+ sys.stdout.flush()
+
+ github_summary_file = os.getenv("GITHUB_STEP_SUMMARY")
+ if github_summary_file:
+ with open(github_summary_file, "a") as handle:
+ print(output, file=handle)
+ handle.flush()
+ else:
+ logging.warning(
+ "$GITHUB_STEP_SUMMARY not set, not writing summary file")
+
+ msg = (
+ "Click the 'Summary' button to view a Markdown table "
+ "summarizing all proof results")
+ if run_dict["status"] != "success":
+ logging.error("Not all proofs passed.")
+ logging.error(msg)
+ sys.exit(1)
+ logging.info(msg)
+
+
+if __name__ == '__main__':
+ args = get_args()
+ logging.basicConfig(format="%(levelname)s: %(message)s")
+ try:
+ print_proof_results(args.run_file)
+ except Exception as ex: # pylint: disable=broad-except
+ logging.critical("Could not print results. Exception: %s", str(ex))
diff --git a/FreeRTOS/Test/CBMC/proofs/run-cbmc-proofs.py b/FreeRTOS/Test/CBMC/proofs/run-cbmc-proofs.py
index f95de775b..661a589ac 100755
--- a/FreeRTOS/Test/CBMC/proofs/run-cbmc-proofs.py
+++ b/FreeRTOS/Test/CBMC/proofs/run-cbmc-proofs.py
@@ -301,6 +301,13 @@ def main():
if not args.no_standalone:
run_build(args.parallel_jobs)
+ out_sym = pathlib.Path("/tmp")/"litani"/"runs"/"latest"
+ out_dir = out_sym.resolve()
+
+ local_copy = pathlib.Path("output")/"latest"
+ local_copy.parent.mkdir(exist_ok=True)
+ local_copy.symlink_to(out_dir)
+
if __name__ == "__main__":
main()
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 37a1fb434..30cd99612 100644
--- a/lexicon.txt
+++ b/lexicon.txt
@@ -1725,6 +1725,7 @@ phostname
php
phy
pic
+pico
pidr
pingreq
pingresp
diff --git a/manifest.yml b/manifest.yml
index 1047f4a49..7229e2be7 100644
--- a/manifest.yml
+++ b/manifest.yml
@@ -4,7 +4,7 @@ description: "This is the standard distribution of FreeRTOS."
dependencies:
- name: "FreeRTOS-Kernel"
- version: "bb6071e1d"
+ version: "ddd50d9a8"
repository:
type: "git"
url: "https://github.com/FreeRTOS/FreeRTOS-Kernel.git"