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

? 歡迎來(lái)到蟲(chóng)蟲(chóng)下載站! | ?? 資源下載 ?? 資源專(zhuān)輯 ?? 關(guān)于我們
? 蟲(chóng)蟲(chóng)下載站

?? memory.c

?? Rabbit 32Bit RTOS源代碼
?? C
字號(hào):
/*********************************************************************
*                   Copyright (c) 2011-2012,李士偉
*                     All rights reserved.
*文 件 名:memory.c
*描    述:可變分區(qū)內(nèi)存管理,最先適應(yīng)算法
*當(dāng)前版本:V1.00
*作    者:李士偉
*創(chuàng)建日期:2011.09.29
**********************************************************************/
#include <mm\memory.h>
#include <kernel\asm.h>

INT32U              OSMemBase[OS_MEM_SIZE];  /* 配置內(nèi)存 */
OSMEMFreeBlkHead   *OSMemFreeList;

OSMEMInf __OSMemInf; /* 內(nèi)存信息 */

/*********************************************************************
*函 數(shù) 名:OS_InitMem
*描    述:初始化內(nèi)存,及相關(guān)的內(nèi)存管理全局變量
*輸入?yún)?shù):無(wú)
*輸出參數(shù):無(wú)
*返 回 值:無(wú)
*注    意:
**********************************************************************/
void OS_InitMem(void)
{
    
    OS_ENTER_CRITICAL();
    OSMemFreeList = (OSMEMFreeBlkHead *)(((INT32U)OSMemBase + sizeof(INT32U)-1) 
                    & (~(sizeof(INT32U)-1)));  /* 內(nèi)存基址字對(duì)齊 */

    OSMemFreeList->BlkNext = NULL;

    /* 因內(nèi)存基址字對(duì)齊處理,須重新計(jì)算內(nèi)存大小*/
    OSMemFreeList->BlkSize = ((OS_MEM_SIZE << 2) - 
    ((INT32U)OSMemFreeList - (INT32U)OSMemBase)+sizeof(INT32U)-1) 
                           & (~(sizeof(INT32U) - 1));

    OSMemFreeList->BlkPrev = NULL;
    
    /* 初始化內(nèi)存信息 */
    __OSMemInf.Usage = 0;
    __OSMemInf.TotalSize = OSMemFreeList->BlkSize;
    __OSMemInf.FreeSize = __OSMemInf.TotalSize;
    __OSMemInf.FreeBlks = 1;
    __OSMemInf.UsingBlks =0;

    OS_EXIT_CRITICAL();
}
/*********************************************************************
*函 數(shù) 名:API_GetMemInf
*描    述:獲取內(nèi)存使用信息
*輸入?yún)?shù):無(wú)
*輸出參數(shù):pMemInf 內(nèi)存信息結(jié)構(gòu)指針,內(nèi)存使用信息寫(xiě)入指針指向結(jié)構(gòu)體
*返 回 值:無(wú)
*注    意:
**********************************************************************/
void API_GetMemInf(OSMEMInf *pMemInf)
{
    OS_ENTER_CRITICAL();
    __OSMemInf.Usage = ((__OSMemInf.TotalSize - __OSMemInf.FreeSize) * 100)
                       / __OSMemInf.TotalSize;

    *pMemInf = __OSMemInf;

    OS_EXIT_CRITICAL();

}

