我一个任务阻塞等待唤醒,在DecapPackage();函数里加有打印语句进行延迟
void App_Task_DECAP(void* pdata)
{
INT8U err;
sem=OSSemCreate(0);
for (;;)
{
//OSSemPend(sem,0,&err);
OSTaskSuspend(APP_TASK_DECAP_PRIO);
FrameFlag |= STATUS_BUSY;
DecapPackage();
/*处理完成*/
FrameFlag &= ~STATUS_BUSY;
}
}
在UART 中断里面唤醒该任务后就再也不能触发中断了,如果该任务没有加打印语句(即延迟),可以正常操作,如下为中断处理函数
void DMA1_Channel2_3_IRQHandler(void)
{
static uint8_t PartArea = 0;
OSIntEnter();
LED1_OPEN();
if(DMA_GetFlagStatus(DMA1_FLAG_TC3) != RESET) //检测DMA1TC1标志
{
DMA_ClearFlag(DMA1_FLAG_TC3); //清除DMA TC3标志
/*已验证完引导码*/
if(FrameFlag & STATUS_RECEIVE)
{
if(DMARxBufsize == 1)
{
PartArea = GetUnionPartRxStatus();
DMARxBufsize = (USART_RX_Buffer[0]); /*modify*/
BufferRxUnion.BufferUnion[PartArea * FRAMELENGTH] = 0x55;
BufferRxUnion.BufferUnion[PartArea * FRAMELENGTH + 1] = 0xaa;
BufferRxUnion.BufferUnion[PartArea * FRAMELENGTH + 2] = USART_RX_Buffer[0];
}
else
{
/*临界区资源*/
memcpy((uint8_t *)&(BufferRxUnion.BufferUnion[PartArea * FRAMELENGTH + 3]),USART_RX_Buffer,DMARxBufsize);
SetUnionPartRxStatus(PartArea,1);
//DMATxBufsize = DMARxBufsize;
//DMA1CH2_BufSizeReload(DMATxBufsize);
FrameFlag &= ~STATUS_RECEIVE;
//FrameFlag |= STATUS_BUSY;
#ifndef OS_uCOS_II_H
CmdCtrl = DISPOSE;
#else
/*唤醒*/
OSTaskResume(APP_TASK_DECAP_PRIO);
#endif
DMARxBufsize = 1;
PartArea = 0;
}
}
/*校验引导码*/
else
{
switch(LeadHeadFlag)
{
case HeadFist:
if(USART_RX_Buffer[0] == 0x55)
{
LeadHeadFlag = HeadSecond;
DMARxBufsize = 1;
}
break;
case HeadSecond:
if(USART_RX_Buffer[0] == 0xaa)
{
LeadHeadFlag = HeadFist;
FrameFlag |= STATUS_RECEIVE;
DMARxBufsize = 1;
}
break;
}
}
DMA1CH3_BufSizeReload(DMARxBufsize);
}
else if(DMA_GetFlagStatus(DMA1_FLAG_TC2) != RESET)
{
DMA_ClearFlag(DMA1_FLAG_TC2);
FrameFlag &= ~STATUS_TRANSMIT;
}
LED1_CLOSE();
OSIntExit();
}
请教各位大神是怎么回事
|