Esempio n. 1
0
/*********************************************************************************************************
** 函数名称: _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);
}
Esempio n. 2
0
/*********************************************************************************************************
** 函数名称: _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;
}
Esempio n. 3
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);
    }
}
Esempio n. 4
0
/*********************************************************************************************************
** 函数名称: _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;
}
Esempio n. 5
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);
}
Esempio n. 6
0
/*********************************************************************************************************
** 函数名称: __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);
}