mirror of
				https://github.com/0xFEEDC0DE64/arduino-esp32.git
				synced 2025-10-31 06:01:39 +01:00 
			
		
		
		
	
		
			
	
	
		
			121 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			121 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
|   | 
 | ||
|  | // Copyright (c) 2003-2015 Cadence Design Systems, Inc.
 | ||
|  | //
 | ||
|  | // 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.
 | ||
|  | 
 | ||
|  | 
 | ||
|  | #ifndef __XOS_INTERNAL_H__
 | ||
|  | #define __XOS_INTERNAL_H__
 | ||
|  | 
 | ||
|  | #if !defined(__XOS_H__) || !defined(_XOS_INCLUDE_INTERNAL_)
 | ||
|  |   #error "xos_internal.h must be included by defining _XOS_INCLUDE_INTERNAL_ before including xos.h"
 | ||
|  | #endif
 | ||
|  | 
 | ||
|  | #include <xtensa/config/core.h>
 | ||
|  | #include "xos_common.h"
 | ||
|  | 
 | ||
|  | #ifdef __cplusplus
 | ||
|  | extern "C" { | ||
|  | #endif
 | ||
|  | 
 | ||
|  | 
 | ||
|  | // Use this macro to suppress compiler warnings for unused variables.
 | ||
|  | 
 | ||
|  | #define UNUSED(x)       (void)(x)
 | ||
|  | 
 | ||
|  | 
 | ||
|  | #if XOS_DEBUG
 | ||
|  | 
 | ||
|  | #include <stdio.h>
 | ||
|  | #include <xtensa/xtutil.h>
 | ||
|  | # define DPRINTF        printf
 | ||
|  | 
 | ||
|  | #else
 | ||
|  | 
 | ||
|  | # define DPRINTF(x...)  do {} while(0)
 | ||
|  | 
 | ||
|  | #endif
 | ||
|  | 
 | ||
|  | 
 | ||
|  | //-----------------------------------------------------------------------------
 | ||
|  | // Internal flags for thread creation.
 | ||
|  | //-----------------------------------------------------------------------------
 | ||
|  | #define XOS_THREAD_FAKE   0x8000  // Don't allocate stack (init and idle threads).
 | ||
|  | 
 | ||
|  | 
 | ||
|  | //-----------------------------------------------------------------------------
 | ||
|  | // Interrupt handler table entry. This structure defines one entry in the XOS
 | ||
|  | // interrupt handler table.
 | ||
|  | //-----------------------------------------------------------------------------
 | ||
|  | typedef struct XosIntEntry { | ||
|  |   XosIntFunc *    handler;      // Pointer to handler function.
 | ||
|  |   void *          arg;          // Argument passed to handler function.
 | ||
|  | #if XOS_OPT_INTERRUPT_SWPRI
 | ||
|  |   unsigned char   level;        // Interrupt level.
 | ||
|  |   unsigned char   priority;     // Interrupt priority.
 | ||
|  |   short           reserved;     // Reserved.
 | ||
|  |   unsigned int    primask;      // Mask of interrupts at higher priority.
 | ||
|  | #else
 | ||
|  |   unsigned int    ps;           // Value of PS when running the handler.
 | ||
|  | #endif
 | ||
|  | } XosIntEntry; | ||
|  | 
 | ||
|  | 
 | ||
|  | //-----------------------------------------------------------------------------
 | ||
|  | // Extern variables.
 | ||
|  | //-----------------------------------------------------------------------------
 | ||
|  | extern unsigned         xos_intlevel_mask; | ||
|  | extern unsigned         xos_intenable_mask; | ||
|  | extern XosIntEntry      xos_interrupt_table[XCHAL_NUM_INTERRUPTS]; | ||
|  | 
 | ||
|  | extern uint32_t         xos_clock_freq; | ||
|  | extern uint32_t         xos_tick_period; | ||
|  | extern uint64_t         xos_system_ticks; | ||
|  | extern uint64_t         xos_system_cycles; | ||
|  | extern uint32_t         xos_num_ctx_switches; | ||
|  | 
 | ||
|  | 
 | ||
|  | /*
 | ||
|  | 
 | ||
|  | One thing I noticed is different between my initial idea of stack | ||
|  | assignments to RTC threads, when comparing to interrupts, is that I | ||
|  | expected each RTC thread priority to have its own stack, whereas | ||
|  | interrupts of different priorities share an interrupt stack. | ||
|  | 
 | ||
|  | It's not really a difference in memory usage, because when assigning | ||
|  | multiple priorities to a stack, you have to add-up worst-case for | ||
|  | all priorities.  One possible functional difference is that with | ||
|  | separate stacks per priority, it's possible to dynamically change | ||
|  | the priority of an RTC thread (while it's running).  Not sure how | ||
|  | valuable that might be -- changing priority is useful with priority | ||
|  | inheritance, to avoid priority inversion, but I don't know how often | ||
|  | an RTC thread might acquire a lock (it couldn't block on acquiring a | ||
|  | lock in the usual sense -- it could get queued waiting and be restarted | ||
|  | when it becomes available, or use try_lock instead of lock). | ||
|  | 
 | ||
|  | */ | ||
|  | 
 | ||
|  | #ifdef __cplusplus
 | ||
|  | } | ||
|  | #endif
 | ||
|  | 
 | ||
|  | #endif  /* __XOS_INTERNAL_H__ */
 | ||
|  | 
 |