亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? os_kernel.h

?? scmRTOS is real-time preemptive operating system and supports up to 31 user processes (and one syste
?? H
字號:
//******************************************************************************
//*
//*     FULLNAME:  Single-Chip Microcontroller Real-Time Operating System
//*
//*     NICKNAME:  scmRTOS
//*
//*     PURPOSE:  OS Kernel Header. Declarations And Definitions
//*
//*     Version: 3.05
//*
//*     $Revision: 195 $
//*     $Date:: 2008-06-19 #$
//*
//*     Copyright (c) 2003-2008, Harry E. Zhurov
//*
//*     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.
//*
//*     =================================================================
//*     See http://scmrtos.sourceforge.net for documentation, latest
//*     information, license and contact details.
//*     =================================================================
//*
//*****************************************************************************

#ifndef OS_KERNEL_H
#define OS_KERNEL_H

#include <stddef.h>
#include <commdefs.h>
#include <usrlib.h>

//------------------------------------------------------------------------------

//==============================================================================
extern "C" void OS_Start(TStackItem* sp);

#if scmRTOS_CONTEXT_SWITCH_SCHEME == 0
    extern "C" void OS_ContextSwitcher(TStackItem** Curr_SP, TStackItem* Next_SP);
#else
    extern "C" TStackItem* OS_ContextSwitchHook(TStackItem* sp);
#endif

//==============================================================================

//------------------------------------------------------------------------------
//
//
//     NAME       :   OS
//
//     PURPOSE    :   Namespace for all OS stuff
//
//     DESCRIPTION:   Includes:  Kernel,
//                               Processes,
//                               Mutexes,
//                               Event Flags,
//                               Byte-wide Channels,
//                               Arbitrary-type Channels,
//                               Messages
//
namespace OS
{
    INLINE inline void SetPrioTag(TProcessMap& pm, const TProcessMap PrioTag) { pm |=  PrioTag; }
    INLINE inline void ClrPrioTag(TProcessMap& pm, const TProcessMap PrioTag) { pm &= ~PrioTag; }

    //--------------------------------------------------------------------------
    //
    //     NAME       :   TKernel
    //
    ///  Implements kernel-level operations such as
    ///  process management, process-level scheduling,
    ///  ISR-level scheduling, system timing.
    //
    //     DESCRIPTION:
    //
    //
    class TKernel
    {
        //-----------------------------------------------------------
        //
        //     Declarations
        //
        friend class TISRW;
        friend class TISRW_SS;
        friend class TBaseProcess;
        friend class TMutex;
        friend class TEventFlag;
        friend class TChannel;
        friend class TBaseMessage;

        template<typename T, word size, class S> friend class channel;
        template<typename T>                     friend class message;

        friend void          Run();
        friend void          WakeUpProcess(TBaseProcess& p);
        friend void          ForceWakeUpProcess(TBaseProcess& p);
        friend inline bool   IsProcessSleeping(const TBaseProcess& p);
        friend inline bool   IsProcessSuspended(const TBaseProcess& p);
        friend inline dword  GetTickCount();

        //-----------------------------------------------------------
        //
        //      Data
        //
    private:
        byte CurProcPriority;
        TProcessMap ReadyProcessMap;
        TBaseProcess* ProcessTable[scmRTOS_PROCESS_COUNT+1];
        volatile byte ISR_NestCount;

    #if scmRTOS_CONTEXT_SWITCH_SCHEME == 1
        byte SchedProcPriority;
    #endif

    #if scmRTOS_SYSTEM_TICKS_ENABLE == 1
        volatile dword SysTickCount;
    #endif

    //-----------------------------------------------------------
    //
    //      Functions
    //
    public:
        INLINE TKernel()
            : CurProcPriority(pr0)
            , ReadyProcessMap( (1 << (scmRTOS_PROCESS_COUNT + 1)) - 1)  // set all processes ready
            , ISR_NestCount(0)
        {
        }

    private:
        INLINE inline void RegisterProcess(TBaseProcess* const p);

        void Sched();
        INLINE void Scheduler() { if(ISR_NestCount) return; else  Sched(); }
        INLINE inline void SchedISR();

    #if scmRTOS_CONTEXT_SWITCH_SCHEME == 1
        INLINE inline bool IsContextSwitchDone() const volatile;
    #endif
        INLINE void SetProcessReady  (const byte pr) { TProcessMap PrioTag = GetPrioTag(pr); SetPrioTag( ReadyProcessMap, PrioTag); }
        INLINE void SetProcessUnready(const byte pr) { TProcessMap PrioTag = GetPrioTag(pr); ClrPrioTag( ReadyProcessMap, PrioTag); }

    public:
        INLINE inline void SystemTimer();
    #if scmRTOS_CONTEXT_SWITCH_SCHEME == 1
        INLINE inline TStackItem* ContextSwitchHook(TStackItem* sp);
    #endif

    };  // End of TKernel class definition
    //--------------------------------------------------------------------------
    extern TKernel Kernel;

    //--------------------------------------------------------------------------
    //
    /// BaseProcess
    ///
    /// Implements base class-type for application processes
    //
    //      DESCRIPTION:
    //
    //
    class TBaseProcess
    {
        friend class TKernel;
        friend class TISRW;
        friend class TISRW_SS;
        friend class TEventFlag;
        friend class TMutex;
        friend class TBaseMessage;

        template<typename T, word size, class S> friend class channel;
        template<typename T>                     friend class message;


        friend void         Run();
        friend void         WakeUpProcess(TBaseProcess& p);
        friend void         ForceWakeUpProcess(TBaseProcess& p);
        friend bool         IsProcessSleeping(const TBaseProcess& p);
        friend bool         IsProcessSuspended(const TBaseProcess& p);

    public:
    #if SEPARATE_RETURN_STACK == 0
        TBaseProcess( TStackItem* Stack, TPriority pr, void (*exec)() );
    #else
        TBaseProcess( TStackItem* Stack, TStackItem* RStack, TPriority pr, void (*exec)() );
    #endif

        static void Sleep(TTimeout timeout = 0);

    protected:
        TStackItem* StackPointer;
        TTimeout Timeout;
        TPriority Priority;
    };
    //--------------------------------------------------------------------------

    //--------------------------------------------------------------------------
    //
    ///  process
    ///
    ///  Implements template for application processes instantiation
    //
    //      DESCRIPTION:
    //
    //
    #if SEPARATE_RETURN_STACK == 0
        template<TPriority pr, word stack_size>
        class process : public TBaseProcess
        {
        public:
            INLINE process() : TBaseProcess(&Stack[stack_size/sizeof(TStackItem)]
                                      , pr
                                      , (void (*)())Exec)
            {
            }

            OS_PROCESS static void Exec();

        private:
            TStackItem Stack[stack_size/sizeof(TStackItem)];
        };
    #else
        template<TPriority pr, word stack_size, word rstack_size>
        class process : public TBaseProcess
        {
        public:
            INLINE process() : TBaseProcess( &Stack[stack_size/sizeof(TStackItem)]
                                    , &RStack[rstack_size/sizeof(TStackItem)]
                                    , pr
                                    , (void (*)())Exec)
            {
            }

            OS_PROCESS static void Exec();

        private:
            TStackItem Stack [stack_size/sizeof(TStackItem)];
            TStackItem RStack[rstack_size/sizeof(TStackItem)];
        };
    #endif
    //--------------------------------------------------------------------------

    //--------------------------------------------------------------------------
    //
    //       Miscellaneous
    //
    //
    INLINE inline void LockSystemTimer()   { TCritSect cs; LOCK_SYSTEM_TIMER();   }
    INLINE inline void UnlockSystemTimer() { TCritSect cs; UNLOCK_SYSTEM_TIMER(); }
    void WakeUpProcess(TBaseProcess& p);
    void ForceWakeUpProcess(TBaseProcess& p);
    INLINE inline void Sleep(TTimeout t = 0) { TBaseProcess::Sleep(t); }

    INLINE inline bool IsProcessSleeping(const TBaseProcess& p)
    {
        TCritSect cs;
        if(p.Timeout)
            return true;
        else
            return false;
    }

    INLINE inline bool IsProcessSuspended(const TBaseProcess& p)
    {
        TCritSect cs;
        if(Kernel.ReadyProcessMap & GetPrioTag(p.Priority))
            return false;
        else
            return true;
    }
    //--------------------------------------------------------------------------

#if scmRTOS_SYSTEM_TICKS_ENABLE == 1
    INLINE inline dword GetTickCount() { TCritSect cs; return Kernel.SysTickCount; }
#endif

#if scmRTOS_SYSTIMER_HOOK_ENABLE == 1
    void  SystemTimerUserHook();
#endif

}
//------------------------------------------------------------------------------

//------------------------------------------------------------------------------
//
///  Register Process
///
///  Places pointer to process in kernel's process table
//
void OS::TKernel::RegisterProcess(OS::TBaseProcess* const p)
{
    ProcessTable[p->Priority] = p;
}
//------------------------------------------------------------------------------
//
/// System Timer Implementation
///
/// Performs process's timeouts checking and
///               moving processes to ready-to-run state
//
void OS::TKernel::SystemTimer()
{
    SYS_TIMER_CRIT_SECT();
#if scmRTOS_SYSTEM_TICKS_ENABLE == 1
    SysTickCount++;
#endif

#if scmRTOS_PRIORITY_ORDER == 0
    const byte BaseIndex = 0;
#else
    const byte BaseIndex = 1;
#endif

    for(byte i = BaseIndex; i < (scmRTOS_PROCESS_COUNT + BaseIndex); i++)
    {
        TBaseProcess* p = ProcessTable[i];

        if(p->Timeout > 0)
        {
            if(--p->Timeout == 0)
            {
                SetProcessReady(p->Priority);
            }
        }
    }
}
//------------------------------------------------------------------------------
//
///    ISR optimized scheduler
///
///    !!! IMPORTANT: This function must be call from ISR services only !!!
//
//
#if scmRTOS_CONTEXT_SWITCH_SCHEME == 0
void OS::TKernel::SchedISR()
{
    byte NextPrty = GetHighPriority(ReadyProcessMap);
    if(NextPrty != CurProcPriority)
    {
        TStackItem*  Next_SP = ProcessTable[NextPrty]->StackPointer;
        TStackItem** Curr_SP_addr = &(ProcessTable[CurProcPriority]->StackPointer);
        CurProcPriority = NextPrty;
        OS_ContextSwitcher(Curr_SP_addr, Next_SP);
    }
}
#else
void OS::TKernel::SchedISR()
{
    byte NextPrty = GetHighPriority(ReadyProcessMap);
    if(NextPrty != CurProcPriority)
    {
        SchedProcPriority    = NextPrty;
        RaiseContextSwitch();
    }
}
//------------------------------------------------------------------------------
bool OS::TKernel::IsContextSwitchDone() const volatile
{
     byte cur    = CurProcPriority;    ///< reading to temporary vars is performed due to
     byte sched  = SchedProcPriority;  ///< suppress warning about order of volatile access
     return cur == sched;
}
//------------------------------------------------------------------------------
TStackItem* OS::TKernel::ContextSwitchHook(TStackItem* sp)
{
    ProcessTable[CurProcPriority]->StackPointer = sp;
    sp = ProcessTable[SchedProcPriority]->StackPointer;

#if scmRTOS_CONTEXT_SWITCH_USER_HOOK_ENABLE == 1
    ContextSwitchUserHook();
#endif 

    CurProcPriority = SchedProcPriority;
    return sp;
}
//------------------------------------------------------------------------------
#endif // scmRTOS_CONTEXT_SWITCH_SCHEME

//-----------------------------------------------------------------------------
/// Start Operation
INLINE inline void OS::Run()
{
    TStackItem* sp = Kernel.ProcessTable[pr0]->StackPointer;
    OS_Start(sp);
}

#include <OS_Services.h>

#endif // OS_KERNEL_H

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产精品美女久久福利网站| 一区二区三区在线影院| 日本成人中文字幕在线视频| 欧美三级电影网| 无吗不卡中文字幕| 91精品国产综合久久久久久漫画| 一区二区三区四区在线免费观看 | 欧美高清性hdvideosex| 婷婷综合在线观看| 日韩精品专区在线| 国产福利91精品一区二区三区| 久久精品欧美日韩| av一区二区三区四区| 亚洲人成精品久久久久| 欧美日韩国产三级| 精品一区二区三区的国产在线播放| 欧美精品一区二区三区很污很色的| 国产伦精品一区二区三区免费 | 亚洲第一搞黄网站| 4438x亚洲最大成人网| 韩国欧美一区二区| 中文字幕一区二区三区不卡在线| 91国偷自产一区二区使用方法| 性感美女久久精品| 国产日韩亚洲欧美综合| 色婷婷综合久久久久中文一区二区 | 天堂va蜜桃一区二区三区 | 中文字幕制服丝袜成人av| 91麻豆国产福利在线观看| 午夜a成v人精品| 2021国产精品久久精品| 色综合天天性综合| 久久国产麻豆精品| 亚洲人成人一区二区在线观看| 欧美一区二区精品在线| 不卡视频在线观看| 热久久免费视频| 中文字幕综合网| 91精品免费观看| aaa国产一区| 精品一区二区在线看| 亚洲欧洲在线观看av| 日韩精品一区二区三区视频播放| 91首页免费视频| 国产一区二区三区电影在线观看| 亚洲精品伦理在线| 国产亚洲欧美色| 91精品啪在线观看国产60岁| 99精品在线免费| 国产乱妇无码大片在线观看| 天天色图综合网| 亚洲女同一区二区| 国产亚洲欧美在线| 欧美变态口味重另类| 日本久久电影网| 成人激情免费视频| 韩国成人福利片在线播放| 亚洲韩国精品一区| 日韩伦理av电影| 国产亚洲成aⅴ人片在线观看 | 久久只精品国产| 91精品国产一区二区| 日本高清成人免费播放| 成人网在线免费视频| 国产精品888| 九九视频精品免费| 免费成人在线视频观看| 亚洲一区二区三区激情| 国产精品成人午夜| 日韩理论电影院| 国产精品福利一区| 欧美国产日韩在线观看| 国产午夜亚洲精品理论片色戒| 欧美成人免费网站| 日韩精品一区二区三区老鸭窝| 欧美丰满高潮xxxx喷水动漫| 欧美在线一区二区三区| 在线欧美日韩国产| 欧美中文字幕亚洲一区二区va在线 | 91精品国产色综合久久不卡蜜臀| 色一情一伦一子一伦一区| 99精品视频一区二区三区| 成人av电影免费在线播放| 风流少妇一区二区| 成人午夜av在线| av亚洲精华国产精华精华| 成人av小说网| 99精品国产视频| 欧美亚洲丝袜传媒另类| 欧美日韩在线免费视频| 欧美日韩免费电影| 91精品国产一区二区三区| 日韩欧美成人午夜| 精品国产精品一区二区夜夜嗨| 精品国产乱码久久久久久牛牛| 久久综合99re88久久爱| 亚洲国产精品黑人久久久| 国产精品久久久久久久久久免费看 | 欧美激情自拍偷拍| 国产精品国产三级国产普通话三级| 国产精品久久久久久久裸模| 亚洲女人的天堂| 亚洲国产裸拍裸体视频在线观看乱了| 亚洲777理论| 国产成人综合自拍| 色欧美88888久久久久久影院| 欧美一区三区二区| 国产欧美日韩精品a在线观看| 亚洲欧洲精品一区二区三区不卡 | 中文字幕欧美一| 偷拍自拍另类欧美| 国产福利精品导航| 欧美性感一区二区三区| 精品国产一区久久| 国产精品嫩草99a| 亚洲成人福利片| 成人性生交大合| 欧美日韩在线三级| 国产精品三级av在线播放| 亚洲福利视频一区| 国产成人精品亚洲日本在线桃色| 色婷婷精品久久二区二区蜜臂av| 9191久久久久久久久久久| 2021中文字幕一区亚洲| 欧美激情在线观看视频免费| 亚洲国产美女搞黄色| 狠狠色丁香九九婷婷综合五月| 成人在线视频首页| 欧美影院一区二区三区| 在线一区二区三区四区| 91精品国产综合久久精品图片| 久久精品在这里| 一区二区三区在线免费观看| 国产剧情一区二区| 在线观看日韩电影| 久久男人中文字幕资源站| 亚洲手机成人高清视频| 亚洲免费观看高清完整版在线观看熊| 日韩成人免费在线| 成人国产免费视频| 欧美丰满嫩嫩电影| 自拍偷拍欧美精品| 日产国产欧美视频一区精品| 97超碰欧美中文字幕| 欧美一卡二卡在线观看| 国产精品福利av| 卡一卡二国产精品| 99精品视频一区二区三区| 精品国产在天天线2019| 亚洲午夜私人影院| 大陆成人av片| 69成人精品免费视频| 亚洲夂夂婷婷色拍ww47| 狠狠狠色丁香婷婷综合久久五月| 欧美亚洲日本国产| 中文字幕中文字幕一区| 蜜乳av一区二区| 欧美一级片在线看| 亚洲已满18点击进入久久| 成人午夜av电影| 久久久五月婷婷| 精一区二区三区| 91精品一区二区三区在线观看| 亚洲另类在线视频| 国产一区二区不卡| 欧美一区二区三区免费视频| 性久久久久久久久久久久| 色呦呦国产精品| 亚洲视频资源在线| 国产成人亚洲综合色影视| 国产嫩草影院久久久久| 老司机精品视频导航| 欧美精品自拍偷拍动漫精品| 亚洲欧美另类久久久精品| 天堂在线亚洲视频| 日韩一区二区三区观看| 亚洲大片精品永久免费| 欧美亚洲动漫精品| 亚洲精品久久久蜜桃| 色狠狠桃花综合| 亚洲精选在线视频| 99久久精品免费看国产 | 欧美视频一区二区在线观看| 亚洲黄色免费网站| 91在线观看一区二区| 中文成人av在线| 成人午夜电影小说| 亚洲人成在线播放网站岛国| 99国产精品国产精品毛片| 国产精品夫妻自拍| 色综合久久99| 26uuu精品一区二区| 成人午夜激情片| 亚洲女厕所小便bbb| 色婷婷av一区二区三区软件| 亚洲婷婷综合色高清在线| 欧美日韩国产精品自在自线| 亚洲综合一区在线| 91在线云播放| 亚洲精选视频免费看|