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

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

?? guialloc.c

?? ucgui在ARM44B0目標板上的移植代碼支持16級灰度
?? 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一区二区三区免费野_久草精品视频
日韩欧美国产成人一区二区| 99久久久无码国产精品| 麻豆91在线播放免费| 国产精品18久久久| 欧美军同video69gay| 欧美国产欧美综合| 日本一不卡视频| 色播五月激情综合网| 日韩久久久久久| 一区二区三区91| 韩日精品视频一区| 天天亚洲美女在线视频| 亚洲欧美视频在线观看视频| 免费观看在线综合色| 91在线视频观看| 精品国产乱子伦一区| 亚洲一区二区三区不卡国产欧美 | 欧美经典一区二区| 麻豆视频一区二区| 欧美巨大另类极品videosbest| 国产精品青草久久| 国产福利精品一区| 久久综合资源网| 极品少妇xxxx精品少妇| 日韩一区和二区| 青青草伊人久久| 欧美日韩第一区日日骚| 一区二区高清视频在线观看| 99亚偷拍自图区亚洲| 中文幕一区二区三区久久蜜桃| 美女爽到高潮91| 日韩欧美不卡在线观看视频| 免费成人结看片| 日韩午夜激情视频| 久久国产精品99精品国产| 欧美一级欧美一级在线播放| 日韩不卡一区二区三区| 欧美高清www午色夜在线视频| 午夜精品久久一牛影视| 欧美乱妇15p| 蜜桃视频第一区免费观看| 日韩精品自拍偷拍| 国产精品白丝jk黑袜喷水| 国产亚洲精品中文字幕| 成人av资源在线| 亚洲精品成人天堂一二三| 色噜噜狠狠色综合欧洲selulu| 一个色综合av| 555www色欧美视频| 久草这里只有精品视频| 久久亚洲免费视频| 成人网页在线观看| 中文字幕日韩一区| 欧美性生活久久| 美女视频黄 久久| 久久久久88色偷偷免费| 99久久久无码国产精品| 亚洲成人tv网| 欧美mv日韩mv国产网站app| 国产麻豆精品一区二区| 亚洲欧洲精品成人久久奇米网| 一本大道综合伊人精品热热| 日韩精品亚洲一区二区三区免费| 精品人伦一区二区色婷婷| 成人性生交大片免费看视频在线 | 在线亚洲一区观看| 天堂在线亚洲视频| 久久久亚洲精品石原莉奈 | 自拍偷拍国产精品| 日韩一区二区影院| 成人三级在线视频| 午夜欧美一区二区三区在线播放| 欧美成人精品1314www| av激情成人网| 麻豆精品一区二区av白丝在线| 欧美国产国产综合| 3d成人h动漫网站入口| 国产成人在线看| 日韩成人免费在线| 国产精品美女久久久久久久| 5566中文字幕一区二区电影| 99精品欧美一区二区三区小说 | 色国产综合视频| 国产麻豆午夜三级精品| 天天综合色天天综合色h| 亚洲国产成人自拍| 欧美α欧美αv大片| 色乱码一区二区三区88| 国产精品一区二区无线| 日韩黄色免费电影| 一区二区三区在线观看国产| 国产网红主播福利一区二区| 欧美精品日日鲁夜夜添| aaa欧美日韩| 国产九九视频一区二区三区| 香蕉久久夜色精品国产使用方法 | 日韩午夜av电影| 日本乱人伦aⅴ精品| 高清在线观看日韩| 免费在线看成人av| 亚洲国产视频在线| 亚洲欧美激情视频在线观看一区二区三区| 精品国产伦一区二区三区观看方式 | 国产一本一道久久香蕉| 日韩精品乱码av一区二区| 一区二区日韩电影| 国产精品灌醉下药二区| 国产欧美日韩另类视频免费观看 | 欧美三级日韩三级| 一本色道久久综合亚洲91| 成人午夜电影久久影院| 国产精品1024| 国产精品一二二区| 国产精品羞羞答答xxdd| 国产精品综合网| 国产精品夜夜嗨| 国产**成人网毛片九色| 国产aⅴ综合色| 成人午夜视频福利| 成人永久aaa| 国产剧情av麻豆香蕉精品| 国产一区二区精品久久99| 国产精品一二一区| 大胆欧美人体老妇| 成人永久看片免费视频天堂| eeuss国产一区二区三区| 成人av在线看| 在线一区二区三区做爰视频网站| 91久久精品国产91性色tv| 欧美三级电影精品| 91精品欧美一区二区三区综合在 | 国产亚洲一区二区三区四区| 久久精品一区二区三区四区| 国产亚洲精品中文字幕| 综合自拍亚洲综合图不卡区| 日韩伦理av电影| 亚洲国产裸拍裸体视频在线观看乱了| 亚洲亚洲人成综合网络| 日韩av一级电影| 国产一区91精品张津瑜| youjizz久久| 欧美日韩午夜影院| 精品久久久影院| 亚洲欧洲日韩在线| 石原莉奈一区二区三区在线观看| 青青草97国产精品免费观看无弹窗版| 久久99久久精品| 成人av网站大全| 精品视频在线看| 2023国产一二三区日本精品2022| 欧美激情一二三区| 五月婷婷激情综合网| 国产精品亚洲一区二区三区妖精| 99久久精品免费看| 91精品国产免费| 中文字幕免费在线观看视频一区| 亚洲国产精品久久一线不卡| 裸体健美xxxx欧美裸体表演| eeuss国产一区二区三区| 欧美精选午夜久久久乱码6080| 久久日一线二线三线suv| 亚洲一区在线看| 国产精品白丝jk白祙喷水网站| 精品污污网站免费看| 国产欧美精品国产国产专区| 亚洲国产精品久久不卡毛片| 丁香天五香天堂综合| 久久综合视频网| 中文字幕久久午夜不卡| 亚洲va天堂va国产va久| 丁香六月综合激情| 日韩欧美国产精品| 亚洲电影在线播放| 成人黄色国产精品网站大全在线免费观看 | 天天色 色综合| 成人动漫av在线| 欧美成人一区二区三区片免费| 亚洲免费视频成人| 国产91丝袜在线播放九色| 制服丝袜亚洲精品中文字幕| 亚洲区小说区图片区qvod| 狠狠色综合播放一区二区| 欧美精品在线观看播放| 自拍偷自拍亚洲精品播放| 国产精品18久久久久久vr| 日韩一区二区麻豆国产| 一区二区三区高清在线| www.欧美日韩| 国产欧美一区二区精品性| 青草av.久久免费一区| 欧美性做爰猛烈叫床潮| 亚洲精品国产精华液| 成人毛片视频在线观看| 国产日韩欧美亚洲| 国产精品综合一区二区| 欧美va亚洲va| 激情六月婷婷久久| www日韩大片| 国产综合色视频| 精品国产成人在线影院|