void OS_TickTask (void *p_arg) { OS_ERR err; CPU_TS ts_delta; CPU_TS ts_delta_dly; CPU_TS ts_delta_timeout; CPU_SR_ALLOC(); (void)&p_arg; /* Prevent compiler warning */ while (DEF_ON) { (void)OSTaskSemPend((OS_TICK )0, (OS_OPT )OS_OPT_PEND_BLOCKING, (CPU_TS *)0, (OS_ERR *)&err); /* Wait for signal from tick interrupt */ if (err == OS_ERR_NONE) { OS_CRITICAL_ENTER(); OSTickCtr++; /* Keep track of the number of ticks */ #if (defined(TRACE_CFG_EN) && (TRACE_CFG_EN > 0u)) TRACE_OS_TICK_INCREMENT(OSTickCtr); /* Record the event. */ #endif OS_CRITICAL_EXIT(); ts_delta_dly = OS_TickListUpdateDly(); ts_delta_timeout = OS_TickListUpdateTimeout(); ts_delta = ts_delta_dly + ts_delta_timeout; /* Compute total execution time of list updates */ if (OSTickTaskTimeMax < ts_delta) { OSTickTaskTimeMax = ts_delta; } } } }
void USB_SDRAM_Disk(void *p_arg) { OS_ERR err; OS_SEM_CTR sem_cnt; (void)p_arg; ExtBus_Init(); SDRAM_Test(); // for (n = 0; n < MSC_ImageSize; n++) { /* Copy Initial Disk Image */ // Memory[n] = DiskImage[n]; /* from Flash to RAM */ // } // BSP_IntVectSet((CPU_INT08U )BSP_INT_ID_USB, // (CPU_FNCT_VOID)USB_IRQHandler); // BSP_IntPrioSet (BSP_INT_ID_USB, 3); // BSP_IntEn (BSP_INT_ID_USB); USB_Init(); /* USB Initialization */ USB_Connect(TRUE); /* USB Connect */ while (1) { // OSTimeDlyHMSM(0, 0, 0, 200, // OS_OPT_TIME_HMSM_STRICT, // &err); if( USB_PowerStatus ) { LED_Off(2); sem_cnt = OSTaskSemPend( 300, OS_OPT_PEND_BLOCKING, 0, &err); LED_On(2); sem_cnt = OSTaskSemPend( 300, OS_OPT_PEND_BLOCKING, 0, &err); } else { LED_Off(2); sem_cnt = OSTaskSemPend( 0, OS_OPT_PEND_BLOCKING, 0, &err); } } }
void OS_TmrTask (void *p_arg) { OS_ERR err; OS_TMR_CALLBACK_PTR p_fnct; OS_TMR *p_tmr; OS_TMR *p_tmr_next; CPU_TS ts; CPU_TS ts_start; CPU_TS ts_delta; (void)&p_arg; /* Not using 'p_arg', prevent compiler warning */ while (DEF_ON) { (void)OSTaskSemPend((OS_TICK )0, /* Wait for signal indicating time to update tmrs */ (OS_OPT )OS_OPT_PEND_BLOCKING, (CPU_TS *)&ts, (OS_ERR *)&err); OS_TmrLock(); ts_start = OS_TS_GET(); OSTmrTickCtr++; /* Increment the current time */ p_tmr = OSTmrListPtr; while (p_tmr != (OS_TMR *)0) { /* Update all the timers in the list */ OSSchedLock(&err); (void)&err; p_tmr_next = p_tmr->NextPtr; p_tmr->Remain--; if (p_tmr->Remain == 0) { if (p_tmr->Opt == OS_OPT_TMR_PERIODIC) { p_tmr->Remain = p_tmr->Period; /* Reload the time remaining */ } else { OS_TmrUnlink(p_tmr); /* Remove from list */ p_tmr->State = OS_TMR_STATE_COMPLETED; /* Indicate that the timer has completed */ } p_fnct = p_tmr->CallbackPtr; /* Execute callback function if available */ if (p_fnct != (OS_TMR_CALLBACK_PTR)0) { (*p_fnct)((void *)p_tmr, p_tmr->CallbackPtrArg); } } p_tmr = p_tmr_next; OSSchedUnlock(&err); (void)&err; } ts_delta = OS_TS_GET() - ts_start; /* Measure execution time of timer task */ if (OSTmrTaskTimeMax < ts_delta) { OSTmrTaskTimeMax = ts_delta; } OS_TmrUnlock(); } }
//浮点测试任务 void float_task(void *p_arg) { OS_ERR err; //CPU_SR_ALLOC(); while(1) { printf("float task wait Task Sem . \n\r"); OSTaskSemPend(0,OS_OPT_PEND_BLOCKING,0,&err); printf("float task get Task Sem . \n\r"); OSTimeDlyHMSM(0,0,0,800,OS_OPT_TIME_HMSM_STRICT,&err); //延时800ms } }
void OS_TickTask (void *p_arg) { OS_ERR err; CPU_TS ts; p_arg = p_arg; /* Prevent compiler warning */ while (DEF_ON) { (void)OSTaskSemPend((OS_TICK )0, (OS_OPT )OS_OPT_PEND_BLOCKING, (CPU_TS *)&ts, (OS_ERR *)&err); /* Wait for signal from tick interrupt */ if (err == OS_ERR_NONE) { if (OSRunning == OS_STATE_OS_RUNNING) { OS_TickListUpdate(); /* Update all tasks waiting for time */ } } } }
void USART_Echo(void *p_arg) { OS_ERR err; uint32_t recv_length; (void)p_arg; USART_SetRecvByteDoneISR(onRecvByteDone); USART_SetRecvTimeoutISR(onRecvTimeout); USART_SetSendDoneISR(onSendDone); while(1) { OSTaskSemPend(0, OS_OPT_PEND_BLOCKING, (void*)0, &err); recv_length = FIFO_Length(&USART_FIFO); recv_length = FIFO_Get(&USART_FIFO, recv_buffer, recv_length); USART_Send(recv_buffer, recv_length); } }
void protocol_task(void *p_arg) { OS_ERR err; static uint8_t Date_Handle_Flag = 0; uint8_t temp = 0; p_arg = p_arg; while(1) { OSTaskSemPend(0,OS_OPT_PEND_BLOCKING,0,&err); if( !Date_Handle_Flag) //Uart3_Recv_STA && { Date_Handle_Flag = 1; //Uart3_Recv_STA = 0; } if(Date_Handle_Flag) { temp = Hekr_RecvData_Handle(Uart3_Recv_Buffer); if(Valid_Data_Update == temp) { //接收的数据保存在 Valid_Data 数组里 //User Code if(Valid_Data[0] == 0x01) { LED0 = 1; OSTaskSuspend((OS_TCB*)&Led0TaskTCB,&err); printf("挂起LED任务\n\r"); } else { LED0 = 0; OSTaskResume((OS_TCB*)&Led0TaskTCB,&err); printf("恢复LED任务\n\r"); } if(Valid_Data[1] == 0x01) { OSTaskDel((OS_TCB*)&FloatTaskTCB,&err); printf("删除float任务\n\r"); } else { //创建浮点测试任务 OSTaskCreate((OS_TCB * )&FloatTaskTCB, (CPU_CHAR * )"float test task", (OS_TASK_PTR )float_task, (void * )0, (OS_PRIO )FLOAT_TASK_PRIO, (CPU_STK * )&FLOAT_TASK_STK[0], (CPU_STK_SIZE)FLOAT_STK_SIZE/10, (CPU_STK_SIZE)FLOAT_STK_SIZE, (OS_MSG_QTY )0, (OS_TICK )0, (void * )0, (OS_OPT )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR, (OS_ERR * )&err); } } if(Hekr_Module_State_Update == temp) { //接收的数据保存在 Module_Status 数组里 //User Code } Date_Handle_Flag = 0; } OSTimeDlyHMSM(0,0,0,10,OS_OPT_TIME_HMSM_STRICT,&err); //延时10ms } }
void OS_TmrTask (void *p_arg) { CPU_BOOLEAN done; OS_ERR err; OS_TMR_CALLBACK_PTR p_fnct; OS_TMR_SPOKE *p_spoke; OS_TMR *p_tmr; OS_TMR *p_tmr_next; OS_TMR_SPOKE_IX spoke; CPU_TS ts; CPU_TS ts_start; CPU_TS ts_end; p_arg = p_arg; /* Not using 'p_arg', prevent compiler warning */ while (DEF_ON) { (void)OSTaskSemPend((OS_TICK )0, /* Wait for signal indicating time to update tmrs */ (OS_OPT )OS_OPT_PEND_BLOCKING, (CPU_TS *)&ts, (OS_ERR *)&err); OSSchedLock(&err); ts_start = OS_TS_GET(); OSTmrTickCtr++; /* Increment the current time */ spoke = (OS_TMR_SPOKE_IX)(OSTmrTickCtr % OSCfg_TmrWheelSize); p_spoke = &OSCfg_TmrWheel[spoke]; p_tmr = p_spoke->FirstPtr; done = DEF_FALSE; while (done == DEF_FALSE) { if (p_tmr != (OS_TMR *)0) { p_tmr_next = (OS_TMR *)p_tmr->NextPtr; /* Point to next tmr to update because current ... */ /* ... timer could get unlinked from the wheel. */ if (OSTmrTickCtr == p_tmr->Match) { /* Process each timer that expires */ OS_TmrUnlink(p_tmr); /* Remove from current wheel spoke */ if (p_tmr->Opt == OS_OPT_TMR_PERIODIC) { OS_TmrLink(p_tmr, OS_OPT_LINK_PERIODIC); /* Recalculate new position of timer in wheel */ } else { p_tmr->State = OS_TMR_STATE_COMPLETED; /* Indicate that the timer has completed */ } p_fnct = p_tmr->CallbackPtr; /* Execute callback function if available */ if (p_fnct != (OS_TMR_CALLBACK_PTR)0) { (*p_fnct)((void *)p_tmr, p_tmr->CallbackPtrArg); } p_tmr = p_tmr_next; /* See if next timer matches */ } else { done = DEF_TRUE; } } else { done = DEF_TRUE; } } ts_end = OS_TS_GET() - ts_start; /* Measure execution time of timer task */ OSSchedUnlock(&err); if (OSTmrTaskTimeMax < ts_end) { OSTmrTaskTimeMax = ts_end; } } }