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