]> git.sur5r.net Git - freertos/commitdiff
Update RISC-V_IGLOO2_Creative_SoftConsole demo to make use of new RISC-V porting...
authorrtel <rtel@1d2547de-c912-0410-9cb9-b8ca96c0e9e2>
Mon, 17 Dec 2018 00:01:36 +0000 (00:01 +0000)
committerrtel <rtel@1d2547de-c912-0410-9cb9-b8ca96c0e9e2>
Mon, 17 Dec 2018 00:01:36 +0000 (00:01 +0000)
git-svn-id: https://svn.code.sf.net/p/freertos/code/trunk@2605 1d2547de-c912-0410-9cb9-b8ca96c0e9e2

FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/.cproject
FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/.settings/language.settings.xml
FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/FreeRTOSConfig.h
FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/Microsemi_Code/riscv_hal/microsemi-riscv-igloo2.ld
FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/Microsemi_Code/riscv_hal/microsemi-riscv-ram.ld
FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/Microsemi_Code/riscv_hal/riscv_hal.c
FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/Microsemi_Code/riscv_hal/riscv_plic.h
FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/full_demo/main_full.c
FreeRTOS/Demo/RISC-V_IGLOO2_Creative_SoftConsole/main.c

index a4718e7c96998c1fc42214e7046972c03105461a..19414c5c2ff8c223817c2be5e7b29da7cae1ec72 100644 (file)
@@ -41,7 +41,7 @@
                                                                                \r
                             <option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.addtools.printsize.306588546" name="Print size" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.addtools.printsize" useByScannerDiscovery="false" value="true" valueType="boolean"/>\r
                                                                                \r
-                            <option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.optimization.level.1940053873" name="Optimization Level" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.optimization.level" useByScannerDiscovery="true" value="ilg.gnumcueclipse.managedbuild.cross.riscv.option.optimization.level.none" valueType="enumerated"/>\r
+                            <option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.optimization.level.1940053873" name="Optimization Level" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.optimization.level" useByScannerDiscovery="true" value="ilg.gnumcueclipse.managedbuild.cross.riscv.option.optimization.level.most" valueType="enumerated"/>\r
                                                                                \r
                             <option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.optimization.messagelength.565243439" name="Message length (-fmessage-length=0)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.optimization.messagelength" useByScannerDiscovery="true" value="false" valueType="boolean"/>\r
                                                                                \r
@@ -85,9 +85,9 @@
                                                                                \r
                             <option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.optimization.freestanding.224053313" name="Assume freestanding environment (-ffreestanding)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.optimization.freestanding" useByScannerDiscovery="true" value="false" valueType="boolean"/>\r
                                                                                \r
-                            <option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.optimization.noinlinefunctions.1322946455" name="Do not inline functions (-fno-inline-functions)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.optimization.noinlinefunctions" value="false" valueType="boolean"/>\r
+                            <option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.optimization.noinlinefunctions.1322946455" name="Do not inline functions (-fno-inline-functions)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.optimization.noinlinefunctions" useByScannerDiscovery="true" value="false" valueType="boolean"/>\r
                                                                                \r
-                            <option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.optimization.nobuiltin.1525203912" name="Disable builtin (-fno-builtin)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.optimization.nobuiltin" value="true" valueType="boolean"/>\r
+                            <option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.optimization.nobuiltin.1525203912" name="Disable builtin (-fno-builtin)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.optimization.nobuiltin" useByScannerDiscovery="true" value="true" valueType="boolean"/>\r
                                                                                \r
                             <targetPlatform archList="all" binaryParser="org.eclipse.cdt.core.ELF" id="ilg.gnumcueclipse.managedbuild.cross.riscv.targetPlatform.1851994667" isAbstract="false" osList="all" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.targetPlatform"/>\r
                                                                                \r
                                                                                                \r
                                 <option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.assembler.usepreprocessor.1853992692" name="Use preprocessor" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.assembler.usepreprocessor" useByScannerDiscovery="false" value="true" valueType="boolean"/>\r
                                                                                                \r
+                                <option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.assembler.include.paths.1792818218" name="Include paths (-I)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.assembler.include.paths" useByScannerDiscovery="true" valueType="includePath">\r
+                                                                                                       \r
+                                    <listOptionValue builtIn="false" value="&quot;${workspace_loc:/${ProjName}/FreeRTOS_Source/portable/GCC/RISC-V-RV32/CLINT}&quot;"/>\r
+                                                                                               \r
+                                </option>\r
+                                                                                               \r
                                 <inputType id="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.assembler.input.1786331150" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.assembler.input"/>\r
                                                                                        \r
                             </tool>\r
