OpenEdv-开源电子网

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

求助一个关于中断的问题,请大佬赐教

[复制链接]

54

主题

347

帖子

0

精华

高级会员

Rank: 4

积分
948
金钱
948
注册时间
2022-4-20
在线时间
356 小时
发表于 2022-10-18 10:35:31 | 显示全部楼层 |阅读模式
5金钱
假如主程序中有100条代码,循环执行,当程序运行到其中任意位置时,中断被触发,如何能使中断结束返回主程序后不继续执行剩下代码,从头开始?我没学习到相关的知识,不知道有没有这种办法,请大佬赐教

最佳答案

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

看内核手册吧,重点关注下LR的就是那个R14的寄存器,R13一般是SP指针的. 一般是这样的,读取R13数据作为地址中对应的数据,找到相应的LR返回位置位置,然后修改他 这其中还是MSP跟PSP的区别自己也注意下
又菜又爱指点
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

80

主题

931

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3337
金钱
3337
注册时间
2013-5-28
在线时间
467 小时
发表于 2022-10-18 10:35:32 | 显示全部楼层
驭剑的秘密 发表于 2022-10-18 17:43
对,这就是我要的效果,我想的就是让他从中断返回的时候直接从指定的代码开始运行,但是我不会,刚刚翻了 ...

看内核手册吧,重点关注下LR的就是那个R14的寄存器,R13一般是SP指针的.
一般是这样的,读取R13数据作为地址中对应的数据,找到相应的LR返回位置位置,然后修改他 acbcf52755a6e2e41b1c46c9884f3544.png
这其中还是MSP跟PSP的区别自己也注意下
5f775aa7f24e71b7d0babcdc963903d4.png

回复

使用道具 举报

11

主题

2103

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4588
金钱
4588
注册时间
2015-1-10
在线时间
574 小时
发表于 2022-10-18 10:47:24 | 显示全部楼层
可以在中断里面置标志后在main里面处理,处理完以后直接break到最外层的while(1)就从头开始了,但是你为什么要这么干呢?
回复

使用道具 举报

17

主题

161

帖子

0

精华

高级会员

Rank: 4

积分
955
金钱
955
注册时间
2022-7-21
在线时间
446 小时
发表于 2022-10-18 10:49:35 | 显示全部楼层
中断回调好像符合你的想法,你去了解一下
回复

使用道具 举报

3

主题

800

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3775
金钱
3775
注册时间
2017-3-7
在线时间
1645 小时
发表于 2022-10-18 11:07:25 | 显示全部楼层
好奇怪的需求,想到另类的方式,中断中直接软复位,也是回到头
回复

使用道具 举报

54

主题

347

帖子

0

精华

高级会员

Rank: 4

积分
948
金钱
948
注册时间
2022-4-20
在线时间
356 小时
 楼主| 发表于 2022-10-18 13:45:59 | 显示全部楼层
阿侑kevin 发表于 2022-10-18 10:47
可以在中断里面置标志后在main里面处理,处理完以后直接break到最外层的while(1)就从头开始了,但是你为什 ...

我一开始也是这样干的,后来我就在想有没有什么指令可以直接完成这个操作,算是一个学习过程吧
  1. if(Page != 8)
  2.   {
  3.    OLED_Clear();
  4.    continue;
  5.   }
复制代码

又菜又爱指点
回复

使用道具 举报

54

主题

347

帖子

0

精华

高级会员

Rank: 4

积分
948
金钱
948
注册时间
2022-4-20
在线时间
356 小时
 楼主| 发表于 2022-10-18 13:49:18 | 显示全部楼层
a5820736 发表于 2022-10-18 11:07
好奇怪的需求,想到另类的方式,中断中直接软复位,也是回到头

效果挺类似,不过似乎就跑得太前面了,我用的是中断里搞了个变量,进了中断之后改变他,在主程序里边判断是否进去过,进了就continue,我就想学学各位大佬有没有什么别的操作
又菜又爱指点
回复

使用道具 举报

54

主题

347

帖子

0

精华

高级会员

Rank: 4

积分
948
金钱
948
注册时间
2022-4-20
在线时间
356 小时
 楼主| 发表于 2022-10-18 13:51:21 | 显示全部楼层
还在忙 发表于 2022-10-18 10:49
中断回调好像符合你的想法,你去了解一下

好的
又菜又爱指点
回复

使用道具 举报

80

主题

