Backup checking of the Freedom Studio RISC-V project - still a work in progress.
diff --git a/FreeRTOS/Demo/RISC-V-Qemu-sifive_e-FreedomStudio/.cproject b/FreeRTOS/Demo/RISC-V-Qemu-sifive_e-FreedomStudio/.cproject
index aee5647..31d9f3f 100644
--- a/FreeRTOS/Demo/RISC-V-Qemu-sifive_e-FreedomStudio/.cproject
+++ b/FreeRTOS/Demo/RISC-V-Qemu-sifive_e-FreedomStudio/.cproject
@@ -60,6 +60,7 @@
 							<tool id="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.c.compiler.1632260763" name="GNU RISC-V Cross C Compiler" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.c.compiler">

 								<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.c.compiler.include.paths.1464742435" name="Include paths (-I)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.c.compiler.include.paths" useByScannerDiscovery="true" valueType="includePath">

 									<listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/FreeRTOS_Source/include}&quot;"/>

+									<listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/full_demo/common_demo_tasks/include}&quot;"/>

 									<listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/freedom-e-sdk/drivers}&quot;"/>

 									<listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}}&quot;"/>

 									<listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/FreeRTOS_Source/portable/GCC/RISC-V-RV32}&quot;"/>

@@ -71,19 +72,20 @@
 									<listOptionValue builtIn="false" value="DONT_USE_PLIC"/>

 									<listOptionValue builtIn="false" value="DONT_USE_M_TIME"/>

 								</option>

-								<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.c.compiler.other.953712529" name="Other compiler flags" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.c.compiler.other" useByScannerDiscovery="true" value="-include sys/cdefs.h -fno-builtin-printf -c" valueType="string"/>

+								<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.c.compiler.other.953712529" name="Other compiler flags" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.c.compiler.other" useByScannerDiscovery="true" value="-ffunction-sections -fdata-sections -include sys/cdefs.h -fno-builtin-printf -c" valueType="string"/>

 								<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.c.compiler.std.1963706020" name="Language standard" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.c.compiler.std" useByScannerDiscovery="true" value="ilg.gnumcueclipse.managedbuild.cross.riscv.option.c.compiler.std.default" valueType="enumerated"/>

 								<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.c.compiler.otheroptimizations.1382786252" name="Other optimization flags" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.c.compiler.otheroptimizations" useByScannerDiscovery="true" value="" valueType="string"/>

+								<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.c.compiler.otherwarnings.1264446812" name="Other warning flags" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.c.compiler.otherwarnings" useByScannerDiscovery="true" value="-Wall -Wextra" valueType="string"/>

 								<inputType id="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.c.compiler.input.517786622" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.c.compiler.input"/>

 							</tool>

 							<tool id="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.cpp.compiler.890064572" name="GNU RISC-V Cross C++ Compiler" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.cpp.compiler"/>

 							<tool id="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.c.linker.1118992651" name="GNU RISC-V Cross C Linker" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.c.linker">

-								<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.c.linker.gcsections.303446425" name="Remove unused sections (-Xlinker --gc-sections)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.c.linker.gcsections" useByScannerDiscovery="false" value="false" valueType="boolean"/>

+								<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.c.linker.gcsections.303446425" name="Remove unused sections (-Xlinker --gc-sections)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.c.linker.gcsections" useByScannerDiscovery="false" value="true" valueType="boolean"/>

 								<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.c.linker.nostart.2092172057" name="Do not use standard start files (-nostartfiles)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.c.linker.nostart" useByScannerDiscovery="false" value="true" valueType="boolean"/>

 								<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.c.linker.libs.1930877742" name="Libraries (-l)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.c.linker.libs" useByScannerDiscovery="false" valueType="libs">

 									<listOptionValue builtIn="false" value="c"/>

 								</option>

-								<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.c.linker.other.724386459" name="Other linker flags" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.c.linker.other" useByScannerDiscovery="false" value="-Wl,--start-group -Wl,--end-group -Wl,--wrap=malloc -Wl,--wrap=free -Wl,--wrap=open -Wl,--wrap=lseek -Wl,--wrap=read -Wl,--wrap=write -Wl,--wrap=fstat -Wl,--wrap=stat -Wl,--wrap=close -Wl,--wrap=link -Wl,--wrap=unlink -Wl,--wrap=execve -Wl,--wrap=fork -Wl,--wrap=getpid -Wl,--wrap=kill -Wl,--wrap=wait -Wl,--wrap=isatty -Wl,--wrap=times -Wl,--wrap=sbrk -Wl,--wrap=_exit -Wl,--wrap=puts -Wl,--wrap=_malloc -Wl,--wrap=_free -Wl,--wrap=_open -Wl,--wrap=_lseek -Wl,--wrap=_read -Wl,--wrap=_write -Wl,--wrap=_fstat -Wl,--wrap=_stat -Wl,--wrap=_close -Wl,--wrap=_link -Wl,--wrap=_unlink -Wl,--wrap=_execve -Wl,--wrap=_fork -Wl,--wrap=_getpid -Wl,--wrap=_kill -Wl,--wrap=_wait -Wl,--wrap=_isatty -Wl,--wrap=_times -Wl,--wrap=_sbrk -Wl,--wrap=__exit -Wl,--wrap=_puts" valueType="string"/>

+								<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.c.linker.other.724386459" name="Other linker flags" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.c.linker.other" useByScannerDiscovery="false" value="-Xlinker --defsym=__stack_size=1K -Wl,--start-group -Wl,--end-group -Wl,--wrap=malloc -Wl,--wrap=free -Wl,--wrap=open -Wl,--wrap=lseek -Wl,--wrap=read -Wl,--wrap=write -Wl,--wrap=fstat -Wl,--wrap=stat -Wl,--wrap=close -Wl,--wrap=link -Wl,--wrap=unlink -Wl,--wrap=execve -Wl,--wrap=fork -Wl,--wrap=getpid -Wl,--wrap=kill -Wl,--wrap=wait -Wl,--wrap=isatty -Wl,--wrap=times -Wl,--wrap=sbrk -Wl,--wrap=_exit -Wl,--wrap=puts -Wl,--wrap=_malloc -Wl,--wrap=_free -Wl,--wrap=_open -Wl,--wrap=_lseek -Wl,--wrap=_read -Wl,--wrap=_write -Wl,--wrap=_fstat -Wl,--wrap=_stat -Wl,--wrap=_close -Wl,--wrap=_link -Wl,--wrap=_unlink -Wl,--wrap=_execve -Wl,--wrap=_fork -Wl,--wrap=_getpid -Wl,--wrap=_kill -Wl,--wrap=_wait -Wl,--wrap=_isatty -Wl,--wrap=_times -Wl,--wrap=_sbrk -Wl,--wrap=__exit -Wl,--wrap=_puts" valueType="string"/>

 								<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.c.linker.paths.1340277823" name="Library search path (-L)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.c.linker.paths" useByScannerDiscovery="false" valueType="libPaths">

 									<listOptionValue builtIn="false" value="../"/>

 								</option>

diff --git a/FreeRTOS/Demo/RISC-V-Qemu-sifive_e-FreedomStudio/.project b/FreeRTOS/Demo/RISC-V-Qemu-sifive_e-FreedomStudio/.project
index b83209e..82efe8a 100644
--- a/FreeRTOS/Demo/RISC-V-Qemu-sifive_e-FreedomStudio/.project
+++ b/FreeRTOS/Demo/RISC-V-Qemu-sifive_e-FreedomStudio/.project
@@ -32,17 +32,17 @@
 		<link>

 			<name>FreeRTOS_Source/event_groups.c</name>

 			<type>1</type>

-			<locationURI>FREERTOS_ROUTE/FreeRTOS/Source/event_groups.c</locationURI>

+			<locationURI>FREERTOS_ROOT/FreeRTOS/Source/event_groups.c</locationURI>

 		</link>

 		<link>

 			<name>FreeRTOS_Source/include</name>

 			<type>2</type>

-			<locationURI>FREERTOS_ROUTE/FreeRTOS/Source/include</locationURI>

