ST MCU Finder
安装免费手机应用,
寻找理想的ST MCU
查看: 344|回复: 16
收起左侧

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

[复制链接]

19

主题

39

帖子

118

积分

中级技术员

 楼主| 发表于 2017-8-11 07:59 | 显示全部楼层 |返回版面|阅读模式
本帖最后由 liu_jing_yang 于 2017-8-11 08:00 编辑

main
{

hanshu1();

hanshu2();

while(1)
{
hanshu3();
}
}


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

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

     

3

主题

506

帖子

1550

积分

助理工程师

发表于 2017-8-11 08:59 | 显示全部楼层 |返回版面
复位一下, 简单粗暴,什么都没啦
     

15

主题

304

帖子

933

积分

高级技术员

发表于 2017-8-11 13:20 | 显示全部楼层 |返回版面
continue  或者  goto 试试
不会是因为你懒
     

330

主题

1万

帖子

4万

积分

版主

---------------------

发表于 2017-8-11 14:41 | 显示全部楼层 |返回版面
OS 里有完整的中断返回转移到其他地方的方法.

参考这个方法, 你可以把 main 入口出寄存器文件存起来, 中断函数里清理堆栈数据和寄存器, 修改.堆栈里的寄存器内容
欢迎进入 TI 模拟技术论坛
     

451

主题

2万

帖子

7万

积分

版主

发表于 2017-8-11 17:07 | 显示全部楼层 |返回版面
你自己写段程序,跳到MAIN也可以啊
深圳游名智能科技有限公司
游名电子工程师群1:16519783;
物联网技术交流群:301879792;

19

主题

39

帖子

118

积分

中级技术员

 楼主| 发表于 2017-8-11 21:10 | 显示全部楼层 |返回版面
airwill 发表于 2017-8-11 14:41
OS 里有完整的中断返回转移到其他地方的方法.

参考这个方法, 你可以把 main 入口出寄存器文件存起来, 中 ...

好复杂啊 没这么写过 不知道咋写

17

主题

43

帖子

-92

积分

禁止发言

发表于 2017-8-11 22:45 | 显示全部楼层 |返回版面
提示: 作者被禁止或删除 内容自动屏蔽
     

36

主题

296

帖子

915

积分

高级技术员

发表于 2017-8-11 22:47 | 显示全部楼层 |返回版面
除了LR弹出堆栈其他寄存器
ldr pc, = main
     

330

主题

1万

帖子

4万

积分

版主

---------------------

发表于 2017-8-12 08:17 | 显示全部楼层 |返回版面
yjmwxwx 发表于 2017-8-11 22:47
除了LR弹出堆栈其他寄存器
ldr pc, = main

8楼的办法, 表明上是能实现的.
但有个缺陷, 不知道中断前, 主程序跑到哪里, 有没有压入数据进堆栈. 你得把所有压入堆栈的数据都清理出来. 否则堆栈数据越来越多, 最好必然会堆栈溢出.

所以最好所有寄存器文件(包括 SP) 一起恢复到 main() 入口处的寄存器.
另外, 根据 ARM 内核的介绍, 中断里 LR 是个状态参数. 所以你的返回还得用中断返回来实现,
而不能使用 LDR PC, = main  
欢迎进入 TI 模拟技术论坛
     

36

主题

296

帖子

915

积分

高级技术员

发表于 2017-8-12 09:24 | 显示全部楼层 |返回版面
airwill 发表于 2017-8-12 08:17
8楼的办法, 表明上是能实现的.
但有个缺陷, 不知道中断前, 主程序跑到哪里, 有没有压入数据进堆栈. 你得 ...

跳到main堆栈里的数据没用了,变量直接用全局变量。
恢复SP到最开始栈顶然后直接设置PC跳到main。
感觉应该行

ldr r0, = 0x8000000
ldr sp, [r0]
ldr pc, = main
     

330

主题

1万

帖子

4万

积分

版主

---------------------

发表于 2017-8-12 17:48 | 显示全部楼层 |返回版面
yjmwxwx 发表于 2017-8-12 09:24
跳到main堆栈里的数据没用了,变量直接用全局变量。
恢复SP到最开始栈顶然后直接设置PC跳到main。
感觉应 ...

那就还有一个问题, 一定要执行一次中断返回.
ldr pc, = main
不会生成返回指令, 还是会有问题啊
欢迎进入 TI 模拟技术论坛
     

26

主题

2218

帖子

8079

积分

VIP会员

发表于 2017-8-12 19:15 | 显示全部楼层 |返回版面
中断返回前执行
set_msp(restore_point);
restore_point里面放你要还原的栈信息
     

103

主题

7602

帖子

2万

积分

技术总监

发表于 2017-8-12 21:30 | 显示全部楼层 |返回版面
如果用OS,你的ISR发送一个信号给一个高优先级任务,ISR返回后这个高优先级任务删除main任务,再重新启动它
     

3

主题

506

帖子

1550

积分

助理工程师

发表于 2017-8-13 19:20 | 显示全部楼层 |返回版面
12楼的方法很好,不过,通用寄存器里面的数据就不好写了
     

5

主题

403

帖子

1217

积分

助理工程师

发表于 2017-8-14 00:44 | 显示全部楼层 |返回版面
goto 。。。。。
     

26

主题

2218

帖子

8079

积分

VIP会员

发表于 2017-8-14 09:07 | 显示全部楼层 |返回版面
feelhyq 发表于 2017-8-13 19:20
12楼的方法很好,不过,通用寄存器里面的数据就不好写了

不用自己写
在main函数需要还原的地方的触发一次pendsvc中断
在那个里面把msp记录下来
以后在中断中就还原那个记录的msp

0

主题

9

帖子

37

积分

实习生

发表于 2017-8-15 15:56 | 显示全部楼层 |返回版面
在中断中对pc赋值就会退出中断
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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