BST_VOID BST_SRV_CHNL_ThreadEntry( BST_VOID *pvArg ) { BST_OS_MBX_T **pstMailBox; BST_OS_LOCKCNT_T tThreadLockCnt; BST_EVT_HEAD_STRU *pstEvent; BST_UINT32 ulRtnVal; if ( BST_NULL_PTR == pvArg ) { return; } /* * 线程参数初始化,包括邮箱,运行标识 */ tThreadLockCnt = BST_OS_ThreadLock (); pstMailBox = (BST_OS_MBX_T **)pvArg; *pstMailBox = BST_OS_CreateMbx ( BST_OS_GetCurrentThreadId(), BST_L_MBOX_SIZE ); if ( BST_NULL_PTR == *pstMailBox ) { BST_OS_ThreadUnLock ( tThreadLockCnt ); return; } BST_SetThreadInitFlag( BST_CHNL_CTRL_THREAD_FLAG ); g_lstChnlMng = BST_NULL_PTR; BST_OS_InitSpinLock( &g_HighPriCntSpinLock ); BST_OS_ThreadUnLock ( tThreadLockCnt ); /* * 进入线程主循环,等待邮件,邮件内容为即将执行的任务 */ for(;;) { ulRtnVal = BST_OS_RecvMail ( *pstMailBox, (BST_VOID **)&pstEvent, BST_OS_SYS_FOREVER ); BST_ASSERT_NORM( BST_OS_SYS_TIMEOUT == ulRtnVal ); BST_SRV_ProcChnlCtrEvent( pstEvent ); /*这里判断指针不为空再次释放,因此需要传递指针的指针*/ if( BST_NULL_PTR != pstEvent->pucData ) { BST_DBG_LOG1( "tiger BST_OS_FREE 8,", pstEvent->pucData ); BST_OS_FREE( pstEvent->pucData ); } BST_OS_FREE( pstEvent ); #if ( BST_VER_TYPE == BST_UT_VER ) break; #endif } }
BST_VOID BST_SYS_InitPlatform( BST_VOID ) { if(BST_FALSE == BST_SYS_ApiGetSupported()) { BST_DBG_LOG("BST_SYS_InitPlatform: bastet nv disabled"); return; } BST_OS_InitLock(); BST_OS_InitSpinLock( &g_MboxLock ); BST_OS_MemInit(); BST_OS_TimerSysInit(); BST_DBG_INITIAL(); if( BST_TRUE == BST_SYS_InitThread() ) { BST_SYS_InitDriver(); } }
BST_UINT32 BST_OS_StaticMemInit( BST_VOID ) { BST_INT32 i; BST_UINT32 lTotalSize = 0; BST_UINT32 lTotalCtrlSize = 0; BST_VOID *pCtrlStart; BST_UINT_PTR ulSpaceStart; BST_UINT_PTR ulSpaceEnd; BST_UINT_PTR ulCtrlStart; BST_INT32 ulIndex; /* calculate mem's size */ for ( i=0; i<BST_MEM_CTRL_BLOCK_NUMBER; i++ ) { if ( 0x00000003 & g_BstMemBlockInfo[i].ulSize )/* 4 byte Aligned */ { BST_DBG_LOG2("BST_OS_StaticMemInit MemBlockInfo[%d].size(%d) not aligned.\r\n", i, g_BstMemBlockInfo[i].ulSize ); return BST_MEM_ERROR; } lTotalSize += ( g_BstMemBlockInfo[i].ulSize + BST_MEMORY_RESERVED_BYTES + BST_MEM_HEAD_BLOCK_SIZE ) * g_BstMemBlockInfo[i].ulNumber; lTotalCtrlSize += BST_MEM_HEAD_BLOCK_SIZE * g_BstMemBlockInfo[i].ulNumber; } /* calculate buf's size */ for ( i=0; i<BST_BUF_CTRL_BLOCK_NUMBER; i++ ) { if ( 0x00000003 & g_BstBufBlockInfo[i].ulSize )/* 4 byte Aligned */ { BST_DBG_LOG2("BST_OS_StaticMemInit bufMemBlockInfo[%d].size(%d) not aligned.\r\n", i, g_BstBufBlockInfo[i].ulSize ); return BST_MEM_ERROR; } lTotalSize += ( g_BstBufBlockInfo[i].ulSize + BST_MEMORY_RESERVED_BYTES + BST_MEM_HEAD_BLOCK_SIZE ) * g_BstBufBlockInfo[i].ulNumber; lTotalCtrlSize += BST_MEM_HEAD_BLOCK_SIZE * g_BstBufBlockInfo[i].ulNumber; } /* add protected space */ lTotalSize += 2 * BST_MEMORY_PROTECT_SIZE; lTotalCtrlSize += BST_MEMORY_PROTECT_SIZE; if ( lTotalSize > sizeof(g_acBstMemBuf) ) { BST_DBG_LOG2("mem init failed, lTotalSize:%d > available:%d",lTotalSize,sizeof(g_acBstMemBuf)); return BST_MEM_ERROR; } pCtrlStart = (BST_VOID *)g_acBstMemBuf; ulCtrlStart = (BST_UINT_PTR)pCtrlStart; ulSpaceStart = ulCtrlStart + lTotalCtrlSize; g_ulBstSpaceStart = ulSpaceStart; ulSpaceEnd = ulCtrlStart + lTotalSize - BST_MEMORY_PROTECT_SIZE ; g_ulBstSpaceEnd = ulSpaceEnd; g_ulBstSpaceAndProtectionStart = g_ulBstSpaceStart - BST_MEMORY_PROTECT_SIZE; g_ulBstSpaceAndProtectionEnd = g_ulBstSpaceEnd + BST_MEMORY_PROTECT_SIZE; /* the start address of msg pool */ g_ulBstMemPoolIntervalAddress[0] = g_ulBstSpaceStart; for ( i=0; i<BST_MEM_CTRL_BLOCK_NUMBER; i++ ) { BST_OS_StaticMemCtrlBlkInit( &g_BstMemCtrlBlk[i], ( BST_INT32 )g_BstMemBlockInfo[i].ulSize, ( BST_INT32 )g_BstMemBlockInfo[i].ulNumber, &ulCtrlStart, &ulSpaceStart); g_BstMemCtrlBlk[i].enType = BST_MEM_TYPE_DYNAMIC; } /* the start address of mem pool */ g_ulBstMemPoolIntervalAddress[1] = ulSpaceStart; for ( i=0; i<BST_BUF_CTRL_BLOCK_NUMBER; i++ ) { BST_OS_StaticMemCtrlBlkInit( &g_BstBufCtrlBlk[i], (BST_INT32)g_BstBufBlockInfo[i].ulSize, (BST_INT32)g_BstBufBlockInfo[i].ulNumber, &ulCtrlStart, &ulSpaceStart); g_BstBufCtrlBlk[i].enType = BST_MEM_TYPE_PBUF; } /* the start address of app mem pool */ g_ulBstMemPoolIntervalAddress[2] = ulSpaceStart; /* 初始化内存状态状态注册回调函数*/ for ( i=0; i<BST_MEM_TYPE_BUTT; i++ ) { for(ulIndex=0; ulIndex < BST_MEM_STATUS_CALLBACK_MAX_NUMBER; ulIndex++) { g_acBstMemCallBackInfo[i][ulIndex].pfCallBack = BST_NULL_PTR; g_acBstMemCallBackInfo[i][ulIndex].usLastReportValue = BST_MEM_HIGH_LEVEL; } } BST_OS_InitSpinLock(&g_stBstMemSpinLock); return BST_MEM_OK; }