嵌入式调试ARM程序跑飞现象的跟踪

发布者:紫色小猫最新更新时间:2018-05-04 来源: eefocus关键字:调试ARM  程序跑飞 手机看文章 扫描二维码
随时随地手机看文章

最近在调试2410的过程中,经常出现程序跑飞的现象,跟踪进行后发现。。。所以决定把它记录下来。
现象:
调试用的是技创ARM仿真器(兼容multi-ICE)和ADS1.2,板子外扩NandFLASH(装有Bootload)和SDRAM。当将程序烧到FLASH运行时会出现无规律的死机。用仿真器仿真时情况是这样:当CPU复位后,第一次装载程序执行时,情况与烧到FLASH运行时一样。但如果将运行的程序停下来(无论有无跑飞情况下),再重新装载(CPU复位后第二次及以后装载)时,运行到下述程序中的“msr     cpsr_cxsf,r1”就跑飞。
     bic     r0,r0,#MODEMASK | NOINT     ;IRQ、FIQ位清0
     orr     r1,r0,#SVCMODE
     msr     cpsr_cxsf,r1         ;SVCMode    ;充许中断后,使程序跑飞
     ldr     sp,=SVCStack
过程:
上面是启动代码中初始化堆栈处的程序,就是这里允许了中断后,产生中断才使程序跑飞的。打开MEMORY窗口,查看各中断挂起寄存器,发现有定时器等中断请求,此时我直接在MEMORY窗口中给该标志位写“1”清除它们,INTPEND中的能清除,SRCPND清不掉,奇怪?原来目标CPU的定时器还在不停的运行着呢(习惯了51仿真的同志要注意这一点,哈哈!包括我)!刚一清除,又立即溢出了,尽管正处在停止运行的仿真状态。现在可以解释为什么CPU复位后第一次装载运行不会使程序跑飞了,因为复位后,各寄存器都变成初始态,定时器也还没有开启,所以也就不会触发中断。而当开启了定时器后,再装载程序时,定时器已经溢出,触发了中断。那么为何一进中断就会使程序跑飞呢?于是就在命令窗口中输入br   0x18,再执行程序,原来IRQ中断入口0x18的内容已从原先的0xea000047被改成了0x6b736564,反汇编代码如下:
00000018     [0x6b736564] * blvs      0x1cd95b0
CPU复位后的代码如下:
00000018     [0xea000047] * b         0x13c
啊!这怎么能被改掉!这不是NandFLASH的内容吗?接着我就用MEMORY窗口观察该处,再单步执行我的程序,果然跟踪到了修改该处的程序,可是没有写NandFLASH的操作,源程序如下:    
typedef   struct   software_config_system 
{
int     software_flag;
CHAR    curfont[20];
     。。。。。。
} software_config, *s_config;                 //定义数据结构及其指针

unsigned  CHAR   InitsoftDescription(void)
{
if   (s_config->software_flag != 0x2)
     {
         s_config->software_flag = 0x2;        //给指针指向的地址处赋值
         memcpy(s_config->curfont, "hanzi", 5);
。。。。。。
}
}  
原来是定义了一个全局的结构指针变量(s_config),由于没有对它进行赋值,而它默认的初始值为0,所以对他进行读写,也就对0x0开始处的地址进行读写。而且此时这段区间的NAND FLASH已被映射成Boot internel SRAM了,所以可以随机读写(这点一定要注意)。
总结:
1.在仿真情况下(即使停止程序的运行),目标CPU的各外围还是在工作的,如定时器等。
2.当将系统设计成NAND FLASH启动时,0x0开始处的4K地址空间已是CPU的内部SRAM了,可以像其它RAM一样随意读写,此时定义全局的指针变量时,一定要记得赋值,否则就会修改这部分的代码。
3.在用仿真器仿真时,可以在初始化堆栈的前面加一些关闭定时器及清中断标志等代码,以免在没有复位CPU的情况下,程序还没执行到main函数就频繁产生中断。

关键字:调试ARM  程序跑飞 引用地址:嵌入式调试ARM程序跑飞现象的跟踪

上一篇:MSP430+DMA
下一篇:STM32 jtag调试程序时程序跑飞

推荐阅读最新更新时间:2024-03-16 16:01

gdb+gdbserver调试arm-linux程序
mmap作为struct file_operations的重要一个元素,mmap主要是实现物理内存到虚拟内存的映射关系,这样可以实现直接访问虚拟内存,而不用使用设备相关的read、write操作,mmap的基本过程是将文件映射到虚拟内存中。在之前的一篇博客中谈到了mmap实现文件复制的操作。 关于linux中的mmap调用如下,最好的办法查看命令,man mmap: 必要的头文件 #include sys/mman.h 函数声明 void * mmap(void *addr,size_t length,int prot, int flags,int fd,off_t offset); 关于各个参数的意义如下:
[单片机]
浅谈ARM裸板调试6410
我所说的ARM裸板调试是指ARM的PCB板制作完后,贴片回来的板子,不但没有任何程序,上电都是第一次。之所以写一篇blog,是因为最近调试了一块ARM板,基于S3C6410的,但是我们把原来的M-DDR DRAM和Nandflash全部都换掉了,硬件做了不小的改动。以前也做过类似的裸板调试,从ARM7到ARM9,再到现在的ARM11。今天就来写一篇ARM裸板调试的文章。 如我前面所说,刚拿到ARM裸板的时候,首先就是要上电。不过上电之前,最好测一下电源和地是否短路。然后就可以上电了,我一般采用稳压电源,这样可以看到电流的大小,如果电流太大,说明硬件可能有问题,用手摸摸板子上的芯片,看看是否烫手,查一下各个电源模块的供电电压是否正
[单片机]
浅谈<font color='red'>ARM</font>裸板<font color='red'>调试</font>6410
mini2440---keil for ARM下的调试与下载环境的搭建
题外话:编译环境选择推荐 对于刚刚接触ARM裸机编程的各位,我要特别的进行提醒一下,就是关于编译环境的选择问题。目前主流的有ADS+AXD,KEIL FOR ARM,IAR FOR ARM三种,我开始使用的ADS+AXD进行学习,因为光盘里面自带,而且很多资料都是他的,但是个人感觉真心调试十分的不方便,而且各种容易死机,并且现在也已经不更新了,北航一本讲嵌入式的书出了一个第二版,就是把ADS换成了KEIL,而且以后KEIL会是主流,因此我推荐选择KEIL进行学习。IAR听我一个同学说也十分好用,但是在网上找有关方面的资料不是很多。而且我想北航一群教授编书都用KEIL进行,说明KEIL自有他的优势,书上这么说了,那以后会有更多学
[单片机]
mini2440---keil for <font color='red'>ARM</font>下的<font color='red'>调试</font>与下载环境的搭建
STM32 jtag调试程序程序
开发环境:keil MDK V5.10 操作系统:windows 7(32位) 目标硬件:STM32F103C8 问题描述:在使用jtag对某软件进行调试的时候,KEIL可以正常的进行软件下载,一旦使用F5全速运行时,立即发现程序跑飞了,暂停后汇编代码显示“MOVS R0 R0”。程序跑飞的时候可以看到目标设备程序执行过程正常(灯正常闪烁,串口调试信息正常输出)。 问题原因:芯片的JTAG引脚被复用,在程序初始化阶段将JTAG引脚remap为了普通的IO引脚导致。 PS:在使用JTAG进行程序调试的时候,如果程序中开了看门狗,调试程序进行了单步调试的情况也可能导致JTAG无法正常使用,因为目标设备的看门狗不能因为单步执行
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved