]> git.sur5r.net Git - freertos/commitdiff
Added the "full" demo to the RISC-V_RV32_SiFive_HiFive1_GCC demo - backup check in...
authorrtel <rtel@1d2547de-c912-0410-9cb9-b8ca96c0e9e2>
Sun, 13 Oct 2019 22:53:00 +0000 (22:53 +0000)
committerrtel <rtel@1d2547de-c912-0410-9cb9-b8ca96c0e9e2>
Sun, 13 Oct 2019 22:53:00 +0000 (22:53 +0000)
git-svn-id: https://svn.code.sf.net/p/freertos/code/trunk@2737 1d2547de-c912-0410-9cb9-b8ca96c0e9e2

FreeRTOS/Demo/RISC-V_RV32_SiFive_HiFive1_GCC/.cproject
FreeRTOS/Demo/RISC-V_RV32_SiFive_HiFive1_GCC/.project
FreeRTOS/Demo/RISC-V_RV32_SiFive_HiFive1_GCC/FreeRTOSConfig.h
FreeRTOS/Demo/RISC-V_RV32_SiFive_HiFive1_GCC/blinky_demo/main_blinky.c
FreeRTOS/Demo/RISC-V_RV32_SiFive_HiFive1_GCC/bsp/design.dts [new file with mode: 0644]
FreeRTOS/Demo/RISC-V_RV32_SiFive_HiFive1_GCC/bsp/design.reglist [new file with mode: 0644]
FreeRTOS/Demo/RISC-V_RV32_SiFive_HiFive1_GCC/bsp/metal.default.lds
FreeRTOS/Demo/RISC-V_RV32_SiFive_HiFive1_GCC/freedom-metal/gloss/crt0.S
FreeRTOS/Demo/RISC-V_RV32_SiFive_HiFive1_GCC/full_demo/RegTest.S [new file with mode: 0644]
FreeRTOS/Demo/RISC-V_RV32_SiFive_HiFive1_GCC/full_demo/main_full.c [new file with mode: 0644]
FreeRTOS/Demo/RISC-V_RV32_SiFive_HiFive1_GCC/main.c

index f7e34155520903611a3b0ebd08375b37b7eb8a9b..4422a43b66009b7b258ceb718a5e4d9fdff20554 100644 (file)
@@ -25,6 +25,7 @@
                                                                <option id="gnu.c.compiler.option.dialect.std.1648189865" name="Language standard" superClass="gnu.c.compiler.option.dialect.std" useByScannerDiscovery="true" value="gnu.c.compiler.dialect.default" valueType="enumerated"/>\r
                                                                <option id="gnu.c.compiler.option.include.paths.1720192082" name="Include paths (-I)" superClass="gnu.c.compiler.option.include.paths" useByScannerDiscovery="false" valueType="includePath">\r
                                                                        <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/FreeRTOS_Source/include}&quot;"/>\r
+                                                                       <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/full_demo/Common_Demo_Tasks/include}&quot;"/>\r
                                                                        <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}}&quot;"/>\r
                                                                        <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/FreeRTOS_Source/portable/GCC/RISC-V}&quot;"/>\r
                                                                        <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/FreeRTOS_Source/include}&quot;"/>\r
                                                        </tool>\r
                                                </toolChain>\r
                                        </folderInfo>\r
+                                       <folderInfo id="cdt.managedbuild.config.gnu.cross.exe.debug.206163480.226910554" name="/" resourcePath="full_demo/Common_Demo_Tasks">\r
+                                               <toolChain id="cdt.managedbuild.toolchain.gnu.cross.exe.debug.1460593804" name="Cross GCC" superClass="cdt.managedbuild.toolchain.gnu.cross.exe.debug" unusedChildren="">\r
+                                                       <tool id="cdt.managedbuild.tool.gnu.cross.c.compiler.1285988628" name="Cross GCC Compiler" superClass="cdt.managedbuild.tool.gnu.cross.c.compiler.1469975065"/>\r
+                                                       <tool id="cdt.managedbuild.tool.gnu.cross.cpp.compiler.223438273" name="Cross G++ Compiler" superClass="cdt.managedbuild.tool.gnu.cross.cpp.compiler.420742449"/>\r
+                                                       <tool id="cdt.managedbuild.tool.gnu.cross.c.linker.609362678" name="Cross GCC Linker" superClass="cdt.managedbuild.tool.gnu.cross.c.linker.558060359"/>\r
+                                                       <tool id="cdt.managedbuild.tool.gnu.cross.cpp.linker.1231291683" name="Cross G++ Linker" superClass="cdt.managedbuild.tool.gnu.cross.cpp.linker.2105463183"/>\r
+                                                       <tool id="cdt.managedbuild.tool.gnu.cross.archiver.585811070" name="Cross GCC Archiver" superClass="cdt.managedbuild.tool.gnu.cross.archiver.424513814"/>\r
+                                                       <tool id="cdt.managedbuild.tool.gnu.cross.assembler.376247243" name="Cross GCC Assembler" superClass="cdt.managedbuild.tool.gnu.cross.assembler.825438707"/>\r
+                                               </toolChain>\r
+                                       </folderInfo>\r
                                        <sourceEntries>\r
                                                <entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name=""/>\r
                                        </sourceEntries>\r
index a9213bc29500c31b8afa32d333c985bd7fe9e79b..f22f740774cb95a36d8890e073347dec4730bec0 100644 (file)
                        <type>2</type>\r
                        <locationURI>FREERTOS_ROOT/FreeRTOS/Source</locationURI>\r
                </link>\r
+               <link>\r
+                       <name>full_demo/Common_Demo_Tasks</name>\r
+                       <type>2</type>\r
+                       <locationURI>FREERTOS_ROOT/FreeRTOS/Demo/Common/Minimal</locationURI>\r
+               </link>\r
+               <link>\r
+                       <name>full_demo/Common_Demo_Tasks/include</name>\r
+                       <type>2</type>\r
+                       <locationURI>FREERTOS_ROOT/FreeRTOS/Demo/Common/include</locationURI>\r
+               </link>\r
        </linkedResources>\r
        <filteredResources>\r
                <filter>\r
                                <arguments>1.0-name-matches-false-false-GCC</arguments>\r
                        </matcher>\r
                </filter>\r
+               <filter>\r
+                       <id>1571005814144</id>\r
+                       <name>full_demo/Common_Demo_Tasks</name>\r
+                       <type>5</type>\r
+                       <matcher>\r
+                               <id>org.eclipse.ui.ide.multiFilter</id>\r
+                               <arguments>1.0-name-matches-false-false-TimerDemo.c</arguments>\r
+                       </matcher>\r
+               </filter>\r
+               <filter>\r
+                       <id>1571005814150</id>\r
+                       <name>full_demo/Common_Demo_Tasks</name>\r
+                       <type>5</type>\r
+                       <matcher>\r
+                               <id>org.eclipse.ui.ide.multiFilter</id>\r
+                               <arguments>1.0-name-matches-false-false-blocktim.c</arguments>\r
+                       </matcher>\r
+               </filter>\r
+               <filter>\r
+                       <id>1571005814159</id>\r
+                       <name>full_demo/Common_Demo_Tasks</name>\r
+                       <type>5</type>\r
+                       <matcher>\r
+                               <id>org.eclipse.ui.ide.multiFilter</id>\r
+                               <arguments>1.0-name-matches-false-false-dynamic.c</arguments>\r
+                       </matcher>\r
+               </filter>\r
+               <filter>\r
+                       <id>1571005814167</id>\r
+                       <name>full_demo/Common_Demo_Tasks</name>\r
+                       <type>5</type>\r
+                       <matcher>\r
+                               <id>org.eclipse.ui.ide.multiFilter</id>\r
+                               <arguments>1.0-name-matches-false-false-TaskNotify.c</arguments>\r
+                       </matcher>\r
+               </filter>\r
                <filter>\r
                        <id>1570727992991</id>\r
                        <name>FreeRTOS_Source/portable/GCC</name>\r
                                <arguments>1.0-name-matches-false-false-heap_4.c</arguments>\r
                        </matcher>\r
                </filter>\r
