OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 9643|回复: 12

求助:STM32F407存储全局变量大数组,编译错误,恳请指点

[复制链接]

7

主题

27

帖子

0

精华

新手上路

积分
39
金钱
39
注册时间
2016-6-22
在线时间
16 小时
发表于 2016-7-15 14:29:22 | 显示全部楼层 |阅读模式
1金钱
STM32F407TFTLCD试验中存储类似几个A[3000],B[3000]这样的数组,定义为全局变量,编译错误提示无空间(no space),尝试用SRAM,更改option中IRAM的Start 0x68000000 Size 0xFFFFF,编译无错误,下载后黑屏, 尝试更改数组地址属性,
uint  F, i,j,V,m=4,n=300;
double  t,Dc[300]__attribute__((at(0X68000000))),B[30]__attribute__((at(0X68000000))),C[300]__attribute__((at(0X680002400))),G[300]__attribute__((at(0X68000000))),M[300]__attribute__((at(0X68000000))),r[300]__attribute__((at(0X68000000))),R[300]__attribute__((at(0X68000000))),d;        
//加上地址属性时定义不在片内RAM了

void main(void)
{  
       
        B[0]=0;
        C[0]=100;
        G[0]=100;
        M[0]=0;
        M[1]=0;//Vy
        M[2]=-10;//Vz
        d=0.1;
        t=0;
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2
        delay_init(168);      //初始化延时函数
        uart_init(115200);        //初始化串口波特率为115200
        LED_Init();        //明明屏蔽掉也没什么关系,为什么所有的显示都有这个初始化呢?
        LCD_Init();           //初始化LCD FSMC接口
        FSMC_SRAM_Init;
        B[1]=B[0]+M[0]*t;//X(B[1])不断变化
        C[1]=C[0]+M[1]*t;
下面是显示
while((0<Dc[i])&&(Dc[i]<=10))
        {
        A[i]=atan(Y/X);
        A[i]=A[i]*180/PI;
        if(i%1==0)
                POINT_COLOR=BLACK;      //画笔颜色:黑色
            LCD_ShowString(30,20,210,24,16,"Angle:");//LCD_ShowString(u16 x,u16 y,u16 width,u16 height,u8 size,u8 *p),
            POINT_COLOR=RED;
        LCD_ShowxNum(30,50,A[i],8,16,0);
                POINT_COLOR=BLACK;      
                LCD_ShowString(30,80,200,16,16,"Time: s");
            POINT_COLOR=RED;
            LCD_ShowxNum(70,80,t,1,16,0);
            LED0=!LED0;
                delay_ms(250);       

编译错误, integer operation result is out of range,恳请大神帮忙指点


       

最佳答案

查看完整内容[请看2#楼]

这提示,貌似是程序存储空间不够。 另外,你这么多3000,晕啊。 删除几个,试试还报错不,目的是查找原因。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

7

主题

27

帖子

0

精华

新手上路

积分
39
金钱
39
注册时间
2016-6-22
在线时间
16 小时
 楼主| 发表于 2016-7-17 19:31:37 | 显示全部楼层
已解决,把程序中的数组变小了,如A[10],而且改成局部变量了,谢谢大家,
回复

使用道具 举报

58

主题

6294

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11525
金钱
11525
注册时间
2014-4-1
在线时间
1311 小时
发表于 2016-7-15 14:29:23 | 显示全部楼层
xiyou 发表于 2016-7-15 16:14
可是直接定义double  t,A[3000],Db[3000],Dc[3000],B[3000],C[3000],G[3000],M[3000],r[3000],R[3000],d, ...


这提示,貌似是程序存储空间不够。

另外,你这么多3000,晕啊。

删除几个,试试还报错不,目的是查找原因。


回复

使用道具 举报

58

主题

6294

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11525
金钱
11525
注册时间
2014-4-1
在线时间
1311 小时
发表于 2016-7-15 15:38:26 | 显示全部楼层

才3000,即使32位宽度,也占不了多少空间。

回复

使用道具 举报

7

主题

27

帖子

0

精华

新手上路

积分
39
金钱
39
注册时间
2016-6-22
在线时间
16 小时
 楼主| 发表于 2016-7-15 16:14:00 | 显示全部楼层
xuande 发表于 2016-7-15 15:38
才3000,即使32位宽度,也占不了多少空间。

可是直接定义double  t,A[3000],Db[3000],Dc[3000],B[3000],C[3000],G[3000],M[3000],r[3000],R[3000],d,y[3000],y0[3000],k1[3000],k2[3000],k3[3000],k4[3000];         编译结果提示.Error: L6406E: No space in execution regions with .ANY selector matching main.o(.bss).是不是空间不足呢,谢谢
回复

使用道具 举报

13

主题

92

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1057
金钱
1057
注册时间
2015-5-12
在线时间
208 小时
发表于 2016-7-15 16:31:21 | 显示全部楼层
本帖最后由 numbqq 于 2016-7-15 16:35 编辑
xiyou 发表于 2016-7-15 16:14
可是直接定义double  t,A[3000],Db[3000],Dc[3000],B[3000],C[3000],G[3000],M[3000],r[3000],R[3000],d, ...

你这个3000*15*8=360000B=351.56KB 肯定不够啊
回复

使用道具 举报

7

主题

27

帖子

0

精华

新手上路

积分
39
金钱
39
注册时间
2016-6-22
在线时间
16 小时
 楼主| 发表于 2016-7-15 17:50:18 | 显示全部楼层
xuande 发表于 2016-7-15 16:35
这提示,貌似是程序存储空间不够。

另外,你这么多3000,晕啊。

化作A[300]时无措,所以我想是不是需要用SRAM,用的时候改成上面的就不出结果了,想过数组很多是不是需要用内存管理函数类似malloc,是不是需要每个数组需要调用内存管理实验
中                            p=mymalloc(sramx,2048);//申请2K字节
                                if(p!=NULL)sprintf((char*)p,"Memory Malloc Test%03d",i);呢?谢谢啊
回复

使用道具 举报

7

主题

27

帖子

0

精华

新手上路

积分
39
金钱
39
注册时间
2016-6-22
在线时间
16 小时
 楼主| 发表于 2016-7-16 02:11:20 来自手机 | 显示全部楼层
恳请各位指点一下,万分感激
回复

使用道具 举报

13

主题

448

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1755
金钱
1755
注册时间
2015-2-7
在线时间
369 小时
发表于 2016-7-16 16:22:45 | 显示全部楼层
楼主用内存管理吧,不应该定义那么多大数组呀。
回复

使用道具 举报

7

主题

27

帖子

0

精华

新手上路

积分
39
金钱
39
注册时间
2016-6-22
在线时间
16 小时
 楼主| 发表于 2016-7-16 16:44:36 | 显示全部楼层
电子之旅 发表于 2016-7-16 16:22
楼主用内存管理吧,不应该定义那么多大数组呀。

我需要在上面运行迭代运算,迭代次数需要3000,查阅资料将MDK的勾选IRAM,START改为0x200000c0,SIZE改为0xFFFFF,(不知道为什么这样改)数组定义在A[1000]时可以,TFTLCD显示,3000编译无错误,但下载到LCD上黑屏,这是为什么呢,
回复

使用道具 举报

13

主题

448

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1755
金钱
1755
注册时间
2015-2-7
在线时间
369 小时
发表于 2016-7-18 12:00:51 | 显示全部楼层
xiyou 发表于 2016-7-16 16:44
我需要在上面运行迭代运算,迭代次数需要3000,查阅资料将MDK的勾选IRAM,START改为0x200000c0,SIZE改为 ...

更改MDK的IRAM选项只是告诉MDK编译的时候可以使用这么的内存空间,但是实际上你的芯片不可能达到这么的内存。如果一定要以数组的形式进行算法算,那你估计只能使用外部SRAM了,把数组定义到外部SRAM。具体怎么定义可以参考原子哥的外部SRAM实验。
回复

使用道具 举报

7

主题

27

帖子

0

精华

新手上路

积分
39
金钱
39
注册时间
2016-6-22
在线时间
16 小时
 楼主| 发表于 2016-7-26 16:19:49 | 显示全部楼层
电子之旅 发表于 2016-7-18 12:00
更改MDK的IRAM选项只是告诉MDK编译的时候可以使用这么的内存空间,但是实际上你的芯片不可能达到这么的内 ...

非常感谢,我把数组改小了,现在能成功运行了
回复

使用道具 举报

1

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
76
金钱
76
注册时间
2022-1-28
在线时间
21 小时
发表于 2022-8-2 20:00:27 | 显示全部楼层
你好,我也遇到同样问题,是两个三维的5k的数组,而且执行该部分函数后,调用使用全局变量会导致变量数据严重更改,我只是阅读了该数组,但是问题很奇怪,甚至导致串口由已经初始化变为非初始化状态,但是仔细计算,并没有最大也就130KB,没有超过192KB,不知是何原因,求解答
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-8 01:42

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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