/*********************************************************************
*函 數(shù) 名:malloc
*描    述:以字為單位分配內(nèi)存塊
*輸入?yún)?shù):size: 分配內(nèi)存塊的字節(jié)數(shù),若分配的字節(jié)數(shù)非字的倍數(shù),
*                會(huì)多分配1~3個(gè)字節(jié)湊齊字的倍數(shù)
*輸出參數(shù):無(wú)
*返 回 值:分配的內(nèi)存塊指針,用戶要保證使用相同的指針值釋放內(nèi)存
*注    意:size 的值不能取0
**********************************************************************/
void* malloc(INT32U size)
{
    OSMEMFreeBlkHead *pblk;
    OSMEMUsingBlkHead *pUseblk;

    /* 按字分配內(nèi)存,計(jì)算需分配的內(nèi)存塊大小(單位字) */

    size  = (size + sizeof(OSMEMUsingBlkHead) + sizeof(INT32U) -1)
            & (~(sizeof(INT32U) - 1));

    OS_ENTER_CRITICAL();
    pblk  = OSMemFreeList;

    /* 查找足夠大的內(nèi)存塊 */
    while (pblk != NULL)
    {
        if (pblk->BlkSize >= size)
        {
            break;
        }
        pblk = pblk->BlkNext;
    }

    /* 找到足夠大的內(nèi)存塊 */
    if (pblk != NULL)
    {    
         /* 分配整塊內(nèi)存塊出去 */
        if ((pblk->BlkSize) < (size + sizeof(OSMEMFreeBlkHead))) 
        {
            if (pblk->BlkNext != NULL)
            {
                (pblk->BlkNext)->BlkPrev = pblk->BlkPrev;
            }

            if (pblk->BlkPrev != NULL) /* pblk 不是雙向鏈表頭節(jié)點(diǎn) */
            {
                (pblk->BlkPrev)->BlkNext = pblk->BlkNext;
            }
            else  /* pblk 是雙向鏈表頭節(jié)點(diǎn) */
            {
                OSMemFreeList = pblk->BlkNext;
            }

            size    = pblk->BlkSize;
            pUseblk = (OSMEMUsingBlkHead *)pblk;

            __OSMemInf.FreeBlks--; /* 空閑內(nèi)塊數(shù)量減1 */

        }
        else  /* 從內(nèi)存塊高端地址切分一塊內(nèi)存 */
        {
            pblk->BlkSize = pblk->BlkSize - size;
            pUseblk = (OSMEMUsingBlkHead *)
                     ((INT32U)pblk + (pblk->BlkSize));
        }

        pUseblk->SizeChk = size;
        pUseblk->Size    = size;

        __OSMemInf.FreeSize = __OSMemInf.FreeSize - size;
        __OSMemInf.UsingBlks++;

        OS_EXIT_CRITICAL();
        return (void *)((INT32U)pUseblk + sizeof(OSMEMUsingBlkHead));
    }
    /* 未找到足夠大的內(nèi)存塊 */
    OS_EXIT_CRITICAL();
    return NULL;
}

/*********************************************************************
*函 數(shù) 名:OS_FreeMemErr
*描    述:釋放內(nèi)存校驗(yàn)出錯(cuò)處理
*輸入?yún)?shù):ptr: 釋放內(nèi)存塊的指針
*輸出參數(shù):無(wú)
*返 回 值:無(wú)
*注    意:這個(gè)函數(shù)只是在內(nèi)存釋放出錯(cuò)時(shí)簡(jiǎn)單的重啟系統(tǒng)
**********************************************************************/
void OS_FreeMemErr(void *ptr)
{

    Reboot();  /* 重啟系統(tǒng) */

}

