当前位置:首页 > 单片机 > 单片机
[导读] 最近在调试2410的过程中,经常出现程序跑飞的现象,跟踪进行后发现。。。所以决定把它记录下来。现象:调试用的是技创ARM仿真器(兼容multi-ICE)和ADS1.2,板子外扩NandFLASH(装有Bootload)和SDRAM。

最近在调试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; //定义数据结构及其指针

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

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

在这篇文章中,小编将对PLC的相关内容和情况加以介绍以帮助大家增进对它的了解程度,和小编一起来阅读以下内容吧。

关键字: PLC 模块化 程序

ARM系统几乎都采用Linux的操作系统,而且几乎所有的硬件系统都要单独构建自己的系统,与其他系统不能兼容,这也导致其应用软件不能方便移植,这一点一直严重制约了ARM系统的发展和应用。GOOGLE开发了开放式的Andro...

关键字: Linux x86 ARM

随着计算需求的多样化,尤其是随着移动设备、嵌入式系统和云计算的兴起,ARM 和 x86 架构之间的争论变得更加突出。ARM(高级 RISC 机器)和 x86 代表两种不同类型的处理器架构,每种架构都针对不同的工作负载和用...

关键字: Linux x86 ARM

从画质优化 (NSS) 到帧率提升 (NFRU) 和光线追踪(NSSD),Arm 计划覆盖移动端图形处理的多个维度,推动边缘 AI 图形革命。而未来通过持续的技术迭代,Arm也将保持在移动计算领域的技术领先,满足手游、A...

关键字: ARM 神经图形技术 GPU AI ML

7月31日消息,据媒体报道,芯片架构提供商Arm Holdings首席执行官Rene Haas宣布,公司正加大投入开发自有芯片产品,此举标志着其从传统IP授权模式向提供实体芯片的战略重大转变。

关键字: ARM META

7月28日消息,2025年,中国AI硬件市场规模将首次突破万亿元大关。

关键字: AI ARM
关闭