Migrated RL78/IAR port to EWRL78v3+ (#461)
Co-authored-by: Cobus van Eeden <35851496+cobusve@users.noreply.github.com>
diff --git a/portable/IAR/RL78/ISR_Support.h b/portable/IAR/RL78/ISR_Support.h
deleted file mode 100644
index 7ceed2d..0000000
--- a/portable/IAR/RL78/ISR_Support.h
+++ /dev/null
@@ -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
-;------------------------------------------------------------------------------
diff --git a/portable/IAR/RL78/port.c b/portable/IAR/RL78/port.c
index 8e6e7e4..7cfc02b 100644
--- a/portable/IAR/RL78/port.c
+++ b/portable/IAR/RL78/port.c
@@ -45,7 +45,7 @@
* |--------------------- Zero Flag set
* ---------------------- Global Interrupt Flag set (enabled)
*/
-#define portPSW ( 0xc6UL )
+#define portPSW ( 0xc6UL )
/* The address of the pxCurrentTCB variable, but don't know or need to know its
type. */
@@ -65,21 +65,13 @@
/*-----------------------------------------------------------*/
/*
- * Sets up the periodic ISR used for the RTOS tick using the interval timer.
- * The application writer can define configSETUP_TICK_INTERRUPT() (in
- * FreeRTOSConfig.h) such that their own tick interrupt configuration is used
- * in place of prvSetupTimerInterrupt().
+ * Sets up the periodic ISR used for the RTOS tick.
*/
-static void prvSetupTimerInterrupt( 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 */
+extern void vApplicationSetupTimerInterrupt( void );
/*
- * Defined in portasm.s87, this function starts the scheduler by loading the
- * context of the first task to run.
+ * Starts the scheduler by loading the context of the first Task to run.
+ * (implemented in portasm.s).
*/
extern void vPortStartFirstTask( void );
@@ -100,182 +92,119 @@
{
uint32_t *pulLocal;
- /* With large code and large data sizeof( StackType_t ) == 2, and
- sizeof( StackType_t * ) == 4. With small code and small data
- sizeof( StackType_t ) == 2 and sizeof( StackType_t * ) == 2. */
+ /* With large code and large data sizeof( StackType_t ) == 2, and
+ sizeof( StackType_t * ) == 4. With small code and small data
+ sizeof( StackType_t ) == 2 and sizeof( StackType_t * ) == 2. */
- #if __DATA_MODEL__ == __DATA_MODEL_FAR__
- {
- /* Parameters are passed in on the stack, and written using a 32-bit value
- hence a space is left for the second two bytes. */
- pxTopOfStack--;
+ #if __DATA_MODEL__ == __DATA_MODEL_FAR__
+ {
+ /* Far pointer parameters are passed using the A:DE registers (24-bit).
+ 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--;
+ pulLocal = ( uint32_t * ) pxTopOfStack;
+ *pulLocal = ( uint32_t ) pvParameters;
+ pxTopOfStack--;
- /* Write in the parameter value. */
- pulLocal = ( uint32_t * ) pxTopOfStack;
- *pulLocal = ( uint32_t ) pvParameters;
- pxTopOfStack--;
+ /* The return address is a 32-bit value. So decrement the stack pointer
+ in order to make extra room needed to store the correct value. See the
+ comments above the prvTaskExitError() prototype at the top of this file. */
+ pxTopOfStack--;
+ pulLocal = ( uint32_t * ) pxTopOfStack;
+ *pulLocal = ( uint32_t ) prvTaskExitError;
+ pxTopOfStack--;
- /* The return address, leaving space for the first two bytes of the
- 32-bit value. See the comments above the prvTaskExitError() prototype
- at the top of this file. */
- pxTopOfStack--;
- pulLocal = ( uint32_t * ) pxTopOfStack;
- *pulLocal = ( uint32_t ) prvTaskExitError;
- pxTopOfStack--;
+ /* The task function start address combined with the PSW is also stored
+ as a 32-bit value. So leave a space for the second two bytes. */
+ pxTopOfStack--;
+ pulLocal = ( uint32_t * ) pxTopOfStack;
+ *pulLocal = ( ( ( uint32_t ) pxCode ) | ( portPSW << 24UL ) );
+ pxTopOfStack--;
- /* The start address / PSW value is also written in as a 32-bit value,
- so leave a space for the second two bytes. */
- pxTopOfStack--;
+ /* An initial value for the AX register. */
+ *pxTopOfStack = ( StackType_t ) 0x1111;
+ pxTopOfStack--;
+ }
+ #else
+ {
+ /* The return address, leaving space for the first two bytes of the
+ 32-bit value. See the comments above the prvTaskExitError() prototype
+ at the top of this file. */
+ pxTopOfStack--;
+ pulLocal = ( uint32_t * ) pxTopOfStack;
+ *pulLocal = ( uint32_t ) prvTaskExitError;
+ pxTopOfStack--;
- /* Task function start address combined with the PSW. */
- pulLocal = ( uint32_t * ) pxTopOfStack;
- *pulLocal = ( ( ( uint32_t ) pxCode ) | ( portPSW << 24UL ) );
- pxTopOfStack--;
+ /* Task function. Again as it is written as a 32-bit value a space is
+ left on the stack for the second two bytes. */
+ pxTopOfStack--;
- /* An initial value for the AX register. */
- *pxTopOfStack = ( StackType_t ) 0x1111;
- pxTopOfStack--;
- }
- #else
- {
- /* The return address, leaving space for the first two bytes of the
- 32-bit value. See the comments above the prvTaskExitError() prototype
- at the top of this file. */
- pxTopOfStack--;
- pulLocal = ( uint32_t * ) pxTopOfStack;
- *pulLocal = ( uint32_t ) prvTaskExitError;
- pxTopOfStack--;
+ /* Task function start address combined with the PSW. */
+ pulLocal = ( uint32_t * ) pxTopOfStack;
+ *pulLocal = ( ( ( uint32_t ) pxCode ) | ( portPSW << 24UL ) );
+ pxTopOfStack--;
- /* Task function. Again as it is written as a 32-bit value a space is
- left on the stack for the second two bytes. */
- pxTopOfStack--;
+ /* The parameter is passed in AX. */
+ *pxTopOfStack = ( StackType_t ) pvParameters;
+ pxTopOfStack--;
+ }
+ #endif
- /* Task function start address combined with the PSW. */
- pulLocal = ( uint32_t * ) pxTopOfStack;
- *pulLocal = ( ( ( uint32_t ) pxCode ) | ( portPSW << 24UL ) );
- pxTopOfStack--;
+ /* An initial value for the HL register. */
+ *pxTopOfStack = ( StackType_t ) 0x2222;
+ pxTopOfStack--;
- /* The parameter is passed in AX. */
- *pxTopOfStack = ( StackType_t ) pvParameters;
- pxTopOfStack--;
- }
- #endif
+ /* CS and ES registers. */
+ *pxTopOfStack = ( StackType_t ) 0x0F00;
+ pxTopOfStack--;
- /* An initial value for the HL register. */
- *pxTopOfStack = ( StackType_t ) 0x2222;
- pxTopOfStack--;
+ /* The remaining general purpose registers DE and BC */
+ *pxTopOfStack = ( StackType_t ) 0xDEDE;
+ pxTopOfStack--;
+ *pxTopOfStack = ( StackType_t ) 0xBCBC;
+ pxTopOfStack--;
- /* CS and ES registers. */
- *pxTopOfStack = ( StackType_t ) 0x0F00;
- pxTopOfStack--;
+ /* Finally the critical section nesting count is set to zero when the task
+ first starts. */
+ *pxTopOfStack = ( StackType_t ) portNO_CRITICAL_SECTION_NESTING;
- /* The remaining general purpose registers DE and BC */
- *pxTopOfStack = ( StackType_t ) 0xDEDE;
- pxTopOfStack--;
- *pxTopOfStack = ( StackType_t ) 0xBCBC;
- pxTopOfStack--;
-
- /* Finally the critical section nesting count is set to zero when the task
- first starts. */
- *pxTopOfStack = ( StackType_t ) portNO_CRITICAL_SECTION_NESTING;
-
- /* Return a pointer to the top of the stack that has been generated so it
- can be stored in the task control block for the task. */
- return pxTopOfStack;
+ /* Return a pointer to the top of the stack that has been generated so
+ it can be stored in the task control block for the task. */
+ return pxTopOfStack;
}
/*-----------------------------------------------------------*/
static void prvTaskExitError( void )
{
- /* A function that implements a task must not exit or attempt to return to
- its caller as there is nothing to return to. If a task wants to exit it
- should instead call vTaskDelete( NULL ).
+ /* A function that implements a task must not exit or attempt to return to
+ its caller as there is nothing to return to. If a task wants to exit it
+ should instead call vTaskDelete( NULL ).
- Artificially force an assert() to be triggered if configASSERT() is
- defined, then stop here so application writers can catch the error. */
- configASSERT( usCriticalNesting == ~0U );
- portDISABLE_INTERRUPTS();
- for( ;; );
+ Artificially force an assert() to be triggered if configASSERT() is
+ defined, then stop here so application writers can catch the error. */
+ configASSERT( usCriticalNesting == ~0U );
+ portDISABLE_INTERRUPTS();
+ for( ;; );
}
/*-----------------------------------------------------------*/
BaseType_t xPortStartScheduler( void )
{
- /* Setup the hardware to generate the tick. Interrupts are disabled when
- this function is called. */
- configSETUP_TICK_INTERRUPT();
+ /* Setup the hardware to generate the tick. Interrupts are disabled when
+ this function is called. */
+ vApplicationSetupTimerInterrupt();
- /* Restore the context of the first task that is going to run. */
- vPortStartFirstTask();
+ /* Restore the context of the first task that is going to run. */
+ vPortStartFirstTask();
- /* 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;
+ /* Execution should not reach here as the tasks are now running! */
+ return pdTRUE;
}
/*-----------------------------------------------------------*/
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
-}
-/*-----------------------------------------------------------*/
-
diff --git a/portable/IAR/RL78/portasm.s b/portable/IAR/RL78/portasm.s
new file mode 100644
index 0000000..f328d1b
--- /dev/null
+++ b/portable/IAR/RL78/portasm.s
@@ -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
diff --git a/portable/IAR/RL78/portasm.s87 b/portable/IAR/RL78/portasm.s87
deleted file mode 100644
index 6d68649..0000000
--- a/portable/IAR/RL78/portasm.s87
+++ /dev/null
@@ -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
diff --git a/portable/IAR/RL78/portmacro.h b/portable/IAR/RL78/portmacro.h
index f183352..0243125 100644
--- a/portable/IAR/RL78/portmacro.h
+++ b/portable/IAR/RL78/portmacro.h
@@ -29,6 +29,8 @@
#ifndef PORTMACRO_H
#define PORTMACRO_H
+#ifdef __IAR_SYSTEMS_ICC__
+
#ifdef __cplusplus
extern "C" {
#endif
@@ -44,11 +46,11 @@
*/
#if __DATA_MODEL__ == __DATA_MODEL_FAR__ && __CODE_MODEL__ == __CODE_MODEL_NEAR__
- #warning This port has not been tested with your selected memory model combination. If a far data model is required it is recommended to also use a far code model.
+ #warning This port has not been tested with your selected memory model combination. If a far data model is required it is recommended to also use a far code model.
#endif
#if __DATA_MODEL__ == __DATA_MODEL_NEAR__ && __CODE_MODEL__ == __CODE_MODEL_FAR__
- #warning This port has not been tested with your selected memory model combination. If a far code model is required it is recommended to also use a far data model.
+ #warning This port has not been tested with your selected memory model combination. If a far code model is required it is recommended to also use a far data model.
#endif
/* Type definitions. */
@@ -67,70 +69,70 @@
#if __DATA_MODEL__ == __DATA_MODEL_FAR__
- #define portPOINTER_SIZE_TYPE uint32_t
+ #define portPOINTER_SIZE_TYPE uint32_t
#else
- #define portPOINTER_SIZE_TYPE uint16_t
+ #define portPOINTER_SIZE_TYPE uint16_t
#endif
#if ( configUSE_16_BIT_TICKS == 1 )
- typedef unsigned int TickType_t;
- #define portMAX_DELAY ( TickType_t ) 0xffff
+ typedef unsigned int TickType_t;
+ #define portMAX_DELAY ( TickType_t ) 0xffff
#else
- typedef uint32_t TickType_t;
- #define portMAX_DELAY ( TickType_t ) 0xffffffffUL
+ typedef uint32_t TickType_t;
+ #define portMAX_DELAY ( TickType_t ) 0xffffffffUL
#endif
/*-----------------------------------------------------------*/
/* Interrupt control macros. */
-#define portDISABLE_INTERRUPTS() __asm ( "DI" )
-#define portENABLE_INTERRUPTS() __asm ( "EI" )
+#define portDISABLE_INTERRUPTS() __asm ( "DI" )
+#define portENABLE_INTERRUPTS() __asm ( "EI" )
/*-----------------------------------------------------------*/
/* Critical section control macros. */
-#define portNO_CRITICAL_SECTION_NESTING ( ( uint16_t ) 0 )
+#define portNO_CRITICAL_SECTION_NESTING ( ( uint16_t ) 0 )
-#define portENTER_CRITICAL() \
-{ \
-extern volatile uint16_t usCriticalNesting; \
- \
- portDISABLE_INTERRUPTS(); \
- \
- /* Now interrupts are disabled ulCriticalNesting can be accessed */ \
- /* directly. Increment ulCriticalNesting to keep a count of how many */ \
- /* times portENTER_CRITICAL() has been called. */ \
- usCriticalNesting++; \
+#define portENTER_CRITICAL() \
+{ \
+extern volatile uint16_t usCriticalNesting; \
+ \
+ portDISABLE_INTERRUPTS(); \
+ \
+ /* Now interrupts are disabled ulCriticalNesting can be accessed */ \
+ /* directly. Increment ulCriticalNesting to keep a count of how many */ \
+ /* times portENTER_CRITICAL() has been called. */ \
+ usCriticalNesting++; \
}
-#define portEXIT_CRITICAL() \
-{ \
-extern volatile uint16_t usCriticalNesting; \
- \
- if( usCriticalNesting > portNO_CRITICAL_SECTION_NESTING ) \
- { \
- /* Decrement the nesting count as we are leaving a critical section. */ \
- usCriticalNesting--; \
- \
- /* If the nesting level has reached zero then interrupts should be */ \
- /* re-enabled. */ \
- if( usCriticalNesting == portNO_CRITICAL_SECTION_NESTING ) \
- { \
- portENABLE_INTERRUPTS(); \
- } \
- } \
+#define portEXIT_CRITICAL() \
+{ \
+extern volatile uint16_t usCriticalNesting; \
+ \
+ if( usCriticalNesting > portNO_CRITICAL_SECTION_NESTING ) \
+ { \
+ /* Decrement the nesting count when leaving a critical section. */ \
+ usCriticalNesting--; \
+ \
+ /* If the nesting level has reached zero then interrupts should be */ \
+ /* re-enabled. */ \
+ if( usCriticalNesting == portNO_CRITICAL_SECTION_NESTING ) \
+ { \
+ portENABLE_INTERRUPTS(); \
+ } \
+ } \
}
/*-----------------------------------------------------------*/
/* Task utilities. */
-#define portYIELD() __asm( "BRK" )
+#define portNOP() __asm( "NOP" )
+#define portYIELD() __asm( "BRK" )
#define portYIELD_FROM_ISR( xHigherPriorityTaskWoken ) do { if( xHigherPriorityTaskWoken ) vTaskSwitchContext(); } while( 0 )
-#define portNOP() __asm( "NOP" )
/*-----------------------------------------------------------*/
/* Hardwware specifics. */
-#define portBYTE_ALIGNMENT 2
-#define portSTACK_GROWTH ( -1 )
-#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ )
+#define portBYTE_ALIGNMENT 2
+#define portSTACK_GROWTH ( -1 )
+#define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ )
/*-----------------------------------------------------------*/
/* Task function macros as described on the FreeRTOS.org WEB site. */
@@ -139,7 +141,88 @@
#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 /* 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 */