+			<locationURI>FREERTOS_ROOT/FreeRTOS/Source/include</locationURI>

 		</link>

 		<link>

 			<name>FreeRTOS_Source/list.c</name>

 			<type>1</type>

-			<locationURI>FREERTOS_ROUTE/FreeRTOS/Source/list.c</locationURI>

+			<locationURI>FREERTOS_ROOT/FreeRTOS/Source/list.c</locationURI>

 		</link>

 		<link>

 			<name>FreeRTOS_Source/portable</name>

@@ -52,22 +52,27 @@
 		<link>

 			<name>FreeRTOS_Source/queue.c</name>

 			<type>1</type>

-			<locationURI>FREERTOS_ROUTE/FreeRTOS/Source/queue.c</locationURI>

+			<locationURI>FREERTOS_ROOT/FreeRTOS/Source/queue.c</locationURI>

 		</link>

 		<link>

 			<name>FreeRTOS_Source/stream_buffer.c</name>

 			<type>1</type>

-			<locationURI>FREERTOS_ROUTE/FreeRTOS/Source/stream_buffer.c</locationURI>

+			<locationURI>FREERTOS_ROOT/FreeRTOS/Source/stream_buffer.c</locationURI>

 		</link>

 		<link>

 			<name>FreeRTOS_Source/tasks.c</name>

 			<type>1</type>

-			<locationURI>FREERTOS_ROUTE/FreeRTOS/Source/tasks.c</locationURI>

+			<locationURI>FREERTOS_ROOT/FreeRTOS/Source/tasks.c</locationURI>

 		</link>

 		<link>

 			<name>FreeRTOS_Source/timers.c</name>

 			<type>1</type>

-			<locationURI>FREERTOS_ROUTE/FreeRTOS/Source/timers.c</locationURI>

+			<locationURI>FREERTOS_ROOT/FreeRTOS/Source/timers.c</locationURI>

+		</link>

+		<link>

+			<name>full_demo/common_demo_tasks</name>

+			<type>2</type>

+			<locationURI>virtual:/virtual</locationURI>

 		</link>

 		<link>

 			<name>FreeRTOS_Source/portable/GCC</name>

@@ -80,19 +85,59 @@
 			<locationURI>virtual:/virtual</locationURI>

 		</link>

 		<link>

+			<name>full_demo/common_demo_tasks/EventGroupsDemo.c</name>

+			<type>1</type>

+			<locationURI>FREERTOS_ROOT/FreeRTOS/Demo/Common/Minimal/EventGroupsDemo.c</locationURI>

+		</link>

+		<link>

+			<name>full_demo/common_demo_tasks/GenQTest.c</name>

+			<type>1</type>

+			<locationURI>FREERTOS_ROOT/FreeRTOS/Demo/Common/Minimal/GenQTest.c</locationURI>

+		</link>

+		<link>

+			<name>full_demo/common_demo_tasks/TaskNotify.c</name>

+			<type>1</type>

+			<locationURI>FREERTOS_ROOT/FreeRTOS/Demo/Common/Minimal/TaskNotify.c</locationURI>

+		</link>

+		<link>

+			<name>full_demo/common_demo_tasks/TimerDemo.c</name>

+			<type>1</type>

+			<locationURI>FREERTOS_ROOT/FreeRTOS/Demo/Common/Minimal/TimerDemo.c</locationURI>

+		</link>

+		<link>

+			<name>full_demo/common_demo_tasks/blocktim.c</name>

+			<type>1</type>

+			<locationURI>FREERTOS_ROOT/FreeRTOS/Demo/Common/Minimal/blocktim.c</locationURI>

+		</link>

+		<link>

+			<name>full_demo/common_demo_tasks/dynamic.c</name>

+			<type>1</type>

+			<locationURI>FREERTOS_ROOT/FreeRTOS/Demo/Common/Minimal/dynamic.c</locationURI>

+		</link>

+		<link>

+			<name>full_demo/common_demo_tasks/include</name>

+			<type>2</type>

+			<locationURI>FREERTOS_ROOT/FreeRTOS/Demo/Common/include</locationURI>

+		</link>

+		<link>

+			<name>full_demo/common_demo_tasks/recmutex.c</name>

+			<type>1</type>

+			<locationURI>FREERTOS_ROOT/FreeRTOS/Demo/Common/Minimal/recmutex.c</locationURI>

+		</link>

+		<link>

 			<name>FreeRTOS_Source/portable/GCC/RISC-V-RV32</name>

 			<type>2</type>

-			<locationURI>FREERTOS_ROUTE/FreeRTOS/Source/portable/GCC/RISC-V-RV32</locationURI>

+			<locationURI>FREERTOS_ROOT/FreeRTOS/Source/portable/GCC/RISC-V-RV32</locationURI>

 		</link>

 		<link>

 			<name>FreeRTOS_Source/portable/MemMang/heap_4.c</name>

 			<type>1</type>

-			<locationURI>FREERTOS_ROUTE/FreeRTOS/Source/portable/MemMang/heap_4.c</locationURI>

+			<locationURI>FREERTOS_ROOT/FreeRTOS/Source/portable/MemMang/heap_4.c</locationURI>

 		</link>

 	</linkedResources>

 	<variableList>

 		<variable>

-			<name>FREERTOS_ROUTE</name>

+			<name>FREERTOS_ROOT</name>

 			<value>$%7BPARENT-3-PROJECT_LOC%7D</value>

 		</variable>

 	</variableList>

diff --git a/FreeRTOS/Demo/RISC-V-Qemu-sifive_e-FreedomStudio/.settings/language.settings.xml b/FreeRTOS/Demo/RISC-V-Qemu-sifive_e-FreedomStudio/.settings/language.settings.xml
index 53c0c63..59b35b2 100644
--- a/FreeRTOS/Demo/RISC-V-Qemu-sifive_e-FreedomStudio/.settings/language.settings.xml
+++ b/FreeRTOS/Demo/RISC-V-Qemu-sifive_e-FreedomStudio/.settings/language.settings.xml
@@ -5,7 +5,7 @@
 			<provider copy-of="extension" id="org.eclipse.cdt.ui.UserLanguageSettingsProvider"/>

 			<provider-reference id="org.eclipse.cdt.core.ReferencedProjectsLanguageSettingsProvider" ref="shared-provider"/>

 			<provider-reference id="org.eclipse.cdt.managedbuilder.core.MBSLanguageSettingsProvider" ref="shared-provider"/>

-			<provider class="org.eclipse.cdt.managedbuilder.language.settings.providers.GCCBuiltinSpecsDetector" console="false" env-hash="1967898482140670668" id="ilg.gnumcueclipse.managedbuild.cross.riscv.GCCBuiltinSpecsDetector" keep-relative-paths="false" name="CDT RISC-V Cross GCC Built-in Compiler Settings" parameter="${COMMAND} ${FLAGS} ${cross_toolchain_flags} -E -P -v -dD &quot;${INPUTS}&quot;" prefer-non-shared="true">

+			<provider class="org.eclipse.cdt.managedbuilder.language.settings.providers.GCCBuiltinSpecsDetector" console="false" env-hash="-1662098508467853022" id="ilg.gnumcueclipse.managedbuild.cross.riscv.GCCBuiltinSpecsDetector" keep-relative-paths="false" name="CDT RISC-V Cross GCC Built-in Compiler Settings" parameter="${COMMAND} ${FLAGS} ${cross_toolchain_flags} -E -P -v -dD &quot;${INPUTS}&quot;" prefer-non-shared="true">

 				<language-scope id="org.eclipse.cdt.core.gcc"/>

 				<language-scope id="org.eclipse.cdt.core.g++"/>

 			</provider>

@@ -16,7 +16,7 @@
 			<provider copy-of="extension" id="org.eclipse.cdt.ui.UserLanguageSettingsProvider"/>

 			<provider-reference id="org.eclipse.cdt.core.ReferencedProjectsLanguageSettingsProvider" ref="shared-provider"/>

 			<provider-reference id="org.eclipse.cdt.managedbuilder.core.MBSLanguageSettingsProvider" ref="shared-provider"/>