+               <filter>\r
+                       <id>1571005832815</id>\r
+                       <name>full_demo/Common_Demo_Tasks/include</name>\r
+                       <type>5</type>\r
+                       <matcher>\r
+                               <id>org.eclipse.ui.ide.multiFilter</id>\r
+                               <arguments>1.0-name-matches-false-false-TimerDemo.h</arguments>\r
+                       </matcher>\r
+               </filter>\r
+               <filter>\r
+                       <id>1571005832820</id>\r
+                       <name>full_demo/Common_Demo_Tasks/include</name>\r
+                       <type>5</type>\r
+                       <matcher>\r
+                               <id>org.eclipse.ui.ide.multiFilter</id>\r
+                               <arguments>1.0-name-matches-false-false-blocktim.h</arguments>\r
+                       </matcher>\r
+               </filter>\r
+               <filter>\r
+                       <id>1571005832824</id>\r
+                       <name>full_demo/Common_Demo_Tasks/include</name>\r
+                       <type>5</type>\r
+                       <matcher>\r
+                               <id>org.eclipse.ui.ide.multiFilter</id>\r
+                               <arguments>1.0-name-matches-false-false-dynamic.h</arguments>\r
+                       </matcher>\r
+               </filter>\r
+               <filter>\r
+                       <id>1571005832829</id>\r
+                       <name>full_demo/Common_Demo_Tasks/include</name>\r
+                       <type>5</type>\r
+                       <matcher>\r
+                               <id>org.eclipse.ui.ide.multiFilter</id>\r
+                               <arguments>1.0-name-matches-false-false-MessageBufferDemo.h</arguments>\r
+                       </matcher>\r
+               </filter>\r
+               <filter>\r
+                       <id>1571005832835</id>\r
+                       <name>full_demo/Common_Demo_Tasks/include</name>\r
+                       <type>5</type>\r
+                       <matcher>\r
+                               <id>org.eclipse.ui.ide.multiFilter</id>\r
+                               <arguments>1.0-name-matches-false-false-TaskNotify.h</arguments>\r
+                       </matcher>\r
+               </filter>\r
                <filter>\r
                        <id>1570728021983</id>\r
                        <name>FreeRTOS_Source/portable/GCC/RISC-V/chip_specific_extensions</name>\r
index d27c2557bfb12438343268c19215558d2db758e4..207d2e2bd4755328718fb6f71d4b6ea3402c5758 100644 (file)
@@ -90,8 +90,8 @@
 #define configCPU_CLOCK_HZ                             ( 32768 ) /*QEMU*/\r
 #define configTICK_RATE_HZ                             ( ( TickType_t ) 1000 )\r
 #define configMAX_PRIORITIES                   ( 7 )\r
-#define configMINIMAL_STACK_SIZE               ( ( unsigned short ) 70 )\r
-#define configTOTAL_HEAP_SIZE                  ( ( size_t ) 10000 )\r
+#define configMINIMAL_STACK_SIZE               ( ( unsigned short ) 120 ) /* Only needs to be this high as some demo tasks also use this constant.  In production only the idle task would use this. */\r
+#define configTOTAL_HEAP_SIZE                  ( ( size_t ) 10900 )\r
 #define configMAX_TASK_NAME_LEN                        ( 16 )\r
 #define configUSE_TRACE_FACILITY               0\r
 #define configUSE_16_BIT_TICKS                 0\r
 /* Software timer definitions. */\r
 #define configUSE_TIMERS                               1\r
 #define configTIMER_TASK_PRIORITY              ( configMAX_PRIORITIES - 1 )\r
-#define configTIMER_QUEUE_LENGTH               4\r
-#define configTIMER_TASK_STACK_DEPTH   ( 100 )\r
+#define configTIMER_QUEUE_LENGTH               8\r
+#define configTIMER_TASK_STACK_DEPTH   ( 160 )\r
 \r
 /* Task priorities.  Allow these to be overridden. */\r
 #ifndef uartPRIMARY_PRIORITY\r
@@ -138,16 +138,4 @@ header file. */
 void vAssertCalled( void );\r
 #define configASSERT( x ) if( ( x ) == 0 ) vAssertCalled()\r
 \r
-/* Overwrite some of the stack sizes allocated to various test and demo tasks.\r
-Like all task stack sizes, the value is the number of words, not bytes. */\r
-#define bktBLOCK_TIME_TASK_STACK_SIZE 100\r
-#define notifyNOTIFIED_TASK_STACK_SIZE 120\r
-#define priSUSPENDED_RX_TASK_STACK_SIZE 90\r
-#define tmrTIMER_TEST_TASK_STACK_SIZE 100\r
-#define ebRENDESVOUS_TEST_TASK_STACK_SIZE 100\r
-#define ebEVENT_GROUP_SET_BITS_TEST_TASK_STACK_SIZE 115\r
-#define genqMUTEX_TEST_TASK_STACK_SIZE 90\r
-#define genqGENERIC_QUEUE_TEST_TASK_STACK_SIZE 100\r
-#define recmuRECURSIVE_MUTEX_TEST_TASK_STACK_SIZE 90\r
-\r
 #endif /* FREERTOS_CONFIG_H */\r
index 1e5cf0a9c0729b08235b4f4612c45ced9f25c578..727560b7aac5779bea03cdf0c8228b4d72cff222 100644 (file)
@@ -191,14 +191,9 @@ extern void vToggleLED( void );
                is it the expected value?  If it is, toggle the LED. */\r
                if( ulReceivedValue == ulExpectedValue )\r
                {\r
-                       write( STDOUT_FILENO, pcPassMessage, strlen( pcPassMessage ) );\r
                        vToggleLED();\r
                        ulReceivedValue = 0U;\r
                }\r
-               else\r
-               {\r
-                       write( STDOUT_FILENO, pcFailMessage, strlen( pcFailMessage ) );\r
-               }\r
        }\r
 }\r
 /*-----------------------------------------------------------*/\r
