如何解决单片机答辩问题软件中难以重现的问题

基于故障重现的单片机系统设计
基于故障重现的单片机系统设计
电磁脉冲辐照效应实验方法
  电磁脉冲对电予系统的辐照效应实验方法,简单地说就是将被测电子系统置于电磁脉冲辐射场中,接受电磁脉冲的照射,研究被测系统在电磁脉冲照射下受干扰、损伤的情况。
  实验配置如图1所示。主要由吉赫横电磁波传输室(GTEM Cell)、Marx发生器、控制台和被试系统等组成。Marx发生器用于产生高电压,与GTEM室配合,在GTEM室内产生均匀电磁场。控制
  电磁脉冲辐照效应实验方法
  电磁脉冲对电予系统的辐照效应实验方法,简单地说就是将被测电子系统置于电磁脉冲辐射场中,接受电磁脉冲的照射,研究被测系统在电磁脉冲照射下受干扰、损伤的情况。
  实验配置如图1所示。主要由吉赫横电磁波传输室(GTEM Cell)、Marx发生器、控制台和被试系统等组成。Marx发生器用于产生高电压,与GTEM室配合,在GTEM室内产生均匀电磁场。控制台主要由示波器、光接收机和Marx控制面板组成。光接收机和电场传感器组成模拟量光纤场测量系统,主要用于将辐射电磁场转换成电压信号;示波器用来显示电场波形;Marx控制面板用来控制Marx发生器的充放电操作和陡化间隙的调整。
  故障重现原理
  故障重现的概念
  计算机系统在电磁脉冲作用下可产生硬件损坏、数据采集误差增大、内存数据改变、程序跳转、重启动和死机等故障。这些故障现象是大量的、不同的计算机在不同环境、不同时间受干扰后产生的故障现象的集总。如果拿出任意一台计算机做实验,只能产生很少的几个故障现象,由于这些计算机没有自动检测功能,有的故障即使是发生了,也观察不到。如
果连故障现象都观察不全,就无法找出故障出现的规律和原因,更谈不上进行防护技术研究。因此,很有必要设计一套专门用于电磁脉冲效应实验的计算机系统,该系统具有以下功能:
  &自动检测并显示系统本身出现的故障;
  &干扰时故障最容易出现;
  &使出现故障的种类最多;
  &具有故障重现功能。
  故障重现是指主动地采取一定的技术手段,使故障反复出现。想看哪种故障就能出现哪种故障,想让它出现儿次就出现几次。这与一般电路中采取有效措施抗干扰的设计思想截然不同。
  故障重现的条件
  故障重现并不是用计算机软件进行故障仿真,而是故障的真实再现。要使故障重现,除了辐射场的幅度要足够强外,被测系统还要具备必需的硬件电路和软件环境。软件环境是指干扰出现时控制功能电路工作的程序正在运行,即时间对准。例如,如果要考查电磁脉冲对A/D转换电路转换精度的影响,首先要有ADC,其次要保证照射时ADC正在工作。
  实现故障重现的技术手段
  对辐射场强度和硬件电路的要求比较容易实现,难点是保证时间对准。当然,有些故障的重现对时间对准要求很宽松,如死机和重启动,计算机几乎在运行任何程序时都有可能出现这两种故障现象。
  解决这一难点的方法是采取程序模块化和循环等待技术。程序模块化使每一种故障(效应)对应一个程序模块,想看哪种故障,就运行相应的程序模块;想让故障多次出现,就反复进行效应实验。循环等待技术是让计算机始终运行某一段或某一句程序,可大大提高干扰成功的概率,使故障最容易出现。
  系统组成及工作原理
  硬件组成
  本系统采用51系列单片机。为便于研究程序存储器的效应情况,选用内部不含EPROM的8031作为中央处理器,程序固化在外部程序存储器中,这里采用的是擦、写方便的E2PROM()。由于8031内含CTC和SIO,不再另设外CTC和SIO。为使系统能够重现尽可能多的故障现象,采用的外设芯片还有:外部数据存储器(6264)和ADC(AD0809)。另外,增加4位数码管用于信息显示,显示数据由4个锁存器(74LS373)保存。上述硬件电路既完成一定的功能又是被试验对象。系统组成如图2所示。