-			<provider class="org.eclipse.cdt.managedbuilder.language.settings.providers.GCCBuiltinSpecsDetector" console="false" env-hash="1935790922815146096" id="ilg.gnumcueclipse.managedbuild.cross.riscv.GCCBuiltinSpecsDetector" keep-relative-paths="false" name="CDT RISC-V Cross GCC Built-in Compiler Settings" parameter="${COMMAND} ${FLAGS} ${cross_toolchain_flags} -E -P -v -dD &quot;${INPUTS}&quot;" prefer-non-shared="true">

+			<provider class="org.eclipse.cdt.managedbuilder.language.settings.providers.GCCBuiltinSpecsDetector" console="false" env-hash="-1671468065510502376" id="ilg.gnumcueclipse.managedbuild.cross.riscv.GCCBuiltinSpecsDetector" keep-relative-paths="false" name="CDT RISC-V Cross GCC Built-in Compiler Settings" parameter="${COMMAND} ${FLAGS} ${cross_toolchain_flags} -E -P -v -dD &quot;${INPUTS}&quot;" prefer-non-shared="true">

 				<language-scope id="org.eclipse.cdt.core.gcc"/>

 				<language-scope id="org.eclipse.cdt.core.g++"/>

 			</provider>

diff --git a/FreeRTOS/Demo/RISC-V-Qemu-sifive_e-FreedomStudio/FreeRTOSConfig.h b/FreeRTOS/Demo/RISC-V-Qemu-sifive_e-FreedomStudio/FreeRTOSConfig.h
index c9e825c..db200a5 100644
--- a/FreeRTOS/Demo/RISC-V-Qemu-sifive_e-FreedomStudio/FreeRTOSConfig.h
+++ b/FreeRTOS/Demo/RISC-V-Qemu-sifive_e-FreedomStudio/FreeRTOSConfig.h
@@ -88,14 +88,14 @@
 #define configCLINT_BASE_ADDRESS		CLINT_CTRL_ADDR

 #define configUSE_PREEMPTION			1

 #define configUSE_IDLE_HOOK				0

-#define configUSE_TICK_HOOK				0

+#define configUSE_TICK_HOOK				1

 #define configCPU_CLOCK_HZ				( 10000000 ) /*QEMU*/

 #define configTICK_RATE_HZ				( ( TickType_t ) 1000 )

 #define configMAX_PRIORITIES			( 5 )

-#define configMINIMAL_STACK_SIZE		( ( unsigned short ) 512 )

-#define configTOTAL_HEAP_SIZE			( ( size_t ) ( 8 * 1024 ) )

+#define configMINIMAL_STACK_SIZE		( ( unsigned short ) 85 )

+#define configTOTAL_HEAP_SIZE			( ( size_t ) 14300 )

 #define configMAX_TASK_NAME_LEN			( 16 )

-#define configUSE_TRACE_FACILITY		1

+#define configUSE_TRACE_FACILITY		0

 #define configUSE_16_BIT_TICKS			0

 #define configIDLE_SHOULD_YIELD			0

 #define configUSE_MUTEXES				1

@@ -112,10 +112,10 @@
 #define configMAX_CO_ROUTINE_PRIORITIES ( 2 )

 

 /* Software timer definitions. */

-#define configUSE_TIMERS				0

-#define configTIMER_TASK_PRIORITY		( 2 )

-#define configTIMER_QUEUE_LENGTH		2

-#define configTIMER_TASK_STACK_DEPTH	( configMINIMAL_STACK_SIZE )

+#define configUSE_TIMERS				1

+#define configTIMER_TASK_PRIORITY		( configMAX_PRIORITIES - 1 )

+#define configTIMER_QUEUE_LENGTH		7

+#define configTIMER_TASK_STACK_DEPTH	( 120 )

 

 /* Task priorities.  Allow these to be overridden. */

 #ifndef uartPRIMARY_PRIORITY

@@ -132,20 +132,21 @@
 #define INCLUDE_vTaskDelayUntil			1

 #define INCLUDE_vTaskDelay				1

 #define INCLUDE_eTaskGetState			1

+#define INCLUDE_xTimerPendFunctionCall	1

 

 /* Normal assert() semantics without relying on the provision of an assert.h

 header file. */

-#define configASSERT( x ) if( ( x ) == 0 ) { taskDISABLE_INTERRUPTS(); for( ;; ); }

+void vAssertCalled( void );

+#define configASSERT( x ) if( ( x ) == 0 ) vAssertCalled()

 

-/* Definitions that map the FreeRTOS port interrupt handlers to their CMSIS

-standard names - or at least those used in the unmodified vector table. */

-//#define vPortSVCHandler SVCall_Handler

-//#define xPortPendSVHandler PendSV_Handler

-//#define vPortSysTickHandler SysTick_Handler

+/* Overwrite some of the stack sizes allocated to various test and demo tasks.

+Like all task stack sizes, the value is the number of words, not bytes. */

+#define configTIMER_TEST_TASK_STACK_SIZE 150

+#define configNOTIFIED_TEST_TASK_STACK_SIZE 120

+#define configEVENT_GROUP_SET_BIT_TEST_TASK_STACK_SIZE 110

+#define configEVENT_GROUP_RENDEZVOUS_TASK_STACK_SIZE 100

+#define configRECURSIVE_MUTEX_TASK_STACK_SIZE 100

 

-extern void vApplicationMallocFailedHook();

-

-

-extern void vUARTWriteString( const char * const pcString );

+#define configUSE_PORT_OPTIMISED_TASK_SELECTION 0

 

 #endif /* FREERTOS_CONFIG_H */

diff --git a/FreeRTOS/Demo/RISC-V-Qemu-sifive_e-FreedomStudio/blinky_demo/main_blinky.c b/FreeRTOS/Demo/RISC-V-Qemu-sifive_e-FreedomStudio/blinky_demo/main_blinky.c
new file mode 100644
index 0000000..f5222ad
--- /dev/null
+++ b/FreeRTOS/Demo/RISC-V-Qemu-sifive_e-FreedomStudio/blinky_demo/main_blinky.c
@@ -0,0 +1,203 @@
+/*

+ * FreeRTOS Kernel V10.1.1

+ * Copyright (C) 2018 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.

+ *

+ * http://www.FreeRTOS.org

+ * http://aws.amazon.com/freertos

+ *

+ * 1 tab == 4 spaces!

+ */

+

+/******************************************************************************

+ * NOTE 1:  This project provides two demo applications.  A simple blinky

+ * style project, and a more comprehensive test and demo application.  The

+ * mainCREATE_SIMPLE_BLINKY_DEMO_ONLY setting in main.c is used to select

+ * between the two.  See the notes on using mainCREATE_SIMPLE_BLINKY_DEMO_ONLY

+ * in main.c.  This file implements the simply blinky style version.

+ *

+ * NOTE 2:  This file only contains the source code that is specific to the

+ * basic demo.  Generic functions, such FreeRTOS hook functions, and functions

+ * required to configure the hardware are defined in main.c.

+ ******************************************************************************

+ *

+ * main_blinky() creates one queue, and two tasks.  It then starts the

+ * scheduler.

+ *

+ * The Queue Send Task:

+ * The queue send task is implemented by the prvQueueSendTask() function in

+ * this file.  prvQueueSendTask() sits in a loop that causes it to repeatedly

+ * block for 1000 milliseconds, before sending the value 100 to the queue that

+ * was created within main_blinky().  Once the value is sent, the task loops

+ * back around to block for another 1000 milliseconds...and so on.

+ *

+ * The Queue Receive Task:

+ * The queue receive task is implemented by the prvQueueReceiveTask() function

+ * in this file.  prvQueueReceiveTask() sits in a loop where it repeatedly

+ * blocks on attempts to read data from the queue that was created within

+ * main_blinky().  When data is received, the task checks the value of the

+ * data, and if the value equals the expected 100, writes 'Blink' to the UART

+ * (the UART is used in place of the LED to allow easy execution in QEMU).  The

+ * 'block time' parameter passed to the queue receive function specifies that

+ * the task should be held in the Blocked state indefinitely to wait for data to

+ * be available on the queue.  The queue receive task will only leave the

+ * Blocked state when the queue send task writes to the queue.  As the queue

+ * send task writes to the queue every 1000 milliseconds, the queue receive

+ * task leaves the Blocked state every 1000 milliseconds, and therefore toggles

+ * the LED every 200 milliseconds.

+ */