diff --git a/FreeRTOS/Demo/RISC-V_RV32_SiFive_HiFive1_GCC/bsp/design.dts b/FreeRTOS/Demo/RISC-V_RV32_SiFive_HiFive1_GCC/bsp/design.dts
new file mode 100644 (file)
index 0000000..970d3be
--- /dev/null
@@ -0,0 +1,209 @@
+/dts-v1/;
+
+/ {
+        #address-cells = <1>;
+        #size-cells = <1>;
+        compatible = "sifive,hifive1-revb";
+        model = "sifive,hifive1-revb";
+
+        chosen {
+                stdout-path = "/soc/serial@10013000:115200";
+                metal,entry = <&spi0 0x10000>;
+        };
+
+        cpus {
+                #address-cells = <1>;
+                #size-cells = <0>;
+                compatible = "sifive,fe310-g000";
+                L6: cpu@0 {
+                        clocks = <&hfclk>;
+                        compatible = "sifive,rocket0", "riscv";
+                        device_type = "cpu";
+                        i-cache-block-size = <64>;
+                        i-cache-sets = <128>;
+                        i-cache-size = <16384>;
+                        next-level-cache = <&spi0>;
+                        reg = <0>;
+                        riscv,isa = "rv32imac";
+                        riscv,pmpregions = <8>;
+                        sifive,dtim = <&dtim>;
+                        status = "okay";
+                        timebase-frequency = <1000000>;
+                        hardware-exec-breakpoint-count = <4>;
+                        hlic: interrupt-controller {
+                                #interrupt-cells = <1>;
+                                compatible = "riscv,cpu-intc";
+                                interrupt-controller;
+                        };
+                };
+        };
+
+        soc {
+                #address-cells = <1>;
+                #size-cells = <1>;
+                #clock-cells = <1>;
+                compatible = "sifive,hifive1";
+                ranges;
+                hfxoscin: clock@0 {
+                        #clock-cells = <0>;
+                        compatible = "fixed-clock";
+                        clock-frequency = <16000000>;
+                };
+                hfxoscout: clock@1 {
+                        compatible = "sifive,fe310-g000,hfxosc";
+                        clocks = <&hfxoscin>;
+                        reg = <&prci 0x4>;
+                        reg-names = "config";
+                };
+                hfroscin: clock@2 {
+                        #clock-cells = <0>;
+                        compatible = "fixed-clock";
+                        clock-frequency = <72000000>;
+                };
+                hfroscout: clock@3 {
+                        compatible = "sifive,fe310-g000,hfrosc";
+                        clocks = <&hfroscin>;
+                        reg = <&prci 0x0>;
+                        reg-names = "config";
+                };
+                hfclk: clock@4 {
+                        compatible = "sifive,fe310-g000,pll";
+                        clocks = <&hfxoscout &hfroscout>;
+                        clock-names = "pllref", "pllsel0";
+                        reg = <&prci 0x8 &prci 0xc>;
+                        reg-names = "config", "divider";
+                       clock-frequency = <16000000>;
+                };
+
+                lfroscin: clock@5 {
+                        #clock-cells = <0>;
+                        compatible = "fixed-clock";
+                        clock-frequency = <32000000>;
+                };
+                lfclk: clock@6 {
+                        compatible = "sifive,fe310-g000,lfrosc";
+                        clocks = <&lfroscin>;
+                        reg = <&aon 0x70>;
+                        reg-names = "config";
+                };
+
+                aon: aon@10000000 {
+                        compatible = "sifive,aon0";
+                        reg = <0x10000000 0x8000>;
+                        reg-names = "mem";
+                };
+
+                prci: prci@10008000 {
+                        compatible = "sifive,fe310-g000,prci";
+                        reg = <0x10008000 0x8000>;
+                        reg-names = "mem";
+                };
+
+                clint: clint@2000000 {
+                        compatible = "riscv,clint0";
+                        interrupts-extended = <&hlic 3 &hlic 7>;
+                        reg = <0x2000000 0x10000>;
+                        reg-names = "control";
+                };
+                local-external-interrupts-0 {
+                        compatible = "sifive,local-external-interrupts0";
+                        interrupt-parent = <&hlic>;
+                        interrupts = <16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31>;
+                };
+                plic: interrupt-controller@c000000 {
+                        #interrupt-cells = <1>;
+                        compatible = "riscv,plic0";
+                        interrupt-controller;
+                        interrupts-extended = <&hlic 11>;
+                        reg = <0xc000000 0x4000000>;
+                        reg-names = "control";
+                        riscv,max-priority = <7>;
+                        riscv,ndev = <26>;
+                };
+                global-external-interrupts {
+                        compatile = "sifive,global-external-interrupts0";
+                        interrupt-parent = <&plic>;
+                        interrupts = <1 2 3 4>;
+                };
+
+                debug-controller@0 {
+                        compatible = "sifive,debug-011", "riscv,debug-011";
+                        interrupts-extended = <&hlic 65535>;
+                        reg = <0x0 0x100>;
+                        reg-names = "control";
+                };
+
+                maskrom@1000 {
+                        reg = <0x1000 0x2000>;
+                        reg-names = "mem";
+                };
+                otp@20000 {
+                        reg = <0x20000 0x2000 0x10010000 0x1000>;
+                        reg-names = "mem", "control";
+                };
+
+                dtim: dtim@80000000 {
+                        compatible = "sifive,dtim0";
+                        reg = <0x80000000 0x4000>;
+                        reg-names = "mem";
+                };
+
+                pwm@10015000 {
+                        compatible = "sifive,pwm0";
+                        interrupt-parent = <&plic>;
+                        interrupts = <23 24 25 26>;
+                        reg = <0x10015000 0x1000>;
+                        reg-names = "control";
+                };
+                gpio0: gpio@10012000 {
+                        compatible = "sifive,gpio0";
+                        interrupt-parent = <&plic>;
+                        interrupts = <7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22>;
+                        reg = <0x10012000 0x1000>;
+                        reg-names = "control";
+                };
+                uart0: serial@10013000 {
+                        compatible = "sifive,uart0";
+                        interrupt-parent = <&plic>;
+                        interrupts = <5>;
+                        reg = <0x10013000 0x1000>;
+                        reg-names = "control";
+                        clocks = <&hfclk>;
+                        pinmux = <&gpio0 0x30000 0x30000>;
+                };
+                spi0: spi@10014000 {
+                        compatible = "sifive,spi0";
+                        interrupt-parent = <&plic>;
+                        interrupts = <6>;
+                        reg = <0x10014000 0x1000 0x20000000 0x7A120>;
+                        reg-names = "control", "mem";
+                        clocks = <&hfclk>;
+                        pinmux = <&gpio0 0x0003C 0x0003C>;
+                };
+                i2c0: i2c@10016000 {
+                        compatible = "sifive,i2c0";
+                        interrupt-parent = <&plic>;
+                        interrupts = <52>;
+                        reg = <0x10016000 0x1000>;
+                        reg-names = "control";
+                };
+                led@0red {
+                        compatible = "sifive,gpio-leds";
+                        label = "LD0red";
+                        gpios = <&gpio0 22>;
+                        linux,default-trigger = "none";
+                };
+                led@0green {
+                        compatible = "sifive,gpio-leds";
+                        label = "LD0green";
+                        gpios = <&gpio0 19>;
+                        linux,default-trigger = "none";
+                };
+                led@0blue {
+                        compatible = "sifive,gpio-leds";
+                        label = "LD0blue";
+                        gpios = <&gpio0 21>;
+                        linux,default-trigger = "none";
+                };
+        };
+};
diff --git a/FreeRTOS/Demo/RISC-V_RV32_SiFive_HiFive1_GCC/bsp/design.reglist b/FreeRTOS/Demo/RISC-V_RV32_SiFive_HiFive1_GCC/bsp/design.reglist
new file mode 100644 (file)
index 0000000..921dd83
--- /dev/null
@@ -0,0 +1,54 @@
+zero
+ra
+sp
+gp
+tp
+t0
+t1
+t2
+fp
+s1
+a0
+a1
+a2
+a3
+a4
+a5
+a6
+a7
+s2
+s3
+s4
+s5
+s6
+s7
+s8
+s9
+s10
+s11
+t3
+t4
+t5
+t6
+pc
+mstatus
+misa
+mie
+mtvec
+mscratch
+mepc
+mcause
+mtval
+mip
+mvendorid
+marchid
+mimpid
+mhartid
+tselect
+tdata1
+tdata2
+tdata3
+dcsr
+dpc
+dscratch
+priv
index 1d45a92664c4f5465340d18824959c0f699c8510..7070af7e864e6f0000e9472e962ff3767bae4894 100644 (file)
@@ -26,7 +26,7 @@ SECTIONS
 {
        __stack_size = DEFINED(__stack_size) ? __stack_size : 0x400;
        PROVIDE(__stack_size = __stack_size);
-       __heap_size = DEFINED(__heap_size) ? __heap_size : 0x400;
+       __heap_size = DEFINED(__heap_size) ? __heap_size : 0x4;
        PROVIDE(__metal_boot_hart = 0);
        PROVIDE(__metal_chicken_bit = 0);
 
@@ -216,7 +216,8 @@ SECTIONS
                . = ALIGN(16);
                metal_segment_stack_begin = .;
                . += __stack_size;
-               _sp = .;
+               . = ALIGN(16);
+               _sp = .;                
                PROVIDE(metal_segment_stack_end = .);
                __freertos_irq_stack_top = .;
        } >ram AT>ram :ram
