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

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