我试图在我的代码中检索IRQ处理程序的返回地址.我的目标是在看门狗定时器到期之前和复位之前使用WDT_IRQHandler()保存PC的值以进行调试.我也在用其他IRQ测试这种方法来检查我是否掌握了这个想法.但似乎我没有.
我已经阅读了可用的文档.我知道当异常发生时,8个寄存器被推送到堆栈:R0,R1,R2,R3,R12,LR,PC和XPSR.
我还读过堆栈自动双字对齐.所以在我看来,检索返回地址就像这样简单:
检查附加的调试器,似乎不是这种情况,该内存地址的内容并不总是指向闪存区域,甚至指向有效区域,并且在任何情况下,它都不是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相比具有负偏移.我无法理解如何获得正确的地址.
我是.git的新手,我正在使用Sourcetree/Bitbucket.我暂时不需要共享我的代码,只是为了跟踪我的项目并允许我撤消或恢复到旧版本.我读了很多指南,但对我来说仍然有些神秘.
我想要使用它的方法是每次我需要添加新功能时从主设备创建一个分支.我想继续在那个分支上工作,当它最终工作时,我想将它合并回主人,然后继续下一个功能.也许甚至有更好的方式来使用它,我愿意接受建议.
我最终遇到了这种情况,因为我必须快速发布一个新版本而且我没有时间来修复存储库.后来尝试修复它导致更加混乱.也许是时候寻求帮助了;)

这就是我应该做的事情: - 29 gen,我想创建一个新的分支"transmitter_fo_nrf24l01 +" - 继续提交该分支,直到5 feb - 6月2日,创建一个新的分支(来自master)"added_serial_interface"(我想我在这里失败了.) - 再次使用12 feb的版本与master合并. - 为新功能创建一个新分支(来自主服务器)
今天我无法将adds_serial_interface合并到master,因为与5月5日添加的README文件发生冲突,最后一次尝试导致了那个孤独的头......
我现在如何合并主分支中的所有内容?我无法解决冲突.我不太关心修复所有的历史,但我现在至少要开始"清理"新功能,并了解我的错误是什么.谢谢!
PS抱歉小图片,如果您使用浏览器放大,您可以看到它的实际大小