⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 guialloc.lst

📁 Keil C下通过的UCGUI,UCGUI的移植源代码
💻 LST
📖 第 1 页 / 共 2 页
字号:
 213   4              U8* pData = &GUI_Heap.abHeap[aBlock[iNext].Off];
 214   4              memmove(pData-NumBytesBeforeBlock, pData, aBlock[iNext].Size);
 215   4              aBlock[iNext].Off -=NumBytesBeforeBlock;
 216   4            }
 217   3          }
 218   2        }
 219   1      /* Check last block */
 220   1        if (GUI_ALLOC_SIZE - (aBlock[i].Off+aBlock[i].Size) >= Size)
 221   1          r = i;
 222   1        return r;
 223   1      }
 224          
 225          static void CheckInit(void) {
 226   1        if (!IsInitialized)
 227   1          GUI_ALLOC_Init();
 228   1      }
 229          
 230          /*
 231            ********************************************************************
 232            *
 233            *                  Exported routines
 234            *
 235            ********************************************************************
 236          */
 237          
 238          void GUI_ALLOC_Init(void) {
 239   1        GUI_DEBUG_LOG("\nGUI_ALLOC_Init...");
C51 COMPILER V8.05a   GUIALLOC                                                             04/11/2008 14:18:53 PAGE 5   

 240   1        GUI_ALLOC.NumFreeBlocksMin = GUI_ALLOC.NumFreeBlocks = GUI_MAXBLOCKS-1;
 241   1        GUI_ALLOC.NumFreeBytesMin  = GUI_ALLOC.NumFreeBytes  = GUI_ALLOC_SIZE;
 242   1        GUI_ALLOC.NumUsedBlocks = 0;
 243   1        GUI_ALLOC.NumUsedBytes = 0;
 244   1        aBlock[0].Size = (1<<GUI_BLOCK_ALIGN);  /* occupy minimum for a block */
 245   1        aBlock[0].Off  = 0;
 246   1        aBlock[0].Next = 0;
 247   1        IsInitialized =1;
 248   1      }
 249          
 250          static GUI_HMEM _Alloc(int size) {
 251   1        GUI_HMEM hMemNew, hMemIns;
 252   1        CheckInit();
 253   1        size = Size2LegalSize(size);
 254   1        /* Check if memory is available at all ...*/
 255   1        if (size > GUI_ALLOC.NumFreeBytes) {
 256   2          GUI_DEBUG_WARN1("GUI_ALLOC_Alloc: Insufficient memory configured (Trying to alloc % bytes)", size);
 257   2          return 0;
 258   2        }
 259   1        /* Locate free handle */
 260   1        if ((hMemNew = FindFreeHandle()) == 0)
 261   1          return 0;
 262   1        /* Locate or Create hole of sufficient size */
 263   1        hMemIns = FindHole(size);
 264   1        #if GUI_ALLOC_AUTDEFRAG
 265   1          if (hMemIns == -1) {
 266   2            hMemIns = CreateHole(size);
 267   2          }
 268   1        #endif
 269   1      /* Occupy hole */
 270   1        if (hMemIns==-1) {
 271   2          GUI_DEBUG_ERROROUT1("GUI_ALLOC_Alloc: Could not allocate %d bytes",size);
 272   2          return 0;
 273   2              }
 274   1        {
 275   2          int Off = aBlock[hMemIns].Off+aBlock[hMemIns].Size;
 276   2          int Next = aBlock[hMemIns].Next;
 277   2          aBlock[hMemNew].Size  = size;
 278   2          aBlock[hMemNew].Off   = Off;
 279   2          if ((aBlock[hMemNew].Next  = Next) >0) {
 280   3            aBlock[Next].Prev = hMemNew;  
 281   3          }
 282   2          aBlock[hMemNew].Prev  = hMemIns;
 283   2          aBlock[hMemIns].Next  = hMemNew;
 284   2        }
 285   1      /* Keep track of number of blocks and av. memory */
 286   1        GUI_ALLOC.NumUsedBlocks++;
 287   1        GUI_ALLOC.NumFreeBlocks--;
 288   1        if (GUI_ALLOC.NumFreeBlocksMin > GUI_ALLOC.NumFreeBlocks) {
 289   2          GUI_ALLOC.NumFreeBlocksMin = GUI_ALLOC.NumFreeBlocks;
 290   2        }
 291   1        GUI_ALLOC.NumUsedBytes += size;
 292   1        GUI_ALLOC.NumFreeBytes -= size;
 293   1        if (GUI_ALLOC.NumFreeBytesMin > GUI_ALLOC.NumFreeBytes) {
 294   2          GUI_ALLOC.NumFreeBytesMin = GUI_ALLOC.NumFreeBytes;
 295   2        }
 296   1      /* In order to be on the safe side, zeroinit ! */
 297   1        memset(HMEM2PTR(hMemNew), 0, size);
 298   1        return hMemNew;
 299   1      }
 300          
 301          GUI_HMEM GUI_ALLOC_Alloc(int size) {
C51 COMPILER V8.05a   GUIALLOC                                                             04/11/2008 14:18:53 PAGE 6   

 302   1        GUI_HMEM hMem;
 303   1       /* First make sure that init has been called */
 304   1        GUI_LOCK();
 305   1        GUI_DEBUG_LOG2("\nGUI_ALLOC_Alloc... requesting %d, %d avail", size, GUI_ALLOC.NumFreeBytes);
 306   1        hMem = _Alloc(size);
 307   1        GUI_DEBUG_LOG1("\nGUI_ALLOC_Alloc : Handle", hMem);
 308   1        GUI_UNLOCK();
 309   1        return hMem;
 310   1      }
 311          
 312          void GUI_ALLOC_Free(GUI_HMEM hMem) {
 313   1        int Size;
 314   1        if (hMem == GUI_HMEM_NULL)  /* Note: This is not an error, it is permitted */
 315   1          return;
 316   1        GUI_LOCK();
 317   1        GUI_DEBUG_LOG1("\nGUI_ALLOC_Free(%d)", hMem);
 318   1        /* Do some error checking ... */
 319   1        #if GUI_DEBUG_LEVEL>0
 320   1          /* Block not allocated ? */
 321   1          if (aBlock[hMem].Size==0) {
 322   2            GUI_DEBUG_ERROROUT("GUI_ALLOC_Free(): Invalid hMem");
 323   2            return;
 324   2          }
 325   1        #endif
 326   1        Size = aBlock[hMem].Size;
 327   1        #ifdef WIN32
                  memset(&GUI_Heap.abHeap[aBlock[hMem].Off], 0xcc, Size);
                #endif
 330   1        GUI_ALLOC.NumFreeBytes += Size;
 331   1        GUI_ALLOC.NumUsedBytes -= Size;
 332   1        aBlock[hMem].Size = 0;
 333   1        {
 334   2          int Next = aBlock[hMem].Next;
 335   2          int Prev = aBlock[hMem].Prev;
 336   2          aBlock[Prev].Next = Next;
 337   2          if (Next)
 338   2            aBlock[Next].Prev = Prev;
 339   2        }  
 340   1        GUI_ALLOC.NumFreeBlocks++;
 341   1        GUI_ALLOC.NumUsedBlocks--;
 342   1        GUI_UNLOCK();
 343   1      }
 344          
 345          void*       GUI_ALLOC_h2p   (GUI_HMEM  hMem) {
 346   1        #if GUI_DEBUG_LEVEL>0
 347   1          if (!hMem) {
 348   2            GUI_DEBUG_ERROROUT("\n"__FILE__ " GUI_ALLOC_h2p: illegal argument (0 handle)");
 349   2            return 0;
 350   2          }
 351   1        #endif
 352   1        return HMEM2PTR(hMem);
 353   1      }
 354          
 355          void GUI_ALLOC_FreePtr(GUI_HMEM *ph) {
 356   1        GUI_LOCK();
 357   1        GUI_ALLOC_Free(*ph);
 358   1        *ph =0;
 359   1        GUI_UNLOCK();
 360   1      }
 361          
 362          /*
 363            ********************************************************************
C51 COMPILER V8.05a   GUIALLOC                                                             04/11/2008 14:18:53 PAGE 7   

 364            *
 365            *                  Exported info routines
 366            *
 367            ********************************************************************
 368          */
 369          
 370          int GUI_GetUsedMem(void) {
 371   1        int NumUsedBytes=0;
 372   1        int i;
 373   1        GUI_LOCK();
 374   1        CheckInit();
 375   1        for (i=1; i; i = aBlock[i].Next) {
 376   2          NumUsedBytes += aBlock[i].Size;
 377   2        }
 378   1        GUI_UNLOCK();
 379   1        return NumUsedBytes;
 380   1      }
 381          
 382          
 383          int GUI_ALLOC_GetNumFreeBytes(void) {
 384   1        CheckInit();
 385   1        return GUI_ALLOC.NumFreeBytes;  
 386   1      }
 387          /*
 388            *************************************************
 389            *
 390            *       GetMaxSize
 391            *
 392            *************************************************
 393          
 394            Returns the biggest available blocksize
 395            (without relocation)
 396          
 397          */
 398          int GUI_ALLOC_GetMaxSize(void) {
 399   1        int r=0;
 400   1        int NumFreeBytes;
 401   1        int i, iNext;
 402   1        GUI_LOCK();
 403   1        CheckInit();
 404   1        for (i=0; (iNext =aBlock[i].Next) !=0; i= iNext) {
 405   2          NumFreeBytes = aBlock[iNext].Off- (aBlock[i].Off+aBlock[i].Size);
 406   2          if (NumFreeBytes > r) {
 407   3            r = NumFreeBytes;
 408   3          }
 409   2        }
 410   1      /* Check last block */
 411   1        NumFreeBytes = (GUI_ALLOC_SIZE - (aBlock[i].Off+aBlock[i].Size));
 412   1        if (NumFreeBytes > r) {
 413   2          r = NumFreeBytes;
 414   2        }
 415   1        GUI_UNLOCK();
 416   1        return r;
 417   1      }
 418          


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =   2196    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =   1801      44
   PDATA SIZE       =   ----    ----
C51 COMPILER V8.05a   GUIALLOC                                                             04/11/2008 14:18:53 PAGE 8   

   DATA SIZE        =   ----    ----
   IDATA SIZE       =   ----    ----
   BIT SIZE         =   ----    ----
END OF MODULE INFORMATION.


C51 COMPILATION COMPLETE.  0 WARNING(S),  0 ERROR(S)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -