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

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

?? os_mem.c

?? keil開發環境
?? 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
**創   建   人: 陳明計
**最后修改日期:  2003年8月3日
**描      述: 內存動態分配模塊,可以在非Small RTOS(51)下使用。在Small RTOS(51)
**             下必須配置為支持重入棧。
**--------------歷史版本信息----------------------------------------------------------------------------
** 創建人: 陳明計
** 版  本: 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;                /* 自由內存塊的雙向鏈表的頭 */


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

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

    /* 判斷自由空間是否有效 */
    if (Addr != NULL && MemSize > sizeof(struct _UsingMem))
    {
        /* 建立只有一個節點的雙向隊列 */
        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;
    }
}

/*********************************************************************************************************
** 函數名稱: OSMemNew
** 功能描述: 分配內存。
** 輸 入: Size: 所需內存的大小
** 輸 出: 指向已分配的內存開始的地址的指針,NULL為失敗。
** 全局變量: 無
** 調用模塊: 無
**
** 作 者: 陳明計
** 日 期: 2003年8月3日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
        void xdata *OSMemNew(unsigned int Size) reentrant
{
    struct _FreeMem xdata *ThisFreeMem;
    struct _UsingMem xdata *Rt;
    
    OS_ENTER_CRITICAL();
    ThisFreeMem = OSFreeMem;
    
    /* 調整應當分配的大?。ū仨殲樽?word))的整數倍,且要加入分配給頭的空間 */
    Size = ((Size + sizeof(int) - 1) & ~(sizeof(int) - 1)) + 
           sizeof(struct _UsingMem);
    
    /* 查找足夠大的自由內存塊 */
    while(ThisFreeMem != NULL)
    {
        if ((ThisFreeMem->Size) >= Size)
        {
            break;
        }
        ThisFreeMem = ThisFreeMem->Next;
    }
    if (ThisFreeMem != NULL)
    {
        if ((ThisFreeMem->Size) < (Size + sizeof(struct _FreeMem)))
        {
            /* 分配后剩余內存太小則整塊自由內存分配出去 */
            /* 即在雙向鏈表中刪除這個節點 */
            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
        {
            /* 否則從自由內存塊的高地址端分配一塊內存 */
            /* 即僅僅調整這個節點的內容 */
            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;
    }
    
}

/*********************************************************************************************************
** 函數名稱: OSMemFree
** 功能描述: 把由OSMemNew分配的空間歸還給系統
** 輸 入: Addr: 由指OSMemNew返回的指針
** 輸 出: 無
** 全局變量: 無
** 調用模塊: 無
**
** 作 者: 陳明計
** 日 期: 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;
    /* 找到內存塊的開始位置 */
    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
    /* 查找這塊內存應當在雙向鏈表中插入的位置 */    
    /* 雙向鏈表以內存塊首地址的大小順序為節點的鏈接順序 */
    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)
    {
        /* 回收的內存塊與這一個自由內存塊相鄰,則直接修改這個節點內容 */
        ThisFreeMem->Size += UserMem->Size;
    }
    else
    {
        /* 否則插入一個節點 */
        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))
    {
        /* 如果這兩個內存塊相鄰,則合并之 */
        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一区二区三区免费野_久草精品视频
国产黑丝在线一区二区三区| 不卡视频免费播放| 精品久久一区二区| 成人爱爱电影网址| 亚洲免费大片在线观看| 欧美一区二区久久久| 国产高清不卡二三区| 亚洲电影在线免费观看| 久久久久99精品一区| 51精品视频一区二区三区| 99久免费精品视频在线观看| 亚洲bt欧美bt精品| 亚洲精品高清视频在线观看| 欧美成人在线直播| 7799精品视频| 欧美日韩一区二区三区四区| 国产成人综合在线| 国产一区二区三区| 日日摸夜夜添夜夜添亚洲女人| 337p日本欧洲亚洲大胆色噜噜| 日本道免费精品一区二区三区| 国产激情精品久久久第一区二区| 亚洲成人精品在线观看| 一区二区在线看| 亚洲欧美成人一区二区三区| 国产日本欧洲亚洲| 国产精品全国免费观看高清| 国产日韩欧美一区二区三区乱码 | 亚洲精品自拍动漫在线| 国产精品美女久久久久久久| 久久久www免费人成精品| 久久久久97国产精华液好用吗| 精品久久五月天| 久久蜜桃av一区二区天堂| 中文幕一区二区三区久久蜜桃| 中文字幕久久午夜不卡| 国产精品久久福利| 另类小说视频一区二区| 国产福利精品导航| 色婷婷久久99综合精品jk白丝| 欧洲精品中文字幕| 日韩美女视频在线| 国产精品久久久久久一区二区三区| 国产欧美日韩综合精品一区二区| 国产精品萝li| 久久超级碰视频| 日本韩国一区二区| 日韩欧美自拍偷拍| 一区二区在线观看不卡| 激情五月激情综合网| 色婷婷久久99综合精品jk白丝| 日韩一区二区中文字幕| 日韩一区日韩二区| 成人中文字幕合集| 3atv在线一区二区三区| 一区二区三区在线视频播放| 欧美日韩精品免费| 久久久99精品久久| 国内成人自拍视频| 日韩美女视频一区二区在线观看| 亚洲精品一二三| gogogo免费视频观看亚洲一| 精品成人一区二区三区四区| 美女在线观看视频一区二区| 欧美午夜片在线看| 天天亚洲美女在线视频| 欧美三区在线观看| 亚洲电影在线播放| 555夜色666亚洲国产免| 日韩精品电影在线观看| 欧美一区二区在线免费观看| 日韩激情一区二区| 精品久久久久久久久久久院品网 | 亚洲柠檬福利资源导航| 在线这里只有精品| 亚洲一二三区不卡| 91精品国产一区二区| 美国十次综合导航| 国产精品色呦呦| 一本高清dvd不卡在线观看| 午夜精品在线视频一区| 精品蜜桃在线看| 色综合久久88色综合天天| 日韩中文字幕一区二区三区| 欧美大胆一级视频| 成人免费观看av| 国产露脸91国语对白| 一区二区三区中文字幕电影| 欧美美女直播网站| 国产成人aaaa| 日本伊人午夜精品| 亚洲同性同志一二三专区| 欧美一区二区三区在线看| 波多野结衣亚洲| 国产不卡一区视频| 秋霞影院一区二区| 亚洲成人tv网| 一区二区三区免费网站| 欧美国产在线观看| 久久久精品中文字幕麻豆发布| 欧美精品v日韩精品v韩国精品v| 粉嫩蜜臀av国产精品网站| 激情久久五月天| 韩国一区二区视频| 国产一区不卡视频| 成人黄动漫网站免费app| 韩国v欧美v日本v亚洲v| 国内精品在线播放| 国产电影一区二区三区| 国产美女久久久久| 国产精品亚洲综合一区在线观看| 久久99精品久久久久久国产越南 | 国产一区二区久久| 高清不卡一二三区| 成人一级片网址| 色综合久久久网| 欧美精品色一区二区三区| 欧美三级资源在线| 欧美精品一区二区三区高清aⅴ | 国产麻豆日韩欧美久久| 精品一区二区三区视频在线观看| 青椒成人免费视频| 高清av一区二区| 欧美吻胸吃奶大尺度电影 | 精品一区在线看| 成人午夜精品在线| 欧洲亚洲精品在线| 国产色综合一区| 午夜精品久久久久影视| 极品瑜伽女神91| 91国产成人在线| 久久先锋影音av鲁色资源网| 一区二区三区四区亚洲| 韩国一区二区三区| 欧美色精品在线视频| 久久久99精品免费观看不卡| 亚洲欧美一区二区久久| 国产乱妇无码大片在线观看| 欧美午夜在线观看| 国产喂奶挤奶一区二区三区| 亚洲一区二区三区四区五区黄| 久久精品国产99久久6| 在线观看视频91| 国产精品精品国产色婷婷| 精品一二三四区| 欧美一级国产精品| 日韩中文字幕区一区有砖一区| 欧美在线视频你懂得| 亚洲女人的天堂| 91国偷自产一区二区三区成为亚洲经典| 久久九九久精品国产免费直播| 日韩高清一区二区| 欧美一区二区在线播放| 青青草成人在线观看| 日韩限制级电影在线观看| 免费在线欧美视频| 精品不卡在线视频| 成人免费毛片片v| 亚洲线精品一区二区三区| 欧美色图12p| 麻豆国产精品视频| 久久免费偷拍视频| 96av麻豆蜜桃一区二区| 亚洲自拍偷拍麻豆| 欧美tickle裸体挠脚心vk| 成人在线综合网| 亚洲一区二区在线免费观看视频| 欧美无砖砖区免费| 精品亚洲国内自在自线福利| 国产婷婷色一区二区三区四区| 91丝袜高跟美女视频| 亚洲1区2区3区视频| 久久久国产精品午夜一区ai换脸| 99久久久免费精品国产一区二区| 一区二区三区在线视频播放| 91精品国产91久久久久久一区二区| 黑人精品欧美一区二区蜜桃| 亚洲黄色av一区| 久久女同性恋中文字幕| 欧美无乱码久久久免费午夜一区| 国产精品一区二区无线| 日韩电影网1区2区| 亚洲一二三专区| 亚洲蜜臀av乱码久久精品| 久久久久久一级片| 26uuu精品一区二区在线观看| 欧美色图片你懂的| 欧美色视频一区| 欧美三级韩国三级日本一级| 成人免费av在线| 国产高清亚洲一区| 国产电影一区二区三区| 精品一区二区在线视频| 97久久超碰国产精品电影| 国产一区二区三区综合| 国产一区二区女| 国产精品系列在线播放| 国产馆精品极品| 色综合久久久久综合体| 欧美自拍丝袜亚洲|