+

+/* Standard includes. */

+#include <stdio.h>

+#include <string.h>

+#include <unistd.h>

+

+/* Kernel includes. */

+#include "FreeRTOS.h"

+#include "task.h"

+#include "queue.h"

+

+/* Priorities used by the tasks. */

+#define mainQUEUE_RECEIVE_TASK_PRIORITY		( tskIDLE_PRIORITY + 2 )

+#define	mainQUEUE_SEND_TASK_PRIORITY		( tskIDLE_PRIORITY + 1 )

+

+/* The rate at which data is sent to the queue.  The 200ms value is converted

+to ticks using the pdMS_TO_TICKS() macro. */

+#define mainQUEUE_SEND_FREQUENCY_MS			pdMS_TO_TICKS( 1000 )

+

+/* The maximum number items the queue can hold.  The priority of the receiving

+task is above the priority of the sending task, so the receiving task will

+preempt the sending task and remove the queue items each time the sending task

+writes to the queue.  Therefore the queue will never have more than one item in

+it at any time, and even with a queue length of 1, the sending task will never

+find the queue full. */

+#define mainQUEUE_LENGTH					( 1 )

+

+/*-----------------------------------------------------------*/

+

+/*

+ * Called by main when mainCREATE_SIMPLE_BLINKY_DEMO_ONLY is set to 1 in

+ * main.c.

+ */

+void main_blinky( void );

+

+/*

+ * The tasks as described in the comments at the top of this file.

+ */

+static void prvQueueReceiveTask( void *pvParameters );

+static void prvQueueSendTask( void *pvParameters );

+

+/*-----------------------------------------------------------*/

+

+/* The queue used by both tasks. */

+static QueueHandle_t xQueue = NULL;

+

+/*-----------------------------------------------------------*/

+

+void main_blinky( void )

+{

+	/* Create the queue. */

+	xQueue = xQueueCreate( mainQUEUE_LENGTH, sizeof( uint32_t ) );

+

+	if( xQueue != NULL )

+	{

+		/* Start the two tasks as described in the comments at the top of this

+		file. */

+		xTaskCreate( prvQueueReceiveTask,				/* The function that implements the task. */

+					"Rx", 								/* The text name assigned to the task - for debug only as it is not used by the kernel. */

+					configMINIMAL_STACK_SIZE * 2U, 			/* The size of the stack to allocate to the task. */

+					NULL, 								/* The parameter passed to the task - not used in this case. */

+					mainQUEUE_RECEIVE_TASK_PRIORITY, 	/* The priority assigned to the task. */

+					NULL );								/* The task handle is not required, so NULL is passed. */

+

+		xTaskCreate( prvQueueSendTask, "TX", configMINIMAL_STACK_SIZE * 2U, NULL, mainQUEUE_SEND_TASK_PRIORITY, NULL );

+

+		/* Start the tasks and timer running. */

+		vTaskStartScheduler();

+	}

+

+	/* If all is well, the scheduler will now be running, and the following

+	line will never be reached.  If the following line does execute, then

+	there was insufficient FreeRTOS heap memory available for the Idle and/or

+	timer tasks to be created.  See the memory management section on the

+	FreeRTOS web site for more details on the FreeRTOS heap

+	http://www.freertos.org/a00111.html. */

+	for( ;; );

+}

+/*-----------------------------------------------------------*/

+

+static void prvQueueSendTask( void *pvParameters )

+{

+TickType_t xNextWakeTime;

+const unsigned long ulValueToSend = 100UL;

+BaseType_t xReturned;

+

+	/* Remove compiler warning about unused parameter. */

+	( void ) pvParameters;

+

+	/* Initialise xNextWakeTime - this only needs to be done once. */

+	xNextWakeTime = xTaskGetTickCount();

+

+	for( ;; )

+	{

+		/* Place this task in the blocked state until it is time to run again. */

+		vTaskDelayUntil( &xNextWakeTime, mainQUEUE_SEND_FREQUENCY_MS );

+

+		/* Send to the queue - causing the queue receive task to unblock and

+		toggle the LED.  0 is used as the block time so the sending operation

+		will not block - it shouldn't need to block as the queue should always

+		be empty at this point in the code. */

+		xReturned = xQueueSend( xQueue, &ulValueToSend, 0U );

+		configASSERT( xReturned == pdPASS );

+	}

+}

+/*-----------------------------------------------------------*/

+

+static void prvQueueReceiveTask( void *pvParameters )

+{

+unsigned long ulReceivedValue;

+const unsigned long ulExpectedValue = 100UL;

+const char * const pcPassMessage = "Blink\r\n";

+const char * const pcFailMessage = "Unexpected value received\r\n";

+

+	/* Remove compiler warning about unused parameter. */

+	( void ) pvParameters;

+

+	for( ;; )

+	{

+		/* Wait until something arrives in the queue - this task will block

+		indefinitely provided INCLUDE_vTaskSuspend is set to 1 in

+		FreeRTOSConfig.h. */

+		xQueueReceive( xQueue, &ulReceivedValue, portMAX_DELAY );

+

+		/*  To get here something must have been received from the queue, but

+		is it the expected value?  If it is, toggle the LED. */

+		if( ulReceivedValue == ulExpectedValue )

+		{

+			write( STDOUT_FILENO, pcPassMessage, strlen( pcPassMessage ) );

+			ulReceivedValue = 0U;

+		}

+		else

+		{

+			write( STDOUT_FILENO, pcFailMessage, strlen( pcFailMessage ) );

+		}

+	}

+}

+/*-----------------------------------------------------------*/

+

diff --git a/FreeRTOS/Demo/RISC-V-Qemu-sifive_e-FreedomStudio/full_demo/RegTest.S b/FreeRTOS/Demo/RISC-V-Qemu-sifive_e-FreedomStudio/full_demo/RegTest.S
index e4d8714..e3d169a 100644
--- a/FreeRTOS/Demo/RISC-V-Qemu-sifive_e-FreedomStudio/full_demo/RegTest.S
+++ b/FreeRTOS/Demo/RISC-V-Qemu-sifive_e-FreedomStudio/full_demo/RegTest.S
@@ -28,12 +28,17 @@
 	.extern ulRegTest1LoopCounter

 	.extern ulRegTest2LoopCounter

 

-	.global vRegTest1Task

-	.global vRegTest2Task

+	.global vRegTest1Implementation

+	.global vRegTest2Implementation

 

 /*-----------------------------------------------------------*/

 

-vRegTest1Task:

+/*

+ * The register check tasks are described in the comments at the top of

+ * main_full.c.

+ */

+

+vRegTest1Implementation:

 

 	/* Fill the core registers with known values. */

 	li x5, 0x5

@@ -65,9 +70,9 @@
 

 reg1_loop:

 

-    /* Check each register still contains the expected known value.

-    vRegTest1Implementation uses x31 as the temporary, vRegTest2Implementation

-    uses x5 as the temporary. */

+	/* Check each register still contains the expected known value.

+	vRegTest1Implementation uses x31 as the temporary, vRegTest2Implementation

+	uses x5 as the temporary. */

 	li x31, 0x5

 	bne x31, x5, reg1_error_loop

 	li x31, 0x6

@@ -121,134 +126,136 @@
 	li x31, 0x1e

 	bne x31, x30, reg1_error_loop

 

-    /* Everything passed, increment the loop counter. */

+	/* Everything passed, increment the loop counter. */

 	lw x31, ulRegTest1LoopCounterConst

 	lw x30, 0(x31)

 	addi x30, x30, 1

 	sw x30, 0(x31)

 

-    /* Restore clobbered register reading for next loop. */

