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

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

?? os_services.h

?? scmRTOS is real-time preemptive operating system and supports up to 31 user processes (and one syste
?? H
?? 第 1 頁 / 共 2 頁
字號:
//------------------------------------------------------------------------------
void OS::TEventFlag::SignalISR()
{
    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.
    }
    else
    {
        Value = efOn;                                
    }
}
//------------------------------------------------------------------------------
template<typename T, word Size, typename S>
void OS::channel<T, Size, S>::CheckWaiters(TProcessMap& pm)
{
    if(pm)
    {
        TProcessMap Timeouted = Kernel.ReadyProcessMap;

        SetPrioTag(Kernel.ReadyProcessMap, pm);       // place all waiting processes to the ready map
        ClrPrioTag(pm, ~Timeouted);                   // remove waiting processes from the wait map
        Kernel.Scheduler();
    }
}
//------------------------------------------------------------------------------
template<typename T, word Size, typename S>
void OS::channel<T, Size, S>::push(const T& item)
{
    TCritSect cs;

    while(!pool.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();                           
    }

    pool.push_back(item);
    CheckWaiters(ConsumersProcessMap);
}
//------------------------------------------------------------------------------
template<typename T, word Size, typename S>
void OS::channel<T, Size, S>::push_front(const T& item)
{
    TCritSect cs;

    while(!pool.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();
    }

    pool.push_front(item);
    CheckWaiters(ConsumersProcessMap);
}
//------------------------------------------------------------------------------
template<typename T, word Size, typename S>
bool OS::channel<T, Size, S>::pop(T& item, TTimeout timeout)
{
    TCritSect cs;

    if(pool.get_count())
    {
        item = pool.pop();
        CheckWaiters(ProducersProcessMap);
        return true;
    }
    else
    {
        TBaseProcess* p = Kernel.ProcessTable[Kernel.CurProcPriority];
        p->Timeout = timeout;

        TProcessMap PrioTag = GetPrioTag(Kernel.CurProcPriority);
        for(;;)
        {
            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();                           

            if(pool.get_count())                          
            {
                p->Timeout = 0;
                item = pool.pop();
                CheckWaiters(ProducersProcessMap);
                return true;
            }

            if(ConsumersProcessMap & PrioTag)             // waked up by timer when timeout expired
            {                                             // or by OS::ForceWakeUpProcess()

                p->Timeout = 0;                           // non-zero if waked up by ForceWakeUpProcess()
                ClrPrioTag(ConsumersProcessMap, PrioTag); // remove current process from the wait map
                return false;
            }
        }
    }
}
//------------------------------------------------------------------------------
template<typename T, word Size, typename S>
bool OS::channel<T, Size, S>::pop_back(T& item, TTimeout timeout)
{
    TCritSect cs;

    if(pool.get_count())
    {
        item = pool.pop_back();
        CheckWaiters(ProducersProcessMap);
        return true;
    }
    else
    {
        TBaseProcess* p = Kernel.ProcessTable[Kernel.CurProcPriority];
        p->Timeout = timeout;

        TProcessMap PrioTag = GetPrioTag(Kernel.CurProcPriority);
        for(;;)
        {
            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();                           

            if(pool.get_count())                          
            {
                p->Timeout = 0;
                item = pool.pop_back();
                CheckWaiters(ProducersProcessMap);
                return true;
            }

            if(ConsumersProcessMap & PrioTag)             // waked up by timer when timeout expired
            {                                             // or by OS::ForceWakeUpProcess()

                p->Timeout = 0;                           // non-zero if waked up by ForceWakeUpProcess()
                ClrPrioTag(ConsumersProcessMap, PrioTag); // remove current process from the wait map
                return false;
            }
        }
    }
}
//------------------------------------------------------------------------------
template<typename T, word Size, typename S>
void OS::channel<T, Size, S>::flush()
{
    TCritSect cs;
    pool.flush();
    CheckWaiters(ProducersProcessMap);
}
//------------------------------------------------------------------------------
template<typename T, word Size, typename S>
void OS::channel<T, Size, S>::write(const T* data, const S count)
{
    TCritSect cs;

    while(pool.get_free_size() < count)
    {
        TProcessMap PrioTag = GetPrioTag(Kernel.CurProcPriority);
        SetPrioTag(ProducersProcessMap, PrioTag);     // channel does not have enough space, put current process to the wait map
        ClrPrioTag(Kernel.ReadyProcessMap, PrioTag);  // remove current process from the ready map
        Kernel.Scheduler();
    }

    pool.write(data, count);
    CheckWaiters(ConsumersProcessMap);
}
//------------------------------------------------------------------------------
template<typename T, word Size, typename S>
bool OS::channel<T, Size, S>::read(T* const data, const S count, TTimeout timeout)
{
    TCritSect cs;

    TBaseProcess* p = Kernel.ProcessTable[Kernel.CurProcPriority];
    p->Timeout = timeout;

    TProcessMap PrioTag = GetPrioTag(Kernel.CurProcPriority);
    while(pool.get_count() < count)
    {
        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();

        if(ConsumersProcessMap & PrioTag)             // waked up by timer when timeout expired
        {                                             // or by OS::ForceWakeUpProcess()

            p->Timeout = 0;                           // non-zero if waked up by ForceWakeUpProcess()
            ClrPrioTag(ConsumersProcessMap, PrioTag); // remove current process from the wait map
            return false;
        }
    }

    p->Timeout = 0;
    pool.read(data, count);
    CheckWaiters(ProducersProcessMap);

    return true;
}
//------------------------------------------------------------------------------

