首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

当使用外部RAM时,程序跑飞

当使用外部RAM时,程序跑飞

   本人准备使用NE64做了一个串口转网口,网口转串口的设备。当使用外部RAM作为BUF时,功能可以实现,数据可以相互转发,但程序很容易跑飞,跑到外部RAM区。当用内部RAM做为BUF时,程序工作正常,没有跑飞的现象。由于内部RAM有限,我一定要使用外部RAM。请指教!!
你的程序中是否有对PPAGE寄存器的操作?堆栈是否平衡?
海纳百川  有容乃大
我是使用C语言编程,在程序中没有对PPAGE操作。只是在定义变量时使用,如: #pragma DATA_SEG __PPAGE_SEG MY_BANKED_RAM0
UINT8 EthTxDataBuf[4096];
#pragma DATA_SEG DEFAULT

我把我的问题再详细解释一下:网口使用OPENTcp软件,使用TCP协议,串口使用SCI0;当使用外部RAM时,单向发送数据,无任是串口向网口发数据,还是网口向串口发数据,程序都比较稳定。但如果双向发数据时,程序容易跑飞。我估计是程序中断比较频繁,使用外部RAM时,要消耗更多的时间。所以,我把中断程序中的变量都定义在内部RAM中,只是保留中转BUFFER放在外部RAM中,程序要稳定一点,但也是容易跑飞;只有所有的变量都使用内部RAM,程序才比较稳定。感觉是使用外部RAM造成的。我也试过增加STACKSIZE,情况也没有什么改善。也试过增加或降低总线速度,程序稳定性也没有什么改善。不知如何下手?
  堆栈平衡是什么意思?
这几天继续做了一些工作,还是没有解决问题。
1、串口全双工测试,在程序内做了一个2秒定时器,定时发送1K字节的数据,使用串口调试工具向NE64发送数据(1K)。变化串口调试工具中的发送时间,没有发现丢数据的现象。
2、网口全双工测试:在程序内做了一个2秒定时器,通过网口定时发送1K字节的数据,使用
SOCKET调试工具向NE64发送数据(1K)。变化SOCKET调试工具中的发送时间,没有发现丢数据的现象。
3、起动串口、网口互相转发程序,程序容易跑飞。当错开转发时间,程序工作比较稳定。
经过观察,当串口调试工具中发送数据的时间和SOCKET调试工具中发送数据的时间相同/几乎相同时,程序立即跑飞。
4、单向转发数据时,程序比较稳定。

  以上测试都使用了外部RAM。

不使用外部RAM时,双向转发数据,程序工作很稳定(用很快的速度转发数据,也没有程序跑飞的想象)
  
  不知如何解决问题!!
你的中断是否有嵌套?就是说,你是否进入了一个中断后,将中断禁止位打开了?
海纳百川  有容乃大
中断肯定有嵌套。OpenTCP(MAC)方面有:12个中断,1个时钟中断,1个SCI0中断,1个STARTUP。我也想有可能是频繁中断造成的,所以我增加STACKSIZE,也解决不了问题。
每个中断都是独立的,程序在初始化的时候,把有用的中断都打开(只有SCI0 TX在发送时有效,发送完成以后无效)。MAC方面的中断也不是很了解,是使用OpenTCP DEMO软件。
  有时,程序跑飞后,出现:illegal BP。
  有时,程序进入SWI中断地址,我在程序中没有使用SWI中断。经过检查后,发现在$A000(外部RAM地址区)后面有SWI指令,我想一定是程序进入外部RAM区后,遇到SWI,再进入SWI中断地址。
  我在程序中,没有屏蔽其他中断。不知如何来解决问题。
今天做了对发数据的实验,测试方法如下:
  1、用串口调试工具向NE64发数据,SCIO只是接收,不转存到外部RAM BUFFER,不转发;用SOCKET调试工具通过网口向NE64网口发数据,只接收,不转存,不转发。
    结果:程序不会跑飞(双方用很快的速度发送)。
2、用串口调试工具向NE64发数据,SCIO接收数据,并存到外部RAM BUFFER,但不转发;用SOCKET调试工具通过网口向NE64网口发数据,接收数据,但转存到外部RAM BUFFER,不转发。
   结果:程序马上跑飞。(单向发送时,转存、转发是没有问题的)

   很明显,程序跑飞是因为使用了扩展RAM的缘故。可能是数据在转存时,有中断发生,造成PC错误。
   但如何来解决这个问题,不知道。
   
   是否是NE64本身的问题??
   StrongChen:  我把我的程序发给你,测试一下,如何??。
   如果有兴趣的朋友需要,请留EMAIL;你需要有NE64开发板就可以。
你能否做一个这样的试验:在向扩展RAM中转存数据前,先将中断关闭;操作完成后,再打开中断。看看这样有什么结果。
海纳百川  有容乃大
StrongChen:谢谢你的跟踪。
  我今天按您的建议做了测试,在使用到外部RAM的地方,先关中断,访问外部RAM结束后,打开中断。
  测试方法:用串口调试工具每隔1000ms向NE64发1K的数据,转存到外部RAM区,并转发到网口;用SOCKET调试工具每隔1100ms向NE64发1K的数据,转存到外部RAM区,并转发到串口;
  结果:程序没有发现跑飞的现象,但有数据有丢失的现象。经观察,是有的数据包(1K),有数据丢失的现象,大部分数据包是比较完整的。
  总结:在使用外部RAM时,如果有频繁的中断产生时,PC容易出错。希望freescale 的设计人员做进一步的测试,我感觉NE64是有缺陷的,我们不能在使用外部RAM时,总屏蔽所有中断吧!!!!????。
  总之,现在有很大的进步,多谢!!希望保持联系
  hgwangweilin@21cn.com
我相信产生这些现象的根本原因,并非NE64本身的缺陷,而是在使用扩展存储空间时,有一些问题没有注意到。可惜我没有具体做过,也没有条件进行试验。我建议你再仔细看一下NE64关于扩展空间的介绍。同时,我也会继续关注这个问题,和别人进行一下讨论。有结果会马上贴出来的。
海纳百川  有容乃大
返回列表