-    li x30, 0x1e

+	/* Restore clobbered register reading for next loop. */

+	li x30, 0x1e

 

-    /* Yield to increase code coverage. */

-    ecall

+	/* Yield to increase code coverage. */

+	ecall

 

-    /* Start again. */

-    jal reg1_loop

+	/* Start again. */

+	jal reg1_loop

 

 reg1_error_loop:

-    /* Jump here if a register contains an uxpected value.  This stops the loop

-    counter being incremented so the check task knows an error was found. */

+	/* Jump here if a register contains an uxpected value.  This stops the loop

+	counter being incremented so the check task knows an error was found. */

+//	ebreak

 	jal reg1_error_loop

 

 ulRegTest1LoopCounterConst: .word ulRegTest1LoopCounter

 

 /*-----------------------------------------------------------*/

 

-vRegTest2Task:

+vRegTest2Implementation:

 

-    /* Fill the core registers with known values. */

-    li x6, 0x61

-    li x7, 0x71

-    li x8, 0x81

-    li x9, 0x91

-    li x10, 0xa1

-    li x11, 0xb1

-    li x12, 0xc1

-    li x13, 0xd1

-    li x14, 0xe1

-    li x15, 0xf1

-    li x16, 0x20

-    li x17, 0x21

-    li x18, 0x22

-    li x19, 0x23

-    li x20, 0x24

-    li x21, 0x25

-    li x22, 0x26

-    li x23, 0x27

-    li x24, 0x28

-    li x25, 0x29

-    li x26, 0x2a

-    li x27, 0x2b

-    li x28, 0x2c

-    li x29, 0x2d

-    li x30, 0x2e

-    li x31, 0x2f

+	/* Fill the core registers with known values. */

+	li x6, 0x61

+	li x7, 0x71

+	li x8, 0x81

+	li x9, 0x91

+	li x10, 0xa1

+	li x11, 0xb1

+	li x12, 0xc1

+	li x13, 0xd1

+	li x14, 0xe1

+	li x15, 0xf1

+	li x16, 0x20

+	li x17, 0x21

+	li x18, 0x22

+	li x19, 0x23

+	li x20, 0x24

+	li x21, 0x25

+	li x22, 0x26

+	li x23, 0x27

+	li x24, 0x28

+	li x25, 0x29

+	li x26, 0x2a

+	li x27, 0x2b

+	li x28, 0x2c

+	li x29, 0x2d

+	li x30, 0x2e

+	li x31, 0x2f

 

 Reg2_loop:

 

-    /* Check each register still contains the expected known value.

-    vRegTest2Implementation uses x5 as the temporary, vRegTest1Implementation

-    uses x31 as the temporary. */

-    li x5, 0x61

-    bne x5, x6, reg2_error_loop

-    li x5, 0x71

-    bne x5, x7, reg2_error_loop

-    li x5, 0x81

-    bne x5, x8, reg2_error_loop

-    li x5, 0x91

-    bne x5, x9, reg2_error_loop

-    li x5, 0xa1

-    bne x5, x10, reg2_error_loop

-    li x5, 0xb1

-    bne x5, x11, reg2_error_loop

-    li x5, 0xc1

-    bne x5, x12, reg2_error_loop

-    li x5, 0xd1

-    bne x5, x13, reg2_error_loop

-    li x5, 0xe1

-    bne x5, x14, reg2_error_loop

-    li x5, 0xf1

-    bne x5, x15, reg2_error_loop

-    li x5, 0x20

-    bne x5, x16, reg2_error_loop

-    li x5, 0x21

-    bne x5, x17, reg2_error_loop

-    li x5, 0x22

-    bne x5, x18, reg2_error_loop

-    li x5, 0x23

-    bne x5, x19, reg2_error_loop

-    li x5, 0x24

-    bne x5, x20, reg2_error_loop

-    li x5, 0x25

-    bne x5, x21, reg2_error_loop

-    li x5, 0x26

-    bne x5, x22, reg2_error_loop

-    li x5, 0x27

-    bne x5, x23, reg2_error_loop

-    li x5, 0x28

-    bne x5, x24, reg2_error_loop

-    li x5, 0x29

-    bne x5, x25, reg2_error_loop

-    li x5, 0x2a

-    bne x5, x26, reg2_error_loop

-    li x5, 0x2b

-    bne x5, x27, reg2_error_loop

-    li x5, 0x2c

-    bne x5, x28, reg2_error_loop

-    li x5, 0x2d

-    bne x5, x29, reg2_error_loop

-    li x5, 0x2e

-    bne x5, x30, reg2_error_loop

-    li x5, 0x2f

-    bne x5, x31, reg2_error_loop

+	/* Check each register still contains the expected known value.

+	vRegTest2Implementation uses x5 as the temporary, vRegTest1Implementation

+	uses x31 as the temporary. */

+	li x5, 0x61

+	bne x5, x6, reg2_error_loop

+	li x5, 0x71

+	bne x5, x7, reg2_error_loop

+	li x5, 0x81

+	bne x5, x8, reg2_error_loop

+	li x5, 0x91

+	bne x5, x9, reg2_error_loop

+	li x5, 0xa1

+	bne x5, x10, reg2_error_loop

+	li x5, 0xb1

+	bne x5, x11, reg2_error_loop

+	li x5, 0xc1

+	bne x5, x12, reg2_error_loop

+	li x5, 0xd1

+	bne x5, x13, reg2_error_loop

+	li x5, 0xe1

+	bne x5, x14, reg2_error_loop

+	li x5, 0xf1

+	bne x5, x15, reg2_error_loop

+	li x5, 0x20

+	bne x5, x16, reg2_error_loop

+	li x5, 0x21

+	bne x5, x17, reg2_error_loop

+	li x5, 0x22

+	bne x5, x18, reg2_error_loop

+	li x5, 0x23

+	bne x5, x19, reg2_error_loop

+	li x5, 0x24

+	bne x5, x20, reg2_error_loop

+	li x5, 0x25

+	bne x5, x21, reg2_error_loop

+	li x5, 0x26

+	bne x5, x22, reg2_error_loop

+	li x5, 0x27

+	bne x5, x23, reg2_error_loop

+	li x5, 0x28

+	bne x5, x24, reg2_error_loop

+	li x5, 0x29

+	bne x5, x25, reg2_error_loop

+	li x5, 0x2a

+	bne x5, x26, reg2_error_loop

+	li x5, 0x2b

+	bne x5, x27, reg2_error_loop

+	li x5, 0x2c

+	bne x5, x28, reg2_error_loop

+	li x5, 0x2d

+	bne x5, x29, reg2_error_loop

+	li x5, 0x2e

+	bne x5, x30, reg2_error_loop

+	li x5, 0x2f

+	bne x5, x31, reg2_error_loop

 

-    /* Everything passed, increment the loop counter. */

-    lw x5, ulRegTest2LoopCounterConst

-    lw x6, 0(x5)

-    addi x6, x6, 1

-    sw x6, 0(x5)

+	/* Everything passed, increment the loop counter. */

+	lw x5, ulRegTest2LoopCounterConst

+	lw x6, 0(x5)

+	addi x6, x6, 1

+	sw x6, 0(x5)

 

-    /* Restore clobbered register reading for next loop. */

-    li x6, 0x61

+	/* Restore clobbered register reading for next loop. */

+	li x6, 0x61

 

-    /* Start again. */

-    jal Reg2_loop

+	/* Start again. */

+	jal Reg2_loop

 

 reg2_error_loop:

-    /* Jump here if a register contains an uxpected value.  This stops the loop

-    counter being incremented so the check task knows an error was found. */

-    jal reg2_error_loop

+	/* Jump here if a register contains an uxpected value.  This stops the loop

+	counter being incremented so the check task knows an error was found. */

+//	ebreak

+	jal reg2_error_loop

 

 ulRegTest2LoopCounterConst: .word ulRegTest2LoopCounter

 

