打印
[STM32F1]

KEIL调试汇编指令

[复制链接]
2654|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
st316|  楼主 | 2014-8-26 22:13 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 st316 于 2014-8-26 22:22 编辑

我打算利用Keil的软件仿真功能学习一下ARM汇编指令。

于是我建立了一个基于STM32的工程。里面只包含一个汇编文件test.s,代码内容如下:
        AREA RESET, DATA, READONLY
        DCD 0x20018000                   ;MSP
        DCD 0x08000008                   ;Reset_Handler

        area MYCODE, code, readonly
        entry
start mov r1, #10
        mov r2, #20
        add r1, r1, r2
        b start
        end

另外,分散加载文件test.sct如下:
LR_ROM1 0x08000000
{
    ER_ROM1 +0
    {
        *.o(RESET, +First)
        *(InRoot$Sections)
        .ANY(+RO)
    }
    RW_RAM1 0x20000000
    {
        .ANY(+RW +ZI)
    }
}

最后,调试脚本DebugIni.int如下:
FUNC void Setup(void)
{
    PC = 0x08000008;
    SP = 0x20018000;
}
Setup();

Ctrl+F5进入调试模式之后,PC和SP内都存放着我指定的数值,黄色的键头也指向了test.s中的mov r1, #10,可是按下单步运行之后,PC跑到了0x00000000地址处,我希望测试的汇编指令根本不能得到执行,如下图。为什么会这样啊?



工程文件在这里: ASM_1.rar (26.64 KB)
请各位指点,谢谢了!

沙发
st316|  楼主 | 2014-8-27 07:07 | 只看该作者
是因为地址0x00000000处没有中断向量表的缘故么?

使用特权

评论回复
板凳
st316|  楼主 | 2014-9-2 15:04 | 只看该作者
好吧,问题终于被我解决了!
Ctrl+F5进入Debug模式后,可以看到一个Command窗口,这里给出了错误信息。

这里有好几个问题,先看第一个:
*** error 65: access violation at0x0000000C : no 'read' permission
提示 Memory 的访问权限有问题,0x0000000C不可读。
那么,通过 Debug -> Memory Map… 菜单查看一下内存访问权限,如下图:

可见,对于地址 0x0000000C,当前的设置确实是不可读的。

解决方法:
在当前的对话框中,手动添加修改。
或者, 退出 Debug 模式,在 Optionsfor Target 对话框中的 Device 标签页,重新选择一个芯片即可。

解决第一个问题后,再次进入Debug模式。

单步运行,提示仍有错误。
*** error 65: access violation at0x0214F04E : no 'execute/read' permission
提示地址 0x0214F04E 处不可执行/不可读。

为什么会去0x0214F04E地址读取并执行代码,它位于RAM内呀?
通过查看Register窗口,发现PC寄存器里的值确实是0x0214F04E


检查一下汇编程序,原来是中断向量表中PC的初始值给错了。
AREA RESET, DATA, READONLY
                   DCD 0x20018000                 ;MSP
                   DCD 0x08000008               ;Reset_Handler

通过Memory窗口查看0x08000000中存放的数据,的确是0x0214F04E


解决方法:
将汇编代码中的DCD 0x08000008                  ;Reset_Handler
改成DCD start                  ;Reset_Handler
重新编译链接,进入Debug模式,单步执行,程序正常运行,大功告成。

修改过后的工程文件在这里: ASM_2.rar (32.71 KB)


PS,其实这里用不到调试脚本,可以直接删除。将下图中Initialization File:中的文件路径删除即可。

分散加载文件,直接让KEIL生成就行了,不用自己写。将下图中的Use Memory Layout from Target Dialog前的复选框勾选上就行了。





使用特权

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

本版积分规则

21

主题

167

帖子

3

粉丝