From 4255ac5c28af626ea7953006a4ff112f758ea332 Mon Sep 17 00:00:00 2001 From: Gaurav-Aggarwal-AWS <33462878+aggarg@users.noreply.github.com> Date: Tue, 8 Feb 2022 14:10:28 -0800 Subject: [PATCH] Update SiFive FreedomStudio project (#785) SiFive FreedomStudio project changes needed for refactored code Signed-off-by: Gaurav Aggarwal --- .../.cproject | 2 +- .../.settings/language.settings.xml | 2 +- .../FreeRTOSConfig.h | 6 +- .../main.c | 43 +++++++- .../vector_table.S | 98 +++++++++++++++++++ 5 files changed, 144 insertions(+), 7 deletions(-) create mode 100644 FreeRTOS/Demo/RISC-V_RV32_SiFive_HiFive1-RevB_FreedomStudio/vector_table.S diff --git a/FreeRTOS/Demo/RISC-V_RV32_SiFive_HiFive1-RevB_FreedomStudio/.cproject b/FreeRTOS/Demo/RISC-V_RV32_SiFive_HiFive1-RevB_FreedomStudio/.cproject index baa18f1aab..5e22068fdb 100644 --- a/FreeRTOS/Demo/RISC-V_RV32_SiFive_HiFive1-RevB_FreedomStudio/.cproject +++ b/FreeRTOS/Demo/RISC-V_RV32_SiFive_HiFive1-RevB_FreedomStudio/.cproject @@ -57,7 +57,7 @@ - diff --git a/FreeRTOS/Demo/RISC-V_RV32_SiFive_HiFive1-RevB_FreedomStudio/.settings/language.settings.xml b/FreeRTOS/Demo/RISC-V_RV32_SiFive_HiFive1-RevB_FreedomStudio/.settings/language.settings.xml index b1990cea13..48e342c5cc 100644 --- a/FreeRTOS/Demo/RISC-V_RV32_SiFive_HiFive1-RevB_FreedomStudio/.settings/language.settings.xml +++ b/FreeRTOS/Demo/RISC-V_RV32_SiFive_HiFive1-RevB_FreedomStudio/.settings/language.settings.xml @@ -5,7 +5,7 @@ - + diff --git a/FreeRTOS/Demo/RISC-V_RV32_SiFive_HiFive1-RevB_FreedomStudio/FreeRTOSConfig.h b/FreeRTOS/Demo/RISC-V_RV32_SiFive_HiFive1-RevB_FreedomStudio/FreeRTOSConfig.h index 47d915a081..9f80763ca8 100644 --- a/FreeRTOS/Demo/RISC-V_RV32_SiFive_HiFive1-RevB_FreedomStudio/FreeRTOSConfig.h +++ b/FreeRTOS/Demo/RISC-V_RV32_SiFive_HiFive1-RevB_FreedomStudio/FreeRTOSConfig.h @@ -20,7 +20,7 @@ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * https://www.FreeRTOS.org - * https://aws.amazon.com/freertos + * https://github.com/FreeRTOS * */ @@ -47,8 +47,8 @@ #define configCPU_CLOCK_HZ ( 32768 ) #define configTICK_RATE_HZ ( ( TickType_t ) 1000 ) #define configMAX_PRIORITIES ( 7 ) -#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. */ -#define configTOTAL_HEAP_SIZE ( ( size_t ) 10900 ) +#define configMINIMAL_STACK_SIZE ( ( unsigned short ) 128 ) +#define configTOTAL_HEAP_SIZE ( ( size_t ) 10 * 1024 ) #define configMAX_TASK_NAME_LEN ( 16 ) #define configUSE_TRACE_FACILITY 0 #define configUSE_16_BIT_TICKS 0 diff --git a/FreeRTOS/Demo/RISC-V_RV32_SiFive_HiFive1-RevB_FreedomStudio/main.c b/FreeRTOS/Demo/RISC-V_RV32_SiFive_HiFive1-RevB_FreedomStudio/main.c index 45a87c0308..a8ebb68db0 100644 --- a/FreeRTOS/Demo/RISC-V_RV32_SiFive_HiFive1-RevB_FreedomStudio/main.c +++ b/FreeRTOS/Demo/RISC-V_RV32_SiFive_HiFive1-RevB_FreedomStudio/main.c @@ -20,7 +20,7 @@ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * https://www.FreeRTOS.org - * https://aws.amazon.com/freertos + * https://github.com/FreeRTOS * */ @@ -59,6 +59,17 @@ or 0 to run the more comprehensive test and demo application. */ #define mainCREATE_SIMPLE_BLINKY_DEMO_ONLY 0 +/* Set to 1 to use direct mode and set to 0 to use vectored mode. + +VECTOR MODE=Direct --> all traps into machine mode cause the pc to be set to the +vector base address (BASE) in the mtvec register. + +VECTOR MODE=Vectored --> all synchronous exceptions into machine mode cause the +pc to be set to the BASE, whereas interrupts cause the pc to be set to the +address BASE plus four times the interrupt cause number. +*/ +#define mainVECTOR_MODE_DIRECT 0 + /* Index to first HART (there is only one). */ #define mainHART_0 0 @@ -70,6 +81,9 @@ or 0 to run the more comprehensive test and demo application. */ /*-----------------------------------------------------------*/ +extern void freertos_risc_v_trap_handler( void ); +extern void freertos_vector_table( void ); + /* * 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. @@ -118,7 +132,6 @@ int main( void ) #endif } /*-----------------------------------------------------------*/ - static void prvSetupHardware( void ) { struct metal_cpu *pxCPU; @@ -137,6 +150,16 @@ struct metal_interrupt *pxInterruptController; configASSERT( pxInterruptController ); metal_interrupt_init( pxInterruptController ); + #if( mainVECTOR_MODE_DIRECT == 1 ) + { + __asm__ volatile( "csrw mtvec, %0" :: "r"( freertos_risc_v_trap_handler ) ); + } + #else + { + __asm__ volatile( "csrw mtvec, %0" :: "r"( ( uintptr_t )freertos_vector_table | 0x1 ) ); + } + #endif + /* Set all interrupt enable bits to 0. */ mainPLIC_ENABLE_0 = 0UL; mainPLIC_ENABLE_1 = 0UL; @@ -248,6 +271,22 @@ volatile uint32_t ulMEPC = 0UL, ulMCAUSE = 0UL, ulPLICPending0Register = 0UL, ul } /*-----------------------------------------------------------*/ +void freertos_risc_v_application_interrupt_handler( uint32_t ulMcause ) +{ + ( void )ulMcause; + + handle_trap(); +} +/*-----------------------------------------------------------*/ + +void freertos_risc_v_application_exception_handler( uint32_t ulMcause ) +{ + ( void )ulMcause; + + handle_trap(); +} +/*-----------------------------------------------------------*/ + void vToggleLED( void ) { metal_led_toggle( pxBlueLED ); diff --git a/FreeRTOS/Demo/RISC-V_RV32_SiFive_HiFive1-RevB_FreedomStudio/vector_table.S b/FreeRTOS/Demo/RISC-V_RV32_SiFive_HiFive1-RevB_FreedomStudio/vector_table.S new file mode 100644 index 0000000000..805b2bc178 --- /dev/null +++ b/FreeRTOS/Demo/RISC-V_RV32_SiFive_HiFive1-RevB_FreedomStudio/vector_table.S @@ -0,0 +1,98 @@ +/* + * FreeRTOS V202112.00 + * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * https://www.FreeRTOS.org + * https://github.com/FreeRTOS + * + */ + +.extern freertos_risc_v_exception_handler +.extern freertos_risc_v_interrupt_handler +.extern freertos_risc_v_mtimer_interrupt_handler + +.balign 128, 0 +.option norvc +.global freertos_vector_table +freertos_vector_table: +IRQ_0: + j freertos_risc_v_exception_handler +IRQ_1: + j freertos_risc_v_interrupt_handler +IRQ_2: + j freertos_risc_v_interrupt_handler +IRQ_3: + j freertos_risc_v_interrupt_handler +IRQ_4: + j freertos_risc_v_interrupt_handler +IRQ_5: + j freertos_risc_v_interrupt_handler +IRQ_6: + j freertos_risc_v_interrupt_handler +IRQ_7: + j freertos_risc_v_mtimer_interrupt_handler +IRQ_8: + j freertos_risc_v_interrupt_handler +IRQ_9: + j freertos_risc_v_interrupt_handler +IRQ_10: + j freertos_risc_v_interrupt_handler +IRQ_11: + j freertos_risc_v_interrupt_handler +IRQ_12: + j freertos_risc_v_interrupt_handler +IRQ_13: + j freertos_risc_v_interrupt_handler +IRQ_14: + j freertos_risc_v_interrupt_handler +IRQ_15: + j freertos_risc_v_interrupt_handler +IRQ_LC0: + j freertos_risc_v_interrupt_handler +IRQ_LC1: + j freertos_risc_v_interrupt_handler +IRQ_LC2: + j freertos_risc_v_interrupt_handler +IRQ_LC3: + j freertos_risc_v_interrupt_handler +IRQ_LC4: + j freertos_risc_v_interrupt_handler +IRQ_LC5: + j freertos_risc_v_interrupt_handler +IRQ_LC6: + j freertos_risc_v_interrupt_handler +IRQ_LC7: + j freertos_risc_v_interrupt_handler +IRQ_LC8: + j freertos_risc_v_interrupt_handler +IRQ_LC9: + j freertos_risc_v_interrupt_handler +IRQ_LC10: + j freertos_risc_v_interrupt_handler +IRQ_LC11: + j freertos_risc_v_interrupt_handler +IRQ_LC12: + j freertos_risc_v_interrupt_handler +IRQ_LC13: + j freertos_risc_v_interrupt_handler +IRQ_LC14: + j freertos_risc_v_interrupt_handler +IRQ_LC15: + j freertos_risc_v_interrupt_handler