历史上的今天
今天是:2025年01月28日(星期二)
2020年01月28日 | PIC单片机之关于超大数组问题
2020-01-28 来源:eefocus
关于超大数组问题:
本实验用的编译器是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, 现在我们可以看看实验效果了:
下一篇:PIC单片机之IO口映射问题
史海拾趣
|
最近在做linux+qte 在arm平台上的界面显示,由于周围 几乎没有做 这块的,qt学习起来相当吃力, 这个是qtopia部分一些精华 要点 分析,看后很受启发… 查看全部问答> |
|
大家好! 断断续续接触CE,今天有遇到一个问题 我用三星原来的BSP自己用PB有生成了一个新的BSP,为什么两个BSP下的LCD驱动中sources这个文件内容不一样呢 (不排除我修改过其他文件,我记不清了),我只是想知道他们为什么不一样了 比如 我自己新生成 ...… 查看全部问答> |
|
正在学习USB的几个实验,其中的DFU遇到了困难。将DFU程序烧写到开发板,然后使用DFUSe Demonstration将STM32F10xUSBLibUSBLibdemosDevice_Firmware_Upgradeimages 中的joystickmouse.dfu去upgrade CPU,重启运行,正常。但问题 ...… 查看全部问答> |