index 2141915ea955c011bb2af66439fd986e62f4c0b7..7ddab4d416a8e1245c0fbda93cacfc5f8558e968 100644 (file)
@@ -125,7 +125,7 @@ _start:
   /* The RISC-V port only uses new-style constructors and destructors. */
   la a0, __libc_fini_array
   call atexit
-  call __libc_init_array
+/*_RB_  call __libc_init_array */
 
 _skip_init:
 
diff --git a/FreeRTOS/Demo/RISC-V_RV32_SiFive_HiFive1_GCC/full_demo/RegTest.S b/FreeRTOS/Demo/RISC-V_RV32_SiFive_HiFive1_GCC/full_demo/RegTest.S
new file mode 100644 (file)
index 0000000..8eef086
--- /dev/null
@@ -0,0 +1,266 @@
+/*\r
+ * FreeRTOS Kernel V10.2.1\r
+ * Copyright (C) 2019 Amazon.com, Inc. or its affiliates.  All Rights Reserved.\r
+ *\r
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of\r
+ * this software and associated documentation files (the "Software"), to deal in\r
+ * the Software without restriction, including without limitation the rights to\r
+ * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\r
+ * the Software, and to permit persons to whom the Software is furnished to do so,\r
+ * subject to the following conditions:\r
+ *\r
+ * The above copyright notice and this permission notice shall be included in all\r
+ * copies or substantial portions of the Software.\r
+ *\r
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\r
+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\r
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\r
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
+ *\r
+ * http://www.FreeRTOS.org\r
+ * http://aws.amazon.com/freertos\r
+ *\r
+ * 1 tab == 4 spaces!\r
+ */\r
+\r
+       .extern ulRegTest1LoopCounter\r
+       .extern ulRegTest2LoopCounter\r
+\r
+       .global vRegTest1Implementation\r
+       .global vRegTest2Implementation\r
+\r
+/*-----------------------------------------------------------*/\r
+\r
+/*\r
+ * The register check tasks are described in the comments at the top of\r
+ * main_full.c.\r
+ */\r
+\r
+.align( 8 )\r
+vRegTest1Implementation:\r
+\r
+       /* Fill the core registers with known values. */\r
+       li x5, 0x5\r
+       li x6, 0x6\r
+       li x7, 0x7\r
+       li x8, 0x8\r
+       li x9, 0x9\r
+       li x10, 0xa\r
+       li x11, 0xb\r
+       li x12, 0xc\r
+       li x13, 0xd\r
+       li x14, 0xe\r
+       li x15, 0xf\r
+       li x16, 0x10\r
+       li x17, 0x11\r
+       li x18, 0x12\r
+       li x19, 0x13\r
+       li x20, 0x14\r
+       li x21, 0x15\r
+       li x22, 0x16\r
+       li x23, 0x17\r
+       li x24, 0x18\r
+       li x25, 0x19\r
+       li x26, 0x1a\r
+       li x27, 0x1b\r
+       li x28, 0x1c\r
+       li x29, 0x1d\r
+       li x30, 0x1e\r
+\r
+reg1_loop:\r
+\r
+       /* Check each register still contains the expected known value.\r
+       vRegTest1Implementation uses x31 as the temporary, vRegTest2Implementation\r
+       uses x5 as the temporary. */\r
+       li x31, 0x5\r
+       bne x31, x5, reg1_error_loop\r
+       li x31, 0x6\r
+       bne x31, x6, reg1_error_loop\r
+       li x31, 0x7\r
+       bne x31, x7, reg1_error_loop\r
+       li x31, 0x8\r
+       bne x31, x8, reg1_error_loop\r
+       li x31, 0x9\r
+       bne x31, x9, reg1_error_loop\r
+       li x31, 0xa\r
+       bne x31, x10, reg1_error_loop\r
+       li x31, 0xb\r
+       bne x31, x11, reg1_error_loop\r
+       li x31, 0xc\r
+       bne x31, x12, reg1_error_loop\r
+       li x31, 0xd\r
+       bne x31, x13, reg1_error_loop\r
+       li x31, 0xe\r
+       bne x31, x14, reg1_error_loop\r
+       li x31, 0xf\r
+       bne x31, x15, reg1_error_loop\r
+       li x31, 0x10\r
+       bne x31, x16, reg1_error_loop\r
+       li x31, 0x11\r
+       bne x31, x17, reg1_error_loop\r
+       li x31, 0x12\r
+       bne x31, x18, reg1_error_loop\r
+       li x31, 0x13\r
+       bne x31, x19, reg1_error_loop\r
+       li x31, 0x14\r
+       bne x31, x20, reg1_error_loop\r
+       li x31, 0x15\r
+       bne x31, x21, reg1_error_loop\r
+       li x31, 0x16\r
+       bne x31, x22, reg1_error_loop\r
+       li x31, 0x17\r
+       bne x31, x23, reg1_error_loop\r
+       li x31, 0x18\r
+       bne x31, x24, reg1_error_loop\r
+       li x31, 0x19\r
+       bne x31, x25, reg1_error_loop\r
+       li x31, 0x1a\r
+       bne x31, x26, reg1_error_loop\r
+       li x31, 0x1b\r
+       bne x31, x27, reg1_error_loop\r
+       li x31, 0x1c\r
+       bne x31, x28, reg1_error_loop\r
+       li x31, 0x1d\r
+       bne x31, x29, reg1_error_loop\r
+       li x31, 0x1e\r
+       bne x31, x30, reg1_error_loop\r
+\r
+       /* Everything passed, increment the loop counter. */\r
+       lw x31, ulRegTest1LoopCounterConst\r
+       lw x30, 0(x31)\r
+       addi x30, x30, 1\r
+       sw x30, 0(x31)\r
+\r
+       /* Restore clobbered register reading for next loop. */\r
+       li x30, 0x1e\r
+\r
+       /* Yield to increase code coverage. */\r
+       ecall\r
+\r
+       /* Start again. */\r
+       jal reg1_loop\r
+\r
+reg1_error_loop:\r
+       /* Jump here if a register contains an uxpected value.  This stops the loop\r
+       counter being incremented so the check task knows an error was found. */\r
+       ebreak\r
+       jal reg1_error_loop\r
+\r
+.align( 16 )\r
+ulRegTest1LoopCounterConst: .word ulRegTest1LoopCounter\r
+\r
+/*-----------------------------------------------------------*/\r
+\r
+.align( 8 )\r
+vRegTest2Implementation:\r
+\r
+       /* Fill the core registers with known values. */\r
+       li x6, 0x61\r
+       li x7, 0x71\r
+       li x8, 0x81\r
+       li x9, 0x91\r
+       li x10, 0xa1\r
+       li x11, 0xb1\r
+       li x12, 0xc1\r
+       li x13, 0xd1\r
+       li x14, 0xe1\r
+       li x15, 0xf1\r
+       li x16, 0x20\r
+       li x17, 0x21\r
+       li x18, 0x22\r
+       li x19, 0x23\r
+       li x20, 0x24\r
+       li x21, 0x25\r
+       li x22, 0x26\r
+       li x23, 0x27\r
+       li x24, 0x28\r
+       li x25, 0x29\r
+       li x26, 0x2a\r
+       li x27, 0x2b\r
+       li x28, 0x2c\r
+       li x29, 0x2d\r
+       li x30, 0x2e\r
+       li x31, 0x2f\r
+\r
+Reg2_loop:\r
+\r
+       /* Check each register still contains the expected known value.\r
+       vRegTest2Implementation uses x5 as the temporary, vRegTest1Implementation\r
+       uses x31 as the temporary. */\r
+       li x5, 0x61\r
+       bne x5, x6, reg2_error_loop\r
+       li x5, 0x71\r
+       bne x5, x7, reg2_error_loop\r
+       li x5, 0x81\r
+       bne x5, x8, reg2_error_loop\r
+       li x5, 0x91\r
+       bne x5, x9, reg2_error_loop\r
+       li x5, 0xa1\r
+       bne x5, x10, reg2_error_loop\r
+       li x5, 0xb1\r
+       bne x5, x11, reg2_error_loop\r
+       li x5, 0xc1\r
+       bne x5, x12, reg2_error_loop\r
+       li x5, 0xd1\r
+       bne x5, x13, reg2_error_loop\r
+       li x5, 0xe1\r
+       bne x5, x14, reg2_error_loop\r
+       li x5, 0xf1\r
+       bne x5, x15, reg2_error_loop\r
+       li x5, 0x20\r
+       bne x5, x16, reg2_error_loop\r
+       li x5, 0x21\r
+       bne x5, x17, reg2_error_loop\r
+       li x5, 0x22\r
+       bne x5, x18, reg2_error_loop\r
+       li x5, 0x23\r
+       bne x5, x19, reg2_error_loop\r
+       li x5, 0x24\r
+       bne x5, x20, reg2_error_loop\r
+       li x5, 0x25\r
+       bne x5, x21, reg2_error_loop\r
+       li x5, 0x26\r
+       bne x5, x22, reg2_error_loop\r
+       li x5, 0x27\r
+       bne x5, x23, reg2_error_loop\r
+       li x5, 0x28\r
+       bne x5, x24, reg2_error_loop\r
+       li x5, 0x29\r
+       bne x5, x25, reg2_error_loop\r
+       li x5, 0x2a\r
+       bne x5, x26, reg2_error_loop\r
+       li x5, 0x2b\r
+       bne x5, x27, reg2_error_loop\r
+       li x5, 0x2c\r
+       bne x5, x28, reg2_error_loop\r
+       li x5, 0x2d\r
+       bne x5, x29, reg2_error_loop\r
+       li x5, 0x2e\r
+       bne x5, x30, reg2_error_loop\r
+       li x5, 0x2f\r
+       bne x5, x31, reg2_error_loop\r
+\r
+       /* Everything passed, increment the loop counter. */\r
+       lw x5, ulRegTest2LoopCounterConst\r
+       lw x6, 0(x5)\r
+       addi x6, x6, 1\r
+       sw x6, 0(x5)\r
+\r
+       /* Restore clobbered register reading for next loop. */\r
+       li x6, 0x61\r
+\r
+       /* Start again. */\r
+       jal Reg2_loop\r
+\r
+reg2_error_loop:\r
+       /* Jump here if a register contains an uxpected value.  This stops the loop\r
+       counter being incremented so the check task knows an error was found. */\r
+       ebreak\r
+       jal reg2_error_loop\r
+\r
+.align( 16 )\r
+ulRegTest2LoopCounterConst: .word ulRegTest2LoopCounter\r
+\r
+\r
diff --git a/FreeRTOS/Demo/RISC-V_RV32_SiFive_HiFive1_GCC/full_demo/main_full.c b/FreeRTOS/Demo/RISC-V_RV32_SiFive_HiFive1_GCC/full_demo/main_full.c
new file mode 100644 (file)
index 0000000..5813c13
--- /dev/null
@@ -0,0 +1,332 @@
+/*\r
+ * FreeRTOS Kernel V10.2.1\r
+ * Copyright (C) 2019 Amazon.com, Inc. or its affiliates.  All Rights Reserved.\r
+ *\r
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of\r
+ * this software and associated documentation files (the "Software"), to deal in\r
+ * the Software without restriction, including without limitation the rights to\r
+ * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\r
+ * the Software, and to permit persons to whom the Software is furnished to do so,\r
+ * subject to the following conditions:\r
+ *\r
+ * The above copyright notice and this permission notice shall be included in all\r
+ * copies or substantial portions of the Software.\r
+ *\r
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\r
+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\r
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\r
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
+ *\r
+ * http://www.FreeRTOS.org\r
+ * http://aws.amazon.com/freertos\r
+ *\r
+ * 1 tab == 4 spaces!\r
+ */\r
+\r
+/******************************************************************************\r
+ * NOTE 1:  This project provides two demo applications.  A simple blinky style\r
+ * project, and a more comprehensive test and demo application.  The\r
+ * mainCREATE_SIMPLE_BLINKY_DEMO_ONLY setting in main.c is used to select\r
+ * between the two.  See the notes on using mainCREATE_SIMPLE_BLINKY_DEMO_ONLY\r
+ * in main.c.  This file implements the comprehensive test and demo version.\r
+ *\r
+ * NOTE 2:  This file only contains the source code that is specific to the\r
+ * full demo.  Generic functions, such FreeRTOS hook functions, and functions\r
+ * required to configure the hardware, are defined in main.c.\r
+ *\r
+ ******************************************************************************\r
+ *\r
+ * main_full() creates all the demo application tasks and software timers, then\r
+ * starts the scheduler.  The web documentation provides more details of the\r
+ * standard demo application tasks, which provide no particular functionality,\r
+ * but do provide a good example of how to use the FreeRTOS API.\r
+ *\r
+ * In addition to the standard demo tasks, the following tasks and tests are\r
+ * defined and/or created within this file:\r
+ *\r
+ * "Reg test" tasks - These fill both the core registers with known values, then\r
+ * check that each register maintains its expected value for the lifetime of the\r
+ * task.  Each task uses a different set of values.  The reg test tasks execute\r
+ * with a very low priority, so get preempted very frequently.  A register\r
+ * containing an unexpected value is indicative of an error in the context\r
+ * switching mechanism.\r
+ *\r
+ * "Check" task - The check executes every three seconds.  It checks that all\r
+ * the standard demo tasks, and the register check tasks, are not only still\r
+ * executing, but are executing without reporting any errors.  If the check task\r
+ * discovers that a task has either stalled, or reported an error, then it\r
+ * prints an error message to the UART, otherwise it prints "Pass.".\r
+ */\r
+\r
+/* Standard includes. */\r
+#include <stdio.h>\r
+#include <string.h>\r
+#include <unistd.h>\r
+\r
+/* Kernel includes. */\r
+#include "FreeRTOS.h"\r
+#include "task.h"\r
+#include "timers.h"\r
+#include "semphr.h"\r
+\r
+/* Standard demo application includes. */\r
+#include "dynamic.h"\r
+#include "blocktim.h"\r
+#include "GenQTest.h"\r
+#include "recmutex.h"\r
+#include "TimerDemo.h"\r
+#include "EventGroupsDemo.h"\r
+#include "TaskNotify.h"\r
+#include "AbortDelay.h"\r
+#include "countsem.h"\r
+#include "death.h"\r
+#include "MessageBufferDemo.h"\r
+#include "StreamBufferDemo.h"\r
+#include "StreamBufferInterrupt.h"\r
+\r
+/* Priorities for the demo application tasks. */\r
+#define mainCHECK_TASK_PRIORITY                                ( configMAX_PRIORITIES - 1 )\r
+#define mainCREATOR_TASK_PRIORITY                      ( tskIDLE_PRIORITY + 3UL )\r
+\r
+/* The period of the check task, in ms, converted to ticks using the\r
+pdMS_TO_TICKS() macro.  mainNO_ERROR_CHECK_TASK_PERIOD is used if no errors have\r
+been found, mainERROR_CHECK_TASK_PERIOD is used if an error has been found. */\r
+#define mainNO_ERROR_CHECK_TASK_PERIOD         pdMS_TO_TICKS( 3000UL )\r
+#define mainERROR_CHECK_TASK_PERIOD                    pdMS_TO_TICKS( 500UL )\r
+\r
+/* Parameters that are passed into the register check tasks solely for the\r
+purpose of ensuring parameters are passed into tasks correctly. */\r
+#define mainREG_TEST_TASK_1_PARAMETER          ( ( void * ) 0x12345678 )\r
+#define mainREG_TEST_TASK_2_PARAMETER          ( ( void * ) 0x87654321 )\r
+\r
+/* The base period used by the timer test tasks. */\r
+#define mainTIMER_TEST_PERIOD                          ( 50 )\r
+\r
+/* The size of the stack allocated to the check task (as described in the\r
+comments at the top of this file. */\r
+#define mainCHECK_TASK_STACK_SIZE_WORDS 160\r
+\r
+/* Size of the stacks to allocated for the register check tasks. */\r
+#define mainREG_TEST_STACK_SIZE_WORDS 90\r
+\r
+/*-----------------------------------------------------------*/\r
+\r
+/*\r
+ * Called by main() to run the full demo (as opposed to the blinky demo) when\r
+ * mainCREATE_SIMPLE_BLINKY_DEMO_ONLY is set to 0.\r
+ */\r
+void main_full( void );\r
+\r
+/*\r
+ * The check task, as described at the top of this file.\r
+ */\r
+static void prvCheckTask( void *pvParameters );\r
+\r
+/*\r
+ * Register check tasks as described at the top of this file.  The nature of\r
+ * these files necessitates that they are written in an assembly file, but the\r
+ * entry points are kept in the C file for the convenience of checking the task\r
+ * parameter.\r
+ */\r
+static void prvRegTestTaskEntry1( void *pvParameters );\r
+extern void vRegTest1Implementation( void );\r
+static void prvRegTestTaskEntry2( void *pvParameters );\r
+extern void vRegTest2Implementation( void );\r
+\r
+/*\r
+ * Tick hook used by the full demo, which includes code that interacts with\r
+ * some of the tests.\r
+ */\r
+void vFullDemoTickHook( void );\r
+\r
+/*-----------------------------------------------------------*/\r
+\r
+/* The following two variables are used to communicate the status of the\r
+register check tasks to the check task.  If the variables keep incrementing,\r
+then the register check tasks have not discovered any errors.  If a variable\r
+stops incrementing, then an error has been found. */\r
+uint32_t ulRegTest1LoopCounter = 0UL, ulRegTest2LoopCounter = 0UL;\r
+volatile uint32_t *pulRegTest1LoopCounter = &ulRegTest1LoopCounter;\r
+volatile uint32_t *pulRegTest2LoopCounter = &ulRegTest2LoopCounter;\r
+/*-----------------------------------------------------------*/\r
+\r
+void main_full( void )\r
+{\r
+       /* Start all the other standard demo/test tasks.  They have no particular\r
+       functionality, but do demonstrate how to use the FreeRTOS API and test the\r
+       kernel port. */\r
+       vCreateBlockTimeTasks();\r
+       vStartTimerDemoTask( mainTIMER_TEST_PERIOD );\r
+       vStartDynamicPriorityTasks();\r
+//     vStartMessageBufferTasks( configMINIMAL_STACK_SIZE );\r
+       vStartTaskNotifyTask();\r
+\r
+       /* Create the register check tasks, as described at the top of this     file.\r
+       Use xTaskCreateStatic() to create a task using only statically allocated\r
+       memory. */\r
+       xTaskCreate( prvRegTestTaskEntry1,                      /* The function that implements the task. */\r
+                                "Reg1",                                                /* The name of the task. */\r
+                                mainREG_TEST_STACK_SIZE_WORDS, /* Size of stack to allocate for the task - in words not bytes!. */\r
+                                mainREG_TEST_TASK_1_PARAMETER, /* Parameter passed into the task. */\r
+                                tskIDLE_PRIORITY,                              /* Priority of the task. */\r
+                                NULL );                                                /* Can be used to pass out a handle to the created task. */\r
+       xTaskCreate( prvRegTestTaskEntry2, "Reg2", mainREG_TEST_STACK_SIZE_WORDS, mainREG_TEST_TASK_2_PARAMETER, tskIDLE_PRIORITY, NULL );\r
+\r
+       /* Create the task that performs the 'check' functionality,     as described at\r
+       the top of this file. */\r
+       xTaskCreate( prvCheckTask, "Check", mainCHECK_TASK_STACK_SIZE_WORDS, NULL, mainCHECK_TASK_PRIORITY, NULL );\r
+\r
+       /* Start the scheduler. */\r
+       vTaskStartScheduler();\r
+\r
+       /* If all is well, the scheduler will now be running, and the following\r
+       line will never be reached.  If the following line does execute, then\r
+       there was insufficient FreeRTOS heap memory available for the Idle and/or\r
+       timer tasks to be created.  See the memory management section on the\r
+       FreeRTOS web site for more details on the FreeRTOS heap\r
+       http://www.freertos.org/a00111.html. */\r
+       for( ;; );\r
+}\r
+/*-----------------------------------------------------------*/\r
+volatile uint32_t ulCheckTaskCycles = 0;\r
+static volatile TaskStatus_t xTaskStatus[ 15 ];\r
+static void prvCheckTask( void *pvParameters )\r
+{\r
+TickType_t xDelayPeriod = mainNO_ERROR_CHECK_TASK_PERIOD;\r
+TickType_t xLastExecutionTime;\r
+uint32_t ulLastRegTest1Value = 0, ulLastRegTest2Value = 0;\r
+char * const pcPassMessage = ".";\r
+char * pcStatusMessage = pcPassMessage;\r
+extern void vToggleLED( void );\r
+\r
+       /* Just to stop compiler warnings. */\r
+       ( void ) pvParameters;\r
+\r
+       /* Initialise xLastExecutionTime so the first call to vTaskDelayUntil()\r
+       works correctly. */\r
+       xLastExecutionTime = xTaskGetTickCount();\r
+\r
+       /* Cycle for ever, delaying then checking all the other tasks are still\r
+       operating without error.  The onboard LED is toggled on each iteration.\r
+       If an error is detected then the delay period is decreased from\r
+       mainNO_ERROR_CHECK_TASK_PERIOD to mainERROR_CHECK_TASK_PERIOD.  This has the\r
+       effect of increasing the rate at which the onboard LED toggles, and in so\r
+       doing gives visual feedback of the system status. */\r
+       for( ;; )\r
+       {\r
+               /* Delay until it is time to execute again. */\r
+               vTaskDelayUntil( &xLastExecutionTime, xDelayPeriod );\r
+\r
+               /* Check all the demo tasks (other than the flash tasks) to ensure\r
+               that they are all still running, and that none have detected an error. */\r
+               if( xAreDynamicPriorityTasksStillRunning() == pdFALSE )\r
+               {\r
+                       pcStatusMessage = "ERROR: Dynamic priority demo/tests.\r\n";\r
+               }\r
+\r
+               if( xAreBlockTimeTestTasksStillRunning() == pdFALSE )\r
+               {\r
+                       pcStatusMessage = "ERROR: Block time demo/tests.\r\n";\r
+               }\r
+\r
+               if( xAreTimerDemoTasksStillRunning( ( TickType_t ) xDelayPeriod ) == pdFALSE )\r
+               {\r
+                       pcStatusMessage = "ERROR: Timer demo/tests.\r\n";\r
+               }\r
+\r
+               if( xAreTaskNotificationTasksStillRunning() == pdFALSE )\r
+               {\r
+                       pcStatusMessage = "ERROR: Task notification demo/tests.\r\n";\r
+               }\r
+\r
+//             if( xAreMessageBufferTasksStillRunning() == pdFALSE )\r
+               {\r
+//                     pcStatusMessage = "ERROR: Message buffer.\r\n";\r
+               }\r
+\r
+               /* Check that the register test 1 task is still running. */\r
+               if( ulLastRegTest1Value == ulRegTest1LoopCounter )\r
+               {\r
+                       pcStatusMessage = "ERROR: Register test 1.\r\n";\r
+               }\r
+               ulLastRegTest1Value = ulRegTest1LoopCounter;\r
+\r
+               /* Check that the register test 2 task is still running. */\r
+               if( ulLastRegTest2Value == ulRegTest2LoopCounter )\r
+               {\r
+                       pcStatusMessage = "ERROR: Register test 2.\r\n";\r
+               }\r
+               ulLastRegTest2Value = ulRegTest2LoopCounter;\r
+\r
+               /* Write the status message to the UART and toggle the LED to show the\r
+               system status if the UART is not connected. */\r
+               vToggleLED();\r
+\r
+               /* If an error has been found then increase the LED toggle rate by\r
+               increasing the cycle frequency. */\r
+               if( pcStatusMessage != pcPassMessage )\r
+               {\r
+                       xDelayPeriod = mainERROR_CHECK_TASK_PERIOD;\r
+                       write( STDOUT_FILENO, pcStatusMessage, strlen( pcStatusMessage ) );\r
+               }\r
+\r
+               ulCheckTaskCycles++;\r
+\r
+//             uxTaskGetSystemState( xTaskStatus, sizeof( xTaskStatus ) / sizeof( TaskStatus_t ), NULL );\r
+               __asm volatile( "NOP" );\r
+       }\r
+}\r
+/*-----------------------------------------------------------*/\r
+\r
+static void prvRegTestTaskEntry1( void *pvParameters )\r
+{\r
+       /* Although the regtest task is written in assembler, its entry point is\r
+       written in C for convenience of checking the task parameter is being passed\r
+       in correctly. */\r
+       if( pvParameters == mainREG_TEST_TASK_1_PARAMETER )\r
+       {\r
+               /* Start the part of the test that is written in assembler. */\r
+               vRegTest1Implementation();\r
+       }\r
+\r
+       /* The following line will only execute if the task parameter is found to\r
+       be incorrect.  The check task will detect that the regtest loop counter is\r
+       not being incremented and flag an error. */\r
+       vTaskDelete( NULL );\r
+}\r
+/*-----------------------------------------------------------*/\r
+\r
+static void prvRegTestTaskEntry2( void *pvParameters )\r
+{\r
+       /* Although the regtest task is written in assembler, its entry point is\r
+       written in C for convenience of checking the task parameter is being passed\r
+       in correctly. */\r
+       if( pvParameters == mainREG_TEST_TASK_2_PARAMETER )\r
+       {\r
+               /* Start the part of the test that is written in assembler. */\r
+               vRegTest2Implementation();\r
+       }\r
+\r
+       /* The following line will only execute if the task parameter is found to\r
+       be incorrect.  The check task will detect that the regtest loop counter is\r
+       not being incremented and flag an error. */\r
+       vTaskDelete( NULL );\r
+}\r
+/*-----------------------------------------------------------*/\r
+\r
+void vFullDemoTickHook( void )\r
+{\r
+       /* Called from vApplicationTickHook() when the project is configured to\r
+       build the full test/demo applications. */\r
+\r
+       /* The full demo includes a software timer demo/test that requires\r
+       prodding periodically from the tick interrupt. */\r
+//     vTimerPeriodicISRTests();\r
+\r
+       /* Use task notifications from an interrupt. */\r
+       xNotifyTaskFromISR();\r
+}\r
+/*-----------------------------------------------------------*/\r
+\r
index 6013912ee8e465235cd90c44c15b0ebb7022bf6d..ffb6c207f03f40e934a837f5e0f7c77af87f29f4 100644 (file)
@@ -1,4 +1,3 @@
-#if 1\r
 /*\r
  * FreeRTOS Kernel V10.2.1\r
  * Copyright (C) 2019 Amazon.com, Inc. or its affiliates.  All Rights Reserved.\r
@@ -35,7 +34,6 @@
 #include <metal/led.h>\r
 #include <metal/button.h>\r
 \r
-\r
 /******************************************************************************\r
  * This project provides two demo applications.  A simple blinky style project,\r
  * and a more comprehensive test and demo application.  The\r
 \r
 #warning Also test in QEMU and add instructions above.\r
 \r
+/* Set mainCREATE_SIMPLE_BLINKY_DEMO_ONLY to one to run the simple blinky demo,\r
+or 0 to run the more comprehensive test and demo application. */\r
+#define mainCREATE_SIMPLE_BLINKY_DEMO_ONLY     0\r
+\r
 /* Index to first HART (there is only one). */\r
 #define mainHART_0             0\r
 \r
