搜索
bottom↓
回复: 3

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

[复制链接]

出0入0汤圆

发表于 2010-10-24 10:48:27 | 显示全部楼层 |阅读模式
大家好,读写SD卡时,能正确读写,可是LCD却不能正常显示,怀疑可能是堆栈溢出。先上源程序吧。

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

int main(void)
{
    BYTE i,src[512],tar[512];
           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卡读写正常。

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

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

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

 楼主| 发表于 2010-10-24 14:40:23 | 显示全部楼层
自己研究了一中午,发现如果将两个数组 src[512]和tar[512]声明为static类型,程序就正常运行。问题解决了,可是原因还不知道,期待高手的解答。

出0入0汤圆

发表于 2010-10-24 14:50:36 | 显示全部楼层
就是栈溢出了。如果不声明为static类型,会把src与tar都放在栈内存中,这样一下子就吃掉了1024字节的栈。如果是static类型的,则会为它俩分配专用的内存。建议复习一下C语言变量作用域与生命期相关的知识

出0入0汤圆

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

呵呵,谢谢前辈的指点。不过编译器是怎么分配栈的啊?我定义了这么大的变量,应该给分配这么大的栈啊。如果声明为static的话,那就是存放在堆里面,会不会出现堆溢出呢。
呵呵,回头一定要好好看看这一部分,哎,嵌入式系统,就是要在内存方面斤斤计较的。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-13 20:53

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表