OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4865|回复: 1

OSTaskResume唤醒任务后再也不能进入中断了,请教各位大神是什么回事

[复制链接]

4

主题

12

帖子

0

精华

新手上路

积分
49
金钱
49
注册时间
2014-4-3
在线时间
0 小时
发表于 2015-1-14 13:15:01 | 显示全部楼层 |阅读模式
我创建了一个任务:
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();
}

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

4

主题

12

帖子

0

精华

新手上路

积分
49
金钱
49
注册时间
2014-4-3
在线时间
0 小时
 楼主| 发表于 2015-1-14 13:31:48 | 显示全部楼层
原子哥,各位大神,帮忙看下
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-27 00:58

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表