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

📄 fmem.c

📁 uMemory 内存管理模块
💻 C
字号:
/*
 * =====================================================================================
 * 
 *       Filename:  fmem.c
 * 
 *    Description:  static memory allocation. 
 * 
 *        Version:  1.0
 *        Created:  6/19/2007 6:31:09 PM Tokyo Standard Time
 *       Revision:  none
 * 
 *         Author:  Jian Zhang , zhjwp@hotmail.com
 *                 
 *        Note(s):  To enable it to be used in the interrupt ISR context, instead of 
 *                  using 'critical primitive', interrupt are closed/opened.
 *                  Because this poring is based on uCOS-II, variable 'cpu_sr' is required
 *                  by primitive 'DISABLE_INTERRUPT' and 'ENABLE_INTERRUPT'. It may be 
 *                  modified when portted to other OS.
 * 
 * =====================================================================================
 */

#include "fmem.h"

INT8U FMEM_CreateParti(FMEM_PARTI *parti, void *addr, INT32U blk_num, INT32U blk_size)
{
    INT8U ret = 0;
#if OS_CRITICAL_METHOD == 3 
    OS_CPU_SR     cpu_sr = 0;
#endif

    if (blk_num) {
        INT32U num = blk_num;
        void **p_addr = (void **)addr;
        
        do {
            *p_addr = (void *)((INT8U *)p_addr + blk_size);
            p_addr = (void **)((INT8U *)p_addr + blk_size);
        } while (--num);
        
        DISABLE_INTERRUPT
        parti->base_addr = addr;
        parti->free_list = addr;
        parti->blk_size = blk_size;
        parti->blk_total_num = blk_num;
        parti->blk_free_num = blk_num;
        ENABLE_INTERRUPT;
        ret = 1;
    }
    return ret;
}

void *FMEM_Malloc(FMEM_PARTI *parti)
{
    void *addr = NULL;
#if OS_CRITICAL_METHOD == 3 
    OS_CPU_SR     cpu_sr = 0;
#endif

    DISABLE_INTERRUPT;
    if (parti->blk_free_num) {
        addr = parti->free_list;
        parti->free_list = *(void **)parti->free_list;
        parti->blk_free_num--;
    }
    ENABLE_INTERRUPT;
    return addr;
}

void  FMEM_Free(FMEM_PARTI *parti, void *addr)
{
#if OS_CRITICAL_METHOD == 3 
    OS_CPU_SR     cpu_sr = 0;
#endif

    DISABLE_INTERRUPT;
    *(void **)addr = parti->free_list;
    parti->free_list = addr;
    parti->blk_free_num++;
    ENABLE_INTERRUPT;
}

⌨️ 快捷键说明

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