diff --git a/FreeRTOS/Demo/RISC-V-Qemu-sifive_e-FreedomStudio/full_demo/main_full.c b/FreeRTOS/Demo/RISC-V-Qemu-sifive_e-FreedomStudio/full_demo/main_full.c
new file mode 100644
index 0000000..5981a38
--- /dev/null
+++ b/FreeRTOS/Demo/RISC-V-Qemu-sifive_e-FreedomStudio/full_demo/main_full.c
@@ -0,0 +1,317 @@
+/*

+ * FreeRTOS Kernel V10.1.1

+ * Copyright (C) 2018 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.

+ *

+ * http://www.FreeRTOS.org

+ * http://aws.amazon.com/freertos

+ *

+ * 1 tab == 4 spaces!

+ */

+

+/******************************************************************************

+ * NOTE 1:  This project provides two demo applications.  A simple blinky style

+ * project, and a more comprehensive test and demo application.  The

+ * mainCREATE_SIMPLE_BLINKY_DEMO_ONLY setting in main.c is used to select

+ * between the two.  See the notes on using mainCREATE_SIMPLE_BLINKY_DEMO_ONLY

+ * in main.c.  This file implements the comprehensive test and demo version.

+ *

+ * NOTE 2:  This file only contains the source code that is specific to the

+ * full demo.  Generic functions, such FreeRTOS hook functions, and functions

+ * required to configure the hardware, are defined in main.c.

+ *

+ ******************************************************************************

+ *

+ * main_full() creates all the demo application tasks and software timers, then

+ * starts the scheduler.  The web documentation provides more details of the

+ * standard demo application tasks, which provide no particular functionality,

+ * but do provide a good example of how to use the FreeRTOS API.

+ *

+ * In addition to the standard demo tasks, the following tasks and tests are

+ * defined and/or created within this file:

+ *

+ * "Reg test" tasks - These fill both the core registers with known values, then

+ * check that each register maintains its expected value for the lifetime of the

+ * task.  Each task uses a different set of values.  The reg test tasks execute

+ * with a very low priority, so get preempted very frequently.  A register

+ * containing an unexpected value is indicative of an error in the context

+ * switching mechanism.

+ *

+ * "Check" task - The check executes every five seconds.  It checks that all

+ * the standard demo tasks, and the register check tasks, are not only still

+ * executing, but are executing without reporting any errors.  If the check task

+ * discovers that a task has either stalled, or reported an error, then it

+ * prints an error message to the UART, otherwise it prints "Pass.".

+ */

+

+/* Standard includes. */

+#include <stdio.h>

+#include <string.h>

+

+/* Kernel includes. */

+#include "FreeRTOS.h"

+#include "task.h"

+#include "timers.h"

+#include "semphr.h"

+

+/* Standard demo application includes. */

+#include "dynamic.h"

+#include "blocktim.h"

+#include "GenQTest.h"

+#include "recmutex.h"

+#include "TimerDemo.h"

+#include "EventGroupsDemo.h"

+#include "TaskNotify.h"

+

+/* SiFive includes. */

+#include "platform.h"

+#include "encoding.h"

+#include "unistd.h"

+

+/* Priorities for the demo application tasks. */

+#define mainCHECK_TASK_PRIORITY				( configMAX_PRIORITIES - 1 )

+

+/* The period of the check task, in ms, converted to ticks using the

+pdMS_TO_TICKS() macro. */

+#define mainNO_ERROR_CHECK_TASK_PERIOD		pdMS_TO_TICKS( 3000UL )

+

+/* Parameters that are passed into the register check tasks solely for the

+purpose of ensuring parameters are passed into tasks correctl5. */

+#define mainREG_TEST_TASK_1_PARAMETER		( ( void * ) 0x12345678 )

+#define mainREG_TEST_TASK_2_PARAMETER		( ( void * ) 0x87654321 )

+

+/* The base period used by the timer test tasks. */

+#define mainTIMER_TEST_PERIOD				( 50 )

+

+/* The size of the stack allocated to the check task (as described in the

+comments at the top of this file. */

+#define mainCHECK_TASK_STACK_SIZE_WORDS 100

+

+/* Size of the stacks to allocated for the register check tasks. */

+#define mainREG_TEST_STACK_SIZE_WORDS 60

+

+/*-----------------------------------------------------------*/

+

+/*

+ * Called by main() to run the full demo (as opposed to the blinky demo) when

+ * mainCREATE_SIMPLE_BLINKY_DEMO_ONLY is set to 0.

+ */

+void main_full( void );

+

+/*

+ * The check task, as described at the top of this file.

+ */

+static void prvCheckTask( void *pvParameters );

+

+/*

+ * Register check tasks as described at the top of this file.  The nature of

+ * these files necessitates that they are written in an assembly file, but the

+ * entry points are kept in the C file for the convenience of checking the task

+ * parameter.

+ */

+static void prvRegTestTaskEntry1( void *pvParameters );

+extern void vRegTest1Implementation( void );

+static void prvRegTestTaskEntry2( void *pvParameters );

+extern void vRegTest2Implementation( void );

+

+/*

+ * Tick hook used by the full demo, which includes code that interacts with

+ * some of the tests.

+ */

+void vFullDemoTickHook( void );

+

+/*-----------------------------------------------------------*/

+

+/* The following two variables are used to communicate the status of the

+register check tasks to the check task.  If the variables keep incrementing,

+then the register check tasks have not discovered any errors.  If a variable

+stops incrementing, then an error has been found. */

+volatile uint32_t ulRegTest1LoopCounter = 0UL, ulRegTest2LoopCounter = 0UL;

+

+/*-----------------------------------------------------------*/

+

+void main_full( void )

+{

+	/* Start all the other standard demo/test tasks.  They have no particular

+	functionality, but do demonstrate how to use the FreeRTOS API and test the

+	kernel port. */

+	vStartDynamicPriorityTasks();

+	vCreateBlockTimeTasks();

+	vStartGenericQueueTasks( tskIDLE_PRIORITY );

+	vStartRecursiveMutexTasks();

+	vStartTimerDemoTask( mainTIMER_TEST_PERIOD );

+	vStartEventGroupTasks();

+	vStartTaskNotifyTask();

+

+	/* Create the register check tasks, as described at the top of this	file.

+	Use xTaskCreateStatic() to create a task using only statically allocated

+	memory. */

+	xTaskCreate( prvRegTestTaskEntry1, 			/* The function that implements the task. */

+				 "Reg1", 						/* The name of the task. */

+				 mainREG_TEST_STACK_SIZE_WORDS, /* Size of stack to allocate for the task - in words not bytes!. */

+				 mainREG_TEST_TASK_1_PARAMETER, /* Parameter passed into the task. */

+				 tskIDLE_PRIORITY, 				/* Priority of the task. */

+				 NULL );						/* Can be used to pass out a handle to the created task. */

+	xTaskCreate( prvRegTestTaskEntry2, "Reg2", mainREG_TEST_STACK_SIZE_WORDS, mainREG_TEST_TASK_2_PARAMETER, tskIDLE_PRIORITY, NULL );

+

+	/* Create the task that performs the 'check' functionality,	as described at

+	the top of this file. */

+//	xTaskCreate( prvCheckTask, "Check", mainCHECK_TASK_STACK_SIZE_WORDS, NULL, mainCHECK_TASK_PRIORITY, NULL );

+	xTaskCreate( prvCheckTask, "Check", mainCHECK_TASK_STACK_SIZE_WORDS, NULL, tskIDLE_PRIORITY, NULL );

+

+	/* Start the scheduler. */

+	vTaskStartScheduler();

+

+	/* If all is well, the scheduler will now be running, and the following

+	line will never be reached.  If the following line does execute, then

+	there was insufficient FreeRTOS heap memory available for the Idle and/or

+	timer tasks to be created.  See the memory management section on the

+	FreeRTOS web site for more details on the FreeRTOS heap

+	http://www.freertos.org/a00111.html. */

+	for( ;; );

+}

+/*-----------------------------------------------------------*/

+

+static void prvCheckTask( void *pvParameters )

