打印
[STM32F1]

请教下该如何获取程序返回地址?

[复制链接]
1499|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
qiurenguo|  楼主 | 2014-7-28 09:21 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
想要可以通过串口打印当前程序运行的PC程序计数器,串口采用中断方式,通过串口助手发送命令下去,获得当前的程序计数器地址,不知道要怎么获取?
不要告诉我去看M3内核中断机制这些,要是我会去看也不会来问了--!
我的思路大概是这样,进入串口中断后,PC会被压栈,我们时候可以通过堆栈地址寻到PC值?
沙发
aozima| | 2014-7-28 11:42 | 只看该作者
本帖最后由 aozima 于 2014-7-28 11:48 编辑
串口中断后,PC会被压栈,我们时候可以通过堆栈地址寻到PC值

不过串口到底什么时候触发中断,这个时机你是无法精确指定的。

GDB stub一般多用串口,但原理不一样。
如果想知道程序运行流程,可以使用  trace 功能。

使用特权

评论回复
板凳
想做大牛的小马| | 2014-7-29 15:58 | 只看该作者
额。。设计的目的是什么呢,我觉得在你的f1的程序中,直接获取pc后,再通过串口发送给你的pc,
这个方法是不是好点呢?~
一定要获取的话,在进入你的串口中断后,去查一下栈里的内容,被中断处的pc被压进去了~

使用特权

评论回复
地板
想做大牛的小马| | 2014-7-29 15:59 | 只看该作者
想做大牛的小马 发表于 2014-7-29 15:58
额。。设计的目的是什么呢,我觉得在你的f1的程序中,直接获取pc后,再通过串口发送给你的pc,
这个方法是 ...

额。。有点乱,我的意思是在你的f1的程序的主循环中,在你想获取程序计数器的地方,直接获取,然后通过
串口发给你的电脑串口助手。。。。~

使用特权

评论回复
5
wsd1b| | 2014-7-31 12:45 | 只看该作者
如果你是想在一个具体的位置获取当前PC值,那很简单。直接用汇编写一个获取PC值的函数就可以了。
mov r0, pc
bx lr

但如果你想每次触发串口中断时打印出进中断前的PC值那就不太现实了,首先,你不可能把串口中断一直开着,那样的话主程序就得不到运行了;再者,即使你在特定的地方调用打印函数,那么进了中断以后,打印出的PC值必然是在你的打印函数里面。

使用特权

评论回复
6
qiurenguo|  楼主 | 2014-8-1 09:16 | 只看该作者
wsd1b 发表于 2014-7-31 12:45
如果你是想在一个具体的位置获取当前PC值,那很简单。直接用汇编写一个获取PC值的函数就可以了。
mov r0, p ...

这个打印的是当前的,我想要跳转前的。而且就是要开串口中断,比如我程序死在一个地方了,那我是不是需要通过串口中断,让他发上来

使用特权

评论回复
7
qiurenguo|  楼主 | 2014-8-1 09:19 | 只看该作者
想做大牛的小马 发表于 2014-7-29 15:58
额。。设计的目的是什么呢,我觉得在你的f1的程序中,直接获取pc后,再通过串口发送给你的pc,
这个方法是 ...

怎么直接获取呢?难道要在每个地方都弄一个MOV PC这样的代码,那有意义吗。
目的就是自己写程序时,可能程序在某个地方死循环了,那我可以通过串口中断接收上位机命令,将当前的PC发上来,这样就省的我再去一段一段代码的找了

使用特权

评论回复
8
qiurenguo 发表于 2014-8-1 09:19
怎么直接获取呢?难道要在每个地方都弄一个MOV PC这样的代码,那有意义吗。
目的就是自己写程序时,可能 ...

。。。你说的功能需要os的支持了,当某个进程异常了(此时系统没有挂掉),串口中断里响应了你上位机的命令,然后将异常任务的进程栈(这里面包含不少信息包括出错处的pc)信息发给上位机。。。如果程序直接跑飞了,如进了什么hardfault异常,那么你的串口中断没有什么意义了。。。。
开发阶段程序跑飞了就用debug工具调一下,代码量少定位是很容易的。。。。~

使用特权

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

本版积分规则

35

主题

184

帖子

1

粉丝