From bda8b6b37f2b6a6593f4ee97ff5a1cc154c065e2 Mon Sep 17 00:00:00 2001 From: harada Date: Wed, 5 Aug 2020 18:56:53 +0900 Subject: [PATCH] add rl78 port --- portable/Renesas/RL78/ISR_Support.h | 137 +++++++++++++ portable/Renesas/RL78/port.c | 299 ++++++++++++++++++++++++++++ portable/Renesas/RL78/portasm.asm | 130 ++++++++++++ portable/Renesas/RL78/portmacro.h | 140 +++++++++++++ 4 files changed, 706 insertions(+) create mode 100644 portable/Renesas/RL78/ISR_Support.h create mode 100644 portable/Renesas/RL78/port.c create mode 100644 portable/Renesas/RL78/portasm.asm create mode 100644 portable/Renesas/RL78/portmacro.h diff --git a/portable/Renesas/RL78/ISR_Support.h b/portable/Renesas/RL78/ISR_Support.h new file mode 100644 index 0000000000..5e73466abf --- /dev/null +++ b/portable/Renesas/RL78/ISR_Support.h @@ -0,0 +1,137 @@ +;/* +; * FreeRTOS Kernel V10.2.1 +; * Copyright (C) 2019 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. +; * +; * http://www.FreeRTOS.org +; * http://aws.amazon.com/freertos +; * +; * 1 tab == 4 spaces! +; */ + + +;;$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 registers, +; the usCriticalNesting Value and the Stack Pointer of the active Task +; onto the task stack +;------------------------------------------------------------------------------ +portSAVE_CONTEXT .MACRO + PUSH AX ; Save the general purpose registers. + PUSH BC + PUSH DE + PUSH HL + MOV A, ES ; Save ES register. + XCH A, X + MOV A, CS ; Save CS register. + PUSH AX + 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 +; /* Switch stack pointers. */ ; The GNURL78 port has this. Why? (NoMaY-jp). +; ;;MOVW SP, #_stack /* Set stack pointer */ ; GNURL78 +; MOVW SP, #LOWW(__STACK_ADDR_START) /* Set stack pointer */ ; CC-RL + .ENDM +;------------------------------------------------------------------------------ + +;------------------------------------------------------------------------------ +; portRESTORE_CONTEXT MACRO +; Restores the task Stack Pointer then use this to restore usCriticalNesting, +; general purpose registers and the CS and ES registers 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 AX ; Restore the CS register. + MOV CS, A + XCH A, X ; Restore the ES register. + MOV ES, A + POP HL ; Restore general purpose registers. + POP DE + POP BC + POP AX + .ENDM +;------------------------------------------------------------------------------ + +;------------------------------------------------------------------------------ +; portSAVE_CONTEXT_C MACRO +; Saves the context of the general purpose registers, CS and ES registers, +; the usCriticalNesting Value and the Stack Pointer of the active Task +; onto the task stack +;------------------------------------------------------------------------------ +;;portSAVE_CONTEXT_C .MACRO +; It is assumed that the general purpose registers, CS and ES registers +; have been saved as follows at the beginning of an interrupt function. +; PUSH AX +; PUSH BC +; PUSH DE +; PUSH HL +; MOV A, ES +; MOV X, A +; MOV A, CS +; PUSH AX +; Saves the context of the general purpose registers, CS and ES registers, +; the usCriticalNesting Value and the Stack Pointer of the active Task +;; 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 +; /* Switch stack pointers. */ ; The GNURL78 port has this. Why? (NoMaY-jp). +; ;;MOVW SP, #_stack /* Set stack pointer */ ; GNURL78 +; MOVW SP, #LOWW(__STACK_ADDR_START) /* Set stack pointer */ ; CC-RL +;; .ENDM +;------------------------------------------------------------------------------ + +;------------------------------------------------------------------------------ +; call@ MACRO +; Calls subroutine using preferred addressing mode depending on memory model +;------------------------------------------------------------------------------ +call@ .MACRO subroutine +$ifdef __RL78_SMALL__ + CALL !subroutine +$else +$ ifdef __RL78_MEDIUM__ + CALL !!subroutine +$ else +$ ifdef __RL78_S1__ + CALL !subroutine +$ else ; __RL78_S2__ or __RL78_S3__ or not defined + CALL !!subroutine +$ endif +$ endif +$endif + .ENDM +;------------------------------------------------------------------------------ diff --git a/portable/Renesas/RL78/port.c b/portable/Renesas/RL78/port.c new file mode 100644 index 0000000000..b7c50ffa81 --- /dev/null +++ b/portable/Renesas/RL78/port.c @@ -0,0 +1,299 @@ +/* + * FreeRTOS Kernel V10.1.1 + * Copyright (C) 2018 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. + * + * http://www.FreeRTOS.org + * http://aws.amazon.com/freertos + * + * 1 tab == 4 spaces! + */ + +/* Scheduler includes. */ +#include "FreeRTOS.h" +#include "task.h" + +#include "types/iot_platform_types.h" + +/* The critical nesting value is initialised to a non zero value to ensure +interrupts don't accidentally become enabled before the scheduler is started. */ +#define portINITIAL_CRITICAL_NESTING ( ( uint16_t ) 10 ) + +/* Initial PSW value allocated to a newly created task. + * 1100011000000000 + * ||||||||-------------- Fill byte + * |||||||--------------- Carry Flag cleared + * |||||----------------- In-service priority Flags set to low level + * ||||------------------ Register bank Select 0 Flag cleared + * |||------------------- Auxiliary Carry Flag cleared + * ||-------------------- Register bank Select 1 Flag cleared + * |--------------------- Zero Flag set + * ---------------------- Global Interrupt Flag set (enabled) + */ +#define portPSW ( 0xc6UL ) + +/* The address of the pxCurrentTCB variable, but don't know or need to know its +type. */ +//typedef void TCB_t; +extern void *pxCurrentTCB; + +/* Each task maintains a count of the critical section nesting depth. Each time +a critical section is entered the count is incremented. Each time a critical +section is exited the count is decremented - with interrupts only being +re-enabled if the count is zero. + +usCriticalNesting will get set to zero when the scheduler starts, but must +not be initialised to zero as that could cause problems during the startup +sequence. */ +volatile uint16_t usCriticalNesting = portINITIAL_CRITICAL_NESTING; + +/*-----------------------------------------------------------*/ + +/* + * 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(). + */ +//static void prvSetupTimerInterrupt( void ); +#ifndef configSETUP_TICK_INTERRUPT + extern void vApplicationSetupTimerInterrupt( void ); + /* 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() + #define configSETUP_TICK_INTERRUPT() vApplicationSetupTimerInterrupt() +#endif /* configSETUP_TICK_INTERRUPT */ + +/* + * Defined in portasm.s87, this function starts the scheduler by loading the + * context of the first task to run. + */ +extern void vPortStartFirstTask( void ); + +/* + * Used to catch tasks that attempt to return from their implementing function. + */ +static void prvTaskExitError( void ); + +/*-----------------------------------------------------------*/ + +/* + * Initialise the stack of a task to look exactly as if a call to + * portSAVE_CONTEXT had been called. + * + * See the header file portable.h. + */ +StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters ) +{ +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. */ + +// #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--; +// +// /* Write in the parameter value. */ +// pulLocal = ( uint32_t * ) pxTopOfStack; +// *pulLocal = ( uint32_t ) pvParameters; +// 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 start address / PSW value is also written in as a 32-bit value, +// so leave a space for the second two bytes. */ +// pxTopOfStack--; +// +// /* Task function start address combined with the PSW. */ +// pulLocal = ( uint32_t * ) pxTopOfStack; +// *pulLocal = ( ( ( uint32_t ) pxCode ) | ( portPSW << 24UL ) ); +// 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. Again as it is written as a 32-bit value a space is + left on the stack for the second two bytes. */ + pxTopOfStack--; + + /* Task function start address combined with the PSW. */ + pulLocal = ( uint32_t * ) pxTopOfStack; + *pulLocal = ( ( ( uint32_t ) pxCode ) | ( portPSW << 24UL ) ); + pxTopOfStack--; + + /* The parameter is passed in AX. */ + *pxTopOfStack = ( StackType_t ) pvParameters; + pxTopOfStack--; +// } +// #endif +#if(0) + /* An initial value for the HL register. */ + *pxTopOfStack = ( StackType_t ) 0x2222; + pxTopOfStack--; + + /* CS and ES registers. */ + *pxTopOfStack = ( StackType_t ) 0x0F00; + pxTopOfStack--; + + /* The remaining general purpose registers DE and BC */ + *pxTopOfStack = ( StackType_t ) 0xDEDE; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0xBCBC; + pxTopOfStack--; +#else + /* The initial value for the general purpose register BC, DE and HL. */ + *pxTopOfStack = ( StackType_t ) 0xBCBC; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0xDEDE; + pxTopOfStack--; + *pxTopOfStack = ( StackType_t ) 0x2222; + pxTopOfStack--; + + /* ES and CS registers. */ + *pxTopOfStack = ( StackType_t ) 0x000F; + pxTopOfStack--; +#endif + + /* 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; +} +/*-----------------------------------------------------------*/ + +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 ). + + 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(); + + /* 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; +} +/*-----------------------------------------------------------*/ + +void vPortEndScheduler( void ) +{ + /* It is unlikely that the RL78 port will get stopped. */ +} +/*-----------------------------------------------------------*/ +#if(0) +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 +} +#endif +/*-----------------------------------------------------------*/ + diff --git a/portable/Renesas/RL78/portasm.asm b/portable/Renesas/RL78/portasm.asm new file mode 100644 index 0000000000..6de6109c32 --- /dev/null +++ b/portable/Renesas/RL78/portasm.asm @@ -0,0 +1,130 @@ +;/* +; * FreeRTOS Kernel V10.2.1 +; * Copyright (C) 2019 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. +; * +; * http://www.FreeRTOS.org +; * http://aws.amazon.com/freertos +; * +; * 1 tab == 4 spaces! +; */ + +$include "ISR_Support.h" + +;; CS .SET 0xFFFFC +;; ES .SET 0xFFFFD + + .PUBLIC _vPortYield + .PUBLIC _vPortStartFirstTask + .PUBLIC _vPortTickISR +;; .PUBLIC _vPortFreeRTOSInterruptCommonHandler_C + + .EXTERN _vTaskSwitchContext + .EXTERN _xTaskIncrementTick + +; FreeRTOS yield handler. This is installed as the BRK software interrupt +; handler. + .SECTION .text,TEXT +_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. + .SECTION .text,TEXT +_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. + .SECTION .text,TEXT +_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 + + +; Common interrupt handler. +;; .SECTION .text,TEXT +;;_vPortFreeRTOSInterruptCommonHandler_C: + ; Argument: BC is the target interrupt handler address. +;; portSAVE_CONTEXT_C ; Save the context of the current task. +;; clrb a +;; mov cs, a +;; call bc ; Call the target interrupt handler. +;; portRESTORE_CONTEXT ; Restore the context of the next task to run. +;; reti + + +; Install the interrupt handlers + + _vPortTickISR .VECTOR 0x38 +;; _vPortTickISR .VECTOR 0x3C + + _vPortYield .VECTOR 0x7E + + +; Somehow CS+ debugger needs more lines at least this file >= ISR_Support.h. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +; Here. diff --git a/portable/Renesas/RL78/portmacro.h b/portable/Renesas/RL78/portmacro.h new file mode 100644 index 0000000000..c719b60875 --- /dev/null +++ b/portable/Renesas/RL78/portmacro.h @@ -0,0 +1,140 @@ +/* + * FreeRTOS Kernel V10.1.1 + * Copyright (C) 2018 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. + * + * http://www.FreeRTOS.org + * http://aws.amazon.com/freertos + * + * 1 tab == 4 spaces! + */ + +#ifndef PORTMACRO_H +#define PORTMACRO_H + +#ifdef __cplusplus +extern "C" { +#endif + +/*----------------------------------------------------------- + * Port specific definitions. + * + * The settings in this file configure FreeRTOS correctly for the + * given hardware and compiler. + * + * These settings should not be altered. + *----------------------------------------------------------- + */ +//#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. +//#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. +//#endif +/* Type definitions. */ + +#define portCHAR char +#define portFLOAT float +#define portDOUBLE double +#define portLONG long +#define portSHORT short +#define portSTACK_TYPE uint16_t +#define portBASE_TYPE short + +typedef portSTACK_TYPE StackType_t; +typedef short BaseType_t; +typedef unsigned short UBaseType_t; + +//#if __DATA_MODEL__ == __DATA_MODEL_FAR__ +// #define portPOINTER_SIZE_TYPE uint32_t +//#else + #define portPOINTER_SIZE_TYPE uint16_t +//#endif + +#if ( configUSE_16_BIT_TICKS == 1 ) + typedef unsigned int TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffff +#else + typedef uint32_t TickType_t; + #define portMAX_DELAY ( TickType_t ) 0xffffffffUL +#endif +/*-----------------------------------------------------------*/ + +/* Interrupt control macros. */ +#define portDISABLE_INTERRUPTS() __DI() /* __asm ( "DI" ) */ +#define portENABLE_INTERRUPTS() __EI() /* __asm ( "EI" ) */ +/*-----------------------------------------------------------*/ + +/* Critical section control macros. */ +#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 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(); \ + } \ + } \ +} +/*-----------------------------------------------------------*/ + +/* Task utilities. */ +#define portYIELD() __brk() /* __asm( "BRK" ) */ +#define portYIELD_FROM_ISR( xHigherPriorityTaskWoken ) if( xHigherPriorityTaskWoken ) vTaskSwitchContext() +#define portNOP() __nop() /* __asm( "NOP" ) */ +/*-----------------------------------------------------------*/ + +/* Hardwware specifics. */ +#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. */ +#define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters ) +#define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters ) + +#ifdef __cplusplus +} +#endif + +#endif /* PORTMACRO_H */ +