mirror of
				https://github.com/FreeRTOS/FreeRTOS-Kernel.git
				synced 2025-11-04 11:09:01 +01:00 
			
		
		
		
	Replace portasmHAS_CLINT with configMTIME_BASE_ADDRESS and configMTIMECMP_BASE_ADDRESS definitions in the IAR RISC-V port - portasmHAS_CLIT will still work by deriving the new definitions from the old.
This commit is contained in:
		
							parent
							
								
									75b81a1fab
								
							
						
					
					
						commit
						066e2bc7d2
					
				@ -38,7 +38,7 @@
 | 
			
		||||
#include "string.h"
 | 
			
		||||
 | 
			
		||||
#ifdef configCLINT_BASE_ADDRESS
 | 
			
		||||
	#warning The configCLINT_BASE_ADDRESS constant has been deprecated.  configMTIME_BASE_ADDRESS and configMTIMECMP_BASE_ADDRESS are currently being derived from configCLINT_BASE_ADDRESS.  Please update to define configMTIME_BASE_ADDRESS and configMTIMECMP_BASE_ADDRESS dirctly in place of configCLINT_BASE_ADDRESS.
 | 
			
		||||
	#warning The configCLINT_BASE_ADDRESS constant has been deprecated.  configMTIME_BASE_ADDRESS and configMTIMECMP_BASE_ADDRESS are currently being derived from the (possibly 0) configCLINT_BASE_ADDRESS setting.  Please update to define configMTIME_BASE_ADDRESS and configMTIMECMP_BASE_ADDRESS dirctly in place of configCLINT_BASE_ADDRESS.
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifndef configMTIME_BASE_ADDRESS
 | 
			
		||||
 | 
			
		||||
@ -160,11 +160,20 @@ not necessary for to use this port.  They are defined so the common demo files
 | 
			
		||||
configMTIME_BASE_ADDRESS and configMTIMECMP_BASE_ADDRESS definitions.  For
 | 
			
		||||
backward compatibility derive the newer definitions from the old if the old
 | 
			
		||||
definition is found. */
 | 
			
		||||
#if defined( configCLINT_BASE_ADDRESS ) && !defined( configMTIME_BASE_ADDRESS )
 | 
			
		||||
#if defined( configCLINT_BASE_ADDRESS ) && !defined( configMTIME_BASE_ADDRESS ) && ( configCLINT_BASE_ADDRESS == 0 )
 | 
			
		||||
	/* Legacy case where configCLINT_BASE_ADDRESS was defined as 0 to indicate
 | 
			
		||||
	there was no CLINT.  Equivalent now is to set the MTIME and MTIMECMP
 | 
			
		||||
	addresses to 0. */
 | 
			
		||||
	#define configMTIME_BASE_ADDRESS 	( 0 )
 | 
			
		||||
	#define configMTIMECMP_BASE_ADDRESS ( 0 )
 | 
			
		||||
#elif defined( configCLINT_BASE_ADDRESS ) && !defined( configMTIME_BASE_ADDRESS )
 | 
			
		||||
	/* Legacy case where configCLINT_BASE_ADDRESS was set to the base address of
 | 
			
		||||
	the CLINT.  Equivalent now is to derive the MTIME and MTIMECMP addresses
 | 
			
		||||
	from the CLINT address. */
 | 
			
		||||
	#define configMTIME_BASE_ADDRESS 	( ( configCLINT_BASE_ADDRESS ) + 0xBFF8UL )
 | 
			
		||||
	#define configMTIMECMP_BASE_ADDRESS ( ( configCLINT_BASE_ADDRESS ) + 0x4000UL )
 | 
			
		||||
#elif !defined( configMTIME_BASE_ADDRESS ) || !defined( configMTIMECMP_BASE_ADDRESS )
 | 
			
		||||
	#error configMTIME_BASE_ADDRESS and configMTIMECMP_BASE_ADDRESS must be defined in FreeRTOSConfig.h.  See https://www.freertos.org/Using-FreeRTOS-on-RISC-V.html
 | 
			
		||||
	#error configMTIME_BASE_ADDRESS and configMTIMECMP_BASE_ADDRESS must be defined in FreeRTOSConfig.h.  Set them to zero if there is no MTIME (machine time) clock.  See https://www.freertos.org/Using-FreeRTOS-on-RISC-V.html
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -53,7 +53,7 @@
 | 
			
		||||
#ifndef __FREERTOS_RISC_V_EXTENSIONS_H__
 | 
			
		||||
#define __FREERTOS_RISC_V_EXTENSIONS_H__
 | 
			
		||||
 | 
			
		||||
#define portasmHAS_CLINT 1
 | 
			
		||||
#define portasmHAS_MTIME 1
 | 
			
		||||
#define portasmADDITIONAL_CONTEXT_SIZE 0 /* Must be even number on 32-bit cores. */
 | 
			
		||||
 | 
			
		||||
portasmSAVE_ADDITIONAL_REGISTERS MACRO
 | 
			
		||||
 | 
			
		||||
@ -37,8 +37,16 @@
 | 
			
		||||
/* Standard includes. */
 | 
			
		||||
#include "string.h"
 | 
			
		||||
 | 
			
		||||
#ifndef configCLINT_BASE_ADDRESS
 | 
			
		||||
	#warning configCLINT_BASE_ADDRESS must be defined in FreeRTOSConfig.h.  If the target chip includes a Core Local Interrupter (CLINT) then set configCLINT_BASE_ADDRESS to the CLINT base address.  Otherwise set configCLINT_BASE_ADDRESS to 0.
 | 
			
		||||
#ifdef configCLINT_BASE_ADDRESS
 | 
			
		||||
	#warning The configCLINT_BASE_ADDRESS constant has been deprecated.  configMTIME_BASE_ADDRESS and configMTIMECMP_BASE_ADDRESS are currently being derived from the (possibly 0) configCLINT_BASE_ADDRESS setting.  Please update to define configMTIME_BASE_ADDRESS and configMTIMECMP_BASE_ADDRESS dirctly in place of configCLINT_BASE_ADDRESS.
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifndef configMTIME_BASE_ADDRESS
 | 
			
		||||
	#warning configMTIME_BASE_ADDRESS must be defined in FreeRTOSConfig.h.  If the target chip includes a memory-mapped mtime register then set configMTIME_BASE_ADDRESS to the mapped address.  Otherwise set configMTIME_BASE_ADDRESS to 0.
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifndef configMTIMECMP_BASE_ADDRESS
 | 
			
		||||
	#warning configMTIMECMP_BASE_ADDRESS must be defined in FreeRTOSConfig.h.  If the target chip includes a memory-mapped mtimecmp register then set configMTIMECMP_BASE_ADDRESS to the mapped address.  Otherwise set configMTIMECMP_BASE_ADDRESS to 0.
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/* Let the user override the pre-loading of the initial LR with the address of
 | 
			
		||||
@ -83,8 +91,9 @@ void vPortSetupTimerInterrupt( void ) __attribute__(( weak ));
 | 
			
		||||
uint64_t ullNextTime = 0ULL;
 | 
			
		||||
const uint64_t *pullNextTime = &ullNextTime;
 | 
			
		||||
const size_t uxTimerIncrementsForOneTick = ( size_t ) ( ( configCPU_CLOCK_HZ ) / ( configTICK_RATE_HZ ) ); /* Assumes increment won't go over 32-bits. */
 | 
			
		||||
volatile uint64_t * const pullMachineTimerCompareRegisterBase = ( uint64_t * ) ( ( configCLINT_BASE_ADDRESS ) + 0x4000 );
 | 
			
		||||
volatile uint64_t * pullMachineTimerCompareRegister = 0;
 | 
			
		||||
uint32_t const ullMachineTimerCompareRegisterBase = configMTIMECMP_BASE_ADDRESS;
 | 
			
		||||
volatile uint64_t * pullMachineTimerCompareRegister = NULL;
 | 
			
		||||
 | 
			
		||||
/* Set configCHECK_FOR_STACK_OVERFLOW to 3 to add ISR stack checking to task
 | 
			
		||||
stack checking.  A problem in the ISR stack will trigger an assert, not call the
 | 
			
		||||
stack overflow hook function (because the stack overflow hook is specific to a
 | 
			
		||||
@ -107,17 +116,17 @@ task stack, not the ISR stack). */
 | 
			
		||||
 | 
			
		||||
/*-----------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
#if( configCLINT_BASE_ADDRESS != 0 )
 | 
			
		||||
#if( configMTIME_BASE_ADDRESS != 0 ) && ( configMTIMECMP_BASE_ADDRESS != 0 )
 | 
			
		||||
 | 
			
		||||
	void vPortSetupTimerInterrupt( void )
 | 
			
		||||
	{
 | 
			
		||||
	uint32_t ulCurrentTimeHigh, ulCurrentTimeLow;
 | 
			
		||||
	volatile uint32_t * const pulTimeHigh = ( uint32_t * ) ( configCLINT_BASE_ADDRESS + 0xBFFC );
 | 
			
		||||
	volatile uint32_t * const pulTimeLow = ( uint32_t * ) ( configCLINT_BASE_ADDRESS + 0xBFF8 );
 | 
			
		||||
	volatile uint32_t ulHartId = 0;
 | 
			
		||||
	volatile uint32_t * const pulTimeHigh = ( uint32_t * ) ( ( configMTIME_BASE_ADDRESS ) + 4UL ); /* 8-byte typer so high 32-bit word is 4 bytes up. */
 | 
			
		||||
	volatile uint32_t * const pulTimeLow = ( uint32_t * ) ( configMTIME_BASE_ADDRESS );
 | 
			
		||||
	volatile uint32_t ulHartId;
 | 
			
		||||
 | 
			
		||||
		__asm volatile( "csrr %0, 0xf14" : "=r"( ulHartId ) ); /* 0xf14 is hartid. */
 | 
			
		||||
		pullMachineTimerCompareRegister  = &( pullMachineTimerCompareRegisterBase[ ulHartId ] );
 | 
			
		||||
		pullMachineTimerCompareRegister  = ( volatile uint64_t * ) ( ullMachineTimerCompareRegisterBase + ( ulHartId * sizeof( uint64_t ) ) );
 | 
			
		||||
 | 
			
		||||
		do
 | 
			
		||||
		{
 | 
			
		||||
@ -126,7 +135,7 @@ task stack, not the ISR stack). */
 | 
			
		||||
		} while( ulCurrentTimeHigh != *pulTimeHigh );
 | 
			
		||||
 | 
			
		||||
		ullNextTime = ( uint64_t ) ulCurrentTimeHigh;
 | 
			
		||||
		ullNextTime <<= 32ULL;
 | 
			
		||||
		ullNextTime <<= 32ULL; /* High 4-byte word is 32-bits up. */
 | 
			
		||||
		ullNextTime |= ( uint64_t ) ulCurrentTimeLow;
 | 
			
		||||
		ullNextTime += ( uint64_t ) uxTimerIncrementsForOneTick;
 | 
			
		||||
		*pullMachineTimerCompareRegister = ullNextTime;
 | 
			
		||||
@ -135,7 +144,7 @@ task stack, not the ISR stack). */
 | 
			
		||||
		ullNextTime += ( uint64_t ) uxTimerIncrementsForOneTick;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
#endif /* ( configCLINT_BASE_ADDRESS != 0 ) */
 | 
			
		||||
#endif /* ( configMTIME_BASE_ADDRESS != 0 ) && ( configMTIME_BASE_ADDRESS != 0 ) */
 | 
			
		||||
/*-----------------------------------------------------------*/
 | 
			
		||||
 | 
			
		||||
BaseType_t xPortStartScheduler( void )
 | 
			
		||||
@ -169,7 +178,7 @@ extern void xPortStartFirstTask( void );
 | 
			
		||||
	configure whichever clock is to be used to generate the tick interrupt. */
 | 
			
		||||
	vPortSetupTimerInterrupt();
 | 
			
		||||
 | 
			
		||||
	#if( configCLINT_BASE_ADDRESS != 0 )
 | 
			
		||||
	#if( ( configMTIME_BASE_ADDRESS != 0 ) && ( configMTIMECMP_BASE_ADDRESS != 0 ) )
 | 
			
		||||
	{
 | 
			
		||||
		/* Enable mtime and external interrupts.  1<<7 for timer interrupt, 1<<11
 | 
			
		||||
		for external interrupt.  _RB_ What happens here when mtime is not present as
 | 
			
		||||
@ -181,7 +190,7 @@ extern void xPortStartFirstTask( void );
 | 
			
		||||
		/* Enable external interrupts. */
 | 
			
		||||
		__asm volatile( "csrs 0x304, %0" :: "r"(0x800) ); /* 304 is mie. */
 | 
			
		||||
	}
 | 
			
		||||
	#endif /* configCLINT_BASE_ADDRESS */
 | 
			
		||||
	#endif /* ( configMTIME_BASE_ADDRESS != 0 ) && ( configMTIMECMP_BASE_ADDRESS != 0 ) */
 | 
			
		||||
 | 
			
		||||
	xPortStartFirstTask();
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -71,8 +71,17 @@
 | 
			
		||||
 | 
			
		||||
/* Check the freertos_risc_v_chip_specific_extensions.h and/or command line
 | 
			
		||||
definitions. */
 | 
			
		||||
#ifndef portasmHAS_CLINT
 | 
			
		||||
	#error freertos_risc_v_chip_specific_extensions.h must define portasmHAS_CLINT to either 1 (CLINT present) or 0 (clint not present).
 | 
			
		||||
#if defined( portasmHAS_CLINT ) && defined( portasmHAS_MTIME )
 | 
			
		||||
	#error The portasmHAS_CLINT constant has been depracted.  Please replace it with portasmHAS_CLINT.  portasmHAS_CLINT and portasmHAS_MTIME cannot both be defined at once.
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifdef portasmHAS_CLINT
 | 
			
		||||
	#warning The portasmHAS_CLINT constant has been depracted.  Please replace it with portasmHAS_CLINT.  For now portasmHAS_MTIME is derived from portasmHAS_CLINT.
 | 
			
		||||
	#define portasmHAS_MTIME portasmHAS_CLINT
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifndef portasmHAS_MTIME
 | 
			
		||||
	#error freertos_risc_v_chip_specific_extensions.h must define portasmHAS_MTIME to either 1 (MTIME clock present) or 0 (MTIME clock not present).
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifndef portasmHANDLE_INTERRUPT
 | 
			
		||||