&  程序执行流程
  该系统软件共由8个程序模块组成:指示单片机重启动的程序模块;检查CTC运行情况的程序模块;串口通讯功能检查程序模块;判断外RAM内容是否改变及读写是否出错的程序模块;判断内RAM内容是否改变程序模块;检查A/D转换电路转换误差是否增大程序模块;判断外中断足否被误触发程序模块;显示E2PROM内容是否被改写的程序模块。
  系统的工作过程也就是上述8个程序模块的运行过程,它们是在执行开关K的控制下顺序执行的。图3给出了流程图。几乎每一种效应实验对应一个程序模块。由于硬件损坏故障与软件运行关系不大,而且故障现象明显,无需专门设置程序模块。重肩动效应实验可以工作在除指示单片机重启动的程序模块的任一程序模块。死机效应实验可以工作在任一程序模块,由于故障现象明显,无需检测程序。 故障重现及检测的具体实现不同的故障现象有不同的重现和检测方法。由于篇幅有限,只给出三种故障重现及检测的实现方法。   外RAM效应
  这部分实验包括三部分:一是不进行读写操作时,检查外RAM内容是否被改写;二是检查读操作是否出错;三是检查写操作是否出错。
  第一部分实验中,RAM内容被改写是由于RAM芯片被干扰所致,只需编制检测程序。先在RAM的0000H~1FFFH单元写入同一数据(&AA&),然后等待执行开关K的按下,等待期间进行冲击实验。冲击完毕,读出RAM内容并判断是否改变。
  第二、三部分实验,检查RAM的读写操作是否因干扰而出错。让持续时间只有微秒量级的干扰脉冲去干扰执行时间只有几个微秒的读写指令,这种事件发生的概率几乎为0。对于干扰源可以工作在重复工作方式的情况,可以使其在重复工作方式下工作,这无疑是一种不错的想法。但是,由于重复工作方式的重复频率并不能做得很高,最高只能达到1kHz左右,所以其效果并不明显。最有效的方法是使程序重复执行一条读或写指令,虽然两次读或写之间还有几条判断读或写入的数据是否正确的指令,但两次读或写之间的时间间隔也只有数十微秒量级,这就相当于让读写指令等着电磁脉冲来干扰,从而大大提高了被干扰的概率。
  第二、三部分程序编制开始时,为了使其更具代表性,对RAM的所有单元进行读或写,即先将RAM的0000H~1FFFH单元清0,然后使程序循环读这些单元,或向这些单元循环写入数据&AA&,并实时检查读出或写入的数据是否正确。在实验中发现,第二、三部分实验出错的次数,比第一部分实验出现的次数还多。尽管采取了上述循环等待技术,但某条指