/*********************************************************************
*函 數(shù) 名:free
*描    述:釋放內(nèi)存
*輸入?yún)?shù):ptr: 內(nèi)存塊指針
*輸出參數(shù):無(wú)
*返 回 值:無(wú)
*注    意:
**********************************************************************/
void free(void *ptr)
{
    OSMEMFreeBlkHead *pFreeblk;
    OSMEMUsingBlkHead *pUseblk;
    INT32U size;

    pUseblk =(OSMEMUsingBlkHead *)((INT32U)ptr - sizeof(OSMEMUsingBlkHead));

    OS_ENTER_CRITICAL();

    if (pUseblk->SizeChk != pUseblk->Size) /* 內(nèi)存釋放大小校驗(yàn)出錯(cuò) */
    {
        OS_FreeMemErr(ptr);
        return;
    }

    size = pUseblk->Size;

    __OSMemInf.FreeSize +=size;
    __OSMemInf.UsingBlks--; /* 使用內(nèi)存塊計(jì)數(shù)減1 */

    pFreeblk = OSMemFreeList;

    if (pFreeblk == NULL)
    {

        OSMemFreeList = (OSMEMFreeBlkHead *)pUseblk;
        OSMemFreeList->BlkNext = NULL;
        OSMemFreeList->BlkSize = size;
        OSMemFreeList->BlkPrev = NULL;

        __OSMemInf.FreeBlks++;  /* 空閑內(nèi)存塊計(jì)數(shù)加1 */

        OS_EXIT_CRITICAL();
        return ;
    }

    while (pFreeblk !=NULL)
    {
        /* 鏈表中存在高于釋放內(nèi)存塊首址的節(jié)點(diǎn) */
        if ((INT32U)pUseblk < (INT32U)pFreeblk)
        {
            if (pFreeblk->BlkPrev == NULL)
            {
                /* pFreeblk是雙向鏈表的頭節(jié)點(diǎn) */
                OSMemFreeList = (OSMEMFreeBlkHead *)pUseblk;
                OSMemFreeList->BlkNext = pFreeblk;
                OSMemFreeList->BlkSize = size;
                OSMemFreeList->BlkPrev = NULL;
                pFreeblk->BlkPrev = OSMemFreeList;
                
                __OSMemInf.FreeBlks++;  /*空閑內(nèi)存塊計(jì)數(shù)加1 */

                /* pFreeblk 指向釋放的內(nèi)存塊節(jié)點(diǎn),
                   在后面判斷是否與下一塊內(nèi)存合并*/
                pFreeblk = OSMemFreeList;

            }
            else
            {

                pFreeblk = pFreeblk->BlkPrev;
                if ((INT32U)pUseblk == (INT32U)pFreeblk
                                    + (pFreeblk->BlkSize))
                {
                    /* 與上一個(gè)內(nèi)存塊相鄰則合并 */
                    pFreeblk->BlkSize += size;
                }
                else
                {
                    /* 在雙向鏈表中創(chuàng)建一個(gè)新內(nèi)存塊節(jié)點(diǎn) */
                    ((OSMEMFreeBlkHead *)pUseblk)->BlkNext = pFreeblk->BlkNext;
                    ((OSMEMFreeBlkHead *)pUseblk)->BlkSize = size;
                    ((OSMEMFreeBlkHead *)pUseblk)->BlkPrev = pFreeblk;
                    (pFreeblk->BlkNext)->BlkPrev = (OSMEMFreeBlkHead *)pUseblk;
                     pFreeblk->BlkNext = (OSMEMFreeBlkHead *)pUseblk;
                    __OSMemInf.FreeBlks++;  /*空閑內(nèi)存塊計(jì)數(shù)加1 */
                     /* pFreeblk 指向釋放的內(nèi)存塊節(jié)點(diǎn),
                        在后面判斷是否與下一塊內(nèi)存合并*/
                     pFreeblk = pFreeblk->BlkNext;

                }
            }

            /* 判斷是否與存在的下一個(gè)內(nèi)存塊相鄰 */
            if (pFreeblk->BlkNext !=NULL)
            {
                /* 與下一個(gè)內(nèi)存塊相鄰則合并 */
                if ((INT32U)(pFreeblk->BlkNext) == (INT32U)pFreeblk 
                                + (pFreeblk->BlkSize))
                {
                    pFreeblk->BlkSize +=(pFreeblk->BlkNext)->BlkSize;
                    pFreeblk->BlkNext = (pFreeblk->BlkNext)->BlkNext;
                    if (pFreeblk->BlkNext != NULL)
                    {
                        (pFreeblk->BlkNext)->BlkPrev = pFreeblk;
                    }
                    
                    __OSMemInf.FreeBlks--;  /*空閑內(nèi)存塊計(jì)數(shù)減1 */
                }
            }

            OS_EXIT_CRITICAL();
            return ;
        }

        /* 釋放的內(nèi)存塊首址高于雙向鏈表最后一塊內(nèi)存首址 */
        if (pFreeblk->BlkNext == NULL)
        {
            if ((INT32U)pUseblk == (INT32U)pFreeblk + (pFreeblk->BlkSize))
            {
                /* 與上一個(gè)內(nèi)存塊相鄰則合并 */
                pFreeblk->BlkSize += size;
            }
            else
            {
                pFreeblk->BlkNext = (OSMEMFreeBlkHead *)pUseblk;
               (pFreeblk->BlkNext)->BlkNext = NULL;
               (pFreeblk->BlkNext)->BlkSize = size;
               (pFreeblk->BlkNext)->BlkPrev = pFreeblk;
                __OSMemInf.FreeBlks++;  /*空閑內(nèi)存塊計(jì)數(shù)加1 */
            }
            OS_EXIT_CRITICAL();
            return ;
        }
        pFreeblk = pFreeblk->BlkNext;
    }

}