-/* Set mainCREATE_SIMPLE_BLINKY_DEMO_ONLY to one to run the simple blinky demo,\r
-or 0 to run the more comprehensive test and demo application. */\r
-#define mainCREATE_SIMPLE_BLINKY_DEMO_ONLY     1\r
+/* Register addresses within the PLIC. */\r
+#define mainPLIC_PENDING_0 ( * ( ( volatile uint32_t * ) 0x0C001000UL ) )\r
+#define mainPLIC_PENDING_1 ( * ( ( volatile uint32_t * ) 0x0C001004UL ) )\r
+#define mainPLIC_ENABLE_0  ( * ( ( volatile uint32_t * ) 0x0C002000UL ) )\r
+#define mainPLIC_ENABLE_1  ( * ( ( volatile uint32_t * ) 0x0C002004UL ) )\r
 \r
 /*\r
  * main_blinky() is used when mainCREATE_SIMPLE_BLINKY_DEMO_ONLY is set to 1.\r
@@ -111,8 +115,8 @@ static void prvSetupHardware( void )
 struct metal_cpu *pxCPU;\r
 struct metal_interrupt *pxInterruptController;\r
 \r
-       /* Initialise the red LED. */\r
-       pxLED = metal_led_get_rgb( "LD0", "red" );\r
+       /* Initialise the blue LED. */\r
+       pxLED = metal_led_get_rgb( "LD0", "blue" );\r
        configASSERT( pxLED );\r
        metal_led_enable( pxLED );\r
        metal_led_off( pxLED );\r
