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

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

?? guialloc.c

?? 一個(gè)在44b0上移植成功的ucgui
?? C
字號(hào):
/***********************************************************************************************************                                                uC/GUI*                        Universal graphic software for embedded applications**                       (c) Copyright 2002, Micrium Inc., Weston, FL*                       (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH**              礐/GUI is protected by international copyright laws. Knowledge of the*              source code may not be used to write a similar product. This file may*              only be used in accordance with a license and should not be redistributed*              in any way. We appreciate your understanding and fairness.*----------------------------------------------------------------------File        : GUIAlloc.CPurpose     : emWin dynamic memory management----------------------------------------------------------------------Version-Date---Author-Explanation----------------------------------------------------------------------1.00    000107 RS     First version----------------------------------------------------------------------Known problems:None.----------------------------------------------------------------------Open issues:None.----------------------------------------------------------------------Todo:Nothing.*/#include <stddef.h>           /* needed for definition of NULL */#include <string.h>           /* for memcpy, memset */#include "GUI_Protected.H"#include "GUIDebug.h"#if GUI_ALLOC_SIZE==0  #error GUI_ALLOC_SIZE needs to be > 0 when using this module#endif/*  *****************************************************************  *  *              Config defaults  *  ******************************************************************//* Permit automatic defragmentation when necessary */#ifndef GUI_ALLOC_AUTDEFRAG  #define GUI_ALLOC_AUTDEFRAG 1#endif#ifndef GUI_BLOCK_ALIGN  #define GUI_BLOCK_ALIGN 2    /* 2 means 4 bytes, 1 means 2 bytes */                              /* 1 can be used on 16-bit CPUs and                                 CPUs which do not require aligned                                 32-bit values (such as x86) */ #endif#ifndef GUI_MAXBLOCKS  #define GUI_MAXBLOCKS (2+GUI_ALLOC_SIZE/32)#endif/*  *****************************************************************  *  *              Internal types and declarations  *  ******************************************************************/#if GUI_ALLOC_SIZE <32767  #define tALLOCINT I16#else  #define tALLOCINT I32#endif#if GUI_MAXBLOCKS >= 256  #define HANDLE U16#else  #define HANDLE U8#endiftypedef struct {  tALLOCINT Off;       /* Offset of memory area */  tALLOCINT Size;      /* usable size of allocated block */  HANDLE Next;      /* next handle in linked list */  HANDLE Prev;} tBlock;/******************************************************************              Static data*******************************************************************/GUI_HEAP GUI_Heap;       /* Public for debugging only */static tBlock aBlock[GUI_MAXBLOCKS];struct {  int       NumUsedBlocks, NumFreeBlocks, NumFreeBlocksMin;        /* For statistical purposes only */  tALLOCINT NumUsedBytes,  NumFreeBytes,  NumFreeBytesMin;} GUI_ALLOC;static char   IsInitialized =0;/*  ********************************************************************  *  *                 Macros for internal use  *  *********************************************************************/#define Min(v0,v1) ((v0>v1) ? v1 : v0)#define Max(v0,v1) ((v0>v1) ? v0 : v1)#define ASSIGN_IF_LESS(v0,v1) if (v1<v0) v0=v1#define HMEM2PTR(hMem) (void*)&GUI_Heap.abHeap[aBlock[hMem].Off]/*  ********************************************************************  *  *                    Internal routines  *  *********************************************************************//*  *************************************************  *  *                 Size2LegalSize  *  *************************************************  returns: Legal allocation size*/static int Size2LegalSize(int size) {  return (size + ((1<<GUI_BLOCK_ALIGN)-1)) & ~((1<<GUI_BLOCK_ALIGN)-1);}  /*  *************************************************  *  *                 FindFreeHandle  *  *************************************************  returns: Free handle*/static GUI_HMEM FindFreeHandle(void) {  int i;  for (i=1; i< GUI_MAXBLOCKS; i++) {    if (aBlock[i].Size ==0)	  return i;  }  GUI_DEBUG_ERROROUT1("Insufficient memory handles configured (GUI_MAXBLOCKS == %d (See GUIConf.h))", GUI_MAXBLOCKS);  return GUI_HMEM_NULL;}/*  *************************************************  *  *               Find hole in heap area  *  *************************************************  returns: Offset to the memory hole (if available)           -1 if not available*/static GUI_HMEM FindHole(int Size) {  int i, iNext;  for (i=0; (iNext = aBlock[i].Next) != 0; i = iNext) {    int NumFreeBytes = aBlock[iNext].Off- (aBlock[i].Off+aBlock[i].Size);    if (NumFreeBytes>=Size)      return i;  }/* Check last block */  if (GUI_ALLOC_SIZE - (aBlock[i].Off+aBlock[i].Size) >= Size)    return i;  return -1;}/*  *************************************************  *  *             Create hole in heap area  *  *************************************************  returns: Offset to the memory hole (if available)           -1 if not available*/static GUI_HMEM CreateHole(int Size) {  int i, iNext;  int r = -1;  for (i=0; (iNext =aBlock[i].Next) !=0; i= iNext) {    int NumFreeBytes = aBlock[iNext].Off- (aBlock[i].Off+aBlock[i].Size);    if (NumFreeBytes < Size) {      int NumBytesBeforeBlock = aBlock[iNext].Off - (aBlock[i].Off+aBlock[i].Size);      if (NumBytesBeforeBlock) {        U8* pData = &GUI_Heap.abHeap[aBlock[iNext].Off];        memmove(pData-NumBytesBeforeBlock, pData, aBlock[iNext].Size);        aBlock[iNext].Off -=NumBytesBeforeBlock;      }    }  }/* Check last block */  if (GUI_ALLOC_SIZE - (aBlock[i].Off+aBlock[i].Size) >= Size)    r = i;  return r;}static void CheckInit(void) {  if (!IsInitialized)    GUI_ALLOC_Init();}/*  ********************************************************************  *  *                  Exported routines  *  *********************************************************************/void GUI_ALLOC_Init(void) {  GUI_DEBUG_LOG("\nGUI_ALLOC_Init...");  GUI_ALLOC.NumFreeBlocksMin = GUI_ALLOC.NumFreeBlocks = GUI_MAXBLOCKS-1;  GUI_ALLOC.NumFreeBytesMin  = GUI_ALLOC.NumFreeBytes  = GUI_ALLOC_SIZE;  GUI_ALLOC.NumUsedBlocks = 0;  GUI_ALLOC.NumUsedBytes = 0;  aBlock[0].Size = (1<<GUI_BLOCK_ALIGN);  /* occupy minimum for a block */  aBlock[0].Off  = 0;  aBlock[0].Next = 0;  IsInitialized =1;}static GUI_HMEM _Alloc(int size) {  GUI_HMEM hMemNew, hMemIns;  CheckInit();  size = Size2LegalSize(size);  /* Check if memory is available at all ...*/  if (size > GUI_ALLOC.NumFreeBytes) {    GUI_DEBUG_WARN1("GUI_ALLOC_Alloc: Insufficient memory configured (Trying to alloc % bytes)", size);    return 0;  }  /* Locate free handle */  if ((hMemNew = FindFreeHandle()) == 0)    return 0;  /* Locate or Create hole of sufficient size */  hMemIns = FindHole(size);  #if GUI_ALLOC_AUTDEFRAG    if (hMemIns == -1) {      hMemIns = CreateHole(size);    }  #endif/* Occupy hole */  if (hMemIns==-1) {    GUI_DEBUG_ERROROUT1("GUI_ALLOC_Alloc: Could not allocate %d bytes",size);    return 0;	}  {    int Off = aBlock[hMemIns].Off+aBlock[hMemIns].Size;    int Next = aBlock[hMemIns].Next;    aBlock[hMemNew].Size  = size;    aBlock[hMemNew].Off   = Off;    if ((aBlock[hMemNew].Next  = Next) >0) {      aBlock[Next].Prev = hMemNew;      }    aBlock[hMemNew].Prev  = hMemIns;    aBlock[hMemIns].Next  = hMemNew;  }/* Keep track of number of blocks and av. memory */  GUI_ALLOC.NumUsedBlocks++;  GUI_ALLOC.NumFreeBlocks--;  if (GUI_ALLOC.NumFreeBlocksMin > GUI_ALLOC.NumFreeBlocks) {    GUI_ALLOC.NumFreeBlocksMin = GUI_ALLOC.NumFreeBlocks;  }  GUI_ALLOC.NumUsedBytes += size;  GUI_ALLOC.NumFreeBytes -= size;  if (GUI_ALLOC.NumFreeBytesMin > GUI_ALLOC.NumFreeBytes) {    GUI_ALLOC.NumFreeBytesMin = GUI_ALLOC.NumFreeBytes;  }/* In order to be on the safe side, zeroinit ! */  memset(HMEM2PTR(hMemNew), 0, size);  return hMemNew;}GUI_HMEM GUI_ALLOC_Alloc(int size) {  GUI_HMEM hMem; /* First make sure that init has been called */  GUI_LOCK();  GUI_DEBUG_LOG2("\nGUI_ALLOC_Alloc... requesting %d, %d avail", size, GUI_ALLOC.NumFreeBytes);  hMem = _Alloc(size);  GUI_DEBUG_LOG1("\nGUI_ALLOC_Alloc : Handle", hMem);  GUI_UNLOCK();  return hMem;}void GUI_ALLOC_Free(GUI_HMEM hMem) {  int Size;  if (hMem == GUI_HMEM_NULL)  /* Note: This is not an error, it is permitted */    return;  GUI_LOCK();  GUI_DEBUG_LOG1("\nGUI_ALLOC_Free(%d)", hMem);  /* Do some error checking ... */  #if GUI_DEBUG_LEVEL>0    /* Block not allocated ? */    if (aBlock[hMem].Size==0) {      GUI_DEBUG_ERROROUT("GUI_ALLOC_Free(): Invalid hMem");      return;    }  #endif  Size = aBlock[hMem].Size;  #ifdef WIN32    memset(&GUI_Heap.abHeap[aBlock[hMem].Off], 0xcc, Size);  #endif  GUI_ALLOC.NumFreeBytes += Size;  GUI_ALLOC.NumUsedBytes -= Size;  aBlock[hMem].Size = 0;  {    int Next = aBlock[hMem].Next;    int Prev = aBlock[hMem].Prev;    aBlock[Prev].Next = Next;    if (Next)      aBlock[Next].Prev = Prev;  }    GUI_ALLOC.NumFreeBlocks++;  GUI_ALLOC.NumUsedBlocks--;  GUI_UNLOCK();}void*       GUI_ALLOC_h2p   (GUI_HMEM  hMem) {  #if GUI_DEBUG_LEVEL>0    if (!hMem) {      GUI_DEBUG_ERROROUT("\n"__FILE__ " GUI_ALLOC_h2p: illegal argument (0 handle)");      return 0;    }  #endif  return HMEM2PTR(hMem);}void GUI_ALLOC_FreePtr(GUI_HMEM *ph) {  GUI_LOCK();  GUI_ALLOC_Free(*ph);  *ph =0;  GUI_UNLOCK();}/*  ********************************************************************  *  *                  Exported info routines  *  *********************************************************************/int GUI_GetUsedMem(void) {  int NumUsedBytes=0;  int i;  GUI_LOCK();  CheckInit();  for (i=1; i; i = aBlock[i].Next) {    NumUsedBytes += aBlock[i].Size;  }  GUI_UNLOCK();  return NumUsedBytes;}int GUI_ALLOC_GetNumFreeBytes(void) {  CheckInit();  return GUI_ALLOC.NumFreeBytes;  }/*  *************************************************  *  *       GetMaxSize  *  *************************************************  Returns the biggest available blocksize  (without relocation)*/int GUI_ALLOC_GetMaxSize(void) {  int r=0;  int NumFreeBytes;  int i, iNext;  GUI_LOCK();  CheckInit();  for (i=0; (iNext =aBlock[i].Next) !=0; i= iNext) {    NumFreeBytes = aBlock[iNext].Off- (aBlock[i].Off+aBlock[i].Size);    if (NumFreeBytes > r) {      r = NumFreeBytes;    }  }/* Check last block */  NumFreeBytes = (GUI_ALLOC_SIZE - (aBlock[i].Off+aBlock[i].Size));  if (NumFreeBytes > r) {    r = NumFreeBytes;  }  GUI_UNLOCK();  return r;}