+{

+const TickType_t xDelayPeriod = mainNO_ERROR_CHECK_TASK_PERIOD;

+TickType_t xLastExecutionTime;

+static unsigned long ulLastRegTest1Value = 0, ulLastRegTest2Value = 0;

+const char * const pcPassMessage = "Pass.\r\n";

+char * pcStatusMessage = pcPassMessage;

+

+	/* Just to stop compiler warnings. */

+	( void ) pvParameters;

+

+	/* Initialise xLastExecutionTime so the first call to vTaskDelayUntil()

+	works correctly. */

+	xLastExecutionTime = xTaskGetTickCount();

+

+	/* Cycle for ever, delaying then checking all the other tasks are still

+	operating without error.  The onboard LED is toggled on each iteration.

+	If an error is detected then the delay period is decreased from

+	mainNO_ERROR_CHECK_TASK_PERIOD to mainERROR_CHECK_TASK_PERIOD.  This has the

+	effect of increasing the rate at which the onboard LED toggles, and in so

+	doing gives visual feedback of the system status. */

+	for( ;; )

+	{

+		/* Delay until it is time to execute again. */

+		vTaskDelayUntil( &xLastExecutionTime, xDelayPeriod );

+

+		/* Check all the demo tasks (other than the flash tasks) to ensure

+		that they are all still running, and that none have detected an error. */

+		if( xAreDynamicPriorityTasksStillRunning() != pdTRUE )

+		{

+			pcStatusMessage = "ERROR: Dynamic priority demo/tests.\r\n";

+		}

+

+		if ( xAreBlockTimeTestTasksStillRunning() != pdTRUE )

+		{

+			pcStatusMessage = "ERROR: Block time demo/tests.\r\n";

+		}

+

+		if ( xAreGenericQueueTasksStillRunning() != pdTRUE )

+		{

+			pcStatusMessage = "ERROR: Generic queue demo/tests.\r\n";

+		}

+

+		if ( xAreRecursiveMutexTasksStillRunning() != pdTRUE )

+		{

+			pcStatusMessage = "ERROR: Recursive mutex demo/tests.\r\n";

+		}

+

+		if( xAreTimerDemoTasksStillRunning( ( TickType_t ) xDelayPeriod ) != pdPASS )

+		{

+//			pcStatusMessage = "ERROR: Timer demo/tests.\r\n";

+		}

+

+		if( xAreEventGroupTasksStillRunning() != pdPASS )

+		{

+			pcStatusMessage = "ERROR: Event group demo/tests.\r\n";

+		}

+

+		if( xAreTaskNotificationTasksStillRunning() != pdPASS )

+		{

+			pcStatusMessage = "ERROR: Task notification demo/tests.\r\n";

+		}

+

+		/* Check that the register test 1 task is still running. */

+		if( ulLastRegTest1Value == ulRegTest1LoopCounter )

+		{

+			pcStatusMessage = "ERROR: Register test 1.\r\n";

+		}

+		ulLastRegTest1Value = ulRegTest1LoopCounter;

+

+		/* Check that the register test 2 task is still running. */

+		if( ulLastRegTest2Value == ulRegTest2LoopCounter )

+		{

+			pcStatusMessage = "ERROR: Register test 2.\r\n";

+		}

+		ulLastRegTest2Value = ulRegTest2LoopCounter;

+

+		/* Write the status message to the UART. */

+		write( STDOUT_FILENO, pcStatusMessage, strlen( pcStatusMessage ) );

+	}

+}

+/*-----------------------------------------------------------*/

+

+static void prvRegTestTaskEntry1( void *pvParameters )

+{

+	/* Although the regtest task is written in assembler, its entry point is

+	written in C for convenience of checking the task parameter is being passed

+	in correctly. */

+	if( pvParameters == mainREG_TEST_TASK_1_PARAMETER )

+	{

+		/* Start the part of the test that is written in assembler. */

+		vRegTest1Implementation();

+	}

+

+	/* The following line will only execute if the task parameter is found to

+	be incorrect.  The check task will detect that the regtest loop counter is

+	not being incremented and flag an error. */

+	vTaskDelete( NULL );

+}

+/*-----------------------------------------------------------*/

+

+static void prvRegTestTaskEntry2( void *pvParameters )

+{

+	/* Although the regtest task is written in assembler, its entry point is

+	written in C for convenience of checking the task parameter is being passed

+	in correctly. */

+	if( pvParameters == mainREG_TEST_TASK_2_PARAMETER )

+	{

+		/* Start the part of the test that is written in assembler. */

+		vRegTest2Implementation();

+	}

+

+	/* The following line will only execute if the task parameter is found to

+	be incorrect.  The check task will detect that the regtest loop counter is

+	not being incremented and flag an error. */

+	vTaskDelete( NULL );

+}

+/*-----------------------------------------------------------*/

+

+void vFullDemoTickHook( void )

+{

+	/* Called from vApplicationTickHook() when the project is configured to

+	build the full demo. */

+//	vTimerPeriodicISRTests();

+	vPeriodicEventGroupsProcessing();

+	xNotifyTaskFromISR();

+}

diff --git a/FreeRTOS/Demo/RISC-V-Qemu-sifive_e-FreedomStudio/main.c b/FreeRTOS/Demo/RISC-V-Qemu-sifive_e-FreedomStudio/main.c
index a33a716..0c970d9 100644
--- a/FreeRTOS/Demo/RISC-V-Qemu-sifive_e-FreedomStudio/main.c
+++ b/FreeRTOS/Demo/RISC-V-Qemu-sifive_e-FreedomStudio/main.c
@@ -1,126 +1,87 @@
-// See LICENSE for license details.

+/*

+ * FreeRTOS Kernel V10.1.1

+ * Copyright (C) 2018 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.

+ *

+ * http://www.FreeRTOS.org

+ * http://aws.amazon.com/freertos

+ *

+ * 1 tab == 4 spaces!

+ */

 

+/* FreeRTOS kernel includes. */

 #include <FreeRTOS.h>

 #include <task.h>

 

-#include <stdio.h>

-#include <stdlib.h>

-#include "platform.h"

-#include <string.h>

-#include "plic/plic_driver.h"

-#include "encoding.h"

-#include <unistd.h>

-#include "stdatomic.h"

+/******************************************************************************

+ * This project provides two demo applications.  A simple blinky style project,

+ * and a more comprehensive test and demo application.  The

+ * mainCREATE_SIMPLE_BLINKY_DEMO_ONLY setting (defined in this file) is used to

+ * select between the two.  The simply blinky demo is implemented and described

+ * in main_blinky.c.  The more comprehensive test and demo application is

+ * implemented and described in main_full.c.

+ *

+ * This file implements the code that is not demo specific, including the

+ * hardware setup and standard FreeRTOS hook functions.

+ *

+ * ENSURE TO READ THE DOCUMENTATION PAGE FOR THIS PORT AND DEMO APPLICATION ON

+ * THE http://www.FreeRTOS.org WEB SITE FOR FULL INFORMATION ON USING THIS DEMO

+ * APPLICATION, AND ITS ASSOCIATE FreeRTOS ARCHITECTURE PORT!

+ *

+ */

 

-

+/* Set mainCREATE_SIMPLE_BLINKY_DEMO_ONLY to one to run the simple blinky demo,

+or 0 to run the more comprehensive test and demo application. */

+#define mainCREATE_SIMPLE_BLINKY_DEMO_ONLY	0

 

 /*

- * FreeRTOS hook for when malloc fails, enable in FreeRTOSConfig.

+ * main_blinky() is used when mainCREATE_SIMPLE_BLINKY_DEMO_ONLY is set to 1.

+ * main_full() is used when mainCREATE_SIMPLE_BLINKY_DEMO_ONLY is set to 0.

  */

+#if mainCREATE_SIMPLE_BLINKY_DEMO_ONLY == 1

+	extern void main_blinky( void );

+#else

+	extern void main_full( void );

+#endif /* #if mainCREATE_SIMPLE_BLINKY_DEMO_ONLY == 1 */

+

+/* Prototypes for the standard FreeRTOS callback/hook functions implemented

+within this file.  See https://www.freertos.org/a00016.html */

 void vApplicationMallocFailedHook( void );

