系统故障分析

真正快乐的是与Bug斗争的过程,最后完成作品或项目只是这种快乐的终点。那么我们该怎么去对待Bug才能做到,游走在Bug世界里享受无尽的快乐。一些高手在程序的编写方面都有了自己的风格,可以将程序做很好的规划。以缜密的思维构造程序架构,以编程规范来打造程序的外观。
 
写程序是很短的时间,调试程序是一个漫长的过程。只有做好前期的准备后面依靠自己的调试技巧,就能玩弄Bug于鼓掌之中,而不是被Bug搞的头昏脑胀。找出Bug的那一瞬间就是快乐,解决Bug的那一刻更是兴奋。这就是与Bug斗争的快乐所在。
 
BUG描述:当C源代码中使用了汉字等非ASCII字符,而此字符的编码又恰好包含了大于或等于0xFD的字节时,这个字节将被编译器删除,从而最终程序代码的运行错误。
 
BUG修复方法一:用十六进制编辑软件打开c51.exe和cx51.exe(这两个文件是相同的,名字不同),搜索80FBFD56,改为80FBFF56即可。
c51.exe位置: Keil安装目录/keil/c51/bin/c51.exe
cx51.exe位置:Keil安装目录/keil/c51/bin/cx51.exe
系统故障分析
BUG修复方法二:拷贝本目录下的Keil_C51_0xFD_fix.exe至Keil安装目录/keil/c51/bin/下运行即可。
 
体系结构BUG分析:mov R1,#0x00003DD0 显示out of the range of operation的原因。想要使IODIR=0x00003dd0,以下是汇编程序
LDR R0,=IODIR
MOV R1,#0x00003dd0
STR R1,[R0]编译时候出错的提示是:超出操作范围
 
解答:使用ldr,mov 的操作数为8 位位图数。
 
编译器与语言BUG分析:00254: Unimplemented RDI message 错误,设置连接都正常。
 
解答:是JTAG的问题.可以先使用ISP操作,如果能ISP,说明LPC2104没有损坏,还能正常运行程序.
 
编译器与语言BUG分析:在调试程序的时候在AXD中出现BUG提示信息:RDI Warning 00159:could not open specified device port.
系统故障分析
解答:安装驱动程序有问题,需要按照光盘\easyarm_drive\readme.txt来进行操作.
 
编译器与语言BUG分析:用实验程序运行经常出现下列信息! 程序不能下载到目标板.Warnning! interrupt vectors data is not correct!Program you downloaded can not run freely!
 
解答:1.仿真器确保配置正确,即"EasyARM Configuration"设置窗口中的"FLASH"项中选择"Erase Flash when need";2.向量表累加和要为0;3.可以先在RAM 调试一个程序(运行),然后STOP,再使用File->Load Image...加载要下载到FLASH 的调试文件.
 
编译器与语言BUG分析:有关LPC2106.INC的BUG分析.无法在project 引用lpc2106.inc文件,只能引用lpc2106.h文件,而且当主程序用汇编编写时,不能引用lpc2106.h,用lpc2106.inc 则无法加入project。
 
解答:不用加2106.inc只要该文件在工程文件夹中,就可以直接在汇编程序的开始处加6"incl? 2106.inc".注意:该文件是汇编文件定义的头文件,定义内部寄存器.
 
编译器与语言BUG分析:入口点的概念,在使用LPC2106 上移植 OS-II,每次MAKE时总是提示Image does not have an entry point,是把光盘的vetctors.s 复制过来的,已经声明了ENTERY。
 
解答:需要在ADS中设置入口.
系统故障分析
编译器与语言BUG分析:直接通过JTAG 口下载EasyArm板带的Ext1_test程序到ARM 中,出现中断向量的告警:interrupt vector is not correct arm is not running freely.果然复位后芯片不能运行.但是用串口下载后芯片能正常工作,中断也行的.并且用JTAG 仿真的话,芯片能正常工作,中断也行的,唯独JTAG口下载不行.
 
解答:仿真器配置中要设置Erase Flash when need.也可以这样试试:1.可以先打开一个工程在RAM 中调试运行;2.stop 程序;3.使用File->Load Image…重新加载Ext1_test 生成的*.axf 文件.
 
编译器与语言BUG分析:仿真器配置中设置了Erase Flash when need,在RAM下调试是可以的,但是下载后出现interrupt vector data is not correct.
 
解答:在RAM下调试是对的,是向量表的累加和不为零.因为如果用ISP 下载能运行,说明向量表的累加和已为零,而用JTAG 下载不能运行的情况可能是 没有正常下载代码.先在RAM 中调试,目的是为了后面正确下载程序到FLASH.
 
