Migrated RL78/IAR port to EWRL78v3+ (#461)

Co-authored-by: Cobus van Eeden <35851496+cobusve@users.noreply.github.com>
This commit is contained in:
Felipe Torrezan 2022-02-24 18:04:46 +01:00 committed by GitHub
parent 840214dc29
commit 4539e1c574
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 299 additions and 371 deletions

View file

@ -1,84 +0,0 @@
;/*
; * FreeRTOS Kernel <DEVELOPMENT BRANCH>
; * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved.
; *
; * SPDX-License-Identifier: MIT
; *
; * 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
; *
; */
#include "FreeRTOSConfig.h"
; Variables used by scheduler
;------------------------------------------------------------------------------
EXTERN pxCurrentTCB
EXTERN usCriticalNesting
;------------------------------------------------------------------------------
; portSAVE_CONTEXT MACRO
; Saves the context of the general purpose registers, CS and ES (only in far
; memory mode) registers the usCriticalNesting Value and the Stack Pointer
; of the active Task onto the task stack
;------------------------------------------------------------------------------
portSAVE_CONTEXT MACRO
PUSH AX ; Save AX Register to stack.
PUSH HL
MOV A, CS ; Save CS register.
XCH A, X
MOV A, ES ; Save ES register.
PUSH AX
PUSH DE ; Save the remaining general purpose registers.
PUSH BC
MOVW AX, usCriticalNesting ; Save the usCriticalNesting value.
PUSH AX
MOVW AX, pxCurrentTCB ; Save the Stack pointer.
MOVW HL, AX
MOVW AX, SP
MOVW [HL], AX
ENDM
;------------------------------------------------------------------------------
;------------------------------------------------------------------------------
; portRESTORE_CONTEXT MACRO
; Restores the task Stack Pointer then use this to restore usCriticalNesting,
; general purpose registers and the CS and ES (only in far memory mode)
; of the selected task from the task stack
;------------------------------------------------------------------------------
portRESTORE_CONTEXT MACRO
MOVW AX, pxCurrentTCB ; Restore the Stack pointer.
MOVW HL, AX
MOVW AX, [HL]
MOVW SP, AX
POP AX ; Restore usCriticalNesting value.
MOVW usCriticalNesting, AX
POP BC ; Restore the necessary general purpose registers.
POP DE
POP AX ; Restore the ES register.
MOV ES, A
XCH A, X ; Restore the CS register.
MOV CS, A
POP HL ; Restore general purpose register HL.
POP AX ; Restore AX.
ENDM
;------------------------------------------------------------------------------

View file

@ -65,21 +65,13 @@ volatile uint16_t usCriticalNesting = portINITIAL_CRITICAL_NESTING;
/*-----------------------------------------------------------*/ /*-----------------------------------------------------------*/
/* /*
* Sets up the periodic ISR used for the RTOS tick using the interval timer. * Sets up the periodic ISR used for the RTOS tick.
* The application writer can define configSETUP_TICK_INTERRUPT() (in
* FreeRTOSConfig.h) such that their own tick interrupt configuration is used
* in place of prvSetupTimerInterrupt().
*/ */
static void prvSetupTimerInterrupt( void ); extern void vApplicationSetupTimerInterrupt( void );
#ifndef configSETUP_TICK_INTERRUPT
/* The user has not provided their own tick interrupt configuration so use
the definition in this file (which uses the interval timer). */
#define configSETUP_TICK_INTERRUPT() prvSetupTimerInterrupt()
#endif /* configSETUP_TICK_INTERRUPT */
/* /*
* Defined in portasm.s87, this function starts the scheduler by loading the * Starts the scheduler by loading the context of the first Task to run.
* context of the first task to run. * (implemented in portasm.s).
*/ */
extern void vPortStartFirstTask( void ); extern void vPortStartFirstTask( void );
@ -106,28 +98,26 @@ uint32_t *pulLocal;
#if __DATA_MODEL__ == __DATA_MODEL_FAR__ #if __DATA_MODEL__ == __DATA_MODEL_FAR__
{ {
/* Parameters are passed in on the stack, and written using a 32-bit value /* Far pointer parameters are passed using the A:DE registers (24-bit).
hence a space is left for the second two bytes. */ Although they are stored in memory as a 32-bit value. Hence decrement
the stack pointer, so 2 bytes are left for the contents of A, before
storing the pvParameters value. */
pxTopOfStack--; pxTopOfStack--;
/* Write in the parameter value. */
pulLocal = ( uint32_t * ) pxTopOfStack; pulLocal = ( uint32_t * ) pxTopOfStack;
*pulLocal = ( uint32_t ) pvParameters; *pulLocal = ( uint32_t ) pvParameters;
pxTopOfStack--; pxTopOfStack--;
/* The return address, leaving space for the first two bytes of the /* The return address is a 32-bit value. So decrement the stack pointer
32-bit value. See the comments above the prvTaskExitError() prototype in order to make extra room needed to store the correct value. See the
at the top of this file. */ comments above the prvTaskExitError() prototype at the top of this file. */
pxTopOfStack--; pxTopOfStack--;
pulLocal = ( uint32_t * ) pxTopOfStack; pulLocal = ( uint32_t * ) pxTopOfStack;
*pulLocal = ( uint32_t ) prvTaskExitError; *pulLocal = ( uint32_t ) prvTaskExitError;
pxTopOfStack--; pxTopOfStack--;
/* The start address / PSW value is also written in as a 32-bit value, /* The task function start address combined with the PSW is also stored
so leave a space for the second two bytes. */ as a 32-bit value. So leave a space for the second two bytes. */
pxTopOfStack--; pxTopOfStack--;
/* Task function start address combined with the PSW. */
pulLocal = ( uint32_t * ) pxTopOfStack; pulLocal = ( uint32_t * ) pxTopOfStack;
*pulLocal = ( ( ( uint32_t ) pxCode ) | ( portPSW << 24UL ) ); *pulLocal = ( ( ( uint32_t ) pxCode ) | ( portPSW << 24UL ) );
pxTopOfStack--; pxTopOfStack--;
@ -179,8 +169,8 @@ uint32_t *pulLocal;
first starts. */ first starts. */
*pxTopOfStack = ( StackType_t ) portNO_CRITICAL_SECTION_NESTING; *pxTopOfStack = ( StackType_t ) portNO_CRITICAL_SECTION_NESTING;
/* Return a pointer to the top of the stack that has been generated so it /* Return a pointer to the top of the stack that has been generated so
can be stored in the task control block for the task. */ it can be stored in the task control block for the task. */
return pxTopOfStack; return pxTopOfStack;
} }
/*-----------------------------------------------------------*/ /*-----------------------------------------------------------*/
@ -203,18 +193,12 @@ BaseType_t xPortStartScheduler( void )
{ {
/* Setup the hardware to generate the tick. Interrupts are disabled when /* Setup the hardware to generate the tick. Interrupts are disabled when
this function is called. */ this function is called. */
configSETUP_TICK_INTERRUPT(); vApplicationSetupTimerInterrupt();
/* Restore the context of the first task that is going to run. */ /* Restore the context of the first task that is going to run. */
vPortStartFirstTask(); vPortStartFirstTask();
/* Execution should not reach here as the tasks are now running! /* Execution should not reach here as the tasks are now running! */
prvSetupTimerInterrupt() is called here to prevent the compiler outputting
a warning about a statically declared function not being referenced in the
case that the application writer has provided their own tick interrupt
configuration routine (and defined configSETUP_TICK_INTERRUPT() such that
their own routine will be called in place of prvSetupTimerInterrupt()). */
prvSetupTimerInterrupt();
return pdTRUE; return pdTRUE;
} }
/*-----------------------------------------------------------*/ /*-----------------------------------------------------------*/
@ -224,58 +208,3 @@ void vPortEndScheduler( void )
/* It is unlikely that the RL78 port will get stopped. */ /* It is unlikely that the RL78 port will get stopped. */
} }
/*-----------------------------------------------------------*/ /*-----------------------------------------------------------*/
static void prvSetupTimerInterrupt( void )
{
const uint16_t usClockHz = 15000UL; /* Internal clock. */
const uint16_t usCompareMatch = ( usClockHz / configTICK_RATE_HZ ) + 1UL;
/* Use the internal 15K clock. */
OSMC = ( uint8_t ) 0x16;
#ifdef RTCEN
{
/* Supply the interval timer clock. */
RTCEN = ( uint8_t ) 1U;
/* Disable INTIT interrupt. */
ITMK = ( uint8_t ) 1;
/* Disable ITMC operation. */
ITMC = ( uint8_t ) 0x0000;
/* Clear INIT interrupt. */
ITIF = ( uint8_t ) 0;
/* Set interval and enable interrupt operation. */
ITMC = usCompareMatch | 0x8000U;
/* Enable INTIT interrupt. */
ITMK = ( uint8_t ) 0;
}
#endif
#ifdef TMKAEN
{
/* Supply the interval timer clock. */
TMKAEN = ( uint8_t ) 1U;
/* Disable INTIT interrupt. */
TMKAMK = ( uint8_t ) 1;
/* Disable ITMC operation. */
ITMC = ( uint8_t ) 0x0000;
/* Clear INIT interrupt. */
TMKAIF = ( uint8_t ) 0;
/* Set interval and enable interrupt operation. */
ITMC = usCompareMatch | 0x8000U;
/* Enable INTIT interrupt. */
TMKAMK = ( uint8_t ) 0;
}
#endif
}
/*-----------------------------------------------------------*/

