搜索
bottom↓
回复: 25

【经验分享】ARM的三种中断调试方法介绍

[复制链接]

出0入0汤圆

发表于 2014-9-5 08:53:39 | 显示全部楼层 |阅读模式
嵌入式软件开发流程及ARM的中断调试方法介绍

1 嵌入式软件开发流程
参照嵌入式软件的开发流程。第一步:工程建立和配置。第二步:编辑源文件。第三步:工程编译和链接。第四步:软件的调试。第五步:执行文件的固化。
在整个流程中,用户首先需要建立工程并对工程做初步的配置,包括配置处理器和配置调试设备。编辑工程文件,包括自己编写的汇编和C语言源程序,还有工程编译时需要编写的链接脚本文件,调试过程中需要编写存储区映像文件和命令脚本文件,以及上电复位时的程序运行入口的启动程序文件。

对后四种文件的理解很重要,其作用解释如下。
(1) 链接脚本文件:在程序编译时起作用。该文件描述代码链接定位的有关信息,包括代码段,数据段,地址段等,链接器必须使用该文件对整个系统的代码做正确的定位。在SDRAM中调试程序、在FLASH中调试或固化后运行的链接脚本文件应加以区分。(在IDE开发环境中使用扩展名*.Ld)
(2)命令脚本文件:在SDRAM中调试程序时起作用。在集成环境与目标连接时、软件调试过程中以及目标板复位后,有时需要集成环境自动完成一些特定的操作,比如复位目标板、清除看门狗、屏蔽中断寄存器、存储区映射等。这些操作可以通过执行一组命令序列来完成,保存一组命令序列的文本文件称为命令脚本文件(在 IDE开发环境中使用扩展名*.Cs)。
(3)存储区映像文件:在SDRAM中调试程序时起作用。在软件调试过程中访问非法存储区在部分处理器和目标板上会产生异常,如果异常没有处理,则会导致软件调试过程无法继续,为了防止以上问题并调整仿真器访问速度以达到最合适的水平,提供这样一种用于描述各个存储区性质的文件叫存储区映像文件(在IDE开发环境中使用扩展名*.Map)。
在程序的调试过程中可以选择使用存储区映像文件*.Map和命令脚本文件*. Cs配合程序的调试。
(4) 启动文件:它主要是完成一些和硬件相关的初始化的工作,为应用程序做准备。一般,启动代码的第一步是设置中断和异常向量;第二步是完成系统启动所必须的寄存器配置;第三步设置看门狗及用户设计的部分外围电路;第四步是配置系统所使用的存储区分配地址空间; 第五步是变量初始化;第六步是为处理器的每个工作模式设置栈指针;最后一步是进入高级语言入口函数(Main函数)。


2 中断程序设计
中断调试方面可以采用类似矢量中断动态处理方式,让中断对应的确定地址代码调转到RAM的固定地址处,定义一个函数指针指向该固定地址,就可以随时通过替换RAM固定地址处的代码,实现动态改变中断处理函数。
具体方法是:
(1)将中断源函数指针定义在RAM中相对的固定地址,建立中断矢量表;
  1. Void SetInterrupt (U32 Vector, Void (*Handler)())
  2. {
  3.     InterruptHandlers[Vector] = Handler;
  4. }
复制代码


(2)在程序中,调用具体某中断源的中断处理函数;
如:
  1. SetInterrupt(IIC_INT,IICWriteIsr);
复制代码

/* 声明IIC中断处理函数,其中IIC_INT为 IIC中断源序号,IICWriteIsr为 IIC的写中断处理函数 */

(3)在0x18处的IRQ或0x1C处的FIQ中断入口函数中,获取中断源、清除中断挂起标志、通过已定义的中断源函数指针进入用户具体某中断处理程序。
  1. Void ISR_IrqHandler(Void)
  2. {
  3.     IntOffSet = (Unsigned Int)INTOFFSET;
  4.     Clear_PendingBit(IntOffSet>>2) ;
  5.     (*InterruptHandlers[IntOffSet>>2])();
  6.     // 调用具体某中断处理程序
  7. }
复制代码


采用动态的中断处理方法,在中断源较多的情况下,中断响应时间和程序性能得到优化。另外,在调试方面,此处理方法具有便于跟踪调试的优点,并且根据需要,可以方便变换中断处理函数。

3 中断调试
软件调试可以在SDRAM中或FLASH中进行。在SDRAM中,读写方便,访问速度快。一般软件调试应在RAM中完成,但当RAM空间小于FLASH程序空间,程序只能在FLASH运行和调试时,或者用户希望了解程序在FLASH中实际运行情况时,就可以在FLASH中进行程序调试。
进行中断调试时,应注意中断入口位于SDRAM中或FLASH中0x18或0x1c地址,链接脚本文件必须使整个系统的代码正确定位于0x0起始处,但SDRAM或FLASH对应的链接脚本文件及工程配置注意区别。

(1)程序在SDRAM中运行
在SDRAM中调试,使用SDRAM对应的链接脚本文件。调试过程需要以下几步:编译、链接工程;连接仿真器和电路板;下载程序(在IDE开发环境中使用扩展名*.Elf);调试。
下载程序前必须启动命令脚本文件完成前述的一些特定的操作,命令脚本文件的启动在连接仿真器时自动进行,其中存储区映射应与程序在SDRAM中运行时相同,保证整个系统的代码正确定位于0x0起始处。下载程序的起始地址也为0x0,下载成功后便可进行调试工作。