编译器与语言BUG分析:仿真软件和2104 开发板连接不上DBE Warning 00041:!An unspecified Debug Toolbox call failed电源和开发板都连好,错误和没接开发板一样,驱动也安装了,安装时按确定键时,软件很长时间才有如上反应,请帮忙
 
解答:1.并口是否正常;2.在其它操作系统(如98)下或其它台式PC下试试.
 
编译器与语言BUG分析:向flash烧数据时出现:exceeds flash limitation!
 
解答:要写入的flash 地址超过了范围.如果不是代码太大的问题,可以检查scf 文件是否正确.
系统故障分析
编译器与语言BUG分析:ADS 编译错误"L6221E:Execution region ER_RO overlays with Execution regionER_ZI" 该如何解决
 
解答:最大的可能是因为你的RELEASE 或者DEBUG 选项里面没有正确设置.
 
编译器与语言BUG分析:EasyARM2100 开发板如何通过JTAG 接口下载到Flash。我在用EasyARM2100 开发板时JTAG 接口不能进行Flash 中的调试(DebugInFlash),但是可以在RAM 中调试(DebugInRAM),且通过ISP 编程可以写入Flash.通过JTAG 接口进行DebugInFlash 调试时,总是出现如下提示:Flash Sector 0 write failed!Warnning interrupt vectors data is not correct!Program you downloaded can not run freely!
 
解答:仿真器设置选项有一个允许擦除FLASH 的选项,选择它.
 
编译器与语言BUG分析:程序在RAM 调试时(RO=0X40000000) OK,但是JTAG 下载到FLASH(RO=0X00000000),显示如下:The session file 'c:\Documents and Settings\jan\default-1-2-0-0.ses'could not be loaded.
 
解答:这是ADS 自身的问题,请不要通过IDE 运行AXD,而是通过开始菜单运行,然后Load 调试文件调试.
 
编译器与语言BUG分析:EasyARM2100AXD 调试时出错,故障现象:按照光盘上的方法设置好ADS1.2 后打开光盘上的expamples\gpio\c\LedDisp 的工程文件(从光盘上拷贝到硬盘,已去处只读属性).编译通过后,按Debug 按键运行调试,进入AXD.按Go 按键,EasyARM 没有反应.再按Stop 按键.AXD 弹出两个确认框窗口:"No disassembly could be read at the reqsted address".如果进入AXD 直接按Step 按键,也是会弹出同样的两个确认框.软件是光盘上的,没有经过任何改动.光盘上的程序试过4,5 个都是这种情况.AXD 的设置是按照光盘上的说明设置的.EasyARM 上的JP8 是断开的.ADS 在出现这种问题后重新安装过,故障依旧.出现这个问题前,可以调试.只是单步的时候感觉比较慢.差不多1-2 秒钟才能单步一次.
 
解答:是芯片被加密了,无法写入新的程序,用FLASH ISP 清除后解决.加密后JTAG 完全不能控制芯片,否则可能被解密.
 
编译器与语言BUG分析:2104 板子,通过EasyJTAG 仿真时,在AXD 上没有文件,而且出现这样"Error, Flash is protected by user configation!"的提示,在AXD 应该打开什么类型的文件啊!
 
解答:在仿真器的配置窗口设置仿真器允许擦除FALSH.AXD->Options->configure target->configure->erase……
 
编译器与语言BUG分析:在AXD 调试中,通过从jtag 接口,连接上lpc2106,出现如下信息:TKSimulator for ADS, V1.2, 2003/08Software Supplied by: ZLGMCUARM7TDMI-S, Little Endian在从file|load imgage...文件,出现两种情况:1.正常,完全能调试;2.出现问题,如下:RDI Warning 00254: Unimplemented RDI message!
 
解答:可能是电源或其他接插件接触不良引起.
 
编译器与语言BUG分析:ADS 如下的编译错误是什么意思L6221E:Execution region ER_RO overlays with Execution region ER_ZI
 
解答:程序段内存分配可能有问题,RO(只读),ZI(0 初始化)
 
操作系统BUG分析:下载了工程模板以后,将工程模板目录下的文件都拷贝到了stationary 目录下,然后建立了一个 ARM Executable Image for OSII(for lpc21xx)的工程,在PROJECT 目录下的文件结构如下:
test.c
inlc?s.h
src->config.h,heap.s,incl?s.h,irq.s,lpc2294.h,
lpc2106.h,mem_a.scf,os_cfg.s,stack.s,startup.s
target.c,target.h, os_ii.c, os_ii.h,
arm->os_cpu.h,os_cup_a.s,os_cup_c.c
OS-> os 源文件arm_pc->pc.h,pc.c编译可以通过,但是MAKE 时提示:ERROR:Execution region IRAM overlaps with Execution region STACKS.如果我表述得不是很清楚的话,那么可否告诉我工程模板到底怎么操作,怎样才能把例子在 ARM2104 上跑起来.
 
