OpenEdv-开源电子网

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

求助关于中断和主程序处理逻辑的问题

[复制链接]

13

主题

41

帖子

0

精华

初级会员

Rank: 2

积分
56
金钱
56
注册时间
2018-3-13
在线时间
41 小时
发表于 2018-12-19 18:30:36 | 显示全部楼层 |阅读模式
40金钱
先贴上代码[mw_shl_code=applescript,true]int main()
{
        while(1)
        {
                函数1()
                        {
                                语句1;
                                语句2;

                                语句3;
                                语句4;
                                语句5;                               
                        }
        }
}[/mw_shl_code]

假如说,我正在处理函数1,运行到了语句2,这个时候,收到了一个中断的信号,程序跳转到中断中去,处理中断命令,但是处理这个信号的函数2耗时很长,不能放在中断服务函数里去,就只在中断服务函数里放了一个标志位。
但是我想用最快的速度去处理这个中断的标志位,就是去处理函数2,至于函数1的语句345,我就不运行了
我现在的想法是,直接在语句2的的后边放一个判断中断标志位的语句,判断正确,直接return 函数2。
不知道我这个想法可行不,这只是个假设,语句那么多,每一句下边放一个判断和return,也不合适。或者有没有其他更好的方法。
大家有什么指教的。

最佳答案

查看完整内容[请看2#楼]

如果你的程序是基于操作系统的,这个非常好做, 也不会出错,否则这个做好只能调用几个低级的汇编语句来完成,因为中断后,CPU自动会转到中断前没有运行完的哪里继续工作,你可以把你的函数2的函数名,其实就是函数指针,付给PC指针,人为的修改程序的运行路径,但风险很大,当然如果你的程序处理简单,也可以全部放到中断里去做,把耗时很长部分离出来,比如延时,用计数周期来处理,等待用判断标志来决定,这样,你做一个任务变 ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

9

主题

507

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3347
金钱
3347
注册时间
2013-4-10
在线时间
333 小时
发表于 2018-12-19 18:30:37 | 显示全部楼层
本帖最后由 likunxue 于 2018-12-20 00:28 编辑

如果你的程序是基于操作系统的,这个非常好做, 也不会出错,否则这个做好只能调用几个低级的汇编语句来完成,因为中断后,CPU自动会转到中断前没有运行完的哪里继续工作,你可以把你的函数2的函数名,其实就是函数指针,付给PC指针,人为的修改程序的运行路径,但风险很大,当然如果你的程序处理简单,也可以全部放到中断里去做,把耗时很长部分离出来,比如延时,用计数周期来处理,等待用判断标志来决定,这样,你做一个任务变量,每次进入中断后按这个任务变量来决定运行哪一段代码,一般简单的程序,我工程中也经常用这种方法,处理得很好,当然条件是全部变量你都得用全局变量来实现。 你先试着按我说的方法去自已处理,如果不行,我再给你提供参考示例。但我希望你能自行完成,因为能把这个玩转了,你对CPU的低层也了解得差不多了    笑,加油
回复

使用道具 举报

31

主题

1955

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4523
金钱
4523
注册时间
2018-5-11
在线时间
947 小时
发表于 2018-12-19 19:05:08 | 显示全部楼层
你的函数2在哪里? 是语句3、4、5吗?
你的意思是只要发生了中断,就无须执行语句3、4、5吗?
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复

使用道具 举报

31

主题

1955

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4523
金钱
4523
注册时间
2018-5-11
在线时间
947 小时
发表于 2018-12-19 21:19:00 | 显示全部楼层
本帖最后由 warship 于 2018-12-19 21:31 编辑

给你写一个参考一下:
int main()
{   
   初始化语句;
    for(;;){   

   while(1)
    {
        语句1;
        语句2;
        if(Flag==1)
            {
              长时处理数据语句;   //可以独立写成一个函数调用  
               Flag=0;  //清中断标志  
              break;}
         语句3;
         语句4;
         语句5;               
      }
   }
}


我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-22 17:21

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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