关于超大数组问题:
本实验用的编译器是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,
现在我们可以看看实验效果了: