/********************************************************************************************************* ** 函数名称: _JobQueueCreate ** 功能描述: 创建一个工作队列 ** 输 入 : uiQueueSize 队列大小 ** bNonBlock 执行函数是否为非阻塞方式 ** 输 出 : 工作队列控制块 ** 全局变量: ** 调用模块: *********************************************************************************************************/ PLW_JOB_QUEUE _jobQueueCreate (UINT uiQueueSize, BOOL bNonBlock) { PLW_JOB_QUEUE pjobq; pjobq = (PLW_JOB_QUEUE)__KHEAP_ALLOC((size_t)(sizeof(LW_JOB_QUEUE) + (uiQueueSize * sizeof(LW_JOB_MSG)))); if (pjobq == LW_NULL) { _DebugHandle(__ERRORMESSAGE_LEVEL, "kernel low memory.\r\n"); _ErrorHandle(ERROR_KERNEL_LOW_MEMORY); return (LW_NULL); } pjobq->JOBQ_pjobmsgQueue = (PLW_JOB_MSG)(pjobq + 1); pjobq->JOBQ_uiIn = 0; pjobq->JOBQ_uiOut = 0; pjobq->JOBQ_uiCnt = 0; pjobq->JOBQ_uiSize = uiQueueSize; pjobq->JOBQ_stLost = 0; if (bNonBlock == LW_FALSE) { pjobq->JOBQ_ulSync = API_SemaphoreBCreate("job_sync", LW_FALSE, LW_OPTION_OBJECT_GLOBAL, LW_NULL); if (pjobq->JOBQ_ulSync == LW_OBJECT_HANDLE_INVALID) { __KHEAP_FREE(pjobq); return (LW_NULL); } } LW_SPIN_INIT(&pjobq->JOBQ_slLock); return (pjobq); }
/********************************************************************************************************* ** 函数名称: _ThreadIdInit ** 功能描述: 初始化线程ID 一共初始化 LW_CFG_MAX_THREADS 个元素 ** 输 入 : ** 输 出 : ** 全局变量: ** 调用模块: *********************************************************************************************************/ VOID _ThreadIdInit (VOID) { REGISTER ULONG ulI; REGISTER PLW_CLASS_TCB ptcbTemp1; REGISTER PLW_CLASS_TCB ptcbTemp2; REGISTER PLW_LIST_MONO pmonoTemp1; REGISTER PLW_LIST_MONO pmonoTemp2; _K_resrcTcb.RESRC_pmonoFreeHeader = &_K_tcbBuffer[0].TCB_monoResrcList; /* 设置资源表头 */ ptcbTemp1 = &_K_tcbBuffer[0]; ptcbTemp2 = &_K_tcbBuffer[1]; for (ulI = 0; ulI < (LW_CFG_MAX_THREADS - 1); ulI++) { pmonoTemp1 = &ptcbTemp1->TCB_monoResrcList; pmonoTemp2 = &ptcbTemp2->TCB_monoResrcList; LW_SPIN_INIT(&ptcbTemp1->TCB_slLock); ptcbTemp1->TCB_usIndex = (UINT16)ulI; /* 设置缓冲池内部编号 */ _LIST_MONO_LINK(pmonoTemp1, pmonoTemp2); ptcbTemp1++; ptcbTemp2++; } pmonoTemp1 = &ptcbTemp1->TCB_monoResrcList; LW_SPIN_INIT(&ptcbTemp1->TCB_slLock); ptcbTemp1->TCB_usIndex = (UINT16)ulI; _INIT_LIST_MONO_HEAD(pmonoTemp1); /* 设置为最后一个元素 */ _K_resrcTcb.RESRC_pmonoFreeTail = pmonoTemp1; _K_resrcTcb.RESRC_uiUsed = 0; _K_resrcTcb.RESRC_uiMaxUsed = 0; }
/********************************************************************************************************* ** 函数名称: _evtfdOpen ** 功能描述: 打开 eventfd 设备 ** 输 入 : pevtfddev eventfd 设备 ** pcName 名称 ** iFlags 方式 ** iMode 方法 ** 输 出 : ERROR ** 全局变量: ** 调用模块: *********************************************************************************************************/ static LONG _evtfdOpen (PLW_EVTFD_DEV pevtfddev, PCHAR pcName, INT iFlags, INT iMode) { PLW_EVTFD_FILE pevtfdfil; if (pcName == LW_NULL) { _DebugHandle(__ERRORMESSAGE_LEVEL, "device name invalidate.\r\n"); _ErrorHandle(ERROR_IO_NO_DEVICE_NAME_IN_PATH); return (PX_ERROR); } else { if (iFlags & O_CREAT) { _ErrorHandle(ERROR_IO_FILE_EXIST); return (PX_ERROR); } pevtfdfil = (PLW_EVTFD_FILE)__SHEAP_ALLOC(sizeof(LW_EVTFD_FILE)); if (!pevtfdfil) { _DebugHandle(__ERRORMESSAGE_LEVEL, "system low memory.\r\n"); _ErrorHandle(ERROR_SYSTEM_LOW_MEMORY); return (PX_ERROR); } pevtfdfil->EF_iFlag = iFlags; pevtfdfil->EF_ulReadLock = API_SemaphoreBCreate("evtfd_rlock", LW_FALSE, LW_OPTION_OBJECT_GLOBAL, LW_NULL); if (pevtfdfil->EF_ulReadLock == LW_OBJECT_HANDLE_INVALID) { __SHEAP_FREE(pevtfdfil); return (PX_ERROR); } pevtfdfil->EF_ulWriteLock = API_SemaphoreBCreate("evtfd_wlock", LW_TRUE, LW_OPTION_OBJECT_GLOBAL, LW_NULL); if (pevtfdfil->EF_ulWriteLock == LW_OBJECT_HANDLE_INVALID) { API_SemaphoreBDelete(&pevtfdfil->EF_ulReadLock); __SHEAP_FREE(pevtfdfil); return (PX_ERROR); } pevtfdfil->EF_u64Counter = 0ull; lib_bzero(&pevtfdfil->EF_selwulist, sizeof(LW_SEL_WAKEUPLIST)); pevtfdfil->EF_selwulist.SELWUL_hListLock = _G_hEvtfdSelMutex; LW_SPIN_INIT(&pevtfdfil->EF_slLock); LW_DEV_INC_USE_COUNT(&_G_evtfddev.ED_devhdrHdr); return ((LONG)pevtfdfil); } }
/********************************************************************************************************* ** 函数名称: _HeapInit ** 功能描述: 堆内存初始化 ** 输 入 : ** 输 出 : ** 全局变量: ** 调用模块: *********************************************************************************************************/ VOID _HeapInit (VOID) { REGISTER ULONG ulI; REGISTER PLW_LIST_MONO pmonoTemp1; REGISTER PLW_LIST_MONO pmonoTemp2; REGISTER PLW_CLASS_HEAP heapTemp1; REGISTER PLW_CLASS_HEAP heapTemp2; _K_resrcHeap.RESRC_pmonoFreeHeader = &_K_heapBuffer[0].HEAP_monoResrcList; heapTemp1 = &_K_heapBuffer[0]; /* 指向缓冲池首地址 */ heapTemp2 = &_K_heapBuffer[1]; for (ulI = 0; ulI < (LW_CFG_MAX_REGIONS + 1); ulI++) { /* LW_CFG_MAX_REGIONS + 2 个 */ pmonoTemp1 = &heapTemp1->HEAP_monoResrcList; pmonoTemp2 = &heapTemp2->HEAP_monoResrcList; heapTemp1->HEAP_usIndex = (UINT16)ulI; LW_SPIN_INIT(&heapTemp1->HEAP_slLock); _LIST_MONO_LINK(pmonoTemp1, pmonoTemp2); heapTemp1++; heapTemp2++; } heapTemp1->HEAP_usIndex = (UINT16)ulI; LW_SPIN_INIT(&heapTemp1->HEAP_slLock); pmonoTemp1 = &heapTemp1->HEAP_monoResrcList; _INIT_LIST_MONO_HEAD(pmonoTemp1); _K_resrcHeap.RESRC_pmonoFreeTail = pmonoTemp1; _K_resrcHeap.RESRC_uiUsed = 0; _K_resrcHeap.RESRC_uiMaxUsed = 0; }
/********************************************************************************************************* ** 函数名称: _JobQueueInit ** 功能描述: 初始化一个工作队列 (静态创建) ** 输 入 : pjobq 需要初始化的工作队列控制块 ** pjobmsg 消息缓冲区 ** uiQueueSize 队列大小 ** bNonBlock 执行函数是否为非阻塞方式 ** 输 出 : 工作队列控制块 ** 全局变量: ** 调用模块: *********************************************************************************************************/ ULONG _jobQueueInit (PLW_JOB_QUEUE pjobq, PLW_JOB_MSG pjobmsg, UINT uiQueueSize, BOOL bNonBlock) { pjobq->JOBQ_pjobmsgQueue = pjobmsg; pjobq->JOBQ_uiIn = 0; pjobq->JOBQ_uiOut = 0; pjobq->JOBQ_uiCnt = 0; pjobq->JOBQ_uiSize = uiQueueSize; pjobq->JOBQ_stLost = 0; if (bNonBlock == LW_FALSE) { pjobq->JOBQ_ulSync = API_SemaphoreBCreate("job_sync", LW_FALSE, LW_OPTION_OBJECT_GLOBAL, LW_NULL); if (pjobq->JOBQ_ulSync == LW_OBJECT_HANDLE_INVALID) { return (errno); } } LW_SPIN_INIT(&pjobq->JOBQ_slLock); return (ERROR_NONE); }
/********************************************************************************************************* ** 函数名称: __canDevInit ** 功能描述: 创建 CAN 设备 ** 输 入 : ** pcanDev CAN 设备 ** uiRdFrameSize 接收缓冲区大小 ** uiWrtFrameSize 发送缓冲区大小 ** 输 出 : ERROR_NONE or PX_ERROR ** 全局变量: ** 调用模块: *********************************************************************************************************/ static INT __canDevInit (__CAN_DEV *pcanDev, UINT uiRdFrameSize, UINT uiWrtFrameSize) { REGISTER INT iErrLevel = 0; pcanDev->CAN_ulSendTimeout = LW_OPTION_WAIT_INFINITE; /* 初始化为永久等待 */ pcanDev->CAN_ulRecvTimeout = LW_OPTION_WAIT_INFINITE; /* 初始化为永久等待 */ pcanDev->CAN_pcanqRecvQueue = __canInitQueue(uiRdFrameSize); /* 创建读缓冲区 */ if (pcanDev->CAN_pcanqRecvQueue == LW_NULL) { /* 创建失败 */ _DebugHandle(__ERRORMESSAGE_LEVEL, "system low memory.\r\n"); _ErrorHandle(ERROR_SYSTEM_LOW_MEMORY); return (PX_ERROR); } pcanDev->CAN_pcanqSendQueue = __canInitQueue(uiWrtFrameSize); /* 创建读缓冲区 */ if (pcanDev->CAN_pcanqSendQueue == LW_NULL) { /* 创建失败 */ _DebugHandle(__ERRORMESSAGE_LEVEL, "system low memory.\r\n"); _ErrorHandle(ERROR_SYSTEM_LOW_MEMORY); iErrLevel = 1; goto __error_handle; } pcanDev->CAN_canstatWriteState.CANSTAT_bBufEmpty = LW_TRUE; /* 发送队列空 */ pcanDev->CAN_uiBusState = CAN_DEV_BUS_ERROR_NONE; /* 发送队列空 */ pcanDev->CAN_ulRcvSemB = API_SemaphoreBCreate("can_rsync", LW_FALSE, LW_OPTION_WAIT_PRIORITY | LW_OPTION_OBJECT_GLOBAL, LW_NULL); /* 读同步 */ if (!pcanDev->CAN_ulRcvSemB) { iErrLevel = 2; goto __error_handle; } pcanDev->CAN_ulSendSemB = API_SemaphoreBCreate("can_wsync", LW_TRUE, LW_OPTION_WAIT_PRIORITY | LW_OPTION_OBJECT_GLOBAL, LW_NULL); /* 写同步 */ if (!pcanDev->CAN_ulSendSemB) { iErrLevel = 3; goto __error_handle; } pcanDev->CAN_ulMutexSemM = API_SemaphoreMCreate("can_lock", LW_PRIO_DEF_CEILING, (LW_OPTION_WAIT_FIFO | LW_OPTION_DELETE_SAFE | LW_OPTION_INHERIT_PRIORITY | LW_OPTION_OBJECT_GLOBAL), LW_NULL); /* 互斥访问控制信号量 */ if (!pcanDev->CAN_ulMutexSemM) { iErrLevel = 4; goto __error_handle; } SEL_WAKE_UP_LIST_INIT(&pcanDev->CAN_selwulList); /* 初始化 select 等待链 */ LW_SPIN_INIT(&pcanDev->CAN_slLock); /* 初始化自旋锁 */ return (ERROR_NONE); __error_handle: if (iErrLevel > 3) { API_SemaphoreBDelete(&pcanDev->CAN_ulSendSemB); /* 删除写同步 */ } if (iErrLevel > 2) { API_SemaphoreBDelete(&pcanDev->CAN_ulRcvSemB); /* 删除读同步 */ } if (iErrLevel > 1) { __canDeleteQueue(pcanDev->CAN_pcanqSendQueue); /* 删除读缓冲区 */ } if (iErrLevel > 0) { __canDeleteQueue(pcanDev->CAN_pcanqRecvQueue); /* 删除写缓冲区 */ } return (PX_ERROR); }