@ -161,7 +170,7 @@ test_if_asynchronous:
 | 
			
		||||
 | 
			
		||||
handle_asynchronous:
 | 
			
		||||
 | 
			
		||||
#if( portasmHAS_CLINT != 0 )
 | 
			
		||||
#if( portasmHAS_MTIME != 0 )
 | 
			
		||||
 | 
			
		||||
	test_if_mtimer:						/* If there is a CLINT then the mtimer is used to generate the tick interrupt. */
 | 
			
		||||
 | 
			
		||||
@ -213,7 +222,7 @@ handle_asynchronous:
 | 
			
		||||
		addi t1, t1, 4					/* 0x80000007 + 4 = 0x8000000b == Machine external interrupt. */
 | 
			
		||||
		bne a0, t1, as_yet_unhandled	/* Something as yet unhandled. */
 | 
			
		||||
 | 
			
		||||
#endif /* portasmHAS_CLINT */
 | 
			
		||||
#endif /* portasmHAS_MTIME */
 | 
			
		||||
 | 
			
		||||
	load_x sp, xISRStackTop				/* Switch to ISR stack before function call. */
 | 
			
		||||
	jal portasmHANDLE_INTERRUPT			/* Jump to the interrupt handler if there is no CLINT or if there is a CLINT and it has been determined that an external interrupt is pending. */
 | 
			
		||||
@ -290,7 +299,7 @@ processed_source:
 | 
			
		||||
 | 
			
		||||
xPortStartFirstTask:
 | 
			
		||||
 | 
			
		||||
#if( portasmHAS_CLINT != 0 )
 | 
			
		||||
#if( portasmHAS_MTIME != 0 )
 | 
			
		||||
	/* If there is a clint then interrupts can branch directly to the FreeRTOS
 | 
			
		||||
	trap handler.  Otherwise the interrupt controller will need to be configured
 | 
			
		||||
	outside of this file. */
 | 
			
		||||
 | 
			
		||||
@ -147,6 +147,27 @@ the source code because to do so would cause other compilers to generate
 | 
			
		||||
warnings. */
 | 
			
		||||
#pragma diag_suppress=Pa082
 | 
			
		||||
 | 
			
		||||
/* configCLINT_BASE_ADDRESS is a legacy definition that was replaced by the
 | 
			
		||||
configMTIME_BASE_ADDRESS and configMTIMECMP_BASE_ADDRESS definitions.  For
 | 
			
		||||
backward compatibility derive the newer definitions from the old if the old
 | 
			
		||||
definition is found. */
 | 
			
		||||
#if defined( configCLINT_BASE_ADDRESS ) && !defined( configMTIME_BASE_ADDRESS ) && ( configCLINT_BASE_ADDRESS == 0 )
 | 
			
		||||
	/* Legacy case where configCLINT_BASE_ADDRESS was defined as 0 to indicate
 | 
			
		||||
	there was no CLINT.  Equivalent now is to set the MTIME and MTIMECMP
 | 
			
		||||
	addresses to 0. */
 | 
			
		||||
	#define configMTIME_BASE_ADDRESS 	( 0 )
 | 
			
		||||
	#define configMTIMECMP_BASE_ADDRESS ( 0 )
 | 
			
		||||
#elif defined( configCLINT_BASE_ADDRESS ) && !defined( configMTIME_BASE_ADDRESS )
 | 
			
		||||
	/* Legacy case where configCLINT_BASE_ADDRESS was set to the base address of
 | 
			
		||||
	the CLINT.  Equivalent now is to derive the MTIME and MTIMECMP addresses
 | 
			
		||||
	from the CLINT address. */
 | 
			
		||||
	#define configMTIME_BASE_ADDRESS 	( ( configCLINT_BASE_ADDRESS ) + 0xBFF8UL )
 | 
			
		||||
	#define configMTIMECMP_BASE_ADDRESS ( ( configCLINT_BASE_ADDRESS ) + 0x4000UL )
 | 
			
		||||
#elif !defined( configMTIME_BASE_ADDRESS ) || !defined( configMTIMECMP_BASE_ADDRESS )
 | 
			
		||||
	#error configMTIME_BASE_ADDRESS and configMTIMECMP_BASE_ADDRESS must be defined in FreeRTOSConfig.h.  Set them to zero if there is no MTIME (machine time) clock.  See https://www.freertos.org/Using-FreeRTOS-on-RISC-V.html
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#ifdef __cplusplus
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user