View file

@ -0,0 +1,84 @@
;/*
; * FreeRTOS Kernel <DEVELOPMENT BRANCH>
; * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved.
; *
; * SPDX-License-Identifier: MIT
; *
; * 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
; *
; */
#include "portmacro.h"
EXTERN _vTaskSwitchContext
EXTERN _xTaskIncrementTick
EXTERN _interrupt_vector_table
PUBLIC _vPortYield
PUBLIC _vPortStartFirstTask
PUBLIC _vPortTickISR
#if !defined(__IASMRL78__) || (__VER__ < 310)
#error "This port requires the IAR Assembler for RL78 version 3.10 or later."
#endif
;-------------------------------------------------------------------------------
; FreeRTOS yield handler. This is installed as the BRK software interrupt
; handler.
;-------------------------------------------------------------------------------
SECTION `.text`:CODE:ROOT(1)
_vPortYield:
portSAVE_CONTEXT ; Save the context of the current task.
RCALL (_vTaskSwitchContext) ; Call the scheduler to select the next task.
portRESTORE_CONTEXT ; Restore the context of the next task to run.
RETB
;-------------------------------------------------------------------------------
;-------------------------------------------------------------------------------
; Starts the scheduler by restoring the context of the task that will execute
; first.
;-------------------------------------------------------------------------------
SECTION `.text`:CODE:ROOT(1)
_vPortStartFirstTask:
portRESTORE_CONTEXT ; Restore the context of whichever task the ...
RETI ; An interrupt stack frame is used so the
; task is started using a RETI instruction.
;-------------------------------------------------------------------------------
;-------------------------------------------------------------------------------
; FreeRTOS Timer Tick handler.
; This is installed as the interval timer interrupt handler.
;-------------------------------------------------------------------------------
SECTION `.text`:CODE:ROOT(1)
_vPortTickISR:
portSAVE_CONTEXT ; Save the context of the current task.
RCALL (_xTaskIncrementTick) ; Call the timer tick function.
CMPW AX, #0x00
SKZ
RCALL (_vTaskSwitchContext) ; Call the scheduler to select the next task.
portRESTORE_CONTEXT ; Restore the context of the next task to run.
RETI
;-------------------------------------------------------------------------------
END