@@ -123,6 +127,14 @@ struct metal_interrupt *pxInterruptController;
        pxInterruptController = metal_cpu_interrupt_controller( pxCPU );\r
        configASSERT( pxInterruptController );\r
        metal_interrupt_init( pxInterruptController );\r
+\r
+       /* Set all interrupt enable bits to 0. */\r
+       mainPLIC_ENABLE_0 = 0UL;\r
+       mainPLIC_ENABLE_1 = 0UL;\r
+\r
+       /* Clear all pending interrupts. */\r
+       mainPLIC_PENDING_0 = 0UL;\r
+       mainPLIC_PENDING_1 = 0UL;\r
 }\r
 /*-----------------------------------------------------------*/\r
 \r
@@ -184,15 +196,41 @@ void vApplicationTickHook( void )
 \r
 void vAssertCalled( void )\r
 {\r
+static struct metal_led *pxRedLED = NULL;\r
+volatile uint32_t ul;\r
+\r
        taskDISABLE_INTERRUPTS();\r
-       for( ;; );\r
+\r
+       /* Initialise the red LED. */\r
+       pxRedLED = metal_led_get_rgb( "LD0", "red" );\r
+       configASSERT( pxRedLED );\r
+       metal_led_enable( pxRedLED );\r
+       metal_led_off( pxRedLED );\r
+\r
+       /* Flash the red LED to indicate that assert was hit - interrupts are off\r
+       here to prevent any further tick interrupts or context switches, so the\r
+       delay is implemented as a crude loop. */\r
+       for( ;; )\r
+       {\r
+               for( ul = 0; ul < 0x1ffff; ul++ )\r
+               {\r
+                       __asm volatile( "nop" );\r
+               }\r
+               metal_led_toggle( pxRedLED );\r
+       }\r
 }\r
 /*-----------------------------------------------------------*/\r
 \r
