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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? os_mem.c

?? 帶時鐘功能溫度和濕度測量的儀器
?? C
字號:
/*********************************************************************************************************
**				                               Small RTOS(51)
**                                   The Real-Time Kernel(For Keil c51)
**
**                                  (c) Copyright 2002-2003, chenmingji
**                                           All Rights Reserved
**
**                                                  V1.20.0
**
**
**--------------文件信息--------------------------------------------------------------------------------
**文   件   名: OS_mem.c
**創(chuàng)   建   人: 陳明計
**最后修改日期:  2003年8月3日
**描      述: 內(nèi)存動態(tài)分配模塊,可以在非Small RTOS(51)下使用。在Small RTOS(51)
**             下必須配置為支持重入棧。
**--------------歷史版本信息----------------------------------------------------------------------------
** 創(chuàng)建人: 陳明計
** 版  本: V1.20.0
** 日 期: 2003年8月3日
** 描 述: 原始版本
**
**------------------------------------------------------------------------------------------------------
**--------------當前版本修訂------------------------------------------------------------------------------
** 修改人: 
** 日 期:
** 描 述:
**
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
#define IN_OS_MEM
#include "config.h"

#ifndef EN_OS_MEM
#define EN_OS_MEM       0
#endif

#if EN_OS_MEM > 0
static struct _FreeMem xdata *OSFreeMem;                /* 自由內(nèi)存塊的雙向鏈表的頭 */


/*********************************************************************************************************
** 函數(shù)名稱: UserMemChkErr
** 功能描述: 內(nèi)存回收時出錯處理函數(shù),將EN_UserMemChkErr定義為1時,用戶可以自己定義這個函數(shù)。
** 輸 入: Addr: 應當回收的內(nèi)存塊
** 輸 出: 無
** 全局變量: 無
** 調(diào)用模塊: 無
**
** 作 者: 陳明計
** 日 期: 2003年8月3日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
#if EN_OS_MEM_CHK > 0 && EN_UserMemChkErr == 0
        void UserMemChkErr(void xdata *Addr) reentrant
{
    Addr = Addr;
    while (1);
}
#endif

/*********************************************************************************************************
** 函數(shù)名稱: OSMemInit
** 功能描述: 初始化動態(tài)內(nèi)存分配模塊。
** 輸 入: Addr: 指向空閑空間起始位置的指針
**        MemSize: 空閑空間的大小 
** 輸 出: TRUE: 成功
**        FALSE: 失敗
** 全局變量: 無
** 調(diào)用模塊: 無
**
** 作 者: 陳明計
** 日 期: 2003年8月3日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
        uint8 OSMemInit(void xdata *Addr, unsigned int MemSize)
{
    struct _FreeMem xdata *MemFree;
    
    MemSize = MemSize & ~(sizeof(int) - 1);     /* 內(nèi)存按照字(word)為單位分配 */
                                                /* 調(diào)整MemSize為字(word)的整數(shù)倍 */

    /* 判斷自由空間是否有效 */
    if (Addr != NULL && MemSize > sizeof(struct _UsingMem))
    {
        /* 建立只有一個節(jié)點的雙向隊列 */
        OS_ENTER_CRITICAL();
        MemFree = (struct _FreeMem xdata *)Addr;
        OSFreeMem = MemFree;
        MemFree->Size = MemSize;
        MemFree->Next = NULL;
        MemFree->Last = NULL;
        OS_EXIT_CRITICAL();
        return TRUE;
    }
    else
    {
        return FALSE;
    }
}

