分类: C/C++
2009-04-27 01:39:51
----------------------------------------------------
本文系本站原创,欢迎转载!
转载请注明出处:http://dreamlcr.cublog.cn/
----------------------------------------------------
C编译器支持两种内存模型(Memory Model):小模式(the small memory model)和大模式(the large memory model)。不同的内存模型主要影响对.bss段中的变量是如何访问的。凡是程序中定义的全局变量(在函数之外定义的变量)和静态变量(用static关键字定义的变量)都被编译器分配在.bss段中。
在小模式下,要求.bss段小于32KB,也就是说程序中定义的全局和静态变量的总和不能超过32KB,此时,编译器将页指针DP指向.bss段的起始,对变量采用直接寻址方式。在大模式下,对.bss段的大小没有任何要求,编译器对变量使用寄存器间接寻址方式。而这里之所以会发生这样的错误一定是程序中定义的全局和静态变量太多,超过了32KB,而默认的内存模式又是小模式,所以发生了数据溢出而有错误。这样,可以选择-ml0编译选项,编译器会自动对集合数据类型如数组使用间接寻址方式,而对一般变量使用直接寻址方式。程序仍然可以通过使用小模式得到最快的对小的变量的访问速度。而对于数组,一般是用DMA访问,或者通过软件流水访问,不会有存取速度问题。这样,就可以解决这个问题了。
当然,DSP的程序一旦达到一定规模的时候就需要修改系统堆栈和内存分配的文件*.cmd。一般出错误的原因可能就是堆栈溢出或内存分配不对引起的。