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

📄 kapi.cxx

📁 ecos为实时嵌入式操作系统
💻 CXX
📖 第 1 页 / 共 3 页
字号:
//==========================================================================////      common/kapi.cxx////      C API Implementation////==========================================================================//####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, dsm// Contributors:        nickg// Date:        1998-03-02// Purpose:     C API Implementation// Description: C++ implementation of the C API//              ////####DESCRIPTIONEND####////==========================================================================#include <pkgconf/kernel.h>#ifdef CYGFUN_KERNEL_API_C#include <cyg/kernel/ktypes.h>         // base kernel types#include <cyg/infra/cyg_trac.h>        // tracing macros#include <cyg/infra/cyg_ass.h>         // assertion macros#include <cyg/kernel/instrmnt.h>       // instrumentation#include <cyg/kernel/diag.h>#include <cyg/kernel/thread.hxx>#include <cyg/kernel/thread.inl>       // thread inlines#include <cyg/kernel/sched.hxx>#include <cyg/kernel/intr.hxx>#include <cyg/kernel/clock.hxx>#include <cyg/kernel/memfixed.hxx>#include <cyg/kernel/memvar.hxx>#include <cyg/kernel/sema.hxx>#include <cyg/kernel/flag.hxx>#include <cyg/kernel/mutex.hxx>#include <cyg/kernel/mbox.hxx>#include <cyg/kernel/sched.inl>        // scheduler inlines#include <cyg/kernel/clock.inl>        // clock inlines#include <cyg/kernel/kapi.h>           // C API// -------------------------------------------------------------------------// Magic new functioninline void *operator new(size_t size, void *ptr){    CYG_CHECK_DATA_PTR( ptr, "Bad pointer" );    return ptr;}// -------------------------------------------------------------------------#ifdef CYGDBG_USE_ASSERTS#define CYG_ASSERT_SIZES(cstruct, cxxstruct)                      \CYG_MACRO_START                                                   \    char *msg = "Size of C struct " #cstruct                      \                       " != size of C++ struct " #cxxstruct ;     \    CYG_ASSERT( sizeof(cstruct) == sizeof(cxxstruct) , msg );     \CYG_MACRO_END#else#define CYG_ASSERT_SIZES(cstruct, cxxstruct)#endif/*---------------------------------------------------------------------------*//* Scheduler operations *//* Starts scheduler with created threads.  Never returns. */externC void cyg_scheduler_start(void){    Cyg_Scheduler::start();}/* Lock the scheduler. We only allow this to take the lock from *//* zero to 1. Any other transition implies that this function   *//* is being called from an ISR/DSR or some other illegal place. */externC void cyg_scheduler_lock(void){    Cyg_Scheduler::lock();        CYG_ASSERT( Cyg_Scheduler::get_sched_lock() == 1 ,                "Cannot nest calls to cyg_scheduler_lock");    if( Cyg_Scheduler::get_sched_lock() != 1 )        Cyg_Scheduler::unlock();        }/* Unlock the scheduler. Like lock, we only allow a 1->0        *//* transition.                                                  */externC void cyg_scheduler_unlock(void){    CYG_ASSERT( Cyg_Scheduler::get_sched_lock() == 1 ,                "Bad call to cyg_scheduler_unlock");    if( Cyg_Scheduler::get_sched_lock() == 1 )        Cyg_Scheduler::unlock();    }/*---------------------------------------------------------------------------*//* Thread operations */externC void cyg_thread_create(    cyg_addrword_t      sched_info,             /* scheduling info (eg pri)  */    cyg_thread_entry_t  *entry,                 /* entry point function      */    cyg_addrword_t      entry_data,             /* entry data                */    char                *name,                  /* optional thread name      */    void                *stack_base,            /* stack base, NULL = alloc  */    cyg_ucount32        stack_size,             /* stack size, 0 = default   */    cyg_handle_t        *handle,                /* returned thread handle    */    cyg_thread          *thread                 /* put thread here           */){    CYG_ASSERT_SIZES( cyg_thread, Cyg_Thread );    Cyg_Thread *t = new((void *)thread) Cyg_Thread (        (CYG_ADDRWORD) sched_info,        (cyg_thread_entry *)entry,        (CYG_ADDRWORD) entry_data,        name,        (CYG_ADDRWORD) stack_base,        stack_size        );    t=t;        CYG_CHECK_DATA_PTR( handle, "Bad handle pointer" );    *handle = (cyg_handle_t)thread;}externC void cyg_thread_exit(){    Cyg_Thread::exit();}externC void cyg_thread_delete( cyg_handle_t thread ){    Cyg_Thread *th = (Cyg_Thread *)thread;    if( th->get_state() != Cyg_Thread::EXITED )        th->kill();    th->~Cyg_Thread();    }externC void cyg_thread_suspend(cyg_handle_t thread){    ((Cyg_Thread *)thread)->suspend();}externC void cyg_thread_resume(cyg_handle_t thread){    Cyg_Thread *th = (Cyg_Thread *)thread;    // If we are resuming an exited thread then    // reinitialize it.        if( th->get_state() == Cyg_Thread::EXITED )        th->reinitialize();    th->resume();}externC void cyg_thread_kill( cyg_handle_t thread){    ((Cyg_Thread *)thread)->kill();    }externC void cyg_thread_release( cyg_handle_t thread){    ((Cyg_Thread *)thread)->release();    }externC void cyg_thread_yield(){    Cyg_Thread::yield();}externC cyg_handle_t cyg_thread_self(){    return (cyg_handle_t)Cyg_Thread::self();}/* Priority manipulation */externC void cyg_thread_set_priority(    cyg_handle_t thread, cyg_priority_t priority ){    ((Cyg_Thread *)thread)->set_priority(priority);}externC cyg_priority_t cyg_thread_get_priority(cyg_handle_t thread){    return ((Cyg_Thread *)thread)->get_priority();}/* Deadline scheduling control (optional) */externC void cyg_thread_deadline_wait(     cyg_tick_count_t    start_time,             /* abs earliest start time   */    cyg_tick_count_t    run_time,               /* worst case execution time */    cyg_tick_count_t    deadline                /* absolute deadline         */){    CYG_ASSERT(0,"Not implemented");} externC void cyg_thread_delay(cyg_tick_count_t delay){    Cyg_Thread::self()->delay(delay);}/*---------------------------------------------------------------------------*//* Per-thread data                                                           */#ifdef CYGVAR_KERNEL_THREADS_DATAexternC cyg_ucount32 cyg_thread_new_data_index(){        return Cyg_Thread::new_data_index();}externC void cyg_thread_free_data_index(cyg_ucount32 index){        Cyg_Thread::free_data_index(index);}externC CYG_ADDRWORD cyg_thread_get_data(cyg_ucount32 index){        return Cyg_Thread::get_data(index);}externC CYG_ADDRWORD *cyg_thread_get_data_ptr(cyg_ucount32 index){        return Cyg_Thread::get_data_ptr(index);}externC void cyg_thread_set_data(cyg_ucount32 index, CYG_ADDRWORD data){        Cyg_Thread::self()->set_data(index, data);}#endif/*---------------------------------------------------------------------------*//* Exception handling.                                                       */#ifdef CYGPKG_KERNEL_EXCEPTIONS    externC void cyg_exception_set_handler(    cyg_code_t                  exception_number,    cyg_exception_handler_t     *new_handler,    cyg_addrword_t              new_data,    cyg_exception_handler_t     **old_handler,    cyg_addrword_t              *old_data){    Cyg_Thread::register_exception(        exception_number,        (cyg_exception_handler *)new_handler,        (CYG_ADDRWORD)new_data,        (cyg_exception_handler **)old_handler,        (CYG_ADDRWORD *)old_data        );}/* Clear exception handler to default                                        */externC void cyg_exception_clear_handler(    cyg_code_t                  exception_number){    Cyg_Thread::deregister_exception( exception_number );}/* Invoke exception handler                                                  */externC void cyg_exception_call_handler(    cyg_handle_t                thread,    cyg_code_t                  exception_number,    cyg_addrword_t              error_code){    Cyg_Thread *t = (Cyg_Thread *)thread;    t->deliver_exception( exception_number, error_code );}#endif    /*---------------------------------------------------------------------------*//* Interrupt handling                                                        */externC void cyg_interrupt_create(    cyg_vector_t        vector,         /* Vector to attach to               */    cyg_priority_t      priority,       /* Queue priority                    */    cyg_addrword_t      data,           /* Data pointer                      */    cyg_ISR_t           *isr,           /* Interrupt Service Routine         */    cyg_DSR_t           *dsr,           /* Deferred Service Routine          */    cyg_handle_t        *handle,        /* returned handle                   */    cyg_interrupt       *intr           /* put interrupt here                */){    CYG_ASSERT_SIZES( cyg_interrupt, Cyg_Interrupt );    Cyg_Interrupt *t = new((void *)intr) Cyg_Interrupt (        (cyg_vector)vector,        (cyg_priority)priority,        (CYG_ADDRWORD)data,        (cyg_ISR *)isr,        (cyg_DSR *)dsr );    t=t;    CYG_CHECK_DATA_PTR( handle, "Bad handle pointer" );    *handle = (cyg_handle_t)intr;}externC void cyg_interrupt_delete( cyg_handle_t interrupt){    ((Cyg_Interrupt *)interrupt)->~Cyg_Interrupt();}void cyg_interrupt_attach( cyg_handle_t interrupt ){    ((Cyg_Interrupt *)interrupt)->attach();}void cyg_interrupt_detach( cyg_handle_t interrupt ){    ((Cyg_Interrupt *)interrupt)->detach();}/* VSR manipulation */externC void cyg_interrupt_get_vsr(    cyg_vector_t        vector,         /* vector to get                     */    cyg_VSR_t           **vsr           /* vsr got                           */){    Cyg_Interrupt::get_vsr( (cyg_vector)vector, (cyg_VSR **)vsr);}externC void cyg_interrupt_set_vsr(    cyg_vector_t        vector,         /* vector to set                     */    cyg_VSR_t           *vsr            /* vsr to set                        */){    Cyg_Interrupt::set_vsr( (cyg_vector)vector, (cyg_VSR *)vsr);}

⌨️ 快捷键说明

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