index 5b379609255a3ce8ec28684da5fd4dbdac153564..69a0ac05b1b2b5895100621abe224ff344958bab 100644 (file)
@@ -11,7 +11,7 @@
                                \r
             <provider-reference id="org.eclipse.cdt.managedbuilder.core.MBSLanguageSettingsProvider" ref="shared-provider"/>\r
                                \r
-            <provider class="org.eclipse.cdt.managedbuilder.language.settings.providers.GCCBuiltinSpecsDetector" console="false" env-hash="-564858745062802889" 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">\r
+            <provider class="org.eclipse.cdt.managedbuilder.language.settings.providers.GCCBuiltinSpecsDetector" console="false" env-hash="247273655846757705" 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">\r
                                                \r
                 <language-scope id="org.eclipse.cdt.core.gcc"/>\r
                                                \r
index e657e635fd4d930ecb8b48191c0a3dd5396b9aa2..8dbf46cd42d0396cae3bda3bde9e67b2fec40287 100644 (file)
@@ -144,4 +144,8 @@ header file. */
 #define configASSERT( x ) if( ( x ) == 0 ) { taskDISABLE_INTERRUPTS(); __asm volatile( "ebreak" ); for( ;; ); }\r
 \r
 #define configUSE_PORT_OPTIMISED_TASK_SELECTION 0\r
+\r
+#define handle_m_ext_interrupt vPortHandleInterrupt\r
+\r
+\r
 #endif /* FREERTOS_CONFIG_H */\r
index 99d1c10dd143db3cc22dc8563ff3c1ecbff8f319..68d030d72b1c99cdd2962957a88dc68c22c6bfb1 100644 (file)
@@ -1,17 +1,17 @@
 /*******************************************************************************\r
  * (c) Copyright 2016-2018 Microsemi SoC Products Group.  All rights reserved.\r
- * \r
+ *\r
  * file name : microsemi-riscv-igloo2.ld\r
  * Mi-V soft processor linker script for creating a SoftConsole downloadable\r
  * image executing in eNVM.\r
- * \r
+ *\r
  * This linker script assumes that the eNVM is connected at on the Mi-V soft\r
- * processor memory space. \r
+ * processor memory space.\r
  *\r
  * SVN $Revision: 9661 $\r
  * SVN $Date: 2018-01-15 16:13:33 +0530 (Mon, 15 Jan 2018) $\r
  */\r
\r
+\r
 OUTPUT_ARCH( "riscv" )\r
 ENTRY(_start)\r
 \r
@@ -24,19 +24,19 @@ MEMORY
 \r
 RAM_START_ADDRESS   = 0x80000000;       /* Must be the same value MEMORY region ram ORIGIN above. */\r
 RAM_SIZE            = 64k;              /* Must be the same value MEMORY region ram LENGTH above. */\r
