搜索
bottom↓
回复: 30

STM32如何做到中断后不返回断点,而是从main或其他函数开...

[复制链接]

出0入0汤圆

发表于 2017-8-11 07:57:36 | 显示全部楼层 |阅读模式

main
{

hanshu1();

hanshu2();

while(1)
{
hanshu3();
}
}


hanshu3
{
语句1;
语句2;
语句3;
}

外部中断启动,在hanshu3执行过程中发生了外部中断,执行完成中断函数的代码后,按照机制返回断点继续执行hanshu3,但是不想让它返回断点继续执行了,需要从main或者while重新开始,用什么指令或者方法来跳转呢?

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2017-8-11 08:17:17 来自手机 | 显示全部楼层
continue。

出5入42汤圆

发表于 2017-8-11 08:24:54 | 显示全部楼层
中断结束前强行改PC可以做到

出0入0汤圆

发表于 2017-8-11 08:32:12 | 显示全部楼层
C语言是不支持 这种特性的,难道不能用别的方法解决,软复位或者是别的逻辑构架

出0入0汤圆

发表于 2017-8-11 08:39:17 | 显示全部楼层
本帖最后由 dr2001 于 2017-8-11 10:51 编辑

中断本身的设计思路不支持这个功能;所以,先考虑实现的需求本身是否合理。

如果要用,需要考虑诸如:
- 不继续执行的代码,和外设交互是否可能只进行了一半?回退是否会导致外设状态和代码内部认为的状态不同步。
- 程序内部状态是否因为只运行了一部分而导致错误?
类似这样的逻辑问题产生的偶发隐性bug是极难调试的;因为没办法逐个指令下断点来测试。

如果必须要,可以考虑:
1、上RTOS之类的调度器,如果RTOS允许,在中断里Kill掉对应的Task,然后重启。
2、用setjmp,longjmp系列函数。
3、强行修改中断保存的现场,直接返回到某个地点。
这三个方法都要求深入理解编译器的需求/行为,特别是栈空间的使用,搞不好就崩溃/随机Bug。
相对来说,方法1,2略微好一点点。

出0入0汤圆

发表于 2017-8-11 08:40:32 | 显示全部楼层
1. 中断增加标志,while里检测,使用Goto
2. 发生中断,进行软件复位,从main开始执行

出0入8汤圆

发表于 2017-8-11 08:42:46 | 显示全部楼层
dr2001 发表于 2017-8-11 08:39
中断本身的设计思路不支持这个功能;所以,先考虑需求本身是否合理。

如果要用,需要考虑诸如:


我想大神用力过猛了。
这种设计是不合理的,需要改变的是设计思路。
如果有评审机制的话,楼主的想法,应该直接被打回去的。

出0入31汤圆

发表于 2017-8-11 08:47:11 | 显示全部楼层
楼主的应用场景是什么呢?为什么会有如此奇怪的需求呢?

出0入0汤圆

发表于 2017-8-11 08:59:37 | 显示全部楼层
楼主好多想法都天马行空的

出0入0汤圆

发表于 2017-8-11 09:04:45 | 显示全部楼层
能提出这样的问题,说明你的程序架构设计是不合理的。

出0入93汤圆

发表于 2017-8-11 09:17:03 | 显示全部楼层
zhugean 发表于 2017-8-11 08:32
C语言是不支持 这种特性的,难道不能用别的方法解决,软复位或者是别的逻辑构架 ...

恰恰相反,C语言是支持这种特性的。下面两种方案可以任意跳转,小叮当的任意门:
1、普适的,C语言全部支持的:setjmp/longjmp
2、GCC扩展语法。全范围的goto


不怕死的可以用,说不定没两下子堆栈就爆了。

出0入0汤圆

发表于 2017-8-11 09:20:13 | 显示全部楼层
中断中修改标记

hanshu3中检测标记退出循环即可

出0入4汤圆

发表于 2017-8-11 09:41:23 | 显示全部楼层
逻辑设计有问题,别忘这个方面钻,没好处

出0入0汤圆

 楼主| 发表于 2017-8-11 10:08:08 来自手机 | 显示全部楼层
