(rt-thread gdb)异常向量的设置以及ARM下单步调试的实现

之前2天时间弄了个框架

以为这个STUB能很快完成

搞了一周后才发现GDB的难度超出了我的预期

好在有其他的代码可以参考


由于自己缺少汇编的编写经验

在异常向量的处理上花了太多的时间

现在看看我用的undef入口代码

.globl vector_undef
vector_undef:
    sub     sp, sp, #72
    stmia   sp, {r0 - r12}          @/* Calling r0-r12                  */
    add     r8, sp, #60

     mrs     r1, cpsr
     msr     cpsr_c, #I_Bit|F_Bit|Mode_SVC
     mov     r0, r0
     @mov     r2, lr    @ Save old lr
     stmdb   r8, {sp, lr}            @/* Calling SP, LR                  */
     msr     cpsr_c, r1   @/* return to Undefined Instruction mode  */

    str     lr, [r8, #0]            @/* Save calling PC                 */
    mrs     r6, spsr
    str     r6, [r8, #4]            @/* Save CPSR                       */
    str     r0, [r8, #8]            @/* Save OLD_R0                     */
    mov     r0, sp

    bl      rt_hw_trap_udef

    ldmia    sp, {r0 - r12}            @ Calling r0 - r2
    mov      r0, r0
    ldr      lr, [sp, #60]            @ Get PC
    add      sp, sp, #72
    movs    pc,lr

代码在bl rt_hw_trap_udef前部分和RTT原本的差不多,都是将寄存器值压入栈供函数使用

有的一点区别就是我们的SP,LR寄存器是先恢复到SVC模式再压栈

因为GDB需要的是sp,lr 而不是sp_udef lr_udef


后半部分主要就是把存入的寄存器覆盖回去.恢复现场

要注意的是这里使用movs pc,lr

因为在undef里 lr_udef寄存器保存的是PC+4的值,我们这里把lr_udef当做了PC传递给函数

但函数修改出来后的值是PC

所以不能用subs 而是直接movs



还有这周主要的工作就是完善了单步执行

大部分的arm架构都是没有支持单步执行的调试单元的

也就是说我们必须用断点来模拟单步执行


= =不过很纠结我的一点就是kgdb将单步执行视为普通的continue

让模拟单步的环节交给GDB

但我找不到是kgdb是如何告诉gdb让他来模拟的.....


所以我只能自己去模拟单步

        if (ins_will_execute(curins)) {
            // Decode instruction to decide what the next PC will be
            addr = (unsigned long) target_ins((unsigned long*)pc, 
                                                     curins);
        } else {
            // The current instruction will not execute (the conditions 
            // don't hold)
            addr = pc+4;
        }
模拟单步的基本过程就是这样

addr是要设置断点的位置

先是解析当前的指令,看是否需要跳转

如果不需要,那就将断点设置为pc+4

不然 就要对命令作解析

比如 bx lr

那我们就要设置ADDR为lr


大致计划上BeagleBone的工作就差不多了,只剩下大量测试了

多核支持也只能等以后RTT多核完善后再说


接下来是准备去实现对cortexM的支持

一开始是准备对所有的arm使用同一套arch

这套arch同时实现软件断点,硬件断点


但现在看来cortexM带有非常完善的调试单元

而且cortexM大多混用thumb指令

差异较大

所以准备分开实现


cortexA系列.ARM9等等不再去实现硬件断点,因为软件断点已经足够好哟你

cortexM只实现硬件断点


大笑虽然我找不到对cortexM做GDB支持的理由

廉价便宜的各种JTAG,SWD调试器完全满足了需要

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值