void OSTimeTick (void) { #if ((OS_CFG_TASK_TICK_EN == DEF_ENABLED) || (OS_CFG_TMR_EN == DEF_ENABLED)) OS_ERR err; #endif if (OSRunning != OS_STATE_OS_RUNNING) { return; } OSTimeTickHook(); /* Call user definable hook */ #if (OS_CFG_TASK_TICK_EN == DEF_ENABLED) (void)OSTaskSemPost(&OSTickTaskTCB, /* Signal tick task */ OS_OPT_POST_NONE, &err); #if (OS_CFG_SCHED_ROUND_ROBIN_EN == DEF_ENABLED) OS_SchedRoundRobin(&OSRdyList[OSPrioCur]); #endif #if (OS_CFG_TMR_EN == DEF_ENABLED) OSTmrUpdateCtr--; if (OSTmrUpdateCtr == 0u) { OSTmrUpdateCtr = OSTmrUpdateCnt; (void)OSTaskSemPost(&OSTmrTaskTCB, /* Signal timer task */ OS_OPT_POST_NONE, &err); } #endif #endif }
void onRecvTimeout(void) { OS_ERR err; OSTaskSemPost(&USART_Echo_TCB, OS_OPT_POST_NONE, &err); }
//USART2接收DMA中断处理函数 void DMA1_Channel6_IRQHandler(void) { OSIntEnter(); if(DMA_GetITStatus(DMA1_IT_TC6)!=RESET) //如果该DMA通道发生中断请求 { OS_ERR err; DMA_Cmd(DMA1_Channel6,DISABLE); //关闭DMA1_Channel6 DMA_ClearITPendingBit(DMA1_IT_TC6); //清除DMA的中断标志 if(U2R_BufferNum==1) { DMA1_Channel6->CMAR=(u32)USART2_Rx_Buffer2; //将缓冲区的地址改为2号 U2R_BufferNum=2; U2R_Buf1_Ok=true; //将1号缓存区标志位置为1,表示已满可读 } else { DMA1_Channel6->CMAR=(u32)USART2_Rx_Buffer1; //将缓冲区的地址改为1号 U2R_BufferNum=1; U2R_Buf2_Ok=true; //将2号缓存区标志位置为1,表示已满可读 } OSTaskSemPost(&ZPH01_Task_TCB,OS_OPT_POST_NONE,&err);//释放任务信号量 USART_ITConfig(USART2,USART_IT_RXNE,ENABLE); //使能串口2的接收中断 } OSIntExit(); }
void USART2_IRQHandler(void) { OS_ERR err; OSIntEnter(); if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET) { /* Read one byte from the receive data register */ /*使能串口2的发送和接收中断*/ RxBuffer2[RxCounter2++] = USART_ReceiveData(USART2); USART_ClearITPendingBit(USART2, USART_IT_RXNE); if (RxBuffer2[RxCounter2-1]=='$') { RxCounter = 0; } if (RxCounter<6) { RxBuffer[RxCounter++] =RxBuffer2[RxCounter2-1]; } if (RxCounter2 == NbrOfDataToRead2) { RxCounter2 = NbrOfDataToRead2; RxCounter = 0; USART_ITConfig(USART2, USART_IT_RXNE, DISABLE); OSTaskSemPost((OS_TCB *)&task2TCB, //这个是向系统软件定时任务//发送信号 (OS_OPT ) OS_OPT_POST_NONE, (OS_ERR *)&err); } else if (RxBuffer2[RxCounter2-2]=='\r' && RxBuffer2[RxCounter2-1]=='\n') { if ( RxBuffer[0]=='$' && RxBuffer[1]=='G' && RxBuffer[2]=='P' && RxBuffer[3]=='R' && RxBuffer[4]=='M' && RxBuffer[5]=='C') { RxCounter = 0; RxCounter2 = NbrOfDataToRead2; USART_ITConfig(USART2, USART_IT_RXNE, DISABLE); OSTaskSemPost((OS_TCB *)&task2TCB, //这个是向系统软件定时任务//发送信号 (OS_OPT ) OS_OPT_POST_NONE, (OS_ERR *)&err); } else { RxCounter = 0; } } } OSIntExit(); }
void OSTimeTick (void) { OS_ERR err; #if OS_CFG_ISR_POST_DEFERRED_EN > 0u CPU_TS ts; #endif OSTimeTickHook(); /* Call user definable hook */ #if OS_CFG_ISR_POST_DEFERRED_EN > 0u ts = OS_TS_GET(); /* Get timestamp */ OS_IntQPost((OS_OBJ_TYPE) OS_OBJ_TYPE_TICK, /* Post to ISR queue */ (void *)&OSRdyList[OSPrioCur], (void *) 0, (OS_MSG_SIZE) 0u, (OS_FLAGS ) 0u, (OS_OPT ) 0u, (CPU_TS ) ts, (OS_ERR *)&err); #else (void)OSTaskSemPost((OS_TCB *)&OSTickTaskTCB, /* Signal tick task */ (OS_OPT ) OS_OPT_POST_NONE, (OS_ERR *)&err); #if OS_CFG_SCHED_ROUND_ROBIN_EN > 0u OS_SchedRoundRobin(&OSRdyList[OSPrioCur]); #endif #if OS_CFG_TMR_EN > 0u OSTmrUpdateCtr--; if (OSTmrUpdateCtr == (OS_CTR)0u) { OSTmrUpdateCtr = OSTmrUpdateCnt; OSTaskSemPost((OS_TCB *)&OSTmrTaskTCB, /* Signal timer task */ (OS_OPT ) OS_OPT_POST_NONE, (OS_ERR *)&err); } #endif #endif }
void OSTimeDynTick (OS_TICK ticks) { OS_ERR err; CPU_SR_ALLOC(); if (OSRunning != OS_STATE_OS_RUNNING) { return; } OSTimeTickHook(); CPU_CRITICAL_ENTER(); OSTickCtrPend += ticks; CPU_CRITICAL_EXIT(); (void)OSTaskSemPost(&OSTickTaskTCB, /* Signal tick task */ OS_OPT_POST_NONE, &err); }