/*
 * 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!
 */

#ifndef PORTMACRO_H
    #define PORTMACRO_H

    #ifdef __cplusplus
        extern "C" {
    #endif

/* record stack high address for stack check */
    #ifndef configRECORD_STACK_HIGH_ADDRESS
        #define configRECORD_STACK_HIGH_ADDRESS    1
    #endif

/*-----------------------------------------------------------
 * Port specific definitions.
 *
 * The settings in this file configure FreeRTOS correctly for the
 * given hardware and compiler.
 *
 * These settings should not be altered.
 *-----------------------------------------------------------
 */

/* Type definitions. */
    #define portCHAR          char
    #define portFLOAT         float
    #define portDOUBLE        double
    #define portLONG          long
    #define portSHORT         short
    #define portSTACK_TYPE    unsigned int
    #define portBASE_TYPE     portLONG

    #ifndef Inline
        #define Inline        static __inline__
    #endif
    #ifndef Asm
        #define Asm           __asm__ volatile
    #endif

/*
 *  normal constants
 */
    #ifndef NULL
        #define NULL    0       /* invalid pointer */
    #endif /* NULL */

    #ifndef true
        #define true    1       /* true */
    #endif /* true */

    #ifndef false
        #define false    0      /* false */
    #endif /* false */

    typedef portSTACK_TYPE     StackType_t;
    typedef long               BaseType_t;
    typedef unsigned long      UBaseType_t;

    #if ( configUSE_16_BIT_TICKS == 1 )
        typedef uint16_t       TickType_t;
        #define portMAX_DELAY          ( TickType_t ) 0xffff
    #else
        typedef unsigned int   TickType_t;
        #define portMAX_DELAY          ( TickType_t ) 0xffffffffUL
    #endif

    #define portNO_CRITICAL_NESTING    0x0
    #define portSTACK_GROWTH           ( -1 )
    #define portTICK_PERIOD_MS         ( ( TickType_t ) 1000 / configTICK_RATE_HZ )
    #define portBYTE_ALIGNMENT         8
    #define portNOP()               Asm( "nop_s" );
    #define IPM_ENABLE_ALL             1

    #define portYIELD_FROM_ISR()    vPortYieldFromIsr()
    #define portYIELD()             vPortYield()

/* Critical section management. */
    #define portDISABLE_INTERRUPTS() \
    {                                \
        Asm( "clri" );               \
        Asm( "" ::: "memory" );      \
    }                                \

    #define portENABLE_INTERRUPTS() \
    {                               \
        Asm( "" ::: "memory" );     \
        Asm( "seti" );              \
    }                               \

    extern volatile unsigned int ulCriticalNesting;

    #define portENTER_CRITICAL() \
    {                            \
        portDISABLE_INTERRUPTS() \
        ulCriticalNesting++;     \
    }


    #define portEXIT_CRITICAL()                                \
    {                                                          \
        if( ulCriticalNesting > portNO_CRITICAL_NESTING )      \
        {                                                      \
            ulCriticalNesting--;                               \
            if( ulCriticalNesting == portNO_CRITICAL_NESTING ) \
            {                                                  \
                portENABLE_INTERRUPTS()                        \
            }                                                  \
        }                                                      \
    }


    #define portTASK_FUNCTION_PROTO( vFunction, pvParameters )    void vFunction( void * pvParameters )
    #define portTASK_FUNCTION( vFunction, pvParameters )          void vFunction( void * pvParameters )

    #define portCONFIGURE_TIMER_FOR_RUN_TIME_STATS()              do {} while( 0 ) /* we use the timer */
    #define portALT_GET_RUN_TIME_COUNTER_VALUE( dest )            ( dest = xTickCount )

    #if defined( __MW__ )
        extern void task_end_hook( void * pxTCB );
        #define portCLEAN_UP_TCB( pxTCB )    task_end_hook( ( void * ) pxTCB )
    #else
        #define portCLEAN_UP_TCB( pxTCB )    ( void ) pxTCB
    #endif

    void vPortYield( void );
    void vPortYieldFromIsr( void );

    #ifdef __cplusplus
        }
    #endif

#endif /* PORTMACRO_H */