View file

@ -1,84 +0,0 @@
;/*
; * FreeRTOS Kernel <DEVELOPMENT BRANCH>
; * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved.
; *
; * SPDX-License-Identifier: MIT
; *
; * 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
; *
; */
#include "ISR_Support.h"
#define CS 0xFFFFC
#define ES 0xFFFFD
PUBLIC vPortYield
PUBLIC vPortStartFirstTask
PUBLIC vPortTickISR
EXTERN vTaskSwitchContext
EXTERN xTaskIncrementTick
; FreeRTOS yield handler. This is installed as the BRK software interrupt
; handler.
RSEG CODE:CODE
vPortYield:
portSAVE_CONTEXT ; Save the context of the current task.
call vTaskSwitchContext ; Call the scheduler to select the next task.
portRESTORE_CONTEXT ; Restore the context of the next task to run.
retb
; Starts the scheduler by restoring the context of the task that will execute
; first.
RSEG CODE:CODE
vPortStartFirstTask:
portRESTORE_CONTEXT ; Restore the context of whichever task the ...
reti ; An interrupt stack frame is used so the task
; is started using a RETI instruction.
; FreeRTOS tick handler. This is installed as the interval timer interrupt
; handler.
RSEG CODE:CODE
vPortTickISR:
portSAVE_CONTEXT ; Save the context of the current task.
call xTaskIncrementTick ; Call the timer tick function.
cmpw ax, #0x00
skz
call vTaskSwitchContext ; Call the scheduler to select the next task.
portRESTORE_CONTEXT ; Restore the context of the next task to run.
reti
; Install the interrupt handlers
COMMON INTVEC:CODE:ROOT(1)
ORG configTICK_VECTOR
DW vPortTickISR
COMMON INTVEC:CODE:ROOT(1)
ORG 126
DW vPortYield
END

View file

