⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 thread.inl

📁 ecos为实时嵌入式操作系统
💻 INL
字号:
#ifndef CYGONCE_KERNEL_THREAD_INL#define CYGONCE_KERNEL_THREAD_INL//==========================================================================////      thread.inl////      Thread class inlines////==========================================================================//####COPYRIGHTBEGIN####//// -------------------------------------------// The contents of this file are subject to the Cygnus eCos Public License// Version 1.0 (the "License"); you may not use this file except in// compliance with the License.  You may obtain a copy of the License at// http://sourceware.cygnus.com/ecos// // Software distributed under the License is distributed on an "AS IS"// basis, WITHOUT WARRANTY OF ANY KIND, either express or implied.  See the// License for the specific language governing rights and limitations under// the License.// // The Original Code is eCos - Embedded Cygnus Operating System, released// September 30, 1998.// // The Initial Developer of the Original Code is Cygnus.  Portions created// by Cygnus are Copyright (C) 1998,1999 Cygnus Solutions.  All Rights Reserved.// -------------------------------------------////####COPYRIGHTEND####//==========================================================================//#####DESCRIPTIONBEGIN####//// Author(s):   nickg// Contributors:        nickg// Date:        1997-09-09// Purpose:     Define inlines for thread classes// Description: Inline implementations of various member functions defined//              in various Thread classes. // Usage://              #include <cyg/kernel/thread.hxx>//              ...//              #include <cyg/kernel/thread.inl>//              ...////####DESCRIPTIONEND####////==========================================================================#include <cyg/kernel/thread.hxx>#include <cyg/hal/hal_arch.h>#include <cyg/kernel/clock.inl>//==========================================================================// Inlines for Cyg_HardwareThread// -------------------------------------------------------------------------// Attach a stack to this thread. If there is a HAL defined macro to// do this, then we use that, otherwise assume a falling stack.inline void Cyg_HardwareThread::attach_stack(CYG_ADDRESS s_base, cyg_uint32 s_size){#ifdef CYGNUM_HAL_STACK_SIZE_MINIMUM    CYG_ASSERT( s_size >= CYGNUM_HAL_STACK_SIZE_MINIMUM,                "Stack size too small");#endif    stack_base = s_base;    stack_size = s_size;#ifdef CYGFUN_KERNEL_THREADS_STACK_LIMIT    stack_limit = s_base;#endif    #ifdef HAL_THREAD_ATTACH_STACK    HAL_THREAD_ATTACH_STACK(stack_ptr, stack_base, stack_size);    #else    stack_ptr = stack_base + stack_size;#endif}// -------------------------------------------------------------------------inline Cyg_HardwareThread::Cyg_HardwareThread(    cyg_thread_entry        *e_point,   // entry point function    CYG_ADDRWORD            e_data,     // entry data    cyg_ucount32            s_size,     // stack size, 0 = use default    CYG_ADDRESS             s_base      // stack base, NULL = allocate){    entry_point = e_point;    entry_data  = e_data;#ifdef CYGDBG_KERNEL_DEBUG_GDB_THREAD_SUPPORT    saved_context = 0;#endif        attach_stack( s_base, s_size );};// -------------------------------------------------------------------------// get the size/base of this thread's stackinline CYG_ADDRESSCyg_HardwareThread::get_stack_base(){    return stack_base;}inline cyg_uint32Cyg_HardwareThread::get_stack_size(){    return stack_size;}// -------------------------------------------------------------------------#ifdef CYGDBG_KERNEL_DEBUG_GDB_THREAD_SUPPORT// Return the current saved state for this thread.inline HAL_SavedRegisters *Cyg_HardwareThread::get_saved_context(){    HAL_SavedRegisters *regs;    if( saved_context != 0 ) regs = saved_context;    else HAL_THREAD_GET_SAVED_REGISTERS( stack_ptr, regs );    return regs;}inline void Cyg_HardwareThread::set_saved_context(HAL_SavedRegisters *ctx){    saved_context = ctx;}#endif// -------------------------------------------------------------------------// (declare this inline before its first use)inline cyg_uint16 Cyg_Thread::get_unique_id(){    return unique_id;}// -------------------------------------------------------------------------// Initialize the context of this thread.inline void Cyg_HardwareThread::init_context(Cyg_Thread *thread){#ifdef CYGPKG_INFRA_DEBUG    cyg_uint32 threadid = thread->get_unique_id()*0x01010000;#else    cyg_uint32 threadid = 0x11110000;#endif    HAL_THREAD_INIT_CONTEXT( stack_ptr, thread, thread_entry, threadid );}// -------------------------------------------------------------------------// Load thread context without saving current context.// This function is only really here for completeness, the// kernel generally calls the HAL macros directly.inline void Cyg_HardwareThread::load_context(){    CYG_ADDRESS dummy_stack_ptr;        HAL_THREAD_SWITCH_CONTEXT( &dummy_stack_ptr, &stack_ptr );}// -------------------------------------------------------------------------// Save current thread's context and load that of the given next thread.// This function is only really here for completeness, the// kernel generally calls the HAL macros directly.inline void Cyg_HardwareThread::switch_context(Cyg_HardwareThread *next){    HAL_THREAD_SWITCH_CONTEXT( &stack_ptr, &next->stack_ptr );}// -------------------------------------------------------------------------// Get and set entry_data.inline void Cyg_HardwareThread::set_entry_data( CYG_ADDRWORD data ){    entry_data = data;}inline CYG_ADDRWORD Cyg_HardwareThread::get_entry_data(){    return entry_data;}// -------------------------------------------------------------------------// Allocate some memory at the lower end of the stack// by moving the stack limit pointer.#ifdef CYGFUN_KERNEL_THREADS_STACK_LIMITinline void *Cyg_HardwareThread::increment_stack_limit( cyg_ucount32 size){    stack_limit += size;    return (void *)(stack_limit - size);}    inline CYG_ADDRESSCyg_HardwareThread::get_stack_limit(){    return stack_limit;}#endif    //==========================================================================// Inlines for Cyg_Thread classinline Cyg_Thread *Cyg_Thread::self(){    return Cyg_Scheduler::get_current_thread();}// -------------------------------------------------------------------------inline void Cyg_Thread::yield(){    self()->Cyg_SchedThread::yield();}// -------------------------------------------------------------------------inline voidCyg_Thread::rotate_queue( cyg_priority pri ){    self()->Cyg_SchedThread::rotate_queue( pri );}// -------------------------------------------------------------------------inline voidCyg_Thread::to_queue_head( void ){    this->Cyg_SchedThread::to_queue_head();}// -------------------------------------------------------------------------#ifdef CYGIMP_THREAD_PRIORITYinline cyg_priority Cyg_Thread::get_priority(){#ifdef CYGSEM_KERNEL_SYNCH_MUTEX_PRIORITY_INHERITANCE_SIMPLE    // If we have an inherited priority, return our original    // priority rather than the current one.        if( priority_inherited ) return original_priority;#endif    return priority;}// Return the actual dispatching priority of the thread// regardless of inheritance or scheduling concerns.inline cyg_priority Cyg_Thread::get_current_priority(){    return priority;}#endif// -------------------------------------------------------------------------inline void Cyg_Thread::set_sleep_reason( cyg_reason reason){    self()->sleep_reason = reason;    self()->wake_reason = NONE;}// -------------------------------------------------------------------------inline Cyg_Thread::cyg_reason Cyg_Thread::get_sleep_reason(){    return sleep_reason;}// -------------------------------------------------------------------------inline void Cyg_Thread::set_wake_reason( cyg_reason reason ){    sleep_reason = NONE;    wake_reason = reason;}// -------------------------------------------------------------------------inline Cyg_Thread::cyg_reason Cyg_Thread::get_wake_reason(){    return wake_reason;}// -------------------------------------------------------------------------inline void Cyg_Thread::set_timer(    cyg_tick_count      trigger,    cyg_reason          reason){#ifdef CYGFUN_KERNEL_THREADS_TIMER    self()->sleep_reason = reason;    self()->wake_reason = NONE;    self()->timer.initialize( trigger);#endif}// -------------------------------------------------------------------------inline void Cyg_Thread::clear_timer(){#ifdef CYGFUN_KERNEL_THREADS_TIMER    self()->timer.disable();#endif}// -------------------------------------------------------------------------#ifdef CYGVAR_KERNEL_THREADS_DATAinline CYG_ADDRWORD Cyg_Thread::get_data( cyg_ucount32 index ){    CYG_ASSERT( index < CYGNUM_KERNEL_THREADS_DATA_MAX,                "Per thread data index out of bounds");    CYG_ASSERT( (thread_data_map & (1<<index)) == 0,                "Unallocated index used");        return self()->thread_data[index];}inline CYG_ADDRWORD *Cyg_Thread::get_data_ptr( cyg_ucount32 index ){    CYG_ASSERT( index < CYGNUM_KERNEL_THREADS_DATA_MAX,                "Per thread data index out of bounds");    CYG_ASSERT( (thread_data_map & (1<<index)) == 0,                "Unallocated index used");        return &(self()->thread_data[index]);}inline void Cyg_Thread::set_data( cyg_ucount32 index, CYG_ADDRWORD data ){    CYG_ASSERT( index < CYGNUM_KERNEL_THREADS_DATA_MAX,                "Per thread data index out of bounds");    CYG_ASSERT( (thread_data_map & (1<<index)) == 0,                "Unallocated index used");    thread_data[index] = data;}#endif// -------------------------------------------------------------------------#ifdef CYGVAR_KERNEL_THREADS_NAMEinline char *Cyg_Thread::get_name(){    return name;}#endif// -------------------------------------------------------------------------#ifdef CYGVAR_KERNEL_THREADS_LISTinline Cyg_Thread *Cyg_Thread::get_list_head(){    return thread_list?thread_list->list_next:0;}    inline Cyg_Thread *Cyg_Thread::get_list_next(){    return (this==thread_list)?0:list_next;}#endif// -------------------------------------------------------------------------#ifdef CYGPKG_KERNEL_EXCEPTIONSinline void Cyg_Thread::register_exception(    cyg_code                exception_number,       // exception number    cyg_exception_handler   handler,                // handler function    CYG_ADDRWORD            data,                   // data argument    cyg_exception_handler   **old_handler,          // handler function    CYG_ADDRWORD            *old_data               // data argument    ){    self()->exception_control.register_exception(        exception_number,        handler,        data,        old_handler,        old_data        );}inline void Cyg_Thread::deregister_exception(    cyg_code                exception_number        // exception number    ){    self()->exception_control.deregister_exception(        exception_number        );}#endif//==========================================================================// Inlines for Cyg_ThreadTimer class// -------------------------------------------------------------------------#if defined(CYGFUN_KERNEL_THREADS_TIMER) && defined(CYGVAR_KERNEL_COUNTERS_CLOCK)inline Cyg_ThreadTimer::Cyg_ThreadTimer(    Cyg_Thread  *th    )    : Cyg_Alarm(Cyg_Clock::real_time_clock,                &alarm,                CYG_ADDRWORD(this)                ){    thread = th;}#endif//==========================================================================// Inlines for Cyg_ThreadQueue classinline void Cyg_ThreadQueue::enqueue(Cyg_Thread *thread){    Cyg_ThreadQueue_Implementation::enqueue(thread);}// -------------------------------------------------------------------------inline Cyg_Thread *Cyg_ThreadQueue::highpri(){    return Cyg_ThreadQueue_Implementation::highpri();}// -------------------------------------------------------------------------inline Cyg_Thread *Cyg_ThreadQueue::dequeue(){    return Cyg_ThreadQueue_Implementation::dequeue();}// -------------------------------------------------------------------------inline void Cyg_ThreadQueue::remove(Cyg_Thread *thread){    Cyg_ThreadQueue_Implementation::remove(thread);}// -------------------------------------------------------------------------inline cyg_bool Cyg_ThreadQueue::empty(){    return Cyg_ThreadQueue_Implementation::empty();}// -------------------------------------------------------------------------#endif // ifndef CYGONCE_KERNEL_THREAD_INL// EOF thread.inl

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -