/** **************************************************************************************************** * @file malloc.c * @author 青谷智控 * @version V1.0 * @date 2024-03-10 * @brief 内存管理 驱动 **************************************************************************************************** */ #ifndef __MALLOC_H #define __MALLOC_H #include "drv_sys.h" /* 瀹氫箟鍏釜鍐呭瓨姹 */ #define SRAMIN 0 /* 鍐呴儴鍐呭瓨姹 */ #define SRAMCCM 1 /* CCM鍐呭瓨姹(姝ら儴鍒哠RAM浠呬粎CPU鍙互璁块棶!!!) */ #define SRAMEX 2 /* 澶栭儴鍐呭瓨姹 */ #define SRAMBANK 3 /* 瀹氫箟鏀寔鐨凷RAM鍧楁暟 */ /* 瀹氫箟鍐呭瓨绠$悊琛ㄧ被鍨,褰撳鎵㏒DRAM鐨勬椂鍊欙紝蹇呴』浣跨敤uint32_t绫诲瀷锛屽惁鍒欏彲浠ュ畾涔夋垚uint16_t锛屼互鑺傜渷鍐呭瓨鍗犵敤 */ #define MT_TYPE uint16_t /* 鍗曞潡鍐呭瓨锛屽唴瀛樼鐞嗘墍鍗犵敤鐨勫叏閮ㄧ┖闂村ぇ灏忚绠楀叕寮忓涓嬶細 * size = MEM1_MAX_SIZE + (MEM1_MAX_SIZE / MEM1_BLOCK_SIZE) * sizeof(MT_TYPE) * 浠RAMEX涓轰緥锛宻ize = 963 * 1024 + (963 * 1024 / 32) * 2 = 1047744 鈮 1023KB * 宸茬煡鎬诲唴瀛樺閲(size)锛屾渶澶у唴瀛樻睜鐨勮绠楀叕寮忓涓嬶細 * MEM1_MAX_SIZE = (MEM1_BLOCK_SIZE * size) / (MEM1_BLOCK_SIZE + sizeof(MT_TYPE)) * 浠CM涓轰緥, MEM2_MAX_SIZE = (32 * 64) / (32 + 2) = 60.24KB 鈮 60KB */ /* mem1鍐呭瓨鍙傛暟璁惧畾.mem1瀹屽叏澶勪簬鍐呴儴SRAM閲岄潰 */ #define MEM1_BLOCK_SIZE 32 /* 鍐呭瓨鍧楀ぇ灏忎负32瀛楄妭 */ #define MEM1_MAX_SIZE 100*1024 /* 鏈澶х鐞嗗唴瀛 100K */ #define MEM1_ALLOC_TABLE_SIZE MEM1_MAX_SIZE/MEM1_BLOCK_SIZE /* 鍐呭瓨琛ㄥぇ灏 */ /* mem2鍐呭瓨鍙傛暟璁惧畾.mem2澶勪簬CCM,鐢ㄤ簬绠$悊CCM(鐗瑰埆娉ㄦ剰,杩欓儴鍒哠RAM,浠匔PU鍙互璁块棶!!) */ #define MEM2_BLOCK_SIZE 32 /* 鍐呭瓨鍧楀ぇ灏忎负32瀛楄妭 */ #define MEM2_MAX_SIZE 60 *1024 /* 鏈澶х鐞嗗唴瀛60K */ #define MEM2_ALLOC_TABLE_SIZE MEM2_MAX_SIZE/MEM2_BLOCK_SIZE /* 鍐呭瓨琛ㄥぇ灏 */ /* mem3鍐呭瓨鍙傛暟璁惧畾.mem3鏄鎵㏒RAM */ #define MEM3_BLOCK_SIZE 32 /* 鍐呭瓨鍧楀ぇ灏忎负32瀛楄妭 */ #define MEM3_MAX_SIZE 963 *1024 /* 鏈澶х鐞嗗唴瀛963K */ #define MEM3_ALLOC_TABLE_SIZE MEM3_MAX_SIZE/MEM3_BLOCK_SIZE /* 鍐呭瓨琛ㄥぇ灏 */ /* 濡傛灉娌℃湁瀹氫箟NULL, 瀹氫箟NULL */ #ifndef NULL #define NULL 0 #endif /* 鍐呭瓨绠$悊鎺у埗鍣 */ struct _m_mallco_dev { void (*init)(uint8_t); /* 鍒濆鍖 */ uint16_t (*perused)(uint8_t); /* 鍐呭瓨浣跨敤鐜 */ uint8_t *membase[SRAMBANK]; /* 鍐呭瓨姹 绠$悊SRAMBANK涓尯鍩熺殑鍐呭瓨 */ MT_TYPE *memmap[SRAMBANK]; /* 鍐呭瓨绠$悊鐘舵佽〃 */ uint8_t memrdy[SRAMBANK]; /* 鍐呭瓨绠$悊鏄惁灏辩华 */ }; extern struct _m_mallco_dev mallco_dev; /* 鍦╩allco.c閲岄潰瀹氫箟 */ /* 鐢ㄦ埛璋冪敤鍑芥暟 */ void my_mem_init(uint8_t memx); /* 鍐呭瓨绠$悊鍒濆鍖栧嚱鏁(澶/鍐呴儴璋冪敤) */ uint16_t my_mem_perused(uint8_t memx) ; /* 鑾峰緱鍐呭瓨浣跨敤鐜(澶/鍐呴儴璋冪敤) */ void my_mem_set(void *s, uint8_t c, uint32_t count);/* 鍐呭瓨璁剧疆鍑芥暟 */ void my_mem_copy(void *des, void *src, uint32_t n); /* 鍐呭瓨鎷疯礉鍑芥暟 */ void myfree(uint8_t memx, void *ptr); /* 鍐呭瓨閲婃斁(澶栭儴璋冪敤) */ void *mymalloc(uint8_t memx, uint32_t size); /* 鍐呭瓨鍒嗛厤(澶栭儴璋冪敤) */ void *myrealloc(uint8_t memx, void *ptr, uint32_t size); /* 閲嶆柊鍒嗛厤鍐呭瓨(澶栭儴璋冪敤) */ #endif