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

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

?? guialloc.c

?? uCGUI
?? C
字號:
/*************************************************************************************************************
                                                   uC/GUI
                                               嵌入式通用圖形軟件
File        : GUIAlloc.C
Purpose     : emWin dynamic memory management
************************************************************************************************************/
#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
#endif

typedef 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;
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产毛片精品视频| 亚洲视频在线观看三级| 亚洲国产aⅴ成人精品无吗| 亚洲综合丁香婷婷六月香| 国产成人免费在线观看不卡| 日韩西西人体444www| 久久精品国产秦先生| 日韩视频不卡中文| 精品一区二区三区在线观看| 91精品国产综合久久福利软件| 一区二区三区精密机械公司| 91美女片黄在线观看| 精品电影一区二区三区| 国产一区 二区 三区一级| wwwwxxxxx欧美| 波多野结衣中文字幕一区 | 精品久久人人做人人爽| 亚洲啪啪综合av一区二区三区| 成人性视频网站| 中文字幕乱码久久午夜不卡| 一本久久a久久精品亚洲| 综合久久国产九一剧情麻豆| 色综合久久综合| 奇米影视在线99精品| 精品理论电影在线观看 | 一区二区三区精品视频| 欧亚一区二区三区| 天堂资源在线中文精品| 26uuu另类欧美| 国产风韵犹存在线视精品| 亚洲激情第一区| 欧美美女bb生活片| 九九九精品视频| 亚洲嫩草精品久久| 欧美一区二区三区视频在线观看| 亚洲愉拍自拍另类高清精品| 欧美成人午夜电影| 高清不卡一区二区在线| 亚洲va欧美va天堂v国产综合| 6080yy午夜一二三区久久| 美女www一区二区| 亚洲人成亚洲人成在线观看图片 | 丝袜美腿亚洲一区| 欧美国产成人在线| 色老汉av一区二区三区| 美女视频免费一区| 亚洲免费毛片网站| 欧美一区二区福利视频| 国产福利一区二区三区视频| 一区二区三区四区亚洲| 日韩欧美中文一区二区| 国产调教视频一区| 欧美伊人久久久久久久久影院| 日韩影院精彩在线| 一区精品在线播放| 日韩精品专区在线影院重磅| 国产馆精品极品| 免费观看30秒视频久久| 中文字幕日韩欧美一区二区三区| 精品久久久久久久久久久久包黑料| 成人国产精品免费观看| 免费人成在线不卡| 午夜一区二区三区视频| **欧美大码日韩| 日韩视频中午一区| 在线精品视频免费播放| 国产精品亚洲人在线观看| 欧美视频一区二区在线观看| 国产成人午夜视频| 亚洲视频小说图片| 中文字幕在线观看一区二区| 精品国产制服丝袜高跟| 日韩写真欧美这视频| 欧洲一区二区三区在线| 国产又粗又猛又爽又黄91精品| 日本aⅴ免费视频一区二区三区| 亚洲免费在线电影| 伊人一区二区三区| 国产精品美女一区二区在线观看| 日韩午夜三级在线| 欧美一级欧美一级在线播放| 91久久国产最好的精华液| 91视频xxxx| 国产成人午夜精品影院观看视频| 免费人成在线不卡| 午夜久久电影网| 亚洲mv在线观看| 日韩精品欧美成人高清一区二区| 亚洲精品国产无天堂网2021| 国产性天天综合网| 久久综合九色综合97_久久久| 欧美一二区视频| 精品理论电影在线观看 | www.综合网.com| 91在线视频免费观看| 成人永久aaa| 国产麻豆精品一区二区| 成人福利视频网站| 国产91精品在线观看| 99免费精品视频| 91在线视频网址| 成人av网站免费| 在线观看日韩av先锋影音电影院| 一本色道久久综合狠狠躁的推荐| 欧美日韩色一区| 91精品午夜视频| 中文字幕一区二区视频| 一区二区三区四区激情| 亚洲高清免费视频| 久久国产精品露脸对白| 国产伦精一区二区三区| 国产福利精品导航| 99re亚洲国产精品| 欧美午夜在线观看| 欧美成人a∨高清免费观看| 久久久久99精品一区| 国产精品久久久久婷婷二区次| 亚洲最色的网站| 亚洲成人资源网| 国产乱子伦一区二区三区国色天香| 国产激情偷乱视频一区二区三区| 99这里只有精品| 制服丝袜日韩国产| 久久综合九色综合欧美就去吻| 亚洲男女一区二区三区| 日韩黄色一级片| 久久99这里只有精品| 91看片淫黄大片一级在线观看| 欧美视频一区二| 欧美激情资源网| 一区二区三区久久久| 国产一区91精品张津瑜| 日本高清无吗v一区| 日韩一区二区精品| 亚洲精品少妇30p| 老色鬼精品视频在线观看播放| 91啪在线观看| 精品精品国产高清一毛片一天堂| 国产午夜精品久久久久久免费视 | 图片区小说区国产精品视频| 琪琪一区二区三区| 99re8在线精品视频免费播放| 在线电影院国产精品| 久久精品一区二区三区不卡| 18成人在线观看| 韩国女主播一区二区三区| 91啪亚洲精品| 国产精品伦理一区二区| 日韩成人一区二区三区在线观看| 久久综合九色欧美综合狠狠 | 亚洲嫩草精品久久| 狠狠色伊人亚洲综合成人| 99久久国产综合精品色伊 | 99国产精品99久久久久久| 91麻豆精品国产自产在线 | 麻豆精品新av中文字幕| 色999日韩国产欧美一区二区| 欧美大尺度电影在线| 亚洲不卡在线观看| 91麻豆高清视频| 欧美片在线播放| 亚洲精品国产一区二区三区四区在线| 国产一区二区三区电影在线观看 | 日本一区中文字幕| 日本精品一区二区三区四区的功能| 日韩欧美的一区二区| 亚洲国产wwwccc36天堂| 91网站在线观看视频| 日韩美女一区二区三区四区| 亚洲精品视频在线| 99久久精品国产毛片| 国产欧美一区二区精品仙草咪 | 欧美视频一区二区三区四区| 亚洲一区日韩精品中文字幕| 99久久免费精品| 欧美一区二区国产| 久久99精品国产.久久久久| 欧美吻胸吃奶大尺度电影 | 久久久久久久久久久黄色| 日本美女一区二区三区视频| 欧美xxxx老人做受| 欧美日本在线一区| 九九视频精品免费| 精品国内二区三区| 免费人成黄页网站在线一区二区| 欧美成人午夜电影| 狠狠狠色丁香婷婷综合激情| 欧美成人福利视频| 国模冰冰炮一区二区| 中文在线资源观看网站视频免费不卡| 经典三级在线一区| 欧美一区二区国产| 日本美女视频一区二区| 日韩欧美国产一区二区在线播放| 蜜臀a∨国产成人精品| 精品少妇一区二区三区视频免付费 | 综合av第一页| 欧美日韩视频在线第一区 | 欧美日韩国产系列| 日韩精品电影在线观看|