小编Vit*_*kes的帖子

检索ARM Cortex M0上的异常的返回地址

我试图在我的代码中检索IRQ处理程序的返回地址.我的目标是在看门狗定时器到期之前和复位之前使用WDT_IRQHandler()保存PC的值以进行调试.我也在用其他IRQ测试这种方法来检查我是否掌握了这个想法.但似乎我没有.

我已经阅读了可用的文档.我知道当异常发生时,8个寄存器被推送到堆栈:R0,R1,R2,R3,R12,LR,PC和XPSR.

我还读过堆栈自动双字对齐.所以在我看来,检索返回地址就像这样简单:

  • 使用__builtin_frame_address(0)检索sp地址;
  • 添加堆叠PC的偏移量(0x18),并读取值,该值应该是处理程序返回时将恢复到PC的值.

检查附加的调试器,似乎不是这种情况,该内存地址的内容并不总是指向闪存区域,甚至指向有效区域,并且在任何情况下,它都不是PC在POP指令.

代码工作正常,所以我认为这是一个问题,我理解它是如何工作的.

如果我检查反汇编,在某些IRQ中,在POPping(?)之前向sp添加一个常量

00001924: 0x000009b0 ...TE_IRQHandler+280   add     sp, #36 ; 0x24
00001926: 0x0000f0bd ...TE_IRQHandler+282   pop     {r4, r5, r6, r7, pc}
Run Code Online (Sandbox Code Playgroud)

在其他IRQ中,这不会发生.

我知道可能会发生更多的寄存器被推送到堆栈,所以我如何确定在哪个偏移量来检索PC?

如果我在代码仍在IRQ处理程序中时检查SP周围的内存转储,我可以发现返回地址,但它始终位于一个奇怪的位置,与SP相比具有负偏移.我无法理解如何获得正确的地址.

stack arm watchdog irq cortex-m

4
推荐指数
1
解决办法
1618
查看次数

在许多错误提交之后合并分支

我是.git的新手,我正在使用Sourcetree/Bitbucket.我暂时不需要共享我的代码,只是为了跟踪我的项目并允许我撤消或恢复到旧版本.我读了很多指南,但对我来说仍然有些神秘.

我想要使​​用它的方法是每次我需要添加新功能时从主设备创建一个分支.我想继续在那个分支上工作,当它最终工作时,我想将它合并回主人,然后继续下一个功能.也许甚至有更好的方式来使用它,我愿意接受建议.

我最终遇到了这种情况,因为我必须快速发布一个新版本而且我没有时间来修复存储库.后来尝试修复它导致更加混乱.也许是时候寻求帮助了;) SourceTree screnshot

这就是我应该做的事情: - 29 gen,我想创建一个新的分支"transmitter_fo_nrf24l01 +" - 继续提交该分支,直到5 feb - 6月2日,创建一个新的分支(来自master)"added_serial_interface"(我想我在这里失败了.) - 再次使用12 feb的版本与master合并. - 为新功能创建一个新分支(来自主服务器)

今天我无法将adds_serial_interface合并到master,因为与5月5日添加的README文件发生冲突,最后一次尝试导致了那个孤独的头......

我现在如何合并主分支中的所有内容?我无法解决冲突.我不太关心修复所有的历史,但我现在至少要开始"清理"新功能,并了解我的错误是什么.谢谢!

PS抱歉小图片,如果您使用浏览器放大,您可以看到它的实际大小

git merge bitbucket atlassian-sourcetree

2
推荐指数
1
解决办法
51
查看次数

标签 统计

arm ×1

atlassian-sourcetree ×1

bitbucket ×1

cortex-m ×1

git ×1

irq ×1

merge ×1

stack ×1

watchdog ×1