新版数采仪开发问题全记录

*************************************************************
2008-01-16

* 下载后,第一次运行(在线跑),马上出现停机现象。
   最后修改了demo.lnk中的内存分配,调整以下两个:
   __HEAP_END    = __SP_INIT-0x8000;
   STKTOP = ADDR(.bss)+SIZEOF(.bss)+0x8000;
   就再不出现停机现象了

* 在线跑时没有任何问题,但是烧写后跑,则处于停止状态。
   因为程序中使用了文件系统,把文件系统注掉后问题解决。
   调试后发现,由于文件系统使用了动态内存分配(malloc()函数),导致了该问题。
   把内存分配函数修改为nucleus自己的函数后(NU_Allocate_Memory()),问题彻底解决。

2008-01-26
* 程序最近一直出现这样的问题:
  在线跑时一切正常,但是烧写后跑,不能boot。
  最后找的的解决办法很奇怪,我现在也不明白其中的道理。
  原先的链接语句为:
  dld -m6 -lc -o main.elf -tMCF52*FS  ..\obj\int_5271.o ..\obj\crt0.o ..\obj\cache.o ..\obj\init.o
  现在的链接语句为:
  dld -m6 -lc -o main.elf -tMCF52*FS  ..\obj\crt0.o ..\obj\cache.o ..\obj\init.o ..\obj\int_5271.o

2008-02-02
这两天又遇到了一个死机的问题,搞得我非常郁闷。
几经周折终于找到了问题所在:

原先的代码是这样的:

NU_HISR HISR_Control_Key;
#define HISR_Key_Stack_Size  10*1024
char HISR_Key_Stack[HISR_Key_Stack_Size];

NU_HISR HISR_Control_SerialPort;
#define HISR_SerialPort_Stack_Size  10*1024
char HISR_SerialPort_Stack[HISR_SerialPort_Stack_Size];

也就是说给两个高级中断分配了比较大的栈空间;一切运行正常。

但是,感觉到栈空间太大了,于是调整为这样

NU_HISR HISR_Control_Key;
#define HISR_Key_Stack_Size  1024
char HISR_Key_Stack[HISR_Key_Stack_Size];

NU_HISR HISR_Control_SerialPort;
#define HISR_SerialPort_Stack_Size  1024
char HISR_SerialPort_Stack[HISR_SerialPort_Stack_Size];

结果崩溃。

原因是在高级中断处理函数中确实用到了超过1024的变量。

经验教训:

在牵扯到内存空间分配的地方一定要慎重。

2008-08-05

程序在启动时,就会死机。而导致死机的原因居然是我在一个很安全的地方增加了一行代码。

看起来,似乎是代码段因为增加了这一行而变大,因此和某些段(例如堆栈段)产生了冲突 。

但是,继续增加了一些代码,该死机又不发生了。 很蹊跷。

仔细检查,还是找到一些问题。死机的地方在这里

    。。。

    enable_I2C_interrupt();       

    InitializeI2CBUS();

    。。。

上述代码中初始化IIC模块在中断使能之后,因此在这之间的一段时间IIC模块的状态就很不确定,是不是这个原因导致的死机?

 于是把代码改为下图,然后问题解决。

    。。。

    InitializeI2CBUS();
    enable_I2C_interrupt();       

    。。。

结论:关于硬件驱动的时序至关重要;而且这次出错还有个提示,是说发生了伪中断,当时没有多加注意,后来看确实是发生了伪中断。



原文地址:https://www.cnblogs.com/gaotaozhaolei/p/1043036.html