解答:RAM 占用太大,请在flash 中调试,并减少任务堆栈的大小.
 
操作系统BUG分析:使用SMALL RTOS 时发现一个BUG.任务在调用系统等待函数 OSWait(K_TMO | K_SIG,x) 后,不能在延时 x 个 ticks 后被唤醒.
 
解答:在 OS_CORE.C uint8 OSWait(uint8 typ, uint8 ticks) small 中,case (K_TMO | K_SIG): 中执行了函数 OSTaskSuspend(OSTaskID);( OS_CORE.C 第549 行)而此函数将延时值改为了 0!解决办法:将此函数改用另一个函数 OS_TaskSuspend(TaskID);并在其后加入任务切换函数 OSSched();便能工作正常.
 
操作系统BUG分析:OsMemPut 是个函数名称Error : L6200E: Symbol OSMemPut multiply defined (by OS_II.o and Os_mem.o).
 
解答:这是重复定义错误.请不要把 OS_II.C 添加到工程中.
 
操作系统BUG分析:OS 在EASYARM 上的一个程序内编写了5 个任务,前4 个任务调试后工作正常,在编译第5个任务时,提示为:Execution region ER_RO overlaps with Execution region ER_ZI.
 
编译还提示:TOTAL ROM SIZE (CODE +RO DATA +RW DATA ) 8624
 
解答:代码超过16K.上面的信息会在zi 段或者rw 段与ro 段(代码段)发生重叠时发生.
 
操作系统BUG分析:请问:在 OS-II\ex2_arm 中,编译时出现错误提示如下:ERROR:L6221E:execution region ER_R0 overlaps with Execution region ER_ZI.在 OS-II\ex1_arm 中编译.运行都正常!
 
解答:定义任务堆栈小一点,如"#define TASK_STK_SIZE 128"
 
操作系统BUG分析:为何我EX1_FLASH 移植的时候总出现如下错误提示Error : C2933E: type disagreement for 'OSTaskStkInit'Os_cpu_c.c line 70
 
解答:是调用OSTaskStkInit 时类型不一致导致.
 
操作系统BUG分析:使用几次RelInFLASH 后不能正常工作,包括其他两种方式也不能工作在RelInFLASH 和DeBUGinflash 时显示一个错误Warnning! interrupt vectors data is not correct!Program you downloaded can not run freely!使用DebugInRAM 虽然不报错,但无法正常工作.
 
解答:可能是启用了加密功能引起的,使用ISP 擦除FLASH.
 
操作系统BUG分析:之前一直在用DebugInRAM,今天想试用了DebugInFLASH,发现以后再进行DebugInFLASH 之前确切的说是进入AXD 在运行之前都显示着第一次用DebugInFLASH 时下装的程序,一运行就可以显示当前程序的结果,每次如此,只要不运行其他程序,实验板上的LED 就保持第一次下载的程序的状态,RESET 和重新上电都不行.
 
解答:DebugInFLASH 就已经把程序下载到FLASH 了,原先出厂的程序已被现有的程序覆盖.
 
操作系统BUG分析:在调试实验程序的时候,把低功耗掉电模式实验代码PDRUN 编译后下载到2104 FLASH以后,程序正常运行了.可是再DEBUG 程序时,在AXD 下总是提示错误:Error:flash is user configured protected。
 
解答:通过ISP 软件擦除.
 
操作系统BUG分析:用开发板自带的一个程序Debug调试,然后AXD 提示:Warnning! interrupt vectors data is not correct!Program you downloaded can not run freely!在保留的异常向量位置填数据0xb9205f80,是为了使向量表中所有的数据32 位累加和为0.
Vectors
LDR PC, ResetAddr
LDR PC, UndefinedAddr
LDR PC, SWI_Addr
LDR PC, PrefetchAddr
LDR PC, DataAbortAddr
DCD 0xb9205f80
LDR PC, [PC, #-0xff0]
LDR PC, FIQ_Addr
ResetAddr DCD Reset
UndefinedAddr DCD Undefined
SWI_Addr DCD SoftwareInterrupt
PrefetchAddr DCD PrefetchAbort
DataAbortAddr DCD DataAbort
Nouse DCD 0
IRQ_Addr DCD 0
FIQ_Addr DCD FIQ_Handler
RELATED CASES
相关案例
MORE+