+volatile uint32_t ulMEPC = 0UL, ulMCAUSE = 0UL, ulPending0Register = 0UL, ulPending1Register = 0UL;\r
+\r
 void handle_trap( void )\r
 {\r
 #warning Not implemented.\r
 \r
+       __asm volatile( "csrr %0, mepc" : "=r"( ulMEPC ) );\r
+       __asm volatile( "csrr %0, mcause" : "=r"( ulMCAUSE ) );\r
+       ulPending0Register = mainPLIC_PENDING_0;\r
+       ulPending1Register = mainPLIC_PENDING_1;\r
        configASSERT( metal_cpu_get( mainHART_0 ) == 0x00 );\r
 }\r
 /*-----------------------------------------------------------*/\r
@@ -201,103 +239,13 @@ void vToggleLED( void )
 {\r
        metal_led_toggle( pxLED );\r
 }\r
+/*-----------------------------------------------------------*/\r
 \r
-\r
-\r
-\r
-#else\r
-\r
-static void prvSetupTimerInterrupt( void )\r
+void *malloc( size_t xSize )\r
 {\r
-       int rc, up_cnt, dn_cnt;\r
-\r
-    // Setup Timer and its interrupt so we can toggle LEDs on 1s cadence\r
-    tmr_intr = metal_cpu_timer_interrupt_controller(pxCPU);\r
-    if (tmr_intr == NULL) {\r
-        printf("TIMER interrupt controller is  null.\n");\r
-        return 4;\r
-    }\r
-    metal_interrupt_init(tmr_intr);\r
-    tmr_id = metal_cpu_timer_get_interrupt_id(pxCPU);\r
-    rc = metal_interrupt_register_handler(tmr_intr, tmr_id, timer_isr, pxCPU);\r
-    if (rc < 0) {\r
-        printf("TIMER interrupt handler registration failed\n");\r
-        return (rc * -1);\r
-    }\r
-\r
-    // Lastly CPU interrupt\r
-    if (metal_interrupt_enable(pxInterruptController, 0) == -1) {\r
-        printf("CPU interrupt enable failed\n");\r
-        return 6;\r
-    }\r
-\r
-    // Red -> Green -> Blue, repeat\r
-    while (1) {\r
-\r
-        // Turn on RED\r
-        wait_for_timer(pxLED);\r
-\r
-        // Turn on Green\r
-        wait_for_timer(led0_green);\r
-\r
-        // Turn on Blue\r
-        wait_for_timer(led0_blue);\r
-    }\r
-\r
-    // return\r
-    return 0;\r
+       configASSERT( metal_cpu_get( mainHART_0 ) == 0x00 );\r
+       return NULL;\r
 }\r
 /*-----------------------------------------------------------*/\r
 \r
 \r
