m0_37635022
2017-05-28 07:55
采纳率: 0%
浏览 3.2k

求大神指教!!!中断服务函数里调用延时函数会导致其他中断不能响应吗???

if ((EINT0PEND&=0x1))

{
GPFCON=(GPFCON & ~(0xf<<28))|(0x1<<29)|(0x1<<31);
GPFPUD=(GPFPUD & ~(0xf<<28));
TimerDelay(5);
GPFCON=(GPFCON & ~(0xf<<28));
GPLCON1=(GPLCON1 & ~(0xfU<<24))|(0x1U<<24);
GPLDAT=(GPLDAT & ~(0xfU<<14))|(0x1U<<14);
}

   if ((EINT0PEND&=0x2))

{
GPFCON=(GPFCON & ~(0xf<<28));
GPFPUD=(GPFPUD & ~(0xf<<28));
GPLCON1=(GPLCON1 & ~(0xfU<<24))|(0x1U<<24);
GPLDAT=(GPLDAT & ~(0xfU<<14));
}

写了一个按键中断服务程序,按下key1pwm输出,按下key2关闭pwm输出,在不加延时的时候key2可以关闭key1打开的pwm,但是加了延时之后key2就不起作用了,是因为在中断服务函数中加了延时导致key2无法响应了吗,即是在延时之前清中断也无法响应吗,只能等待key1 的服务函数执行完(延时),才能进入其他的中断服务函数是嘛?

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

3条回答 默认 最新

  • jklinux 2017-05-28 12:10

    你这个应是arm的裸板中断处理吧? 要想key2也能中断的话, key1的中断里得要在延时前清中断并且恢复cpsr的值,但工作模式也得恢复,比较难处理哦。

    应可以加个定时器来做延时后的处理吧, 有定时器的话也不用在中断处理函数里延时了

    点赞 打赏 评论
  • m0_37635022 2017-05-29 04:02

    是的,是ARM的裸板程序;因为我要实现的功能必须在
    GPFCON=(GPFCON & ~(0xf<<28))|(0x1<<29)|(0x1<<31);
    GPFPUD=(GPFPUD & ~(0xf<<28));
    以及
    GPFCON=(GPFCON & ~(0xf<<28));
    GPLCON1=(GPLCON1 & ~(0xfU<<24))|(0x1U<<24);
    GPLDAT=(GPLDAT & ~(0xfU<<14))|(0x1U<<14);
    这两段代码之间必须有一个延时,TimerDelay()是用定时器写的定时函数,还是不能执行key2.您说的那个在延时之前清中断我也试过了,还是不能执行key2;
    但回复cpsr的值和工作模式是什么意思?按理说我把中断清了,再有其他中断不是应该可以执行吗?不懂的太多,还请大神指教啊~~~~

    点赞 打赏 评论
  • jklinux 2017-05-29 04:18

    是在arm发生中断异常时,cpsr[7]会自动设1(arm的中断功能关闭). 所以清除中断后,cpsr[7]不设0是不会恢复中断的。
    我的意思是定时器也定时产生个中断,在定时器中断里再做延时后的处理。 也就下面的代码在定时器的中断里执行

    GPFCON=(GPFCON & ~(0xf<<28));
    GPLCON1=(GPLCON1 & ~(0xfU<<24))|(0x1U<<24);
    GPLDAT=(GPLDAT & ~(0xfU<<14))|(0x1U<<14);

    
    
    点赞 打赏 评论

相关推荐 更多相似问题