新手上路
- 积分
- 49
- 金钱
- 49
- 注册时间
- 2014-4-3
- 在线时间
- 0 小时
|
我创建了一个任务:
void App_Task_DECAP(void* pdata)
{
INT8U err;
sem=OSSemCreate(0);
for (;;)
{
//OSSemPend(sem,0,&err);
OSTaskSuspend(APP_TASK_DECAP_PRIO);
LED4_CLOSE();
FrameFlag |= STATUS_BUSY;
//DecapPackage();
while(1); //只是为了测试用
/*处理完成*/
FrameFlag &= ~STATUS_BUSY;
}
}
该任务先suspend,等待唤醒,唤醒后就执行,其中while循环只是为了测试用,代表着长时间执行程序,
在中断处理函数里面调用OSTaskResume(APP_TASK_DECAP_PRIO) 把该任务唤醒,但是数据量比较大,
或者接受比较频繁,之后就再也产生不了中断了,请教各位是怎么回事,中断处理函数如下图:
void DMA1_Channel2_3_IRQHandler(void)
{
static uint8_t PartArea = 0;
OSIntEnter();
if(DMA_GetFlagStatus(DMA1_FLAG_TC3) != RESET) //检测DMA1TC1标志
{
DMA_ClearFlag(DMA1_FLAG_TC3); //清除DMA TC3标志
switch(LeadHeadFlag)
{
case HeadFist:
if(USART_RX_Buffer[0] == 0x55)
{
LeadHeadFlag = HeadSecond;
DMARxBufsize = 1;
LED1_OPEN();
}
break;
case HeadSecond:
if(USART_RX_Buffer[0] == 0xaa)
{
LeadHeadFlag = HeadLength;
DMARxBufsize = 1;
LED2_OPEN();
}
break;
case HeadLength:
LeadHeadFlag = HeadContent;
if(DMARxBufsize == 1)
{
LED3_OPEN();
PartArea = GetUnionPartRxStatus();
DMARxBufsize = USART_RX_Buffer[0]; /*modify*/
//if(!DMARxBufsize)
//LED4_OPEN();
BufferRxUnion.BufferUnion[PartArea * FRAMELENGTH] = 0x55;
BufferRxUnion.BufferUnion[PartArea * FRAMELENGTH + 1] = 0xaa;
BufferRxUnion.BufferUnion[PartArea * FRAMELENGTH + 2] = USART_RX_Buffer[0];
}
break;
case HeadContent:
LeadHeadFlag = HeadFist;
/*临界区资源*/
memcpy((uint8_t *)&(BufferRxUnion.BufferUnion[PartArea * FRAMELENGTH + 3]),USART_RX_Buffer,DMARxBufsize);
SetUnionPartRxStatus(PartArea,1);
//DMATxBufsize = DMARxBufsize;
//DMA1CH2_BufSizeReload(DMATxBufsize);
FrameFlag &= ~STATUS_RECEIVE;
#ifndef OS_uCOS_II_H
CmdCtrl = DISPOSE;
#else
/*唤醒*/
OSTaskResume(APP_TASK_DECAP_PRIO);
//OSSemPost(sem);
#endif
DMARxBufsize = 1;
PartArea = 0;
LED1_CLOSE();
LED2_CLOSE();
LED3_CLOSE();
break;
}
DMA1CH3_BufSizeReload(DMARxBufsize);
}
else if(DMA_GetFlagStatus(DMA1_FLAG_TC2) != RESET)
{
DMA_ClearFlag(DMA1_FLAG_TC2);
FrameFlag &= ~STATUS_TRANSMIT;
}
OSIntExit();
}
|
|