-#include <stdio.h>\r
-#include <metal/cpu.h>\r
-#include <metal/led.h>\r
-#include <metal/button.h>\r
-#include <metal/switch.h>\r
-\r
-#define RTC_FREQ    32768\r
-\r
-struct metal_cpu *pxCPU;\r
-struct metal_interrupt *pxInterruptController, *tmr_intr;\r
-int tmr_id;\r
-volatile uint32_t timer_isr_flag;\r
-\r
-\r
-void timer_isr (int id, void *data) {\r
-\r
-    // Disable Timer interrupt\r
-    metal_interrupt_disable(tmr_intr, tmr_id);\r
-\r
-    // Flag showing we hit timer isr\r
-    timer_isr_flag = 1;\r
-}\r
-\r
-void wait_for_timer(struct metal_led *which_led) {\r
-\r
-    // clear global timer isr flag\r
-    timer_isr_flag = 0;\r
-\r
-    // Turn on desired LED\r
-    metal_led_on(which_led);\r
-\r
-    // Set timer\r
-    metal_cpu_set_mtimecmp(pxCPU, metal_cpu_get_mtime(pxCPU) + RTC_FREQ);\r
-\r
-    // Enable Timer interrupt\r
-    metal_interrupt_enable(tmr_intr, tmr_id);\r
-\r
-    // wait till timer triggers and isr is hit\r
-    while (timer_isr_flag == 0){};\r
-\r
-    timer_isr_flag = 0;\r
-\r
-    // Turn off this LED\r
-    metal_led_off(which_led);\r
-}\r
-\r
-\r
-\r
-#endif\r
-\r
-\r