[STM32F1] KEIL调试汇编指令

[复制链接]
3138|2
 楼主| st316 发表于 2014-8-26 22:13 | 显示全部楼层 |阅读模式
本帖最后由 st316 于 2014-8-26 22:22 编辑

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

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

  4.         area MYCODE, code, readonly
  5.         entry
  6. start mov r1, #10
  7.         mov r2, #20
  8.         add r1, r1, r2
  9.         b start
  10.         end

另外,分散加载文件test.sct如下:
  1. LR_ROM1 0x08000000
  2. {
  3.     ER_ROM1 +0
  4.     {
  5.         *.o(RESET, +First)
  6.         *(InRoot$Sections)
  7.         .ANY(+RO)
  8.     }
  9.     RW_RAM1 0x20000000
  10.     {
  11.         .ANY(+RW +ZI)
  12.     }
  13. }

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

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

capture.jpg

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

 楼主| 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… 菜单查看一下内存访问权限,如下图:
2014-09-02_14-22-56.png
可见,对于地址 0x0000000C,当前的设置确实是不可读的。

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

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

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

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

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

通过Memory窗口查看0x08000000中存放的数据,的确是0x0214F04E
2014-09-02_14-39-52.png

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

修改过后的工程文件在这里: ASM_2.rar (32.71 KB, 下载次数: 7)


PS,其实这里用不到调试脚本,可以直接删除。将下图中Initialization File:中的文件路径删除即可。
2014-09-02_14-46-48.png

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




您需要登录后才可以回帖 登录 | 注册

本版积分规则

21

主题

167

帖子

3

粉丝
快速回复 在线客服 返回列表 返回顶部