功能:hanshu3语句1实现led以频率1闪烁,语句2实现以频率2闪烁,程序执行完语句1后外部按键中断启动,中断的功能是关闭led,中断结束后,程序又返回了断点执行了语句2,明显这是不允许出现这情况的,就是解决这个问题

出0入0汤圆

发表于 2017-8-11 10:13:11 | 显示全部楼层
椒盐时代 发表于 2017-8-11 10:08
功能:hanshu3语句1实现led以频率1闪烁,语句2实现以频率2闪烁,程序执行完语句1后外部按键中断启动,中断的 ...

难道用标志位不能完美解决?照你这样的思路,很多程序都得这样跳转了

出0入0汤圆

发表于 2017-8-11 10:39:45 | 显示全部楼层
security 发表于 2017-8-11 08:42
我想大神用力过猛了。
这种设计是不合理的,需要改变的是设计思路。
如果有评审机制的话,楼主的想法,应 ...

需求是合理的,只不过他的实现思路不太对头。

在追求极端效率的特殊场景可能就会用到,谁知道呢。

出0入8汤圆

发表于 2017-8-11 10:44:18 | 显示全部楼层
dr2001 发表于 2017-8-11 10:39
需求是合理的,只不过他的实现思路不太对头。

在追求极端效率的特殊场景可能就会用到,谁知道呢。 ...


嗯,大神说得对。
不过,我通过楼主贴的伪代码吧,命名用 hanshu1 之类的,臆测:楼主应该是走歪路了,而不是真的需要这样。

出0入14汤圆

发表于 2017-8-11 11:18:22 | 显示全部楼层
一个goto解决不了??????????

出0入0汤圆

发表于 2017-8-11 11:20:01 | 显示全部楼层
14楼楼主的描述看,楼主应该是思路歪了,一个标志位解决的问题楼主搞的那么复杂

出0入0汤圆

发表于 2017-8-11 11:42:39 来自手机 | 显示全部楼层
简单,放狗咬去,保证一下回到main。

出0入0汤圆

发表于 2017-8-11 12:15:38 | 显示全部楼层
takashiki 发表于 2017-8-11 09:17
恰恰相反,C语言是支持这种特性的。下面两种方案可以任意跳转,小叮当的任意门:
1、普适的,C语言全部支 ...

你这个是在主程序中跳回上几层调用的,不是在中断中用的

出0入0汤圆

发表于 2017-8-11 12:22:21 来自手机 | 显示全部楼层
中断里直接复位好了,

出0入93汤圆

发表于 2017-8-11 12:24:00 | 显示全部楼层
zhugean 发表于 2017-8-11 12:15
你这个是在主程序中跳回上几层调用的,不是在中断中用的

不对,是任意跳转的,你写一下代码编译下就知道了,虽然后果很严重,但是可以完成LZ的需求。

出0入0汤圆

发表于 2017-8-11 12:26:36 | 显示全部楼层
takashiki 发表于 2017-8-11 12:24
不对,是任意跳转的,你写一下代码编译下就知道了,虽然后果很严重,但是可以完成LZ的需求。 ...

中断中跳转有风险吧,某些MCU会造成不能再次进入中断

出0入8汤圆

发表于 2017-8-11 14:53:04 来自手机 | 显示全部楼层
没有什么是一个goto解决不了的
如果有,那就再用一个

出0入0汤圆

 楼主| 发表于 2017-8-11 21:11:06 | 显示全部楼层
关键点是 外部中断是随机的,所以goto什么的并不知道要加在哪里

出0入362汤圆

发表于 2017-8-11 21:58:55 | 显示全部楼层
还是用狗吧, 主循环里喂狗, 需要返回main的地方放个while(1);
然后狗会执行复位, 完事.

出0入4汤圆

发表于 2017-8-11 22:22:59 | 显示全部楼层
为什么会有如此奇葩的需求?如果真有,那说明软件逻辑肯定不严谨,有更好的办法实现的。

出0入0汤圆

发表于 2017-8-11 23:34:55 来自手机 | 显示全部楼层
不怕栈溢出?

出0入36汤圆

发表于 2017-8-12 01:52:38 来自手机 | 显示全部楼层
强行改变PC指针

出10入23汤圆

发表于 2017-8-12 08:01:16 来自手机 | 显示全部楼层
修改堆栈内容,然后iret
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-22 05:03

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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