931

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3337
金钱
3337
注册时间
2013-5-28
在线时间
467 小时
发表于 2022-10-18 14:51:06 | 显示全部楼层
最直接的办法就是在中断中修改LR寄存器保存下来的值,就是修改堆栈里面的内容,把返回值修改成你要进入的PC指针就可以了.
回复

使用道具 举报

54

主题

347

帖子

0

精华

高级会员

Rank: 4

积分
948
金钱
948
注册时间
2022-4-20
在线时间
356 小时
 楼主| 发表于 2022-10-18 17:43:38 | 显示全部楼层
聚东风 发表于 2022-10-18 14:51
最直接的办法就是在中断中修改LR寄存器保存下来的值,就是修改堆栈里面的内容,把返回值修改成你要进入的PC指 ...

对,这就是我要的效果,我想的就是让他从中断返回的时候直接从指定的代码开始运行,但是我不会,刚刚翻了下手册,没看见LR寄存器,可以细说一下吗?
又菜又爱指点
回复

使用道具 举报

16

主题

426

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2671
金钱
2671
注册时间
2018-11-8
在线时间
430 小时
发表于 2022-10-18 19:36:48 | 显示全部楼层
驭剑的秘密 发表于 2022-10-18 17:43
对,这就是我要的效果,我想的就是让他从中断返回的时候直接从指定的代码开始运行,但是我不会,刚刚翻了 ...

这是内核的部分 应该看cortex M3的手册
回复

使用道具 举报

10

主题

271

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1236
金钱
1236
注册时间
2015-5-14
在线时间
352 小时
发表于 2022-10-18 20:16:39 来自手机 | 显示全部楼层
不建议直接强制“复位”,规范也是这么建议的。可以在中段里面发信号量,然后任务接收到信号量后,做一些需要的操作,然后任务复位。任务复位可以参考状态机。任务退出,可以参考协作式内核或者抢占式内核。,
回复

使用道具 举报

54

主题

347

帖子

0

精华

高级会员

Rank: 4

积分
948
金钱
948
注册时间
2022-4-20
在线时间
356 小时
 楼主| 发表于 2022-10-19 10:35:11 | 显示全部楼层
聚东风 发表于 2022-10-19 09:20
看内核手册吧,重点关注下LR的就是那个R14的寄存器,R13一般是SP指针的.
一般是这样的,读取R13数据作为地 ...

学到了,感谢
又菜又爱指点
回复

使用道具 举报

3

主题

1906

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4100
金钱
4100
注册时间
2018-8-14
在线时间
695 小时
发表于 2023-12-19 19:32:03 | 显示全部楼层
驭剑的秘密 发表于 2022-10-18 13:45
我一开始也是这样干的,后来我就在想有没有什么指令可以直接完成这个操作,算是一个学习过程吧

如果说你只要退出这循环, 在中断把Page设为8不就完了么?
回复

使用道具 举报

54

主题

347

帖子

0

精华

高级会员

Rank: 4

积分
948
金钱
948
注册时间
2022-4-20
在线时间
356 小时
 楼主| 发表于 2023-12-20 09:28:01 | 显示全部楼层
edmund1234 发表于 2023-12-19 19:32
如果说你只要退出这循环, 在中断把Page设为8不就完了么?

一个程序何时进入中断是不确定的,可能在if前面,也可能在后面,如果在if后面进入,那就多跑了一个循环
又菜又爱指点
回复

使用道具 举报

3

主题

1906

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4100
金钱
4100
注册时间
2018-8-14
在线时间
695 小时
发表于 2023-12-20 13:36:42 | 显示全部楼层
驭剑的秘密 发表于 2023-12-20 09:28
一个程序何时进入中断是不确定的,可能在if前面,也可能在后面,如果在if后面进入,那就多跑了一个循环

未进程序前 Page被设为-1, 进入后就设为0~7
中断检查Page不为负数,才设为8
OK?

回复

使用道具 举报

54

主题

347

帖子

0

精华

高级会员

Rank: 4

积分
948
金钱
948
注册时间
2022-4-20
在线时间
356 小时
 楼主| 发表于 2023-12-20 14:27:14 | 显示全部楼层
edmund1234 发表于 2023-12-20 13:36
未进程序前 Page被设为-1, 进入后就设为0~7
中断检查Page不为负数,才设为8
OK?

算了吧,咱俩说的都不是一个事
又菜又爱指点
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-23 17:02

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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