OpenEdv-开源电子网

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

stm32f407用keil5编译,结构体数组和数组过大,超过512字节,程序可编译,无法运行

[复制链接]

12

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
115
金钱
115
注册时间
2018-2-28
在线时间
21 小时
发表于 2018-6-6 14:44:59 | 显示全部楼层 |阅读模式
5金钱
stm32f407用keil5编译,结构体数组和数组过大,超过512字节,程序可编译,无法运行
1111.png
111.png

最佳答案

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

加大堆栈。但是很不好的解决办法。 用内存管理吧。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2018-6-6 14:45:00 | 显示全部楼层
扫地僧WX 发表于 2018-6-6 20:33
问题在这个
CMD_UART uCmd[MaxNoPort];

加大堆栈。但是很不好的解决办法。
用内存管理吧。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

12

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
115
金钱
115
注册时间
2018-2-28
在线时间
21 小时
 楼主| 发表于 2018-6-6 14:46:05 | 显示全部楼层
本帖最后由 扫地僧WX 于 2018-6-6 14:58 编辑

#include "system.h"
#include "SysTick.h"
#include "led.h"
#include "usart.h"
#include "tftlcd.h"
#include "key.h"
#include "spi.h"
#include "flash.h"
#include "api2.h"
#include "string.h"

//要写入到25Q128的字符串数组
const u8 text_buf[]="www.prechin.net";
#define TEXT_LEN sizeof(text_buf)

struct Student
{
        int num;
        char name[20];
        float score[3];
        float aver;
};

#define Max_LenBuf                5120 //程序可编译,无法运行
typedef struct
{
        u32 curNo;
        u8 buf[Max_LenBuf];  //Max_LenBuf小于224可以运行
}CMD_UART;


#define Max_No                513 //程序可编译,无法运行
int main()
{
        u32 i=0;
        u32 j=0;
        u8 key;
        u8 buf[Max_No];  //Max_No小于512可以运行
        void input(struct Student stu[]);
        void init_api1( CMD_UART uCmd[]);

    void print(struct Student stud);
    struct Student stu[3];
    struct Student *p=stu;
        CMD_UART uCmd[MaxNoPort];
        CMD_UART *k = uCmd;
        SysTick_Init(168);
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);  //中断优先级分组 分2组
        LED_Init();
        USART1_Init(9600);
        printf("*******\r\n");
        while(1){
                input(p);
                init_api1(k);
                printf("debug\r\n");
                //check_CMD();
                //for(j=0;j<Max_LenBuf;j++){
                        //printf("%x",uCmd[0].buf[j]);
                       
                //}
                for(j=0;j<Max_No;j++){
                        buf[j]=(u8)(j%256);
                        printf("%x ",buf[j]);
                        if(j%32==31){
                                printf("\r\n");
                        }
                       
                }
                printf("\r\n");
        }
}

void input(struct Student stu[])
{
    int i;
    printf("请依次输入学生编号,姓名,三个科目成绩:\n");
    for (i=0;i<3;i++)
    {
        //scanf("%d %s %f %f %f",&stu.num, &stu.name, &stu.score[0], &stu.score[1], &stu.score[2]);
        stu.aver = (stu.score[0]+stu.score[1]+stu.score[2])/3.0;
    }
}
void clear_buffer(CMD_UART uCmd[],u8 port)
{
        u32 i,j,u;
        port = port % MaxNoPort;
        for(i=0;i<Max_LenBuf;i++){
                uCmd[port].buf =i;
                printf("u[%d].buf[%d]:%d      ",port,i,uCmd[port].buf );
                if((i%4)==3){
                        printf("\r\n");
                }
        }
}
void init_api1( CMD_UART uCmd[])
{
       
        u32 port;
        for(port=0;port<MaxNoPort;port++){
                printf("test......%02x\r\n",port);
                uCmd[port].posCMD = 0;
                uCmd[port].posBuf = 0;
                uCmd[port].posTrans = 0;
                uCmd[port].curNoBuf = 0;
                uCmd[port].curNoPort = 0;
                clear_buffer(uCmd,port);
        }       
}

回复

使用道具 举报

12

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
115
金钱
115
注册时间
2018-2-28
在线时间
21 小时
 楼主| 发表于 2018-6-6 20:33:43 | 显示全部楼层
扫地僧WX 发表于 2018-6-6 14:46
#include "system.h"
#include "SysTick.h"
#include "led.h"

问题在这个
CMD_UART uCmd[MaxNoPort];

u8 buf[Max_No];  //Max_No小于512可以运行

是局部变量,而这个局部变量申请的内存空间太大,所以挂掉了。如果把这2个变量做成全局的就可以了。现在问题是如果继续使用局部变量,有什么办法让程序不挂掉????急急急
回复

使用道具 举报

22

主题

69

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
399
金钱
399
注册时间
2013-10-9
在线时间
73 小时
发表于 2018-6-6 22:40:19 | 显示全部楼层
修改.S
回复

使用道具 举报

12

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
115
金钱
115
注册时间
2018-2-28
在线时间
21 小时
 楼主| 发表于 2018-6-7 09:44:07 | 显示全部楼层
正点原子 发表于 2018-6-6 14:45
加大堆栈。但是很不好的解决办法。
用内存管理吧。

怎么使用内存管理
回复

使用道具 举报

12

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
115
金钱
115
注册时间
2018-2-28
在线时间
21 小时
 楼主| 发表于 2018-6-7 09:44:37 | 显示全部楼层

怎么修改.s
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-29 10:59

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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