68#define OS_MEMBOX_MAGIC 0xa55a5aa5a55a5aa5
70#define OS_MEMBOX_MAGIC 0xa55a5aa5
72#define OS_MEMBOX_SET_MAGIC(addr) \
73 ((LOS_MEMBOX_NODE *)(addr))->pstNext = (LOS_MEMBOX_NODE *)OS_MEMBOX_MAGIC
74#define OS_MEMBOX_CHECK_MAGIC(addr) \
75 ((((LOS_MEMBOX_NODE *)(addr))->pstNext == (LOS_MEMBOX_NODE *)OS_MEMBOX_MAGIC) ? LOS_OK : LOS_NOK)
77#define OS_MEMBOX_USER_ADDR(addr) \
78 ((VOID *)((UINT8 *)(addr) + OS_MEMBOX_NODE_HEAD_SIZE))
79#define OS_MEMBOX_NODE_ADDR(addr) \
80 ((LOS_MEMBOX_NODE *)(VOID *)((UINT8 *)(addr) - OS_MEMBOX_NODE_HEAD_SIZE))
83#define MEMBOX_LOCK(state) LOS_SpinLockSave(&g_memboxSpin, &(state))
84#define MEMBOX_UNLOCK(state) LOS_SpinUnlockRestore(&g_memboxSpin, (state))
103 return OS_MEMBOX_CHECK_MAGIC(node);
125 MEMBOX_LOCK(intSave);
126 boxInfo->
uwBlkSize = LOS_MEMBOX_ALIGNED(blkSize + OS_MEMBOX_NODE_HEAD_SIZE);
130 MEMBOX_UNLOCK(intSave);
138 for (index = 0; index < boxInfo->
uwBlkNum - 1; ++index) {
145 MEMBOX_UNLOCK(intSave);
161 MEMBOX_LOCK(intSave);
166 OS_MEMBOX_SET_MAGIC(nodeTmp);
169 MEMBOX_UNLOCK(intSave);
171 return (nodeTmp == NULL) ? NULL : OS_MEMBOX_USER_ADDR(nodeTmp);
180 if ((pool == NULL) || (box == NULL)) {
184 MEMBOX_LOCK(intSave);
196 MEMBOX_UNLOCK(intSave);
205 if ((pool == NULL) || (box == NULL)) {
209 (VOID)memset_s(box, (boxInfo->
uwBlkSize - OS_MEMBOX_NODE_HEAD_SIZE), 0,
210 (boxInfo->
uwBlkSize - OS_MEMBOX_NODE_HEAD_SIZE));
224 MEMBOX_LOCK(intSave);
225 PRINT_INFO(
"membox(%p,0x%x,0x%x):\r\n", pool, boxInfo->
uwBlkSize, boxInfo->
uwBlkNum);
226 PRINT_INFO(
"free node list:\r\n");
229 node = node->
pstNext, ++index) {
230 PRINT_INFO(
"(%u,%p)\r\n", index, node);
233 PRINT_INFO(
"all node list:\r\n");
235 for (index = 0; index < boxInfo->
uwBlkNum; ++index, node = OS_MEMBOX_NEXT(node, boxInfo->
uwBlkSize)) {
236 PRINT_INFO(
"(%u,%p,%p)\r\n", index, node, node->
pstNext);
238 MEMBOX_UNLOCK(intSave);
244 if ((boxMem == NULL) || (maxBlk == NULL) || (blkCnt == NULL) || (blkSize == NULL)) {
LITE_OS_SEC_TEXT_MINOR VOID LOS_MemboxClr(VOID *pool, VOID *box)
清零指定静态内存块的内容
LITE_OS_SEC_TEXT VOID * LOS_MemboxAlloc(VOID *pool)
从指定的静态内存池中申请一块静态内存块,整个内核源码只有 OsSwtmrScan中用到了静态内存.
LITE_OS_SEC_TEXT_MINOR VOID LOS_ShowBox(VOID *pool)
show membox info.
LITE_OS_SEC_TEXT UINT32 LOS_MemboxFree(VOID *pool, VOID *box)
释放指定的一块静态内存块
LITE_OS_SEC_TEXT_INIT UINT32 LOS_MemboxInit(VOID *pool, UINT32 poolSize, UINT32 blkSize)
初始化一个静态内存池,根据入参设定其起始地址、总大小及每个内存块大小
LITE_OS_SEC_TEXT_MINOR UINT32 LOS_MemboxStatisticsGet(const VOID *boxMem, UINT32 *maxBlk, UINT32 *blkCnt, UINT32 *blkSize)
获取指定静态内存池的信息,包括内存池中总内存块数量、已经分配出去的内存块数量、每个内存块的大小
STATIC INLINE UINT32 OsCheckBoxMem(const LOS_MEMBOX_INFO *boxInfo, const VOID *node)
检查静态内存块
LITE_OS_SEC_BSS SPIN_LOCK_INIT(g_memboxSpin)
LOS_MEMBOX_NODE stFreeList
struct tagMEMBOX_NODE * pstNext