/*********************************************************************************************************
** 函數(shù)名稱: OSMemNew
** 功能描述: 分配內(nèi)存。
** 輸 入: Size: 所需內(nèi)存的大小
** 輸 出: 指向已分配的內(nèi)存開始的地址的指針,NULL為失敗。
** 全局變量: 無
** 調(diào)用模塊: 無
**
** 作 者: 陳明計
** 日 期: 2003年8月3日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
        void xdata *OSMemNew(unsigned int Size) reentrant
{
    struct _FreeMem xdata *ThisFreeMem;
    struct _UsingMem xdata *Rt;
    
    OS_ENTER_CRITICAL();
    ThisFreeMem = OSFreeMem;
    
    /* 調(diào)整應當分配的大小(必須為字(word))的整數(shù)倍,且要加入分配給頭的空間 */
    Size = ((Size + sizeof(int) - 1) & ~(sizeof(int) - 1)) + 
           sizeof(struct _UsingMem);
    
    /* 查找足夠大的自由內(nèi)存塊 */
    while(ThisFreeMem != NULL)
    {
        if ((ThisFreeMem->Size) >= Size)
        {
            break;
        }
        ThisFreeMem = ThisFreeMem->Next;
    }
    if (ThisFreeMem != NULL)
    {
        if ((ThisFreeMem->Size) < (Size + sizeof(struct _FreeMem)))
        {
            /* 分配后剩余內(nèi)存太小則整塊自由內(nèi)存分配出去 */
            /* 即在雙向鏈表中刪除這個節(jié)點 */
            if (ThisFreeMem->Next != NULL)
            {
                (ThisFreeMem->Next)->Last = ThisFreeMem->Last;
            }
            if (ThisFreeMem->Last)
            {
                (ThisFreeMem->Last)->Next = ThisFreeMem->Next;
            }
            Size = ThisFreeMem->Size;
            Rt = (struct _UsingMem xdata *)(ThisFreeMem);
        }
        else
        {
            /* 否則從自由內(nèi)存塊的高地址端分配一塊內(nèi)存 */
            /* 即僅僅調(diào)整這個節(jié)點的內(nèi)容 */
            ThisFreeMem->Size -= Size;
            Rt = (struct _UsingMem xdata *)((uint8 xdata *)ThisFreeMem + 
                                             ThisFreeMem->Size);
        }
#if EN_OS_MEM_CHK > 0
        Rt->HeadChk = 0xa55a;
        Rt->EndChk = 0x5aa5;
#endif
        Rt->Size = Size;
        OS_EXIT_CRITICAL();
        return ( void *)((uint8 xdata *)Rt + sizeof(struct _UsingMem));
    }
    else
    {
        OS_EXIT_CRITICAL();
        return NULL;
    }
    
}

/*********************************************************************************************************
** 函數(shù)名稱: OSMemFree
** 功能描述: 把由OSMemNew分配的空間歸還給系統(tǒng)
** 輸 入: Addr: 由指OSMemNew返回的指針
** 輸 出: 無
** 全局變量: 無
** 調(diào)用模塊: 無
**
** 作 者: 陳明計
** 日 期: 2003年8月3日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
#ifndef EN_OS_MEM_FREE
#define EN_OS_MEM_FREE      1
#endif

#if EN_OS_MEM_FREE > 0

        void OSMemFree(void xdata *Addr) reentrant
{
    struct _FreeMem xdata *ThisFreeMem;
    struct _UsingMem xdata *UserMem;
    unsigned int Size;

    OS_ENTER_CRITICAL();
    
    ThisFreeMem = OSFreeMem;
    /* 找到內(nèi)存塊的開始位置 */
    UserMem = (struct _UsingMem xdata *)((uint8 xdata *)Addr - 
                                          sizeof(struct _UsingMem));
#if EN_OS_MEM_CHK > 0
    if (UserMem->HeadChk != 0xa55a || UserMem->EndChk != 0x5aa5)
    {
        UserMemChkErr(Addr);
        OS_EXIT_CRITICAL();
        return;
    }