令被干扰的可能性还是很小。多次实验不得其解,后来在读实验显示出错信息时检查RAM各单元的内容,发现每次都有一部分RAM单元的内容出错,而读操作出错不可能导致RAM内容改变,因此,并不是或不全是读写操作出错,而是由于RAM内容被改写后,误判为读或写出错。解决这一问题的方法是,使读写操作只对某一一固定的RAM单元进行,由于一个单元被改写的概率是所有单元被改写概率的l/2,这就大大降低了误警概率。
  串口SIO效应
  串口SIO效应实验主要是看串口通讯是否出错。要观察到这种故障现象,就必须让单片机运行串口通讯程序。由于51型单片机只有一个串口,而要使其进行通讯,最少需要两个串口,这就至少需要有两套单片机系统,这将使设备和实验复杂化。在认真研究串口工作原理后,终于找到了只用一个单片机模拟串口通讯的方案:把CPU的TXD和RXD短接,将TXD端发出的数据直接送入RXD进行接收,使单片机工作于自发自收状态,通过检查接收与发送的数据是否相等判断通讯是否正常。当然,仍需采用循环等待技术,使通讯循环进行,当运行正常时,在P1.1口产生脉冲信号,使红色LED亮。如果通汛出现异常,数码管将显示出错信息,并将LED熄灭。
  定时器CTC效应
  为使CTC工作失误故障重现,可在主程序中加入允许CTC中断的指令,使程序运行时,CTC一直在工作,等待电磁脉冲来干扰。 定时器采用CPU内部定时器0,工作方式为方式1。编写CTC0的中断子程序,与软件计数器R0配合,在P1.1口产生一个方波信号,驱动LED闪亮。主程序等待K按下指令,等待期间进行干扰实验。如果LED闪亮异常,表明CTC工作不正常。以下为定时器0的中断子程序:
  实验结果
  在设计该单片机系统以前,曾用一单片机最小应用系统做效应实验,结果只能观察到死机现象。而将该系统用于效应实验后,观察到了硬件损坏、A/D转换误差增大、内存数据改变、程序跳转、死机、CTC工作失误、串口通讯出错和程序存储器E2PROM内容被改写等多种故障现象。通过大量、反复地实验,测出了各种故障出现的阈值,分析了故障出现的原因。
  图4是示波器记录下的串口RXD引脚上的正常信号和通讯出错时的干扰波形。图4表明,RXD上有很强的干扰信号,而且低电平被展宽了3~4倍。根据实验数据及串口工作原理,得出申行通讯出错的原因有两个:1.干扰使SIO电路工作失误,如串口控制寄存器SCON内容改变,发送或接收SBUF内容改变等,这些都可能引起接收数据和发送数据不符,从而使通讯出错;2.RXD线上的干扰信号使串行数据发生混乱,从而使接收数据出错。
