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

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

?? os_services.cpp

?? scmRTOS is real-time preemptive operating system and supports up to 31 user processes (and one syste
?? CPP
字號:
//******************************************************************************
//*
//*     FULLNAME:  Single-Chip Microcontroller Real-Time Operating System
//*
//*     NICKNAME:  scmRTOS
//*
//*     PURPOSE:  OS Services Source
//*
//*     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.
//*     =================================================================
//*
//******************************************************************************

#include "scmRTOS.h"

using namespace OS;

//------------------------------------------------------------------------------
//
//
//      TEventFlag
//
//
bool OS::TEventFlag::Wait(TTimeout timeout)
{
    TCritSect cs;

    if(Value)                                           // if flag already signaled 
    {                                                  
        Value = efOff;                                  // clear flag
        return true;
    }
    else
    {
        TBaseProcess* p = Kernel.ProcessTable[Kernel.CurProcPriority];
        p->Timeout = timeout;
        TProcessMap PrioTag = GetPrioTag(Kernel.CurProcPriority);

        SetPrioTag(ProcessMap, PrioTag);                // put current process to the wait map
        ClrPrioTag(Kernel.ReadyProcessMap, PrioTag);    // remove current process from the ready map
                                                       
        Kernel.Scheduler();                            
                                                       
        p->Timeout = 0;                                
                                                       
        if( !(ProcessMap & PrioTag) )                   // if waked up by signal() or signal_ISR()
            return true;                               
                                                       
        ClrPrioTag(ProcessMap, PrioTag);                // otherwise waked up by timeout or by 
        return false;                                   // OS::ForceWakeUpProcess(), remove process from the wait map
    }                                                        
}
//------------------------------------------------------------------------------
void OS::TEventFlag::Signal()
{
    TCritSect cs;
    if(ProcessMap)                                      // if any process waits for event
    {
        TProcessMap Timeouted = Kernel.ReadyProcessMap; // Process has its tag set in ReadyProcessMap if timeout expired
                                                        // or it was waked up by OS::ForceWakeUpProcess()  

        SetPrioTag(Kernel.ReadyProcessMap, ProcessMap); // place all waiting processes to the ready map
        ClrPrioTag(ProcessMap, ~Timeouted);             // remove all non-timeouted processes from the waiting map.
                                                        // Used to check that process waked up by signal() or signalISR()
                                                        // and not by timeout and OS::ForceWakeUpProcess()
        Kernel.Scheduler();                            
    }                                                  
    else                                               
    {                                                  
        Value = efOn;                                   
    }
}
//------------------------------------------------------------------------------

//------------------------------------------------------------------------------
//
//
//      TMutex
//
//
void OS::TMutex::Lock()
{
    TCritSect cs;

    TProcessMap PrioTag = GetPrioTag(Kernel.CurProcPriority);
    while(ValueTag)
    {
        SetPrioTag(ProcessMap, PrioTag);             // mutex already locked by another process, put current process to the wait map
        ClrPrioTag(Kernel.ReadyProcessMap, PrioTag); // remove current process from the ready map

        Kernel.Scheduler();
    }
    ValueTag = PrioTag;                              // mutex has been successfully locked
}
//------------------------------------------------------------------------------
void OS::TMutex::Unlock()
{
    TCritSect cs;

    TProcessMap PrioTag = GetPrioTag(Kernel.CurProcPriority);
    if(ValueTag != PrioTag) return;                  // the only process that had locked mutex can unlock the mutex
    ValueTag = 0;
    if(ProcessMap)
    {
        byte pr = GetHighPriority(ProcessMap);
        TProcessMap PrioTag = GetPrioTag(pr);
        ClrPrioTag(ProcessMap, PrioTag);             // remove next ready process from the wait map
        SetPrioTag(Kernel.ReadyProcessMap, PrioTag); // place next process to the ready map
        Kernel.Scheduler();
    }
}
//------------------------------------------------------------------------------


//------------------------------------------------------------------------------
//
//
//      TChannel
//
//
void OS::TChannel::CheckWaiters(TProcessMap& pm)
{
    if(pm)
    {
        byte pr = GetHighPriority(pm);
        TProcessMap PrioTag = GetPrioTag(pr);
        ClrPrioTag(pm, PrioTag);                     // remove next ready process from the wait map
        SetPrioTag(Kernel.ReadyProcessMap, PrioTag); // place next process to the ready map
        Kernel.Scheduler();
    }
}
//------------------------------------------------------------------------------
void OS::TChannel::Push(byte x)
{
    TCritSect cs;

    while (!Cbuf.get_free_size())
    {
        TProcessMap PrioTag = GetPrioTag(Kernel.CurProcPriority);
        SetPrioTag  (ProducersProcessMap, PrioTag);  // channel is full, put current process to the wait map
        ClrPrioTag(Kernel.ReadyProcessMap, PrioTag); // remove current process from the ready map
        Kernel.Scheduler();                          // wait until waked-up by Pop() or Read()
    }

    Cbuf.put(x);
    CheckWaiters(ConsumersProcessMap);
}
//------------------------------------------------------------------------------
byte OS::TChannel::Pop()
{
    TCritSect cs;
    byte x;

    while(!Cbuf.get_count())
    {
        TProcessMap PrioTag = GetPrioTag(Kernel.CurProcPriority);
        SetPrioTag(ConsumersProcessMap, PrioTag);    // channel is empty, put current process to the wait map
        ClrPrioTag(Kernel.ReadyProcessMap, PrioTag); // remove current process from the ready map
        Kernel.Scheduler();                          // wait until waked up by Push() or Write()
    }
    x = Cbuf.get();
    CheckWaiters(ProducersProcessMap);
    return x;
}
//------------------------------------------------------------------------------
void OS::TChannel::Write(const byte* data, const byte count)
{
    TCritSect cs;

    while(Cbuf.get_free_size() < count)
    {
        TProcessMap PrioTag = GetPrioTag(Kernel.CurProcPriority);
        SetPrioTag(ProducersProcessMap, PrioTag);    // channel has not enough space, put current process to the wait map
        ClrPrioTag(Kernel.ReadyProcessMap, PrioTag); // remove current process from the ready map
        Kernel.Scheduler();                          // wait until waked up by Read() or Pop()
    }

    Cbuf.write(data, count);
    CheckWaiters(ConsumersProcessMap);
}
//------------------------------------------------------------------------------
void OS::TChannel::Read(byte* const data, const byte count)
{
    TCritSect cs;

    while(Cbuf.get_count() < count)
    {
        TProcessMap PrioTag = GetPrioTag(Kernel.CurProcPriority);
        SetPrioTag(ConsumersProcessMap, PrioTag);    // channel doesn't contain enough data, put current process to the wait map
        ClrPrioTag(Kernel.ReadyProcessMap, PrioTag); // remove current process from the ready map
        Kernel.Scheduler();                          // wait until waked up by Write() or Push()
    }

    Cbuf.read(data, count);
    CheckWaiters(ProducersProcessMap);
}
//------------------------------------------------------------------------------

//------------------------------------------------------------------------------
//
//              OS::message template
//
//          Function-members implementation
//
//
//------------------------------------------------------------------------------
bool OS::TBaseMessage::wait(TTimeout timeout)
{
    TCritSect cs;

    if(NonEmpty)                                                  // message alredy send
    {
        NonEmpty = false;
        return true;
    }
    else
    {
        TBaseProcess* p = Kernel.ProcessTable[Kernel.CurProcPriority];
        p->Timeout = timeout;
        TProcessMap PrioTag = GetPrioTag(Kernel.CurProcPriority);

        SetPrioTag(ProcessMap, PrioTag);                          // put current process to the wait map
        ClrPrioTag(Kernel.ReadyProcessMap, PrioTag);              // remove current process from the ready map
        Kernel.Scheduler();                                       // wait until wake up

        p->Timeout = 0;
        if( !(ProcessMap & PrioTag) )                             // if waked up by send() or sendISR()
            return true;
                                                                  
        ClrPrioTag(ProcessMap, PrioTag);                          // otherwise waked up by timeout or by
            return false;                                         // OS::ForceWakeUpProcess(), remove process from wait map
    }                                                                 
}
//------------------------------------------------------------------------------
void OS::TBaseMessage::send()
{
    TCritSect cs;

    if(ProcessMap)
    {
        TProcessMap Timeouted = Kernel.ReadyProcessMap;    // Process has its tag set in ReadyProcessMap if timeout expired,
                                                           // or it was waked up by OS::ForceWakeUpProcess()
        SetPrioTag(Kernel.ReadyProcessMap, ProcessMap);    // place all waiting processes to the ready map
        ClrPrioTag(ProcessMap, ~Timeouted);                // remove all non-timeouted processes from the waiting map.
        Kernel.Scheduler();
    }
    else
    {
        NonEmpty = true;
    }
}
//------------------------------------------------------------------------------

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产精品一区二区在线播放 | 日韩一级精品视频在线观看| 国产精品久久午夜夜伦鲁鲁| 成人综合在线视频| 亚洲欧洲日本在线| 欧美性猛交xxxx乱大交退制版| 亚洲激情男女视频| 久久精品一级爱片| 国产一区视频在线看| 2019国产精品| eeuss国产一区二区三区| 国产精品久久久久久福利一牛影视 | 久久综合九色综合97婷婷女人| 美女www一区二区| 久久久三级国产网站| 成人免费不卡视频| 亚洲国产精品欧美一二99| 欧美精品三级日韩久久| 久久成人久久爱| 国产精品久久久久久久久免费桃花| 色综合天天在线| 亚洲成人免费视频| 久久精品人人做人人综合| av中文字幕不卡| 蜜臀久久久久久久| 1024国产精品| 91精品国产一区二区三区香蕉| 看电影不卡的网站| 亚洲男人的天堂在线观看| 欧美精品乱码久久久久久按摩| 激情国产一区二区 | 依依成人精品视频| 日韩免费观看高清完整版| 成人黄色软件下载| 琪琪久久久久日韩精品| 欧美国产禁国产网站cc| 欧美久久久影院| eeuss影院一区二区三区| 亚洲国产精品嫩草影院| 日本欧美肥老太交大片| 日本一区二区三区国色天香| 欧美性三三影院| youjizz久久| 美腿丝袜亚洲综合| 亚洲一级在线观看| 综合亚洲深深色噜噜狠狠网站| 欧美一级生活片| 色丁香久综合在线久综合在线观看| 蜜臀av一区二区在线免费观看| 一区二区三区四区在线| 久久久综合激的五月天| 欧美放荡的少妇| 一本高清dvd不卡在线观看 | 蜜臀av国产精品久久久久| 国产精品久久久久aaaa樱花| 欧美一区二区三区的| 欧美午夜电影在线播放| 99久久伊人精品| 大尺度一区二区| 久久99精品视频| 日韩高清国产一区在线| 一区二区三区精品在线观看| 亚洲国产精品99久久久久久久久| 日韩视频国产视频| 在线播放日韩导航| 欧美在线观看一区| av中文字幕不卡| 99热精品一区二区| www.欧美日韩| 成人激情动漫在线观看| 国产综合成人久久大片91| 日韩精品欧美精品| 日韩电影在线免费| 日本不卡视频在线观看| 日韩综合一区二区| 日本视频一区二区三区| 日韩电影免费在线看| 日本视频免费一区| 黄色成人免费在线| 久久国产综合精品| 国产在线视频一区二区| 国产做a爰片久久毛片| 国内欧美视频一区二区 | 精品一区二区三区在线播放| 天堂午夜影视日韩欧美一区二区| 亚洲国产裸拍裸体视频在线观看乱了| 亚洲精品va在线观看| 亚洲一区二区三区自拍| 污片在线观看一区二区| 日韩高清一级片| 激情综合一区二区三区| 国产在线精品一区二区夜色 | 美女诱惑一区二区| 精品一区二区三区在线播放视频| 极品少妇xxxx偷拍精品少妇| 国产一区美女在线| 国产91清纯白嫩初高中在线观看 | 精品夜夜嗨av一区二区三区| 紧缚捆绑精品一区二区| 国产精品综合网| 91在线无精精品入口| 99视频精品在线| 制服丝袜成人动漫| 久久网站热最新地址| 中文字幕在线观看不卡| 亚洲成人av一区二区| 久久国产人妖系列| 99国产精品视频免费观看| 欧洲一区二区三区在线| 91精品免费观看| 日韩成人一级片| 国产中文一区二区三区| av中文字幕亚洲| 欧美一级黄色大片| 国产精品成人免费在线| 午夜天堂影视香蕉久久| 国产一区二区精品久久| 欧洲在线/亚洲| 久久精品一二三| 天堂av在线一区| 不卡在线观看av| 日韩欧美国产高清| 亚洲精品少妇30p| 精东粉嫩av免费一区二区三区| 丁香婷婷综合激情五月色| 欧美综合欧美视频| 国产精品网站在线| 日本亚洲最大的色成网站www| av成人免费在线观看| 欧美一区二区三区喷汁尤物| 国产精品剧情在线亚洲| 人人超碰91尤物精品国产| 91在线观看美女| 久久久久久免费网| 日产欧产美韩系列久久99| 91在线无精精品入口| 国产亚洲综合av| 秋霞电影网一区二区| 色哟哟一区二区| 国产精品视频线看| 韩日av一区二区| 91精品国模一区二区三区| 亚洲欧美精品午睡沙发| 国产一区二区久久| 欧美一区二区三区婷婷月色| 亚洲欧美日韩小说| www.日韩精品| 国产精品三级视频| 国产电影一区二区三区| 日韩一级片网址| 免费观看成人鲁鲁鲁鲁鲁视频| 在线视频欧美精品| 亚洲六月丁香色婷婷综合久久 | 亚洲视频中文字幕| 成人一级视频在线观看| 日韩一区二区三区视频| 亚洲国产一区二区视频| 91久久久免费一区二区| 亚洲欧洲成人自拍| 不卡区在线中文字幕| 国产亚洲成av人在线观看导航| 亚洲制服欧美中文字幕中文字幕| 精品国产第一区二区三区观看体验| 欧美精品一二三| 国产精品欧美一区喷水| 国产真实乱子伦精品视频| 日韩视频一区二区三区在线播放| 天堂蜜桃一区二区三区| 欧美影视一区在线| 亚洲一区免费视频| 欧美在线小视频| 性久久久久久久久| 欧美电影影音先锋| 日韩av成人高清| 久久众筹精品私拍模特| 狠狠v欧美v日韩v亚洲ⅴ| 久久毛片高清国产| 国产不卡视频一区二区三区| 久久精品男人天堂av| 成人午夜免费视频| 亚洲欧美在线视频| 欧美亚洲高清一区二区三区不卡| 亚洲成av人片一区二区三区| 欧美日韩国产首页| 狠狠色丁香久久婷婷综| 国产无一区二区| 色哟哟一区二区在线观看| 亚洲成人免费电影| xnxx国产精品| 不卡免费追剧大全电视剧网站| 亚洲免费成人av| 欧美一区二区三区系列电影| 国产九色sp调教91| 中文字幕一区二区三区在线观看 | 欧美亚洲一区二区在线观看| 三级亚洲高清视频| 国产午夜久久久久| 色综合色综合色综合| 免费黄网站欧美| 国产精品视频第一区|