1 /* 2 * FreeRTOS Kernel V10.6.2 3 * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. 4 * 5 * SPDX-License-Identifier: MIT 6 * 7 * Permission is hereby granted, free of charge, to any person obtaining a copy of 8 * this software and associated documentation files (the "Software"), to deal in 9 * the Software without restriction, including without limitation the rights to 10 * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of 11 * the Software, and to permit persons to whom the Software is furnished to do so, 12 * subject to the following conditions: 13 * 14 * The above copyright notice and this permission notice shall be included in all 15 * copies or substantial portions of the Software. 16 * 17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 18 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS 19 * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR 20 * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER 21 * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 22 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 23 * 24 * https://www.FreeRTOS.org 25 * https://github.com/FreeRTOS 26 * 27 */ 28 29 30 #ifndef PORTMACRO_H 31 #define PORTMACRO_H 32 33 #include <machine.h> 34 35 /* *INDENT-OFF* */ 36 #ifdef __cplusplus 37 extern "C" { 38 #endif 39 /* *INDENT-ON* */ 40 41 /*----------------------------------------------------------- 42 * Port specific definitions. 43 * 44 * The settings in this file configure FreeRTOS correctly for the 45 * given hardware and compiler. 46 * 47 * These settings should not be altered. 48 *----------------------------------------------------------- 49 */ 50 51 /* Type definitions - these are a bit legacy and not really used now, other than 52 portSTACK_TYPE and portBASE_TYPE. */ 53 #define portCHAR char 54 #define portFLOAT float 55 #define portDOUBLE double 56 #define portLONG long 57 #define portSHORT short 58 #define portSTACK_TYPE uint32_t 59 #define portBASE_TYPE long 60 61 typedef portSTACK_TYPE StackType_t; 62 typedef long BaseType_t; 63 typedef unsigned long UBaseType_t; 64 65 #if( configTICK_TYPE_WIDTH_IN_BITS == TICK_TYPE_WIDTH_16_BITS ) 66 typedef uint16_t TickType_t; 67 #define portMAX_DELAY ( TickType_t ) 0xffff 68 #elif ( configTICK_TYPE_WIDTH_IN_BITS == TICK_TYPE_WIDTH_32_BITS ) 69 typedef uint32_t TickType_t; 70 #define portMAX_DELAY ( TickType_t ) 0xffffffffUL 71 72 /* 32-bit tick type on a 32-bit architecture, so reads of the tick count do 73 not need to be guarded with a critical section. */ 74 #define portTICK_TYPE_IS_ATOMIC 1 75 #endif 76 /*-----------------------------------------------------------*/ 77 78 /* Hardware specifics. */ 79 #define portBYTE_ALIGNMENT 8 80 #define portSTACK_GROWTH -1 81 #define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ ) 82 #define portNOP() nop() 83 #define portSTART_SCHEDULER_TRAP_NO ( 32 ) 84 #define portYIELD_TRAP_NO ( 33 ) 85 #define portKERNEL_INTERRUPT_PRIORITY ( 1 ) 86 87 void vPortYield( void ); 88 #define portYIELD() vPortYield() 89 90 extern void vTaskSwitchContext( void ); 91 #define portYIELD_FROM_ISR( x ) do { if( x != pdFALSE ) vTaskSwitchContext(); } while( 0 ) 92 93 /* 94 * This function tells the kernel that the task referenced by xTask is going to 95 * use the floating point registers and therefore requires the floating point 96 * registers saved as part of its context. 97 */ 98 BaseType_t xPortUsesFloatingPoint( void* xTask ); 99 100 /* 101 * The flop save and restore functions are defined in portasm.src and called by 102 * the trace "task switched in" and "trace task switched out" macros. 103 */ 104 void vPortSaveFlopRegisters( void *pulBuffer ); 105 void vPortRestoreFlopRegisters( void *pulBuffer ); 106 107 /* 108 * pxTaskTag is used to point to the buffer into which the floating point 109 * context should be saved. If pxTaskTag is NULL then the task does not use 110 * a floating point context. 111 */ 112 #define traceTASK_SWITCHED_OUT() do { if( pxCurrentTCB->pxTaskTag != NULL ) vPortSaveFlopRegisters( pxCurrentTCB->pxTaskTag ); } while( 0 ) 113 #define traceTASK_SWITCHED_IN() do { if( pxCurrentTCB->pxTaskTag != NULL ) vPortRestoreFlopRegisters( pxCurrentTCB->pxTaskTag ); } while( 0 ) 114 115 /* 116 * These macros should be called directly, but through the taskENTER_CRITICAL() 117 * and taskEXIT_CRITICAL() macros. 118 */ 119 #define portENABLE_INTERRUPTS() set_imask( 0x00 ) 120 #define portDISABLE_INTERRUPTS() set_imask( portKERNEL_INTERRUPT_PRIORITY ) 121 122 /* Critical nesting counts are stored in the TCB. */ 123 #define portCRITICAL_NESTING_IN_TCB ( 1 ) 124 125 /* The critical nesting functions defined within tasks.c. */ 126 extern void vTaskEnterCritical( void ); 127 extern void vTaskExitCritical( void ); 128 #define portENTER_CRITICAL() vTaskEnterCritical(); 129 #define portEXIT_CRITICAL() vTaskExitCritical(); 130 131 /*-----------------------------------------------------------*/ 132 133 /* Task function macros as described on the FreeRTOS.org WEB site. */ 134 #define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void *pvParameters ) 135 #define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void *pvParameters ) 136 137 /* *INDENT-OFF* */ 138 #ifdef __cplusplus 139 } 140 #endif 141 /* *INDENT-ON* */ 142 143 #endif /* PORTMACRO_H */ 144