型号/产品名
广州国鼎电子科技有限公司
广州国鼎电子科技有限公司
深圳主唱科技有限公司
深圳市福田区英格迪电子经营部
深圳市福田区英格迪电子经营部I am encountering an odd crash in our software and I'm having a lot of trouble debugging it, and so I am seeking SO's advice on how to tackle it.
The crash is an access violation reading a NULL pointer:
First chance exception at $00CF0041.
Exception class $C0000005 with message
'access violation at 0x00cf0041: read
of address 0x'.
It only happens 'sometimes' - I haven't managed to figure out any rhyme or reason, yet, for when - and only in the main thread.
When it occurs, the call stack contains one incorrect entry:
For the main thread, which this is, it should show a large stack full of other items.
At this point, all other threads are inactive (mostly sitting in WaitForSingleObject or a similar function.)
I have only seen this crash occur in the main thread.
It always has the same call stack of one entry, in the same method at the same address.
This method may or may not be related - we do use the VCL in our application.
My bet, though, is that something (possibly quite a while ago) is corrupting the stack, and the address where it's crashing is effectively random.
Note it has been the same address across several builds, though - it's probably not truly random.
Here is what I've tried:
Trying to reproduce it reliably at a certain point.
I have found nothing that reproduces it every time, and a couple of things that occasionally do, or do not, for no apparent reason.
These are not 'narrow' enough actions to narrow it down to a particular section of code.
It may be timing related, but at the point the IDE breaks in, other threads are usually doing nothing.
I can't rule out a threading problem, but think it's unlikely.
Building with extra debugging statements (extra debug info, extra asserts, etc.)
After doing so, the crash never occurs.
Building with
After doing so, the crash never occurs and Codeguard shows no errors.
My questions:
1. How do I find what code caused the crash?
How do I do the equivalent of walking back up the stack?
2. What general advice do you have for how to trace the cause of this crash?
I am using
(the project mostly contains C++ Builder code and small amounts of Delphi.)
Edit: I thought I should add what actually caused this.
There was a thread that called
and then, using GetOverlappedResult, waited on an event to continue and do something with the changes.
The event was also signalled in order to terminate the thread after setting a status flag.
The problem was that when the thread exited it never called .
As a result, Windows was still tracking changes and probably still writing to the buffer when the directory changed, even though the buffer, overlapped structure and event no longer existed (nor did the thread context in which they were created.)
When CancelIO was called, there were no more crashes.
解决方案 Even when the IDE-provided stack trace isn't very complete, that doesn't mean there isn't still useful information on the stack. Open up the CPU view and chec for every CALL opcode, a return address is pushed on the stack. Since the stack grows downwards, you'll find these return addresses above the current stack location, i.e. by scrolling upwards in the stack pane.
The stack for the main thread will be somewhere around $ or $ (address space randomization in Vista and upwards has made it more random). Code for the main executable will be somewhere around $. You can speculatively investigate elements on the stack that don't look like integer data (low values) or stack addresses ($+ range) by right-clicking on the stack entry and selecting Follow -> Near Code, which will cause the disassembly window to jump to that code address. If it looks like invalid code, it's probably not a valid entry in the stack trace. If it's valid code, it may be OS code (frequently around $ and above) in which case you won't have meaningful symbols, but every so often you'll hit on an actual proper stack entry.
This technique, though somewhat laborious, can get you meaningful stack trace info when the debugger isn't able to trace things through. It doesn't help you if ESP (the stack pointer) has been screwed with, though. Fortunately, that's pretty rare.
本文地址: &
我在我们的软件中遇到了一个奇怪的崩溃,我在调试时遇到了很多麻烦,因此我寻求如何解决这个问题的建议。
崩溃是访问冲突读取NULL指针:
$ 00CF0041的第一次机会异常。 异常类$ C0000005,带有消息'0x00cf0041处的访问冲突:读取地址0x'。
它只会发生'有时' - 我没有设法找出任何押韵或理性,但是,当时 - 只有在主线程。发生时,调用堆栈包含一个不正确的条目:
对于主线程,这是,它应该显示一个大堆栈
此时,所有其他线程都处于非活动状态(主要位于 WaitForSingleObject 或类似函数。)我只看到这个崩溃发生在主线程。它总是具有相同的调用堆栈的一个条目,在相同的方法在相同的地址。这种方法可能或可能不相关 - 我们在我们的应用程序中使用VCL。我的赌注,虽然,是(可能很久以前)的东西破坏了堆栈,并且崩溃的地址是有效的随机。请注意,它在多个版本中是相同的地址,但它可能不是真正随机的。
这是我试过的:
尝试在某一点可靠地再现。我发现没有什么,每次都重现它,和一些偶尔做的事情,或不,没有明显的理由。这些不是'狭窄'足够的动作,缩小到一个特定的代码段。它可能是与时间相关的,但是在IDE打开的时候,其他线程通常什么也不做。
使用额外的调试语句(额外的调试信息,额外的断言等)进行构建在这样做之后,崩溃永远不会发生
使用启用建立。在这样做后,崩溃从未发生,Codeguard显示没有错误。
我的问题:
1。我如何找到什么代码导致崩溃?我如何做相当于回堆栈?
我使用了(该项目主要包含C ++ Builder代码和少量Delphi。)
编辑:我以为我应该添加实际造成这种情况的原因。有一个主题名为,然后使用 GetOverlappedResult 等待事件继续并对更改进行操作。还设置状态标志后,还发出信号通知事件以终止线程。问题是,当线程退出时,它从未调用。因此,即使缓冲区,重叠结构和事件不再存在(创建它们的线程上下文),Windows仍然跟踪更改,并且可能仍然在目录更改时写入缓冲区。当<$ c
解决方案 即使IDE-提供的堆栈跟踪不是很完整,这并不意味着堆栈上仍然没有有用的信息。打开CPU视图并检查堆栈窗格;对于每个CALL操作码,在堆栈上推送返回地址。因为堆栈向下增长,你会发现这些返回地址在当前堆栈位置之上,即在堆栈窗格中向上滚动。
主线程的堆栈在某地约$ 或$ (地址空间随机化在Vista和向上已使它更随机)。主可执行文件的代码将在$ 左右。您可以通过右键单击堆栈条目并选择跟随 - >近似代码来推测性地调查堆栈中看起来不像整数数据(低值)或堆栈地址($
+ ,这将导致反汇编窗口跳转到该代码地址。如果它看起来像无效代码,它可能不是一个有效的条目在堆栈跟踪。如果它是有效的代码,它可能是操作系统代码(经常大约$ 及以上),在这种情况下,你不会有有意义的符号,但每次都会碰到一个实际的正确的堆栈条目。
这种技术虽然有点费力,但当调试器无法跟踪事件时,可以获得有意义的堆栈跟踪信息。它不帮助你,如果ESP(堆栈指针)已被拧紧,虽然。幸运的是,这是很罕见的。
本文地址: &
扫一扫关注官方微信单片机下载程序出现擦除程序失败,无法烧录数据 用单片机下载程序,擦除完成后下载就暂停了,然后整个过程...
你正在浏览: & >
单片机下载程序出现擦除程序失败,无法烧录数据
单片机下载程序出现擦除程序失败,无法烧录数据15分
full gain下次下载时 P1:11.077875M.外部时钟频率..Chinese:正在重新连接 .Chinese:正在尝试与 MCU&#47;单片机 握手连接 ., P1.0.. MCU Type is..Now baud is: &#47; 当前波特率为: 1200 bps.We are erasing application flash..:11.077875M.We are trying to program ..正在擦除应用程序区: 6.6CChinese:MCU 固件版本号: 6. &#47; 双倍速:
12T&#47;单倍速振荡放大器增益: STC89C52RCMCU Firmware Version.1 与下载无关内部扩展AUX-RAM:
允许访问(强烈推荐)下次下载用户应用程序时将数据Flash区擦除.Erase application is failed:
复位关看门狗内部时钟频率.6CDouble speed &#47; 擦除失败 (End: 14:43: NO用户软件启动内部看门狗后..
上面一大堆数据都出来了,说明单片机和烧录软件的通信是没问题的,单片机的核心也没问题,能运行自举程序。问题出在单片机的FLASH存储器,很遗憾,这个单片机接近或者已经报废了。
在检测目标单片机 ;]当前的波特率.0和P1.1与下次下载无关
. 下次下载用户程序时,不擦除用户EEPROM区
单片机型号: STC89C52RC&#47;LE52RC
固件版本号: 4......??. 当看门狗启动后,任何复位都可停止看门狗
. MCU内部的扩展RAM可用
??。。. 下载失败 ! (6.82D)请确定是否有新版软件: 28800正在擦除目标区域 . 当前的时钟频率: 11.956MHz
. 成功[0.655&quot。。. P1,请及时更新 !这是怎么回事. 系统频率为12T(单倍速)模式
. 振荡器的放大增益不降低
.3C当前芯片的硬件选项为:
单片机型号: STC89C52RC&#47;LE52RC
固件版本号: 4.3C正在重新握手 . ALE脚的功能选择仍然为ALE功能脚
?只能读入一半程序。
上面一大堆数据都出来了,说明单片机和烧录软件的通信是没问题的,单片机的核心也没问题,能运行自举程序。...~~~
设置一下 波特率 吧,设置为9600试试。 顺便问问,你用的是什么开发板?下面那个软件和我的开发板配...~~~
这个不一定的,跟你的电脑有关系。 比如 串口使用久了会存在自身的不稳定工作。 然后,单片机电路设计的...~~~
真相问答机
知道大数据
知道多世界
知道之星...2015-0...~~~
可以说明白点吗?你是在下载软件的时候报的错吗?~~~
是的。要先擦除才能往里写新程序代码。~~~
直接下载就行了,擦除的话软件上可以设置,一般来说是会擦除,然后再写入。。。希望对你有帮助~~~
对于STC单片机,每次下载程序时,无需擦除上次的程序,重新下载程序就行,上次的程序自动就擦除掉了,不...
你可能感兴趣的内容?823被浏览21878分享邀请回答21430 条评论分享收藏感谢收起25添加评论分享收藏感谢收起查看更多回答

我要回帖

更多关于 pic 单片机 rc0问题 的文章

 

随机推荐