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

2019-04-15 11:40发布

关于超大数组问题: 本实验用的编译器是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.com/questions/25878/epmp-on-pic24fj128da210 其中有关键的提示: 所以这里增加-mlarge-arrays这个编译命令,如下: 这时候的编译结果如下所示: 从网上找到这个办法: http://www.microchip.com/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,

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