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