(2)程序在FLASH中运行
在FLASH中调试,使用FLASH对应的链接脚本文件。调试过程需要以下几步:编译、链接工程;连接仿真器和电路板;程序格式转换(*.Elf转换为*.Bin);固化*.Bin程序;调试。
连接仿真器后不需要下载程序,存储区映射由本身工程中启动文件运行完成,不需要命令脚本文件。在本环境调试过程中,可以设置两个硬件断点。

(3)程序从FLASH中调到SDRAM中运行
在某些应用场合,强调程序运行速度的情况下,希望程序在SDRAM中运行,这样就需要将FLASH中存储的程序,在系统上电后搬运到SDRAM某空间位置,然后自动运行。这种所谓的Bootloader技术,在DSP系统中常被采用。

调试过程分两步:
(A)首先将用户程序在SDRAM中调试通过,然后将*.Bin文件固化到FLASH某一非0扇区地址空间;
(B) 将自己编写的Bootloader搬运程序调试通过并将Bootloader.Bin文件固化到FLASH的 0扇区地址空间,搬运程序在系统上电后,将(A)中FLASH某一非0扇区地址空间存储的程序,搬运到在SDRAM调试中同样的空间位置,实现程序在SDRAM中运行的目的。

另外注意,因为用户实际的程序中断入口必须位于FLASH的0x18或0x1c地址,所以Bootloader搬运程序还应具有中断入口的跳转功能,即把PC指针由此转向处于SDRAM空间的中断程序入口表,就是整个用户程序被搬运到SDRAM的那一位置。
如:LDR PC, =HandleIRQ
// HandleIRQ位于SDRAM空间中断程序入口表.

另附PDF下载:


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

发表于 2014-9-5 08:57:50 | 显示全部楼层
收藏了,谢谢分享

出100入101汤圆

发表于 2014-9-5 08:57:59 | 显示全部楼层
下载收藏!

出0入0汤圆

发表于 2014-9-5 09:08:11 | 显示全部楼层

收藏了,谢谢分享

出0入0汤圆

 楼主| 发表于 2014-9-5 09:09:43 | 显示全部楼层
dongyanbo 发表于 2014-9-5 08:57
收藏了,谢谢分享

谢谢支持

出0入0汤圆

发表于 2014-9-5 09:12:15 | 显示全部楼层
收藏了,谢谢分享

出0入0汤圆

发表于 2014-9-5 09:25:26 | 显示全部楼层
谢谢了  还没玩i.mx的arm核的

出0入0汤圆

发表于 2014-9-5 10:55:21 | 显示全部楼层
收藏先,谢谢   

出0入0汤圆

 楼主| 发表于 2014-9-5 11:37:03 | 显示全部楼层

不客气

出0入0汤圆

发表于 2014-9-5 11:44:44 | 显示全部楼层
学习了,讲的很详细。

出0入0汤圆

 楼主| 发表于 2014-9-5 11:45:46 | 显示全部楼层
laotui 发表于 2014-9-5 11:44
学习了,讲的很详细。

这是接近TOWER的节奏

出0入0汤圆

发表于 2014-9-5 11:49:55 | 显示全部楼层
pcbddd 发表于 2014-9-5 11:45
这是接近TOWER的节奏

还差好多,之前没用过飞思卡尔,分享不出好资料还在弄ke02

出0入0汤圆

 楼主| 发表于 2014-9-5 12:05:06 | 显示全部楼层
laotui 发表于 2014-9-5 11:49
还差好多,之前没用过飞思卡尔,分享不出好资料还在弄ke02

我也换了Ke02,看了你的酷贴,不过我用的是Keil+PE

出0入0汤圆

发表于 2014-9-5 12:20:40 | 显示全部楼层
pcbddd 发表于 2014-9-5 12:05
我也换了Ke02,看了你的酷贴,不过我用的是Keil+PE

我还是用IAR了。

出0入0汤圆

发表于 2014-9-5 12:28:23 | 显示全部楼层
多谢分享!

出0入0汤圆

发表于 2014-9-5 13:05:42 | 显示全部楼层
好东西,多谢分享

出0入0汤圆

发表于 2014-9-5 14:11:22 | 显示全部楼层
值得探讨呀

出0入0汤圆

 楼主| 发表于 2014-9-5 14:13:21 | 显示全部楼层

你的头像还能切换,给力

出0入0汤圆

发表于 2014-9-5 14:15:42 | 显示全部楼层
对的,这年头啥都不能一样的

出0入0汤圆

发表于 2014-9-5 14:15:44 | 显示全部楼层
很不错的东西!           

出0入0汤圆

发表于 2014-9-5 16:34:05 | 显示全部楼层
感谢楼主分享。

出0入0汤圆

 楼主| 发表于 2014-9-5 18:38:08 | 显示全部楼层

呵呵,一起学习,谢谢支持

出0入0汤圆

发表于 2014-9-5 20:31:09 | 显示全部楼层
学习学习

出0入0汤圆

发表于 2014-9-5 22:34:27 | 显示全部楼层
中断调试这个思路非常好,这想法很独到,改天可以写个程序试试这种方式

出0入0汤圆

 楼主| 发表于 2014-9-5 22:42:39 | 显示全部楼层
wxfje 发表于 2014-9-5 22:34
中断调试这个思路非常好,这想法很独到,改天可以写个程序试试这种方式

嗯,我的FRDM_KE02板换到了,摸透了再试试这个中断调试,
SDRAM、FLASH、FLASH中调到SDRAM
底层的东西会了我心里才踏实

出0入0汤圆

发表于 2014-9-5 23:01:53 | 显示全部楼层
根据楼主的帖子,我知道了elf和bin文件的作用了,之前看到iar的目标文件一直有三个,不理解,现在理解了。
但是我没能理解中断调试的意思,帖子上介绍的不是怎么进入中断的吗?
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-25 23:22

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表