scm_forever 发表于 2010-10-24 10:48:27

LPC2148读写SD卡时无法解决的问题

大家好,读写SD卡时,能正确读写,可是LCD却不能正常显示,怀疑可能是堆栈溢出。先上源程序吧。

/*SD卡读写测试*/
#include"../wav_player/fatfs/diskio.h"
#include"../wav_player/TFT/TFT018.h"
#include<stdio.h>

int main(void)
{
    BYTE i,src,tar;
         BacklightOn();         //点亮LCD背光灯
         LCD_Init();            //LCD初始化
        LCD_Clear_Screen(Blue);   //清屏,以蓝色为背景

        LCD_PutString(0,0,"LCD Ok",Yellow,Blue);    //输出LCD OK

          //while(1);    //测试点1

        for(i=0;i<40;i++) src=48+i;         //向src数组填入数据

        LCD_PutString(0,16,src,Yellow,Blue);   //将src中的内容输出到LCD屏背景蓝色,字体黄色

          //while(1);    //测试点2

          i=disk_initialize(0);          //SD卡初始化
    if(i==0)         LCD_PutString(80,0,"SD OK",Yellow,Blue);   //返回0,初始化成功,输出 SD OK
    else                 LCD_PutString(80,0,"SD NO",Yellow,Blue); //非0,初始化失败,输出 SD
   
          //while(1);    //测试点3

    i=disk_write(0,src,8,1);              //将src中的内容写入SD卡第8扇区
    if(i==0)        LCD_PutString(0,48,"WT OK",Yellow,Blue);   //返回0,写入成功 ,输出WT OK
    else                LCD_PutString(0,48,"WT NO",Yellow,Blue);   //非0,写入失败,输出WT NO

      //while(1);      //测试点4

    i=disk_read(0,tar,8,1);           //将刚才写入第8扇区的src的内容读出到tar数组   问题出在这一步
    if(i==0)        LCD_PutString(80,48,"RT OK",Yellow,Blue);      //返回0,读出成功,输出RT OK
    else                LCD_PutString(80,48,"RT NO",Yellow,Blue);//非0,读出失败,输出RT NO

       //while(1);      //测试点5

    LCD_PutString(0,64,tar,Cyan,Blue);   //将读出的数据输出到LCD屏
   
        while(1);

};

运行之后,LCD屏是空白的,但是如果不动数组tar,则这个程序是正常的。

经过我自己的测试,在测试点4是正常,到测试点5就出现LCD空白。

如果将上面程序中的所有tar 改成 src,则程序运行正常,SD卡读写正常。

所以我怀疑是数组溢出了,但是不知道怎么解决这个问题。

感谢您的阅读,希望有高人帮忙解答!

scm_forever 发表于 2010-10-24 14:40:23

自己研究了一中午,发现如果将两个数组 src和tar声明为static类型,程序就正常运行。问题解决了,可是原因还不知道,期待高手的解答。

bluelucky 发表于 2010-10-24 14:50:36

就是栈溢出了。如果不声明为static类型,会把src与tar都放在栈内存中,这样一下子就吃掉了1024字节的栈。如果是static类型的,则会为它俩分配专用的内存。建议复习一下C语言变量作用域与生命期相关的知识

scm_forever 发表于 2010-10-24 15:13:27

回复【2楼】bluelucky
就是栈溢出了。如果不声明为static类型,会把src与tar都放在栈内存中,这样一下子就吃掉了1024字节的栈。如果是static类型的,则会为它俩分配专用的内存。建议复习一下c语言变量作用域与生命期相关的知识
-----------------------------------------------------------------------

呵呵,谢谢前辈的指点。不过编译器是怎么分配栈的啊?我定义了这么大的变量,应该给分配这么大的栈啊。如果声明为static的话,那就是存放在堆里面,会不会出现堆溢出呢。
呵呵,回头一定要好好看看这一部分,哎,嵌入式系统,就是要在内存方面斤斤计较的。
页: [1]
查看完整版本: LPC2148读写SD卡时无法解决的问题