OpenEdv-开源电子网

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

一个挂起任务的问题

[复制链接]

15

主题

78

帖子

0

精华

初级会员

Rank: 2

积分
159
金钱
159
注册时间
2014-3-14
在线时间
0 小时
发表于 2014-3-23 10:01:36 | 显示全部楼层 |阅读模式
TIM1的输出比较中断中不能挂起自己(同时需要在串口接收中断中恢复TIM1任务),但是可以挂起其他任务。这是为啥?
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2014-3-23 10:24:39 | 显示全部楼层
可以挂自己吧。。。
你看我们的PS2鼠标例程,里面就是中断里面挂起中断自己。
//位计数器
u8 BIT_Count=0;
//中断15~10处理函数
//每11个bit,为接收1个字节
//每接收完一个包(11位)后,设备至少会等待50ms再发送下一个包
//只做了鼠标部分,键盘部分暂时未加入
void EXTI15_10_IRQHandler(void)
{     
static u8 tempdata=0;
static u8 parity=0;      
if(EXTI->R&(1<<11))//中断11产生了相应的中断
{
EXTI->R=1<<11;  //清除LINE11上的中断标志位
if(BIT_Count==0)
{
parity=0;
tempdata=0;
}
BIT_Count++;    
if(BIT_Count>1&&BIT_Count<10)//这里获得数据
{   
tempdata>>=1;
if(PS2_SDA)
{
tempdata|=0x80;
parity++;//记录1的个数
}   
}else if(BIT_Count==10)//得到校验位
{
if(PS2_SDA)parity|=0x80;//校验位为1
}    
if(BIT_Count==11)//接收到1个字节的数据了
{
  BIT_Count=parity&0x7f;//取得1的个数   
if(((BIT_Count%2==0)&&(parity&0x80))||((BIT_Count%2==1)&&(parity&0x80)==0))//奇偶校验OK
{     
//PS2_Status|=1<<7;//标记得到数据    
BIT_Count=PS2_Status&0x0f;
PS2_DATA_BUF[BIT_Count]=tempdata;//保存数据
if(BIT_Count<15)PS2_Status++;    //数据长度加1
BIT_Count=PS2_Status&0x30;      //得到模式   
switch(BIT_Count)
{
case CMDMODE://命令模式下,每收到一个字节都会产生接收完成
PS2_Dis_Data_Report();//禁止数据传输
PS2_Status|=1<<7; //标记得到数据
break;
case KEYBOARD:
break;
case MOUSE:
if(MOUSE_ID==0)//标准鼠标,3个字节
{
if((PS2_Status&0x0f)==3)
{
PS2_Status|=1<<7;//标记得到数据
PS2_Dis_Data_Report();//禁止数据传输
}
}else if(MOUSE_ID==3)//扩展鼠标,4个字节
{
if((PS2_Status&0x0f)==4)
{
PS2_Status|=1<<7;//标记得到数据
PS2_Dis_Data_Report();//禁止数据传输
}
}  
break;
}      
}else
{
PS2_Status|=1<<6;//标记校验错误
PS2_Status&=0xf0;//清除接收数据计数器
}
BIT_Count=0;
}      
}   
}
//禁止数据传输
//把时钟线拉低,禁止数据传输    
void S2_Dis_Data_Report(void)
{
PS2_Set_Int(0);   //关闭中断
PS2_SET_SCL_OUT();//设置SCL为输出
PS2_SCL_OUT=0;    //抑制传输
}
//使能数据传输
//释放时钟线     
void S2_En_Data_Report(void)
{
PS2_SET_SCL_IN(); //设置SCL为输入
PS2_SET_SDA_IN(); //SDA IN
PS2_SCL_OUT=1;    //上拉   
PS2_SDA_OUT=1; 
PS2_Set_Int(1);   //开启中断
}

//PS2中断屏蔽设置
//en:1,开启;0,关闭;  
void S2_Set_Int(u8 en)
{
EXTI->R=1<<11;  //清除LINE11上的中断标志位
if(en)EXTI->IMR|=1<<11;//不屏蔽line11上的中断
    else EXTI->IMR&=~(1<<11);//屏蔽line11上的中断   
}
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

15

主题

78

帖子

0

精华

初级会员

Rank: 2

积分
159
金钱
159
注册时间
2014-3-14
在线时间
0 小时
 楼主| 发表于 2014-3-23 20:34:14 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
我指的是在uCOS中啊
TIM1的输出比较中断:
void TIM1_CC_IRQHandler(void)
{
if(TIM_GetITStatus(TIM1,TIM_IT_CC1)!=RESET)
{
TIM_ClearITPendingBit(TIM1,TIM_IT_CC1);
step++;
if(step==6)
{
 step=0;
 OSTaskSuspend(OS_PRIO_SELF);
 printf("%d,",10);
}
}
}
串口接收中断中恢复TIM1:
*void USART1_IRQHandler(void)                    //串口1中断服务程序
{
    u8 Res;
    OSIntEnter();
    if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  //接收中断(接收到的数据必须是0x0d 0x0a结尾)
    {
        Res =USART_ReceiveData(USART1);//(USART1->DR);  //读取接收到的数据
 USART_SendData(USART1,Res);
  OSTaskResume(7);    //#define pwmout_PRIO        7 
    }
    OSIntExit();
}
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2014-3-23 23:21:09 | 显示全部楼层
回复【3楼】STM32学徒:
---------------------------------
ucosii的教程,貌似说了这种语句不能在中断里面用的吧!!!
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

15

主题

78

帖子

0

精华

初级会员

Rank: 2

积分
159
金钱
159
注册时间
2014-3-14
在线时间
0 小时
 楼主| 发表于 2014-3-24 21:11:23 | 显示全部楼层
回复【4楼】正点原子:
---------------------------------
但是我如果把OSTaskSuspend(OS_PRIO_SELF); 和 OSTaskResume(7); 换成其他任务的优先级,就能挂起和恢复。咋回事呢?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2014-3-24 22:37:23 | 显示全部楼层
回复【5楼】STM32学徒:
---------------------------------
不解。。。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-22 22:50

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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