@ -29,6 +29,8 @@
#ifndef PORTMACRO_H #ifndef PORTMACRO_H
#define PORTMACRO_H #define PORTMACRO_H
#ifdef __IAR_SYSTEMS_ICC__
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { extern "C" {
#endif #endif
@ -108,7 +110,7 @@ extern volatile uint16_t usCriticalNesting; \
\ \
if( usCriticalNesting > portNO_CRITICAL_SECTION_NESTING ) \ if( usCriticalNesting > portNO_CRITICAL_SECTION_NESTING ) \
{ \ { \
/* Decrement the nesting count as we are leaving a critical section. */ \ /* Decrement the nesting count when leaving a critical section. */ \
usCriticalNesting--; \ usCriticalNesting--; \
\ \
/* If the nesting level has reached zero then interrupts should be */ \ /* If the nesting level has reached zero then interrupts should be */ \
@ -122,9 +124,9 @@ extern volatile uint16_t usCriticalNesting; \
/*-----------------------------------------------------------*/ /*-----------------------------------------------------------*/
/* Task utilities. */ /* Task utilities. */
#define portNOP() __asm( "NOP" )
#define portYIELD() __asm( "BRK" ) #define portYIELD() __asm( "BRK" )
#define portYIELD_FROM_ISR( xHigherPriorityTaskWoken ) do { if( xHigherPriorityTaskWoken ) vTaskSwitchContext(); } while( 0 ) #define portYIELD_FROM_ISR( xHigherPriorityTaskWoken ) do { if( xHigherPriorityTaskWoken ) vTaskSwitchContext(); } while( 0 )
#define portNOP() __asm( "NOP" )
/*-----------------------------------------------------------*/ /*-----------------------------------------------------------*/
/* Hardwware specifics. */ /* Hardwware specifics. */
@ -139,7 +141,88 @@ extern volatile uint16_t usCriticalNesting; \
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif /* __cplusplus */
#endif /* __IAR_SYSTEMS_ICC__ */
;//-----------------------------------------------------------------------------
;// The macros below are processed for asm sources which include portmacro.h.
;//-----------------------------------------------------------------------------
#ifdef __IAR_SYSTEMS_ASM__
;/* Functions and variables used by this file. */
;//-----------------------------------------------------------------------------
EXTERN _pxCurrentTCB
EXTERN _usCriticalNesting
;/* Macro used to declutter calls, depends on the selected code model. */
;//-----------------------------------------------------------------------------
#if __CODE_MODEL__ == __CODE_MODEL_FAR__
#define RCALL(X) CALL F:X
#else
#define RCALL(X) CALL X
#endif #endif
#endif /* PORTMACRO_H */
;/*-----------------------------------------------------------------------------
; * portSAVE_CONTEXT MACRO
; * Saves the context of the general purpose registers, CS and ES (only in __far
; * memory mode) registers the _usCriticalNesting value and the Stack Pointer
; * of the active Task onto the task stack.
; *---------------------------------------------------------------------------*/
portSAVE_CONTEXT MACRO
PUSH AX ; // Save AX Register to stack.
PUSH HL
#if __CODE_MODEL__ == __CODE_MODEL_FAR__
MOV A, CS ; // Save CS register.
XCH A, X
MOV A, ES ; // Save ES register.
PUSH AX
#else
MOV A, CS ; // Save CS register.
PUSH AX
#endif
PUSH DE ; // Save the remaining general purpose registers.
PUSH BC
MOVW AX, _usCriticalNesting ; // Save the _usCriticalNesting value.
PUSH AX
MOVW AX, _pxCurrentTCB ; // Save the Task stack pointer.
MOVW HL, AX
MOVW AX, SP
MOVW [HL], AX
ENDM
;//-----------------------------------------------------------------------------
;/*-----------------------------------------------------------------------------
; * portRESTORE_CONTEXT MACRO
; * Restores the task Stack Pointer then use this to restore _usCriticalNesting,
; * general purpose registers and the CS and ES (only in __far memory mode)
; * of the selected task from the task stack.
; *---------------------------------------------------------------------------*/
portRESTORE_CONTEXT MACRO
MOVW AX, _pxCurrentTCB ; // Restore the Task stack pointer.
MOVW HL, AX
MOVW AX, [HL]
MOVW SP, AX
POP AX ; // Restore _usCriticalNesting value.
MOVW _usCriticalNesting, AX
POP BC ; // Restore the necessary general purpose registers.
POP DE
#if __CODE_MODEL__ == __CODE_MODEL_FAR__
POP AX ; // Restore the ES register.
MOV ES, A
XCH A, X ; // Restore the CS register.
MOV CS, A
#else
POP AX
MOV CS, A ; // Restore CS register.
#endif
POP HL ; // Restore general purpose register HL.
POP AX ; // Restore AX.
ENDM
;//-----------------------------------------------------------------------------
#endif /* __IAR_SYSTEMS_ASM__ */
#endif /* PORTMACRO_H */