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

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

?? guialloc.c

?? 基于arm7內核的S3C44B0X的UCGUI應用程序
?? C
字號:
/***********************************************************************************************************                                                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;}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美一二三区精品| 国产日韩欧美一区二区三区乱码 | 亚洲精品写真福利| 亚洲大尺度视频在线观看| 久久se这里有精品| 一本一本久久a久久精品综合麻豆| 日韩欧美久久一区| 亚洲国产另类av| 久久91精品国产91久久小草| 91视频观看视频| 成人av网在线| zzijzzij亚洲日本少妇熟睡| 久久久久久99久久久精品网站| 成人手机在线视频| 国产精品午夜在线| 欧美色图免费看| 国产最新精品免费| 日本国产一区二区| 国产成人三级在线观看| 91精品国产福利| av激情亚洲男人天堂| 美女高潮久久久| 欧美日韩免费观看一区二区三区| 国产精品美女久久久久av爽李琼| 91在线视频网址| 日韩电影在线免费观看| 亚洲国产成人私人影院tom| 久久99精品国产麻豆不卡| 欧美性大战久久久久久久蜜臀 | 8x福利精品第一导航| 国产精品白丝在线| 成人影视亚洲图片在线| 国产调教视频一区| 亚洲美女视频在线| 97超碰欧美中文字幕| 国产精品视频麻豆| 丁香六月综合激情| 亚洲国产高清aⅴ视频| 亚洲猫色日本管| 91香蕉视频黄| 亚洲国产综合在线| 欧美精品 日韩| 日韩精品电影在线观看| 国产欧美日韩中文久久| 成人污视频在线观看| 中文字幕一区不卡| 91成人在线免费观看| 亚洲制服丝袜av| 欧美精品视频www在线观看| 日本不卡一二三| 99热国产精品| 亚洲一区二区在线播放相泽 | 欧美日韩精品电影| 视频一区二区三区在线| av高清不卡在线| 亚洲国产日韩精品| 日韩三区在线观看| 国产99精品国产| 一区二区三区资源| 欧美久久久久久蜜桃| 国产呦萝稀缺另类资源| 欧美精选午夜久久久乱码6080| 日本一区二区三区国色天香 | 欧美一级黄色片| 国产激情一区二区三区桃花岛亚洲| 欧美一区三区四区| 国产福利一区在线观看| 亚洲综合无码一区二区| 精品久久国产97色综合| 99综合影院在线| 日精品一区二区| 国产精品免费av| 成人av在线影院| 国产欧美va欧美不卡在线| 日本道色综合久久| 精品一区二区在线观看| 亚洲精品免费一二三区| 亚洲精品在线观| 欧美私模裸体表演在线观看| 国产专区综合网| 亚洲综合丝袜美腿| 国产欧美一区二区在线| 欧美日韩和欧美的一区二区| 国产精品久久久久久妇女6080| 国产麻豆一精品一av一免费| 一区二区三区产品免费精品久久75| jiyouzz国产精品久久| 国产精品短视频| 精品三级av在线| 欧美色图片你懂的| 国产成人高清视频| 男男视频亚洲欧美| 欧美精品一区二区三区一线天视频| 久久er99热精品一区二区| 亚洲裸体xxx| 国产精品三级电影| www国产亚洲精品久久麻豆| 91国模大尺度私拍在线视频| 一区二区三区不卡视频| 国产欧美日韩综合精品一区二区| 99免费精品在线观看| 国产成人8x视频一区二区| 免费观看在线综合色| 香蕉影视欧美成人| 亚洲自拍另类综合| 精品一区二区三区免费播放| 五月综合激情网| 精品国产露脸精彩对白 | 国产亚洲一区二区三区在线观看| 国产精品91xxx| 国产综合色精品一区二区三区| 中文字幕亚洲精品在线观看| 久久久久久久久久久黄色| 欧美成人福利视频| 日韩精品一区二区在线观看| 日韩欧美不卡一区| 欧美成人精品3d动漫h| 成人aa视频在线观看| 午夜日韩在线观看| 视频一区免费在线观看| 亚洲国产成人午夜在线一区| 欧美日韩综合在线免费观看| 欧美性猛交一区二区三区精品 | 一区二区在线免费观看| 日韩一区在线播放| 亚洲精品国产高清久久伦理二区| 日韩午夜激情电影| 欧美精品一区二区三区一线天视频| 99久久伊人网影院| 在线这里只有精品| 91.com视频| 26uuu亚洲婷婷狠狠天堂| 国产女人aaa级久久久级| 亚洲欧洲国产日韩| 亚洲第一二三四区| 久久99久久99精品免视看婷婷 | 国产精品久久久久久一区二区三区 | 欧美视频精品在线| 制服视频三区第一页精品| 9人人澡人人爽人人精品| 蜜桃视频在线观看一区二区| 久久99日本精品| 亚洲成人777| 国产一区二区不卡在线| av激情综合网| 日韩欧美高清dvd碟片| 国产欧美综合在线观看第十页| 精品免费一区二区三区| 国产精品女人毛片| 国产欧美一区二区三区网站| 亚洲精品欧美二区三区中文字幕| 亚洲国产精品成人综合色在线婷婷 | 亚洲国产乱码最新视频 | 国产精品久久三| 一区二区三区丝袜| 久久爱www久久做| 91日韩精品一区| 欧美不卡123| 综合自拍亚洲综合图不卡区| 日韩中文字幕一区二区三区| 亚洲一区免费在线观看| 精品一区二区精品| 欧美日韩国产免费一区二区| 久久久精品免费网站| 午夜精品一区在线观看| 亚洲一级二级三级在线免费观看| 一区二区视频在线| 国产一区在线看| 欧美日韩国产片| 综合中文字幕亚洲| 国产不卡一区视频| 国内精品伊人久久久久av一坑| 麻豆精品国产传媒mv男同| 99国产欧美另类久久久精品| 日韩欧美中文一区| 欧美不卡在线视频| 亚洲国产精品视频| 99久久综合色| 国产日韩精品一区| 老司机精品视频一区二区三区| 久久99精品一区二区三区三区| 韩国视频一区二区| 欧美日韩精品系列| 亚洲欧美国产77777| 成人免费观看视频| 精品国产3级a| 免费人成在线不卡| 7777精品伊人久久久大香线蕉最新版| 欧美一级爆毛片| 亚洲福利一二三区| 欧洲一区在线观看| 亚洲精品一二三| 蜜桃久久久久久| 成人在线视频首页| 中文字幕高清一区| 成人黄色片在线观看| 国产精品福利av| 一本到不卡精品视频在线观看| 欧美日韩一区二区三区视频| 亚洲一区在线免费观看|