//------------------------------------------------------------------------------
//
//              OS::message template
//
//          Function-members implementation
//
//
//------------------------------------------------------------------------------
void OS::TBaseMessage::sendISR()
{
    TCritSect cs;

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

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产精品三级电影| 精品999在线播放| 狠狠色伊人亚洲综合成人| 国产日韩欧美综合在线| 欧美日韩色综合| 成人黄色一级视频| 日本亚洲欧美天堂免费| 专区另类欧美日韩| 国产亚洲午夜高清国产拍精品| 欧美日韩专区在线| 成人h动漫精品一区二区| 麻豆精品视频在线观看视频| 亚洲激情在线激情| 国产精品美女久久久久aⅴ国产馆| 91精品国产91热久久久做人人| 色综合天天综合网天天狠天天| 国产乱码精品一区二区三区av | 久久天天做天天爱综合色| 欧洲亚洲国产日韩| 97超碰欧美中文字幕| 成人在线综合网| 国内精品伊人久久久久av影院 | 日韩一区欧美小说| 国产亚洲精品久| 精品久久久久久久一区二区蜜臀| 欧洲另类一二三四区| 91蝌蚪porny九色| 成人免费福利片| 国产a区久久久| 国产一区二区三区美女| 极品美女销魂一区二区三区免费 | 波多野结衣亚洲| 成人一区二区三区视频在线观看| 国内精品国产成人| 麻豆国产精品视频| 久久精品99国产精品| 轻轻草成人在线| 日本成人在线视频网站| 婷婷综合久久一区二区三区| 亚洲成人精品在线观看| 亚洲综合小说图片| 亚洲最大色网站| 亚洲国产精品视频| 午夜精品久久久久久久蜜桃app| 亚洲韩国一区二区三区| 亚洲国产精品一区二区www在线| 亚洲电影激情视频网站| 五月天一区二区| 日本不卡视频一二三区| 久久99精品视频| 国内外精品视频| 成人av一区二区三区| 99久久er热在这里只有精品15| 99久久免费国产| 色94色欧美sute亚洲线路二| 欧美系列一区二区| 91精品国产综合久久香蕉麻豆| 3d动漫精品啪啪| 精品国产免费久久| 国产精品午夜在线观看| 亚洲色图在线播放| 偷拍亚洲欧洲综合| 国内精品久久久久影院色 | 精品免费视频一区二区| xfplay精品久久| 国产精品久久久久精k8| 一个色妞综合视频在线观看| 午夜精品一区二区三区免费视频 | 中文字幕电影一区| 亚洲毛片av在线| 日韩av网站免费在线| 国产成人综合自拍| 欧美影片第一页| 日韩欧美在线1卡| 国产精品嫩草99a| 午夜精品福利一区二区蜜股av| 久久国产日韩欧美精品| 99在线精品一区二区三区| 欧美精品日韩一本| 欧美激情综合五月色丁香 | 国产精品夜夜爽| 日本精品裸体写真集在线观看| 欧美一区二区三区四区五区 | 91在线丨porny丨国产| 91麻豆精品国产91久久久久久久久| 亚洲黄色尤物视频| 日本中文在线一区| 北条麻妃一区二区三区| 欧美巨大另类极品videosbest| 久久久99精品免费观看| 亚洲一区二区影院| 丰满白嫩尤物一区二区| 欧美麻豆精品久久久久久| 中文字幕av一区二区三区高 | av资源网一区| 日韩精品一区在线观看| 亚洲丝袜精品丝袜在线| 久久99精品国产91久久来源| 色综合久久中文字幕| 久久综合九色欧美综合狠狠| 亚洲综合一区二区| 97国产精品videossex| 久久日韩粉嫩一区二区三区| 亚洲成av人片在线观看| jlzzjlzz亚洲日本少妇| 精品国产污污免费网站入口 | 一区二区三区四区在线| 国产毛片精品国产一区二区三区| 欧美亚日韩国产aⅴ精品中极品| 欧美高清在线一区二区| 精品无人码麻豆乱码1区2区| 欧美日韩一级黄| 亚洲精品久久7777| a在线播放不卡| 国产欧美日韩在线| 韩国一区二区视频| 日韩亚洲欧美在线| 亚洲电影一级黄| 色又黄又爽网站www久久| 国产精品久久免费看| 国产精品一区二区不卡| 日韩欧美国产麻豆| 热久久国产精品| 日韩午夜中文字幕| 日本亚洲一区二区| 欧美一区二区日韩| 天天色天天爱天天射综合| 日本韩国欧美国产| 亚洲黄色尤物视频| 在线观看中文字幕不卡| 亚洲一区二区av电影| 在线日韩国产精品| 成人一区二区三区视频 | 另类中文字幕网| 日韩欧美精品三级| 久久99国产精品久久| 91精品国产综合久久精品图片| 午夜精品久久久久久久久久久| 欧美日韩五月天| 奇米777欧美一区二区| 欧美zozo另类异族| 国产一区视频网站| 久久精品无码一区二区三区| 国产ts人妖一区二区| 国产精品全国免费观看高清| youjizz国产精品| 亚洲精品欧美在线| 7777精品伊人久久久大香线蕉超级流畅| 亚洲高清免费一级二级三级| 欧美高清dvd| 久久66热re国产| 国产女同性恋一区二区| 91在线观看地址| 日韩影院在线观看| www欧美成人18+| av不卡免费在线观看| 亚洲成人自拍网| 日韩欧美一区在线观看| 国产一区二区三区av电影 | 精品国产露脸精彩对白| 国产一区二区免费在线| 成人免费视频播放| 伊人色综合久久天天人手人婷| 午夜精品123| 久久久久久影视| 97超碰欧美中文字幕| 日韩中文欧美在线| 久久久.com| 欧美综合色免费| 久久66热re国产| 亚洲精品免费看| 日韩欧美电影在线| 99久久久久久99| 日本伊人色综合网| 亚洲国产成人自拍| 欧美久久久久久久久久| 国产精品亚洲一区二区三区妖精| 亚洲精品免费在线| 欧美精品一区二区三区一线天视频| youjizz国产精品| 免费观看成人鲁鲁鲁鲁鲁视频| 国产亚洲精品久| 7777精品久久久大香线蕉| 丰满亚洲少妇av| 日韩黄色免费电影| 中文字幕中文乱码欧美一区二区| 91精品国产综合久久福利软件| 成人午夜视频在线观看| 日韩av不卡在线观看| 国产精品免费网站在线观看| 欧美一级淫片007| 色丁香久综合在线久综合在线观看| 蜜桃视频在线观看一区| 亚洲精品国产a| 国产视频911| 精品免费视频一区二区| 欧美三级视频在线| 97久久久精品综合88久久| 国产一区不卡视频| 免费欧美日韩国产三级电影|