#endif
    /* 查找這塊內(nèi)存應當在雙向鏈表中插入的位置 */    
    /* 雙向鏈表以內(nèi)存塊首地址的大小順序為節(jié)點的鏈接順序 */
    while (1)
    {
        if (ThisFreeMem > (struct _FreeMem xdata *)UserMem)
        {
            ThisFreeMem = ThisFreeMem->Last;
            break;
        }
        if (ThisFreeMem->Next == NULL)
        {
            break;
        }
        
        ThisFreeMem = ThisFreeMem->Next;
    }

    if (((uint8 xdata *)ThisFreeMem + (ThisFreeMem->Size)) == (uint8 xdata *)UserMem)
    {
        /* 回收的內(nèi)存塊與這一個自由內(nèi)存塊相鄰,則直接修改這個節(jié)點內(nèi)容 */
        ThisFreeMem->Size += UserMem->Size;
    }
    else
    {
        /* 否則插入一個節(jié)點 */
        Size = UserMem->Size;
        ((struct _FreeMem xdata *)UserMem)->Last = ThisFreeMem;
        ((struct _FreeMem xdata *)UserMem)->Next = ThisFreeMem->Next;
        ((struct _FreeMem xdata *)UserMem)->Size = Size;
        ThisFreeMem->Next = (struct _FreeMem xdata *)UserMem;
        ThisFreeMem = (struct _FreeMem xdata *)UserMem;
        if (ThisFreeMem->Next != NULL)
        {
            (ThisFreeMem->Next)->Last = ThisFreeMem;
        }
    }
    if (((uint8 xdata *)ThisFreeMem + (ThisFreeMem->Size)) ==
         (uint8 xdata *)(ThisFreeMem->Next))
    {
        /* 如果這兩個內(nèi)存塊相鄰,則合并之 */
        ThisFreeMem->Size += (ThisFreeMem->Next)->Size;
        ThisFreeMem->Next = (ThisFreeMem->Next)->Next;
        if(ThisFreeMem->Next != NULL)
        {
            (ThisFreeMem->Next)->Last = ThisFreeMem;
        }
    }
    OS_EXIT_CRITICAL();
    return;
}
#endif
#endif
/*********************************************************************************************************
**                            End Of File
********************************************************************************************************/

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美疯狂做受xxxx富婆| 一区二区三区免费在线观看| 欧美高清在线视频| 亚洲成在线观看| 成人亚洲精品久久久久软件| 欧美亚洲精品一区| 国产欧美日韩在线观看| 亚洲成人先锋电影| 99re热视频精品| 久久蜜桃av一区二区天堂 | 99九九99九九九视频精品| 欧美男女性生活在线直播观看| 国产日韩精品一区| 激情亚洲综合在线| 欧美一区二区视频网站| 亚洲伊人伊色伊影伊综合网| av在线不卡电影| 国产午夜亚洲精品理论片色戒| 日韩中文字幕一区二区三区| 91在线精品一区二区三区| 亚洲国产高清在线观看视频| 国产一区二区三区电影在线观看| 91精品久久久久久久99蜜桃| 亚洲午夜羞羞片| 91福利国产成人精品照片| 国产精品电影一区二区| 国产成人精品在线看| 国产视频不卡一区| 国产成+人+日韩+欧美+亚洲| 国产视频911| 国产乱淫av一区二区三区| 日韩精品一区二区三区视频播放| 日韩精品1区2区3区| 91精品国产高清一区二区三区蜜臀| 亚洲一区二区视频在线观看| 色欲综合视频天天天| 亚洲欧美视频在线观看视频| 91免费小视频| 亚洲国产精品麻豆| 欧美福利电影网| 精品综合久久久久久8888| 欧美精品一区在线观看| 国产一区二区美女| 中文字幕一区视频| 91成人国产精品| 图片区小说区区亚洲影院| 欧美年轻男男videosbes| 七七婷婷婷婷精品国产| 精品国偷自产国产一区| 国产成人亚洲精品青草天美| 国产欧美一区二区在线| 一本一道久久a久久精品| 亚洲一二三四久久| 日韩亚洲欧美中文三级| 国产在线精品免费| 亚洲欧美乱综合| 欧美日韩亚洲综合一区二区三区| 蜜臀99久久精品久久久久久软件| 久久奇米777| 91久久一区二区| 老司机精品视频一区二区三区| 久久夜色精品国产噜噜av| 成人aaaa免费全部观看| 亚洲成人综合在线| 久久久亚洲欧洲日产国码αv| 成人综合婷婷国产精品久久| 亚洲综合自拍偷拍| 欧美精品一区在线观看| 一本久久精品一区二区| 美女网站一区二区| 最新中文字幕一区二区三区| 欧美美女bb生活片| 成人福利在线看| 日韩在线卡一卡二| 亚洲色图色小说| 欧美一级夜夜爽| 91尤物视频在线观看| 久久精品免费观看| 亚洲综合小说图片| 国产欧美va欧美不卡在线| 欧美精品丝袜中出| 97久久精品人人澡人人爽| 久久99最新地址| 一区二区三区久久| 久久综合九色综合久久久精品综合 | 国产主播一区二区三区| 亚洲美女精品一区| 国产日韩精品视频一区| 欧美精品vⅰdeose4hd| 91在线国产观看| 国产成人午夜高潮毛片| 日本怡春院一区二区| 一区二区三区美女视频| 国产精品水嫩水嫩| 久久夜色精品国产欧美乱极品| 欧美揉bbbbb揉bbbbb| jlzzjlzz亚洲女人18| 国产精品主播直播| 久久精品国产免费看久久精品| 亚洲午夜三级在线| 亚洲欧美日本在线| 中文字幕欧美日本乱码一线二线| 日韩精品最新网址| 制服.丝袜.亚洲.另类.中文| 在线观看亚洲专区| 在线观看视频欧美| 91猫先生在线| 成人国产免费视频| 粉嫩av一区二区三区| 高清免费成人av| 国产成人精品三级麻豆| 精品一区二区三区日韩| 麻豆精品视频在线观看| 免费在线观看精品| 麻豆免费精品视频| 国产综合色在线视频区| 久久精品国产亚洲aⅴ| 久久国产精品72免费观看| 免费高清视频精品| 久久精品国产99国产精品| 老司机午夜精品| 国内精品免费**视频| 国产不卡视频一区二区三区| 国产精品123| 夫妻av一区二区| 91亚洲精品乱码久久久久久蜜桃| 不卡视频在线观看| 色婷婷久久一区二区三区麻豆| 色综合视频一区二区三区高清| 在线中文字幕不卡| 欧美一区二区三区思思人| 91精品国产麻豆| 久久久久久97三级| 国产精品久线观看视频| 亚洲综合免费观看高清完整版在线| 午夜精品一区二区三区电影天堂 | 国产欧美一区二区精品忘忧草 | 欧美日本高清视频在线观看| 在线成人av网站| 久久亚洲欧美国产精品乐播| 国产精品天美传媒| 亚洲一区二区三区中文字幕| 欧美aa在线视频| 国产成人免费xxxxxxxx| 91久久精品日日躁夜夜躁欧美| 欧美精品亚洲一区二区在线播放| 精品国精品自拍自在线| 中文字幕制服丝袜一区二区三区 | 日本一区二区三区国色天香| 亚洲精品久久久久久国产精华液| 视频一区视频二区在线观看| 国产精品中文字幕日韩精品 | 成人午夜碰碰视频| 欧美亚洲高清一区二区三区不卡| 日韩欧美国产1| 亚洲欧洲制服丝袜| 极品少妇一区二区三区精品视频| 99精品视频在线观看| 欧美一级免费大片| 亚洲欧洲成人精品av97| 免费成人在线视频观看| 97久久超碰国产精品| 欧美成人猛片aaaaaaa| 亚洲免费观看高清完整版在线| 久久国产福利国产秒拍| 91久久线看在观草草青青| 久久亚洲影视婷婷| 午夜免费欧美电影| 99精品黄色片免费大全| 日韩久久精品一区| 亚洲国产日韩精品| 99久久综合国产精品| 精品sm捆绑视频| 视频在线观看国产精品| 日本韩国欧美在线| 国产精品人妖ts系列视频| 久久99久久久欧美国产| 欧美日韩免费在线视频| 日韩毛片精品高清免费| 国产激情一区二区三区四区| 欧美一区二区久久| 五月天丁香久久| 欧美午夜在线一二页| 日韩美女久久久| www.日韩精品| 国产欧美视频在线观看| 国产又黄又大久久| 精品国产一区二区国模嫣然| 轻轻草成人在线| 欧美精品一二三区| 无码av免费一区二区三区试看 | 国产乱理伦片在线观看夜一区| 91精品国产色综合久久不卡蜜臀| 亚洲国产成人va在线观看天堂| 成人久久久精品乱码一区二区三区| 欧美zozo另类异族| 欧美96一区二区免费视频| 欧美区一区二区三区| 日日夜夜免费精品| 欧美男人的天堂一二区|