-

-/*

- * FreeRTOS hook for when FreeRtos is idling, enable in FreeRTOSConfig.

- */

 void vApplicationIdleHook( void );

-

-/*

- * FreeRTOS hook for when a stack overflow occurs, enable in FreeRTOSConfig.

- */

 void vApplicationStackOverflowHook( TaskHandle_t pxTask, char *pcTaskName );

+void vApplicationTickHook( void );

 

-

-

-void vRegTest1Task( void *pvParameters );

-void vRegTest2Task( void *pvParameters );

-

-

-const char * const pcStartMessage = "FreeRTOS demo\r\n";

-volatile uint32_t ulRegTest1LoopCounter = 0, ulRegTest2LoopCounter = 0;

-static void prvCheckTask( void *pvParameters );

-plic_instance_t g_plic;

-uint32_t bitbang_mask = 0;

+/*-----------------------------------------------------------*/

 

 int main( void )

 {

-	#ifdef HAS_BOARD_BUTTONS

-		GPIO_REG(GPIO_OUTPUT_EN)  &= ~((0x1 << BUTTON_0_OFFSET) | (0x1 << BUTTON_1_OFFSET) | (0x1 << BUTTON_2_OFFSET));

-		GPIO_REG(GPIO_PULLUP_EN)  &= ~((0x1 << BUTTON_0_OFFSET) | (0x1 << BUTTON_1_OFFSET) | (0x1 << BUTTON_2_OFFSET));

-		GPIO_REG(GPIO_INPUT_EN)   |=  ((0x1 << BUTTON_0_OFFSET) | (0x1 << BUTTON_1_OFFSET) | (0x1 << BUTTON_2_OFFSET));

-	#endif

-

-	GPIO_REG(GPIO_INPUT_EN)    &= ~((0x1<< RED_LED_OFFSET) | (0x1<< GREEN_LED_OFFSET) | (0x1 << BLUE_LED_OFFSET)) ;

-	GPIO_REG(GPIO_OUTPUT_EN)   |=  ((0x1<< RED_LED_OFFSET)| (0x1<< GREEN_LED_OFFSET) | (0x1 << BLUE_LED_OFFSET)) ;

-	GPIO_REG(GPIO_OUTPUT_VAL)  |=   (0x1 << BLUE_LED_OFFSET) ;

-	GPIO_REG(GPIO_OUTPUT_VAL)  &=  ~((0x1<< RED_LED_OFFSET) | (0x1<< GREEN_LED_OFFSET)) ;

-

-	/* For Bit-banging with Atomics demo. */

-	#ifdef _SIFIVE_HIFIVE1_H

-		bitbang_mask = (1 << PIN_19_OFFSET);

-	#else

-		#ifdef _SIFIVE_COREPLEXIP_ARTY_H

-			bitbang_mask = (0x1 << JA_0_OFFSET);

-		#endif

-	#endif

-

-	GPIO_REG(GPIO_OUTPUT_EN) |= bitbang_mask;

-

-//	xTaskCreate( vRegTest1Task, "RegTest1", 1000, NULL, tskIDLE_PRIORITY, NULL );

-//	xTaskCreate( vRegTest2Task, "RegTest2", 1000, NULL, tskIDLE_PRIORITY, NULL );

-	xTaskCreate( prvCheckTask, "Check", 1000, NULL, configMAX_PRIORITIES - 1, NULL );

-

-	vTaskStartScheduler();

-}

-/*-----------------------------------------------------------*/

-

-static void prvCheckTask( void *pvParameters )

-{

-const char *pcMessage = "PASS\r\n";

-const TickType_t xCheckPeriod = pdMS_TO_TICKS( 3000UL );

-uint32_t ulLastRegTest1LoopCounter = 0, ulLastRegTest2LoopCounter = 0;

-volatile uintptr_t mstatus;

-

-volatile uint32_t ulx;

-__asm volatile ("csrr %0, mstatus" : "=r"(mstatus));

-portENABLE_INTERRUPTS();

-__asm volatile ("csrr %0, mstatus" : "=r"(mstatus));

-for( ;; )

-{

-//	for( ulx = 0; ulx < 0xffff; ulx++ ) __asm volatile( "NOP" );

-//	vPortSetupTimerInterrupt();

-	vTaskDelay( xCheckPeriod );

-	write( STDOUT_FILENO, "Blip\r\n", strlen( "Blip\r\n" ) );

-}

-#if 0

-	for( ;; )

+	/* The mainCREATE_SIMPLE_BLINKY_DEMO_ONLY setting is described at the top

+	of this file. */

+	#if( mainCREATE_SIMPLE_BLINKY_DEMO_ONLY == 1 )

 	{

-		vTaskDelay( xCheckPeriod );

-

-		if( ulLastRegTest1LoopCounter == ulRegTest1LoopCounter )

-		{

-			/* The RegTest1 loop counter is no longer incrementing, indicating

-			the task failed its self check. */

-			pcMessage = "FAIL: RegTest1\r\n";

-		}

-		else

-		{

-			ulLastRegTest1LoopCounter = ulRegTest1LoopCounter;

-		}

-

-		if( ulLastRegTest2LoopCounter == ulRegTest2LoopCounter )

-		{

-			/* The RegTest1 loop counter is no longer incrementing, indicating

-			the task failed its self check. */

-			pcMessage = "FAIL: RegTest2\r\n";

-		}

-		else

-		{

-			ulLastRegTest2LoopCounter = ulRegTest2LoopCounter;

-		}

-

-		vUARTWriteString( pcMessage );

+		main_blinky();

 	}

-#endif

+	#else

+	{

+		main_full();

+	}

+	#endif

 }

 /*-----------------------------------------------------------*/

 

@@ -137,6 +98,7 @@
 	to query the size of free heap space that remains (although it does not

 	provide information on how the remaining heap might be fragmented). */

 	taskDISABLE_INTERRUPTS();

+//	__asm volatile( "ebreak" );

 	for( ;; );

 }

 /*-----------------------------------------------------------*/

@@ -164,39 +126,26 @@
 	configCHECK_FOR_STACK_OVERFLOW is defined to 1 or 2.  This hook

 	function is called if a stack overflow is detected. */

 	taskDISABLE_INTERRUPTS();

+//	__asm volatile( "ebreak" );

 	for( ;; );

 }

 /*-----------------------------------------------------------*/

 

-#define mainINTERRUPT_BIT_SET 0x80000000UL

-#define mainENVIRONMENT_CALL	11UL

-#define mainEXTERNAL_INTERRRUPT ( mainINTERRUPT_BIT_SET | 11UL )

-#define mainTIMER_INTERRUPT		( mainINTERRUPT_BIT_SET | 7UL )

-#define mainSOFTWARE_INTERRUPT	( mainINTERRUPT_BIT_SET | 3UL )

-

-extern void Timer_IRQHandler( void );

-

-uint32_t ulPortTrapHandler( uint32_t mcause, uint32_t mepc )

+void vApplicationTickHook( void )

 {

-	if( mcause == mainENVIRONMENT_CALL )

+	/* The tests in the full demo expect some interaction with interrupts. */

+	#if( mainCREATE_SIMPLE_BLINKY_DEMO_ONLY != 1 )

 	{

-		vTaskSwitchContext();

+		extern void vFullDemoTickHook( void );

+		vFullDemoTickHook();

+	}

+	#endif

+}

+/*-----------------------------------------------------------*/

 

-		/* Ensure not to return to the instruction that generated the exception. */

-		mepc += 4;

-	}

-	else if( mcause == mainEXTERNAL_INTERRRUPT )

-	{

-		for( ;; );

-	}

-	else if( mcause == mainTIMER_INTERRUPT )

-	{

-		Timer_IRQHandler();

-	}

-	else if( mcause == mainSOFTWARE_INTERRUPT )

-	{

-		for( ;; );

-	}

-

-	return mepc;

+void vAssertCalled( void )

+{

+	taskDISABLE_INTERRUPTS();

+//	__asm volatile( "ebreak" );

+	for( ;; );

 }