×
单片机 > 单片机程序设计 > 详情

PIC单片机之关于超大数组问题

发布时间:2025-05-22 发布时间:
|

关于超大数组问题:


本实验用的编译器是xc16-gcc.exe,集成开发环境是MPLAB IDE v8.92,当前的编译器配置如下:


-g -Wall -mlarge-code -mlarge-data -Os -fno-ivopts


如下图:

其中这里有一个超大的数组:

这时候编译会有这样的一个错误:

从提示可以知道,这是一个数据超出的错误,但是这里是超出了数据段,而不是说超出了芯片的flash,我们可以这样查看是否超过了flash,去掉这个数组编译看看占用了多少flash,如下:

也就是说占用的flash空间是:81459+7674=89133,但是单片机的flash却是这样的:

所以即是加上数组的35408也是124541并没有超出flash,所以这个错误完全是编译器的问题,从网上收到这个文章:


http://electronics.stackexchange***/questions/25878/epmp-on-pic24fj128da210


其中有关键的提示:

所以这里增加-mlarge-arrays这个编译命令,如下:

这时候的编译结果如下所示:

从网上找到这个办法:


http://www.microchip***/forums/m621857.aspx


其中的关键的地方是这样的:

在文件中修改如下:

这时候编译结果如下:

编译成功了,要说明的是,如果数组再增大到一定的程度,如下

这时候又会出现新的错误,本人决定去弄一张更小的图片吧,不要那么大的图片了,所以这个错误将不再深究,错误如下:

从这里看,或许真的是因为溢出flash了


注意:上面只是说明了怎么装数据,并没有说明怎么使用数据,下面的函数给出了一个怎么使用这个数组数据的说明:


void show_photo(unsigned short int StartX, unsigned short int StartY, __prog__ unsigned char *BmpAddress)

{

    __prog__ HEADCOLOR *BmpHeadr;

    unsigned short int Width, Height,Column,row;

    __prog__ unsigned char *BmpData;

    BmpHeadr = (__prog__ HEADCOLOR *)BmpAddress;

    Width = BmpHeadr->w;    //177

    Height = BmpHeadr->h;   //100

    BmpData = (__prog__ unsigned char *)(BmpAddress + sizeof(HEADCOLOR));    //sizeof表示该数组内存的多少 单位是字节 算出像素数据在数组中的偏移

    LCD_SetPos(StartX,StartX+Width-1,StartY,StartY+Height-1);

    for(Column=0;Column

    {

        for(row=0;row

        {

            Write_Data(*(__prog__ unsigned short int *)BmpData);

            BmpData +=2;

        }

    }

}


一定要注意这时候使用的是__prog__类型,而不是const类型


下面是这个函数的调用方法:


show_photo(0,0,gImage_100X177);


这个数组的定义是这样的:


__prog__ unsigned char gImage_100X177[35408] __attribute__((space(prog)))= { 0X00,0X10,0XB1,0X00,0X64,0X00,0X01,0X1B,

0XDD,0XC6,0XDD,0XC6,0XFE,0XC6,0XFD,0XCE,0XFD,0XCE,0XFE,0XCE,0X1E,0XCF,0X1E,0XCF,

0X1E,0XCF,0X1E,0XCF,0X1E,0XC7,0X1E,0XCF,0X1E,0XCF,0X3E,0XD7,0X3E,0XD7,0X3E,0XD7,

0X3E,0XD7,0X3E,0XD7,0X3E,0XD7,0X3E,0XD7,0X3E,0XD7,0X3E,0XCF,0X3E,0XC7,0X1E,0XC7,

0X1E,0XC7,0X1E,0XC7,0X1E,0XC7,0X3E,0XC7,0X3E,0XC7,0X3E,0XCF,0X3E,0XCF,0X5E,0XCF,

0X5F,0XCF,0X3E,0XCF,0X3E,0XCF,0X3E,0XCF,0X3F,0XCF,0X3E,0XC7,0X3F,0XCF,0X3F,0XCF,

0X3F,0XC7,0X5F,0XCF,0X5F,0XCF,0X5F,0XCF,0X5E,0XCF,0X5F,0XCF,0X5F,0XCF,0X5F,0XCF,


现在我们可以看看实验效果了:

关键字:PIC单片机  超大数组  编译器 


『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
PIC单片机的数据采集系统设计