-STACK_SIZE          = 2k;               /* needs to be calculated for your application */             \r
+STACK_SIZE          = 2k;               /* needs to be calculated for your application */\r
 HEAP_SIZE           = 2k;               /* needs to be calculated for your application */\r
 \r
 SECTIONS\r
 {\r
   .text : ALIGN(0x10)\r
   {\r
-    KEEP (*(SORT_NONE(.text.entry)))   \r
+    KEEP (*(SORT_NONE(.text.entry)))\r
     . = ALIGN(0x10);\r
     *(.text .text.* .gnu.linkonce.t.*)\r
     *(.plt)\r
     . = ALIGN(0x10);\r
-    \r
+\r
     KEEP (*crtbegin.o(.ctors))\r
     KEEP (*(EXCLUDE_FILE (*crtend.o) .ctors))\r
     KEEP (*(SORT(.ctors.*)))\r
@@ -45,12 +45,12 @@ SECTIONS
     KEEP (*(EXCLUDE_FILE (*crtend.o) .dtors))\r
     KEEP (*(SORT(.dtors.*)))\r
     KEEP (*crtend.o(.dtors))\r
-    \r
+\r
     *(.rodata .rodata.* .gnu.linkonce.r.*)\r
-    *(.gcc_except_table) \r
+    *(.gcc_except_table)\r
     *(.eh_frame_hdr)\r
     *(.eh_frame)\r
-    \r
+\r
     KEEP (*(.init))\r
     KEEP (*(.fini))\r
 \r
@@ -66,14 +66,14 @@ SECTIONS
     KEEP (*(SORT(.fini_array.*)))\r
     PROVIDE_HIDDEN (__fini_array_end = .);\r
     . = ALIGN(0x10);\r
-    \r
+\r
   } >envm\r
 \r
   /* short/global data section */\r
   .sdata : ALIGN(0x10)\r
   {\r
     __sdata_load = LOADADDR(.sdata);\r
-    __sdata_start = .; \r
+    __sdata_start = .;\r
     PROVIDE( __global_pointer$ = . + 0x800);\r
     *(.srodata.cst16) *(.srodata.cst8) *(.srodata.cst4) *(.srodata.cst2)\r
     *(.srodata*)\r
@@ -84,9 +84,9 @@ SECTIONS
 \r
   /* data section */\r
   .data : ALIGN(0x10)\r
-  { \r
+  {\r
     __data_load = LOADADDR(.data);\r
-    __data_start = .; \r
+    __data_start = .;\r
     *(.got.plt) *(.got)\r
     *(.shdata)\r
     *(.data .data.* .gnu.linkonce.d.*)\r
@@ -103,10 +103,10 @@ SECTIONS
     . = ALIGN(0x10);\r
     __sbss_end = .;\r
   } > ram\r
-  \r
+\r
   /* sbss section */\r
   .bss : ALIGN(0x10)\r
-  { \r
+  {\r
     __bss_start = .;\r
     *(.shbss)\r
     *(.bss .bss.* .gnu.linkonce.b.*)\r
@@ -117,7 +117,7 @@ SECTIONS
 \r
   /* End of uninitialized data segment */\r
   _end = .;\r
-  \r
+\r
   .heap : ALIGN(0x10)\r
   {\r
     __heap_start = .;\r
@@ -126,13 +126,14 @@ SECTIONS
     . = ALIGN(0x10);\r
     _heap_end = __heap_end;\r
   } > ram\r
-  \r
+\r
   .stack : ALIGN(0x10)\r
   {\r
     __stack_bottom = .;\r
     . += STACK_SIZE;\r
     __stack_top = .;\r
     _sp = .;\r
+       __freertos_irq_stack_top = .;\r
   } > ram\r
 }\r
 \r
index 47b77075f9f7c9c071774edbe75e2a15642a402d..305cb0ee64776742a2936b60a18a2f60ea0db85f 100644 (file)
@@ -1,10 +1,10 @@
 /*******************************************************************************\r
  * (c) Copyright 2016-2018 Microsemi SoC Products Group.  All rights reserved.\r
- * \r
+ *\r
  * file name : microsemi-riscv-ram.ld\r
  * Mi-V soft processor linker script for creating a SoftConsole downloadable\r
  * debug image executing in SRAM.\r
- * \r
+ *\r
  * This linker script assumes that the SRAM is connected at on the Mi-V soft\r
  * processor memory space. The start address and size of the memory space must\r
  * be correct as per the Libero design.\r
@@ -12,7 +12,7 @@
  * SVN $Revision: 9661 $\r
  * SVN $Date: 2018-01-15 16:13:33 +0530 (Mon, 15 Jan 2018) $\r
  */\r
\r
+\r
 OUTPUT_ARCH( "riscv" )\r
 ENTRY(_start)\r
 \r
@@ -24,19 +24,19 @@ MEMORY
 \r
 RAM_START_ADDRESS   = 0x80000000;       /* Must be the same value MEMORY region ram ORIGIN above. */\r
 RAM_SIZE            = 512k;              /* Must be the same value MEMORY region ram LENGTH above. */\r
-STACK_SIZE          = 64k;               /* needs to be calculated for your application */             \r
+STACK_SIZE          = 64k;               /* needs to be calculated for your application */\r
 HEAP_SIZE           = 64k;               /* needs to be calculated for your application */\r
 \r
 SECTIONS\r
 {\r
   .text : ALIGN(0x10)\r
   {\r
-    KEEP (*(SORT_NONE(.text.entry)))   \r
+    KEEP (*(SORT_NONE(.text.entry)))\r
     . = ALIGN(0x10);\r
     *(.text .text.* .gnu.linkonce.t.*)\r
     *(.plt)\r
     . = ALIGN(0x10);\r
-    \r
+\r
     KEEP (*crtbegin.o(.ctors))\r
     KEEP (*(EXCLUDE_FILE (*crtend.o) .ctors))\r
     KEEP (*(SORT(.ctors.*)))\r
@@ -45,12 +45,12 @@ SECTIONS
     KEEP (*(EXCLUDE_FILE (*crtend.o) .dtors))\r
     KEEP (*(SORT(.dtors.*)))\r
     KEEP (*crtend.o(.dtors))\r
-    \r
+\r
     *(.rodata .rodata.* .gnu.linkonce.r.*)\r
-    *(.gcc_except_table) \r
+    *(.gcc_except_table)\r
     *(.eh_frame_hdr)\r
     *(.eh_frame)\r
-    \r
+\r
     KEEP (*(.init))\r
     KEEP (*(.fini))\r
 \r
@@ -66,14 +66,14 @@ SECTIONS
     KEEP (*(SORT(.fini_array.*)))\r
     PROVIDE_HIDDEN (__fini_array_end = .);\r
     . = ALIGN(0x10);\r
-    \r
+\r
   } > ram\r
 \r
   /* short/global data section */\r
   .sdata : ALIGN(0x10)\r
   {\r
     __sdata_load = LOADADDR(.sdata);\r
-    __sdata_start = .; \r
+    __sdata_start = .;\r
     PROVIDE( __global_pointer$ = . + 0x800);\r
     *(.srodata.cst16) *(.srodata.cst8) *(.srodata.cst4) *(.srodata.cst2)\r
     *(.srodata*)\r
@@ -84,9 +84,9 @@ SECTIONS
 \r
   /* data section */\r
   .data : ALIGN(0x10)\r
-  { \r
+  {\r
     __data_load = LOADADDR(.data);\r
-    __data_start = .; \r
+    __data_start = .;\r
     *(.got.plt) *(.got)\r
     *(.shdata)\r
     *(.data .data.* .gnu.linkonce.d.*)\r
@@ -103,10 +103,10 @@ SECTIONS
     . = ALIGN(0x10);\r
     __sbss_end = .;\r
   } > ram\r
-  \r
+\r
   /* sbss section */\r
   .bss : ALIGN(0x10)\r
-  { \r
+  {\r
     __bss_start = .;\r
     *(.shbss)\r
     *(.bss .bss.* .gnu.linkonce.b.*)\r
@@ -117,7 +117,7 @@ SECTIONS
 \r
   /* End of uninitialized data segment */\r
   _end = .;\r
-  \r
+\r
   .heap : ALIGN(0x10)\r
   {\r
     __heap_start = .;\r
@@ -126,13 +126,14 @@ SECTIONS
     . = ALIGN(0x10);\r
     _heap_end = __heap_end;\r
   } > ram\r
-  \r
+\r
   .stack : ALIGN(0x10)\r
   {\r
     __stack_bottom = .;\r
     . += STACK_SIZE;\r
     __stack_top = .;\r
     _sp = .;\r
+       __freertos_irq_stack_top = .;\r
   } > ram\r
 }\r
 \r
index 1bf02d6f0706b41a22a4566fbb817e4dee165cfb..14ecf7bbee22df2264d5131d546fadf6bf969e90 100644 (file)
@@ -1,4 +1,3 @@
-#if 0\r
 /*******************************************************************************\r
  * (c) Copyright 2016-2018 Microsemi SoC Products Group. All rights reserved.\r
  *\r
@@ -15,6 +14,8 @@
 \r
 #include "riscv_hal.h"\r
 \r
+#include "FreeRTOS.h"\r
+\r
 #ifdef __cplusplus\r
 extern "C" {\r
 #endif\r
@@ -66,70 +67,6 @@ uint8_t External_31_IRQHandler(void);
 extern void Software_IRQHandler(void);\r
 extern void Timer_IRQHandle( void );\r
 \r
-/*------------------------------------------------------------------------------\r
- * Increment value for the mtimecmp register in order to achieve a system tick\r
- * interrupt as specified through the SysTick_Config() function.\r
- */\r
-static uint64_t g_systick_increment = 0U;\r
-\r
-/*------------------------------------------------------------------------------\r
- * Disable all interrupts.\r
- */\r
-void __disable_irq(void)\r
-{\r
-    clear_csr(mstatus, MSTATUS_MPIE);\r
-    clear_csr(mstatus, MSTATUS_MIE);\r
-}\r
-\r
-/*------------------------------------------------------------------------------\r
- * Enabler all interrupts.\r
- */\r
-void __enable_irq(void)\r
-{\r
-    set_csr(mstatus, MSTATUS_MIE);\r
-}\r
-\r
-/*------------------------------------------------------------------------------\r
- * Configure the machine timer to generate an interrupt.\r
- */\r
-uint32_t SysTick_Config(uint32_t ticks)\r
-{\r
-    uint32_t ret_val = ERROR;\r
-\r
-    g_systick_increment = (uint64_t)(ticks) / RTC_PRESCALER;\r
-\r
-    if (g_systick_increment > 0U)\r
-    {\r
-        uint32_t mhart_id = read_csr(mhartid);\r
-\r
-        PRCI->MTIMECMP[mhart_id] = PRCI->MTIME + g_systick_increment;\r
-\r
-        set_csr(mie, MIP_MTIP);\r
-\r
-        __enable_irq();\r
-\r
-        ret_val = SUCCESS;\r
-    }\r
-\r
-    return ret_val;\r
-}\r
-\r
-/*------------------------------------------------------------------------------\r
- * RISC-V interrupt handler for machine timer interrupts.\r
- */\r
-volatile uint32_t ulTimerInterrupts = 0;\r
-extern void Timer_IRQHandler( void );\r
-static void handle_m_timer_interrupt(void)\r
-{\r
-//    clear_csr(mie, MIP_MTIP);\r
-\r
-    Timer_IRQHandler();\r
-\r
-//    PRCI->MTIMECMP[read_csr(mhartid)] = PRCI->MTIME + g_systick_increment;\r
-\r
-//    set_csr(mie, MIP_MTIP);\r
-}\r
-\r
 /*------------------------------------------------------------------------------\r
  * RISC-V interrupt handler for external interrupts.\r
  */\r
@@ -172,7 +109,7 @@ uint8_t (*ext_irq_handler_table[32])(void) =
 /*------------------------------------------------------------------------------\r
  *\r
  */\r
-static void handle_m_ext_interrupt(void)\r
+void handle_m_ext_interrupt(void)\r
 {\r
     uint32_t int_num  = PLIC_ClaimIRQ();\r
     uint8_t disable = EXT_IRQ_KEEP_ENABLED;\r
@@ -187,82 +124,7 @@ static void handle_m_ext_interrupt(void)
     }\r
 }\r
 \r
-static void handle_m_soft_interrupt(void)\r
-{\r
-    Software_IRQHandler();\r
-\r
-    /*Clear software interrupt*/\r
-    PRCI->MSIP[0] = 0x00U;\r
-}\r
-\r
-/*------------------------------------------------------------------------------\r
- * Trap/Interrupt handler\r
- */\r
-#define ENV_CALL_FROM_M_MODE 11\r
-extern void vTaskSwitchContext( void );\r
-\r
-uintptr_t handle_trap(uintptr_t mcause, uintptr_t mepc)\r
-{\r
-       /*_RB_*/\r
-       if( mcause == ENV_CALL_FROM_M_MODE )\r
-       {\r
-               vTaskSwitchContext();\r
-\r
-               /* Ensure not to return to the instruction that generated the exception. */\r
-               mepc += 4;\r
-       } else\r
-       /*end _RB_*/\r
-    if ((mcause & MCAUSE_INT) && ((mcause & MCAUSE_CAUSE)  == IRQ_M_EXT))\r
-    {\r
-        handle_m_ext_interrupt();\r
-    }\r
-    else if ((mcause & MCAUSE_INT) && ((mcause & MCAUSE_CAUSE)  == IRQ_M_TIMER))\r
-    {\r
-        handle_m_timer_interrupt();\r
-    }\r
-    else if ( (mcause & MCAUSE_INT) && ((mcause & MCAUSE_CAUSE)  == IRQ_M_SOFT))\r
-    {\r
-        handle_m_soft_interrupt();\r
-    }\r
-    else\r
-    {\r
-#ifndef NDEBUG\r
-        /*\r
-         Arguments supplied to this function are mcause, mepc (exception PC) and stack pointer\r
-         based onprivileged-isa specification\r
-         mcause values and meanings are:\r
-         0 Instruction address misaligned (mtval/mbadaddr is the address)\r
-         1 Instruction access fault       (mtval/mbadaddr is the address)\r
-         2 Illegal instruction            (mtval/mbadaddr contains the offending instruction opcode)\r
-         3 Breakpoint\r
-         4 Load address misaligned        (mtval/mbadaddr is the address)\r
-         5 Load address fault             (mtval/mbadaddr is the address)\r
-         6 Store/AMO address fault        (mtval/mbadaddr is the address)\r
-         7 Store/AMO access fault         (mtval/mbadaddr is the address)\r
-         8 Environment call from U-mode\r
-         9 Environment call from S-mode\r
-         A Environment call from M-mode\r
-         B Instruction page fault\r
-         C Load page fault                (mtval/mbadaddr is the address)\r
-         E Store page fault               (mtval/mbadaddr is the address)\r
-        */\r
-\r
-         uintptr_t mip      = read_csr(mip);      /* interrupt pending */\r
-         uintptr_t mbadaddr = read_csr(mbadaddr); /* additional info and meaning depends on mcause */\r
-         uintptr_t mtvec    = read_csr(mtvec);    /* trap vector */\r
-         uintptr_t mscratch = read_csr(mscratch); /* temporary, sometimes might hold temporary value of a0 */\r
-         uintptr_t mstatus  = read_csr(mstatus);  /* status contains many smaller fields: */\r
-\r
-               /* breakpoint*/\r
-        __asm("ebreak");\r
-#else\r
-        _exit(1 + mcause);\r
-#endif\r
-    }\r
-    return mepc;\r
-}\r
 \r
 #ifdef __cplusplus\r
 }\r
 #endif\r
-#endif\r
index b306c5bf059d5dbf061fb8ccb280ed4ce04afe19..2d0951891c39c650f77dd39cb9baa8695ff5a1c8 100644 (file)
@@ -143,7 +143,7 @@ static inline void PLIC_init(void)
     PLIC->TARGET[hart_id].PRIORITY_THRESHOLD = 0;\r
 \r
     /* Enable machine external interrupts. */\r
-//    set_csr(mie, MIP_MEIP);\r
+    set_csr(mie, MIP_MEIP);\r
 }\r
 \r
 /*==============================================================================\r
index a0efe8dd45033ccae218da731c6008c836d995cd..f86b8c6a3574d91a6957565badef79b6765a3dc4 100644 (file)
 #include "timers.h"\r
 #include "semphr.h"\r
 \r
+/* Microsemi incldues. */\r
+#include "core_timer.h"\r
+#include "riscv_hal.h"\r
+\r
 /* Standard demo application includes. */\r
 #include "dynamic.h"\r
 #include "blocktim.h"\r
@@ -123,6 +127,12 @@ void main_full( void );
  */\r
 static void prvCheckTask( void *pvParameters );\r
 \r
+/*\r
+ * Initialise and start the peripheral timers that are used to exercise external\r
+ * interrupt processing.\r
+ */\r
+static void prvSetupPeripheralTimers( void );\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
@@ -142,6 +152,13 @@ void vFullDemoTickHook( void );
 \r
 /*-----------------------------------------------------------*/\r
 \r
+/* Timers used to exercise external interrupt processing. */\r
+static timer_instance_t g_timer0, g_timer1;\r
+\r
+/* Variables incremented by the peripheral timers used to exercise external\r
+interrupts. */\r
+volatile uint32_t ulTimer0Interrupts = 0, ulTimer1Interrupts = 0;\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
@@ -188,6 +205,9 @@ void main_full( void )
        running. */\r
        vCreateSuicidalTasks( mainCREATOR_TASK_PRIORITY );\r
 \r
+       /* Start the timers that are used to exercise external interrupt handling. */\r
+       prvSetupPeripheralTimers();\r
+\r
        /* Start the scheduler. */\r
        vTaskStartScheduler();\r
 \r
@@ -205,7 +225,8 @@ static void prvCheckTask( void *pvParameters )
 {\r
 TickType_t xDelayPeriod = mainNO_ERROR_CHECK_TASK_PERIOD;\r
 TickType_t xLastExecutionTime;\r
-static unsigned long ulLastRegTest1Value = 0, ulLastRegTest2Value = 0;\r
+uint32_t ulLastRegTest1Value = 0, ulLastRegTest2Value = 0;\r
+uint32_t ulLastTimer0Interrupts = 0, ulLastTimer1Interrupts = 0;\r
 char * const pcPassMessage = "Pass.\r\n";\r
 char * pcStatusMessage = pcPassMessage;\r
 extern void vSendString( const char * const pcString );\r
@@ -310,9 +331,21 @@ extern void vToggleLED( void );
                }\r
                ulLastRegTest2Value = ulRegTest2LoopCounter;\r
 \r
+               /* Check interrupts from the peripheral timers are being handled. */\r
+               if( ulLastTimer0Interrupts == ulTimer0Interrupts )\r
+               {\r
+                       pcStatusMessage = "ERROR: Peripheral timer 0.\r\n";\r
+               }\r
+               ulLastTimer0Interrupts = ulTimer0Interrupts;\r
+\r
+               if( ulLastTimer1Interrupts == ulTimer1Interrupts )\r
+               {\r
+                       pcStatusMessage = "ERROR: Peripheral timer 1.\r\n";\r
+               }\r
+               ulLastTimer1Interrupts = ulTimer1Interrupts;\r
+\r
                /* Write the status message to the UART. */\r
                vSendString( pcStatusMessage );\r
-               vToggleLED();\r
 \r
                /* If an error has been found then increase the LED toggle rate by\r
                increasing the cycle frequency. */\r
@@ -383,3 +416,60 @@ void vFullDemoTickHook( void )
        /* Called from vApplicationTickHook() when the project is configured to\r
        build the full test/demo applications. */\r
 }\r
+/*-----------------------------------------------------------*/\r
+\r
+static void prvSetupPeripheralTimers( void )\r
+{\r
+       TMR_init(       &g_timer0,\r
+                               CORETIMER0_BASE_ADDR,\r
+                               TMR_CONTINUOUS_MODE,\r
+                               PRESCALER_DIV_1024,\r
+                               83000 );\r
+\r
+    TMR_init(  &g_timer1,\r
+                               CORETIMER1_BASE_ADDR,\r
+                               TMR_CONTINUOUS_MODE,\r
+                               PRESCALER_DIV_512,\r
+                               42000 );\r
+\r
+       /* In this version of the PLIC, the priorities are fixed at 1.\r
+       Lower numbered devices have higher priorities. But this code is given as\r
+       an example.\r
+       */\r
+       PLIC_SetPriority( External_30_IRQn, 1 );\r
+       PLIC_SetPriority( External_31_IRQn, 1 );\r
+\r
+       /*Enable Timer 1 & 0 Interrupt*/\r
+       PLIC_EnableIRQ( External_30_IRQn );\r
+       PLIC_EnableIRQ( External_31_IRQn );\r
+\r
+       /* Enable the timers */\r
+       TMR_enable_int( &g_timer0 );\r
+       TMR_enable_int( &g_timer1 );\r
+\r
+       /* Make sure timers don't interrupt until the scheduler is running. */\r
+       portDISABLE_INTERRUPTS();\r
+\r
+       /*Start the timer*/\r
+       TMR_start( &g_timer0 );\r
+       TMR_start( &g_timer1 );\r
+}\r
+/*-----------------------------------------------------------*/\r
+\r
+/*Core Timer 0 Interrupt Handler*/\r
+uint8_t External_30_IRQHandler( void )\r
+{\r
+       ulTimer0Interrupts++;\r
+    TMR_clear_int(&g_timer0);\r
+    return( EXT_IRQ_KEEP_ENABLED );\r
+}\r
+/*-----------------------------------------------------------*/\r
+\r
+/*Core Timer 1 Interrupt Handler*/\r
+uint8_t External_31_IRQHandler( void )\r
+{\r
+       ulTimer1Interrupts++;\r
+    TMR_clear_int(&g_timer1);\r
+\r
+    return( EXT_IRQ_KEEP_ENABLED );\r
+}\r
index be526c2131c2ede88e5c5c5ae43d33f9f0c73323..59c3093f5df69a5264a354fa968bb1f691150c70 100644 (file)
@@ -107,7 +107,6 @@ static void prvSetupHardware( void )
 {\r
        PLIC_init();\r
        UART_init( &g_uart, COREUARTAPB0_BASE_ADDR, BAUD_VALUE_115200, ( DATA_8_BITS | NO_PARITY ) );\r
-       GPIO_init( &g_gpio_out, COREGPIO_OUT_BASE_ADDR, GPIO_APB_32_BITS_BUS );\r
 }\r
 /*-----------------------------------------------------------*/\r
 \r
@@ -182,3 +181,5 @@ void vApplicationTickHook( void )
        }\r
        #endif\r
 }\r
+\r
+\r