void OSTmr_Init( void ) { #if OS_EVENT_NAME_SIZE > 10 INT8U err; #endif INT16U i; OS_TMR *ptmr1; OS_TMR *ptmr2; OS_MemClr( ( INT8U * ) & OSTmrTbl[0], sizeof( OSTmrTbl ) ); /* Clear all the TMRs */ OS_MemClr( ( INT8U * ) & OSTmrWheelTbl[0], sizeof( OSTmrWheelTbl ) ); /* Clear the timer wheel */ ptmr1 = &OSTmrTbl[0]; ptmr2 = &OSTmrTbl[1]; for ( i = 0; i < ( OS_TMR_CFG_MAX - 1 ); i++ ) { /* Init. list of free TMRs */ ptmr1->OSTmrType = OS_TMR_TYPE; ptmr1->OSTmrState = OS_TMR_STATE_UNUSED; /* Indicate that timer is inactive */ ptmr1->OSTmrNext = ( void * ) ptmr2; /* Link to next timer */ #if OS_TMR_CFG_NAME_SIZE > 1 ptmr1->OSTmrName[0] = '?'; /* Unknown name */ ptmr1->OSTmrName[1] = OS_ASCII_NUL; #endif ptmr1++; ptmr2++; } ptmr1->OSTmrType = OS_TMR_TYPE; ptmr1->OSTmrState = OS_TMR_STATE_UNUSED; /* Indicate that timer is inactive */ ptmr1->OSTmrNext = ( void * ) 0; /* Last OS_TMR */ #if OS_TMR_CFG_NAME_SIZE > 1 ptmr1->OSTmrName[0] = '?'; /* Unknown name */ ptmr1->OSTmrName[1] = OS_ASCII_NUL; #endif OSTmrTime = 0; OSTmrUsed = 0; OSTmrFree = OS_TMR_CFG_MAX; OSTmrFreeList = &OSTmrTbl[0]; OSTmrSem = OSSemCreate( 1 ); OSTmrSemSignal = OSSemCreate( 0 ); #if OS_EVENT_NAME_SIZE > 18 OSEventNameSet( OSTmrSem, ( INT8U * ) "uC/OS-II TmrLock", &err ); /* Assign names to semaphores */ #else #if OS_EVENT_NAME_SIZE > 10 OSEventNameSet( OSTmrSem, ( INT8U * ) "OS-TmrLock", &err ); #endif #endif #if OS_EVENT_NAME_SIZE > 18 OSEventNameSet( OSTmrSemSignal, ( INT8U * ) "uC/OS-II TmrSignal", &err ); #else #if OS_EVENT_NAME_SIZE > 10 OSEventNameSet( OSTmrSemSignal, ( INT8U * ) "OS-TmrSig", &err ); #endif #endif OSTmr_InitTask( ); }
void OSTmr_Init (void) { #if OS_EVENT_NAME_EN > 0u INT8U err; #endif INT16U ix; INT16U ix_next; OS_TMR *ptmr1; OS_TMR *ptmr2; OS_MemClr((INT8U *)&OSTmrTbl[0], sizeof(OSTmrTbl)); /* Clear all the TMRs */ OS_MemClr((INT8U *)&OSTmrWheelTbl[0], sizeof(OSTmrWheelTbl)); /* Clear the timer wheel */ /* 创建空闲定时器控制块链表 */ for (ix = 0u; ix < (OS_TMR_CFG_MAX - 1u); ix++) { /* Init. list of free TMRs */ ix_next = ix + 1u; ptmr1 = &OSTmrTbl[ix]; ptmr2 = &OSTmrTbl[ix_next]; ptmr1->OSTmrType = OS_TMR_TYPE; ptmr1->OSTmrState = OS_TMR_STATE_UNUSED; /* Indicate that timer is inactive */ ptmr1->OSTmrNext = (void *)ptmr2; /* Link to next timer */ #if OS_TMR_CFG_NAME_EN > 0u ptmr1->OSTmrName = (INT8U *)(void *)"?"; #endif } /* 创建链表尾 */ ptmr1 = &OSTmrTbl[ix]; ptmr1->OSTmrType = OS_TMR_TYPE; ptmr1->OSTmrState = OS_TMR_STATE_UNUSED; /* Indicate that timer is inactive */ ptmr1->OSTmrNext = (void *)0; /* Last OS_TMR */ #if OS_TMR_CFG_NAME_EN > 0u ptmr1->OSTmrName = (INT8U *)(void *)"?"; #endif OSTmrTime = 0u; OSTmrUsed = 0u; OSTmrFree = OS_TMR_CFG_MAX; /* 空闲定时器控制块链表头 */ OSTmrFreeList = &OSTmrTbl[0]; OSTmrSem = OSSemCreate(1u); OSTmrSemSignal = OSSemCreate(0u); #if OS_EVENT_NAME_EN > 0u /* Assign names to semaphores */ OSEventNameSet(OSTmrSem, (INT8U *)(void *)"uC/OS-II TmrLock", &err); OSEventNameSet(OSTmrSemSignal, (INT8U *)(void *)"uC/OS-II TmrSignal", &err); #endif /* 创建定时器线程 */ OSTmr_InitTask(); }