?? 快捷鍵說(shuō)明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
51精品久久久久久久蜜臀| 亚洲精品免费一二三区| 欧美成人伊人久久综合网| 欧美日韩免费观看一区三区| 欧美视频在线不卡| 欧美性大战久久| 欧美美女一区二区三区| 欧美日本免费一区二区三区| 这里只有精品视频在线观看| 欧美日韩一区小说| 欧美一区二区在线看| 日韩欧美亚洲另类制服综合在线| 欧美一区二区视频免费观看| 日韩三级视频在线看| 精品伦理精品一区| 久久精品一区八戒影视| 国产精品入口麻豆原神| 亚洲女子a中天字幕| 亚洲黄色在线视频| 天堂av在线一区| 韩国在线一区二区| 成人午夜激情片| 色婷婷av一区二区三区之一色屋| 欧美日韩成人高清| 欧美一区二区三区四区高清| 精品国产在天天线2019| 国产精品午夜久久| 亚洲一区二区三区精品在线| 免费成人在线观看视频| 国产成人精品免费在线| 99精品欧美一区二区三区小说 | 欧美日韩国产成人在线免费| 777午夜精品视频在线播放| 久久你懂得1024| 亚洲男人的天堂在线观看| 日韩精品电影一区亚洲| 国产乱人伦偷精品视频不卡| 不卡的av在线播放| 欧美午夜理伦三级在线观看| 91精品国产综合久久久蜜臀粉嫩| 久久精品一区二区三区不卡| 一区二区三区国产精华| 免费精品视频在线| 不卡的av在线| 日韩欧美高清一区| 亚洲人xxxx| 久久国产剧场电影| 91丝袜美女网| 精品国产第一区二区三区观看体验| 亚洲欧美综合在线精品| 日本午夜精品视频在线观看| 波多野结衣精品在线| 91精品国产色综合久久| 亚洲欧美在线高清| 久久99日本精品| 在线免费亚洲电影| 久久久久久久久伊人| 亚洲第一会所有码转帖| 成人激情午夜影院| 91精品国模一区二区三区| 国产精品理论片在线观看| 日韩av午夜在线观看| 色综合色狠狠天天综合色| 欧美一区二区三区视频免费播放 | 捆绑变态av一区二区三区| 91麻豆产精品久久久久久 | 亚洲视频你懂的| 九九视频精品免费| 欧美日韩一级二级三级| 日韩伦理av电影| 国产乱码精品一品二品| 91精品国产综合久久久蜜臀图片| 亚洲精品免费视频| av在线不卡免费看| 久久精品网站免费观看| 男女男精品网站| 欧美日韩dvd在线观看| 亚洲品质自拍视频| 成人免费电影视频| 久久久精品2019中文字幕之3| 免费观看一级欧美片| 欧美性一二三区| 亚洲男人天堂av网| 91视频在线观看| 国产精品亲子伦对白| 国产精品一卡二卡在线观看| 欧美mv日韩mv亚洲| 美女视频第一区二区三区免费观看网站| 99国产精品一区| 中文字幕日韩欧美一区二区三区| 国产高清在线观看免费不卡| 精品国产人成亚洲区| 久久99精品一区二区三区| 91精品在线观看入口| 日韩成人伦理电影在线观看| 欧美日本在线播放| 日韩精品一级中文字幕精品视频免费观看 | 欧美精彩视频一区二区三区| 精品在线你懂的| 精品乱人伦小说| 久久电影网电视剧免费观看| 日韩欧美三级在线| 麻豆视频观看网址久久| 日韩三级在线观看| 激情国产一区二区 | 夜夜亚洲天天久久| 在线精品亚洲一区二区不卡| 亚洲美女免费视频| 色婷婷综合视频在线观看| 亚洲人妖av一区二区| 色欲综合视频天天天| 亚洲一区二区三区免费视频| 欧美综合在线视频| 亚洲大片一区二区三区| 91麻豆精品国产91久久久更新时间| 图片区小说区国产精品视频| 777午夜精品视频在线播放| 美女诱惑一区二区| 欧美videos大乳护士334| 国产精品一区二区免费不卡 | 久久麻豆一区二区| 成年人国产精品| 亚洲欧美aⅴ...| 欧美高清一级片在线| 麻豆成人综合网| 久久久精品欧美丰满| 不卡视频在线看| 亚洲精品videosex极品| 91精品国产免费| 国产主播一区二区三区| 亚洲四区在线观看| 欧美日韩色综合| 精久久久久久久久久久| 国产精品久久久久7777按摩| 欧美亚洲免费在线一区| 蜜桃一区二区三区在线| 国产女人水真多18毛片18精品视频| 99精品国产91久久久久久| 午夜免费久久看| 久久久99免费| 欧美少妇xxx| 韩国欧美一区二区| 亚洲精品一卡二卡| 欧美一二三四区在线| 成人免费观看视频| 日韩av一二三| 成人欧美一区二区三区黑人麻豆 | 国产毛片一区二区| 中文字幕一区在线| 91麻豆精品国产91久久久更新时间| 国产一区二区三区日韩| 亚洲免费观看高清在线观看| 日韩午夜三级在线| 91视频www| 久久66热re国产| 亚洲一区电影777| 久久久久99精品一区| 欧美日韩第一区日日骚| 成人亚洲精品久久久久软件| 五月天激情综合网| 国产精品超碰97尤物18| 欧美一个色资源| 在线观看不卡视频| 春色校园综合激情亚洲| 日韩国产一二三区| 亚洲精品美国一| 国产欧美一区二区精品婷婷| 欧美一区二区在线免费观看| 色综合视频在线观看| 国产精品一区三区| 肉肉av福利一精品导航| 亚洲欧洲中文日韩久久av乱码| 精品国产91乱码一区二区三区 | 亚洲免费高清视频在线| 精品国产乱码久久久久久久久| 欧美专区日韩专区| 成人动漫一区二区| 精品一区二区国语对白| 午夜影院久久久| 亚洲另类中文字| 国产精品久久看| 久久久99精品免费观看| 日韩一区二区影院| 欧美精品久久一区| 欧美在线一二三| 色爱区综合激月婷婷| 播五月开心婷婷综合| 国产乱对白刺激视频不卡| 精品综合久久久久久8888| 免费在线观看日韩欧美| 日韩精品一区第一页| 亚洲成人一区二区| 亚洲图片自拍偷拍| 一区二区成人在线视频 | 成人综合激情网| 国产黄色精品视频| 国产成人午夜99999| 国内成+人亚洲+欧美+综合在线| 免费的国产精品| 久久国产视频网|