打印
[STM32F1]

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

[复制链接]
3231|24
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
huanghuac|  楼主 | 2018-9-4 19:04 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
main
{

hanshu1();

hanshu2();

while(1)
{
hanshu3();
}
}


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

外部中断启动,在hanshu3执行过程中发生了外部中断,执行完成中断函数的代码后,按照机制返回断点继续执行hanshu3,但是不想让它返回断点继续执行了,需要从main或者while重新开始,用什么指令或者方法来跳转呢?
沙发
pangb| | 2018-9-4 19:10 | 只看该作者
复位一下, 简单粗暴,什么都没啦

使用特权

评论回复
板凳
pangb| | 2018-9-4 19:34 | 只看该作者

continue  或者  goto 试试

使用特权

评论回复
地板
morrisk| | 2018-9-4 19:38 | 只看该作者
OS 里有完整的中断返回转移到其他地方的方法.

参考这个方法, 你可以把 main 入口出寄存器文件存起来, 中断函数里清理堆栈数据和寄存器, 修改.堆栈里的寄存器内容

使用特权

评论回复
5
xxmmi| | 2018-9-4 19:41 | 只看该作者
你自己写段程序,跳到MAIN也可以啊

使用特权

评论回复
6
huanghuac|  楼主 | 2018-9-4 19:45 | 只看该作者
好复杂啊 没这么写过 不知道咋写

使用特权

评论回复
7
huwr| | 2018-9-4 19:48 | 只看该作者

除了LR弹出堆栈其他寄存器
ldr pc, = main

使用特权

评论回复
8
xuanhuanzi| | 2018-9-4 19:59 | 只看该作者
goto最好了。一步到位。

使用特权

评论回复
9
bqyj| | 2018-9-4 20:02 | 只看该作者
8楼的办法, 表明上是能实现的.
但有个缺陷, 不知道中断前, 主程序跑到哪里, 有没有压入数据进堆栈. 你得把所有压入堆栈的数据都清理出来. 否则堆栈数据越来越多, 最好必然会堆栈溢出.

使用特权

评论回复
10
wenfen| | 2018-9-4 20:06 | 只看该作者
所以最好所有寄存器文件(包括 SP) 一起恢复到 main() 入口处的寄存器.

使用特权

评论回复
11
aizaixiyuanqian| | 2018-9-4 20:07 | 只看该作者
goto 语句比较简单

使用特权

评论回复
12
aizaixiyuanqian| | 2018-9-4 20:08 | 只看该作者
使用汇编也可以实现

使用特权

评论回复
13
zhenykun| | 2018-9-4 20:08 | 只看该作者
另外, 根据 ARM 内核的介绍, 中断里 LR 是个状态参数. 所以你的返回还得用中断返回来实现,
而不能使用 LDR PC, = main

使用特权

评论回复
14
tian111| | 2018-9-4 20:12 | 只看该作者
跳到main堆栈里的数据没用了,变量直接用全局变量。
恢复SP到最开始栈顶然后直接设置PC跳到main。
感觉应该行

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

使用特权

评论回复
15
chenho| | 2018-9-4 20:14 | 只看该作者
那就还有一个问题, 一定要执行一次中断返回.
ldr pc, = main
不会生成返回指令, 还是会有问题啊

使用特权

评论回复
16
chuxh| | 2018-9-4 20:24 | 只看该作者

中断返回前执行
set_msp(restore_point);
restore_point里面放你要还原的栈信息

使用特权

评论回复
17
llljh| | 2018-9-4 20:28 | 只看该作者
如果用OS,你的ISR发送一个信号给一个高优先级任务,ISR返回后这个高优先级任务删除main任务,再重新启动它

使用特权

评论回复
18
sky.sun.zz| | 2018-9-4 20:30 | 只看该作者
中断如果不按照正常返回,则堆栈与程序指针未释放,会引起不可预料的结果。最好启用看门狗,由看门狗来复位。

使用特权

评论回复
19
llljh| | 2018-9-4 20:32 | 只看该作者
12楼的方法很好,不过,通用寄存器里面的数据就不好写了

使用特权

评论回复
20
pengf| | 2018-9-4 20:37 | 只看该作者
不用自己写
在main函数需要还原的地方的触发一次pendsvc中断
在那个里面把msp记录下来
以后在中断中就还原那个记录的msp

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

772

主题

8473

帖子

6

粉丝