?? 快捷鍵說(shuō)明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
热久久国产精品| 国产一区二区三区在线观看免费视频| 日韩国产一区二| 成人精品免费看| 精品国产一区二区三区不卡| 中文字幕一区二区不卡| 狠狠狠色丁香婷婷综合激情| 欧美三级中文字幕在线观看| 国产精品国产三级国产aⅴ中文| 日本va欧美va欧美va精品| 在线观看精品一区| 国产精品污污网站在线观看| 蜜臀国产一区二区三区在线播放 | 亚洲成a人v欧美综合天堂下载| 激情图片小说一区| 欧美精品123区| 亚洲午夜在线电影| a美女胸又www黄视频久久| 久久久www免费人成精品| 捆绑紧缚一区二区三区视频| 欧美日本在线观看| 亚洲一区二区在线免费观看视频| 99国产精品久| 中文字幕亚洲欧美在线不卡| 国产二区国产一区在线观看| 欧美一级搡bbbb搡bbbb| 日韩精品久久久久久| 久久久久久久久久久久久女国产乱| 亚洲韩国精品一区| 欧美亚洲免费在线一区| 亚洲精品视频一区二区| 不卡在线观看av| 国产精品久久久99| 97成人超碰视| 一区2区3区在线看| 欧美日韩一本到| 日本中文在线一区| 日韩欧美在线网站| 国产乱淫av一区二区三区| 精品国产乱码久久久久久老虎| 久久精品久久久精品美女| 欧美成va人片在线观看| 国产自产v一区二区三区c| 久久亚洲二区三区| 成人精品视频一区二区三区| 综合色中文字幕| 欧美日韩综合不卡| 美女一区二区三区在线观看| 欧美sm美女调教| 成人激情开心网| 亚洲最大成人网4388xx| 欧美肥大bbwbbw高潮| 极品少妇xxxx精品少妇偷拍| 久久精品亚洲一区二区三区浴池| 春色校园综合激情亚洲| 国产精品中文字幕欧美| 久久伊人中文字幕| 97久久精品人人澡人人爽| 亚洲一区二区偷拍精品| 日韩欧美中文一区| 波多野结衣的一区二区三区| 亚洲国产视频一区二区| 欧美不卡一区二区| aa级大片欧美| 日韩国产一区二| 国产精品欧美经典| 欧美日本在线视频| 国产激情偷乱视频一区二区三区| 亚洲日本乱码在线观看| 日韩限制级电影在线观看| 成人性生交大片免费看视频在线 | 久久天天做天天爱综合色| 99久久精品国产网站| 亚洲sss视频在线视频| 久久精品在线观看| 欧美视频你懂的| 成人性视频网站| 日韩va亚洲va欧美va久久| 看片的网站亚洲| 亚洲天堂久久久久久久| 精品欧美黑人一区二区三区| 色婷婷综合久久久| 国产乱子轮精品视频| 亚洲成人你懂的| 亚洲色图19p| 久久久久国产精品免费免费搜索| 欧美三级电影在线看| 成人sese在线| 国产在线国偷精品免费看| 亚洲 欧美综合在线网络| 亚洲欧洲三级电影| 久久色在线视频| 欧美一区二区性放荡片| 色欧美日韩亚洲| 成人sese在线| 国产成人三级在线观看| 久久99久久99精品免视看婷婷| 亚洲综合免费观看高清完整版| 亚洲国产成人私人影院tom| 日韩一区二区三区视频在线| 欧美日韩在线播放一区| 91蜜桃在线观看| 91在线视频观看| 北条麻妃一区二区三区| 国产精品1区2区| 国内精品久久久久影院一蜜桃| 三级欧美韩日大片在线看| 亚洲一区二区欧美激情| 亚洲美女淫视频| 亚洲欧洲综合另类| 亚洲美女淫视频| 亚洲另类在线视频| 亚洲欧美在线aaa| 亚洲人午夜精品天堂一二香蕉| 国产精品拍天天在线| 国产精品污网站| 中文字幕制服丝袜成人av| 国产精品久久看| 中文字幕一区二区三区不卡| 成人欧美一区二区三区1314| 国产精品乱人伦中文| 椎名由奈av一区二区三区| 中文字幕一区在线观看| 亚洲国产精品av| 亚洲精品乱码久久久久久| 亚洲精品国产a久久久久久| 亚洲在线视频免费观看| 亚洲国产视频网站| 久久精品国产亚洲一区二区三区 | 欧美另类高清zo欧美| 欧美日韩国产综合一区二区三区| 欧美人动与zoxxxx乱| 日韩欧美国产综合一区| 26uuu亚洲| 亚洲欧洲av色图| 亚洲成a人片在线不卡一二三区| 日本免费新一区视频| 久草在线在线精品观看| 成人午夜在线免费| 在线国产亚洲欧美| 日韩欧美一级二级三级久久久 | 看国产成人h片视频| 欧美a一区二区| 久久国产精品99精品国产| 国产一区二区三区高清播放| 粉嫩av一区二区三区粉嫩| 久久久久久久久久久久久久久99 | 国产成人亚洲综合a∨猫咪| 欧美日韩情趣电影| 亚洲视频一区在线| 成人av小说网| 久久久久国产精品麻豆ai换脸 | 久久综合综合久久综合| 欧美视频中文字幕| 亚洲柠檬福利资源导航| 本田岬高潮一区二区三区| 国产欧美日韩卡一| 国产精品一区一区| 亚洲精品一区二区三区蜜桃下载 | 一区二区三区高清| 99久久国产免费看| 中文字幕在线不卡| 97久久超碰国产精品| 亚洲国产精品黑人久久久| 国产精品亚洲а∨天堂免在线| 精品精品国产高清a毛片牛牛 | 欧美另类高清zo欧美| 亚洲国产欧美日韩另类综合 | www.日本不卡| 国产精品国产三级国产普通话三级| 国产v综合v亚洲欧| 国产精品免费观看视频| 成人一区在线看| 一区在线观看视频| 99久久免费视频.com| 亚洲欧美经典视频| 一本到不卡精品视频在线观看| 亚洲精品久久嫩草网站秘色| 色噜噜夜夜夜综合网| 亚洲午夜一区二区三区| 91麻豆精品国产自产在线| 捆绑变态av一区二区三区| 2023国产精品| av中文一区二区三区| 亚洲日本韩国一区| 欧美系列日韩一区| 蜜桃免费网站一区二区三区| 精品盗摄一区二区三区| 国产黄色精品视频| 日韩毛片一二三区| 欧美日韩国产免费一区二区| 琪琪一区二区三区| 日韩二区三区四区| 精品国产乱码久久久久久浪潮| 国产丶欧美丶日本不卡视频| 亚洲欧美一区二区三区久本道91| 欧美色视频一区| 国产伦精品一区二区三区免费迷 | 久久国产精品99精品国产| 国产欧美一二三区|