OpenEdv-开源电子网

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

STM32F103ZET6堆栈溢出导致单片机不断复位,剖析问题所在

[复制链接]

2

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
76
金钱
76
注册时间
2016-7-25
在线时间
8 小时
发表于 2017-9-12 16:08:02 | 显示全部楼层 |阅读模式
1金钱
程序图下:unsigned char buf0[1024];
void  App_TaskUart(void *p_arg)
{
        INT8U tmp;
        INT16U len, i,j;
         
        static INT16U  rUart3Len = 0;  // UART3½óêÕêy¾Y3¤¶è
        INT8U err,cpu_sr;

        (void)p_arg;
        //Ö÷°å485¿ú£¬′óóòÏò×óòà′ÎêÇUART3¡¢UART4¡¢UART5
        while (1)
        {
                SysFlag.TaskRunStatus |= TASK_UART_FLAG;
                Delay_ms(10);
          len = Uart_Ctrl(UART3_ID, CMD_UART_GetCharsRxBuf,0);// ¶á衽óêÕêy¾Y3¤¶è
                if ((len == rUart3Len)&&(len>0))
                {
                        if (len > 1024)
                        {
                                        len = 1024;
                        }
                        tmp = Uart_Read(UART3_ID, buf0, len);
                        rUart3Len -= len;
                }
                else
                {
                        rUart3Len        = len;
                }               

         .........
         ........

当数组buf0定义为全局变量的时候,单片机运行正常;当数组buf0定义为局部变量的时候,单片机不断复位。
我大概了解是堆栈溢出了,但是我看到内存是够用的,所以不明白了,请大神们帮我分析一下为什么?

数组buf0定义在全局变量时编译结果:
Program Size: Code=152064 RO-data=3048 RW-data=132328 ZI-data=56744  
FromELF: creating hex file...
After Build - User command #1: fromelf --bin --output .\output\upgrade.bin .\output\EMB86xxI.axf
".\output\EMB86xxI.axf" - 0 Error(s), 0 Warning(s).


数组buf0定义在局部变量时编译结果:
Program Size: Code=152076 RO-data=3048 RW-data=132328 ZI-data=55720  
FromELF: creating hex file...
After Build - User command #1: fromelf --bin --output .\output\upgrade.bin .\output\EMB86xxI.axf
".\output\EMB86xxI.axf" - 0 Error(s), 0 Warning(s).


最佳答案

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

1、函数内部定义数组;从栈上分配,动态分配,系统管理;栈一般设置不大,栈一般用于函数压栈、访问量大占用空间小的变量等;一口气从栈获取1k空间(典型对计算机内存不理解,面试笔试这样干很容易被pass掉),肯定爆了;裸机的话在启动文件(.s文件)可以设置堆和栈的大小; 2、malloc从堆上分配内存,动态分配,程序员管理; 3、外部、全局变量、静态变量,从全局取分配内存,编译时已经确定。 回炉重炼C语言内存分配知识。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

685

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3448
金钱
3448
注册时间
2017-7-4
在线时间
869 小时
发表于 2017-9-12 16:08:03 | 显示全部楼层

1、函数内部定义数组;从栈上分配,动态分配,系统管理;栈一般设置不大,栈一般用于函数压栈、访问量大占用空间小的变量等;一口气从栈获取1k空间(典型对计算机内存不理解,面试笔试这样干很容易被pass掉),肯定爆了;裸机的话在启动文件(.s文件)可以设置堆和栈的大小;
2、malloc从堆上分配内存,动态分配,程序员管理;
3、外部、全局变量、静态变量,从全局取分配内存,编译时已经确定。
回炉重炼C语言内存分配知识。
回复

使用道具 举报

117

主题

598

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
1702
金钱
1702
注册时间
2012-5-10
在线时间
439 小时
发表于 2017-9-12 17:08:59 | 显示全部楼层
任务内存加大
回复

使用道具 举报

2

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
76
金钱
76
注册时间
2016-7-25
在线时间
8 小时
 楼主| 发表于 2017-9-13 16:00:56 | 显示全部楼层

不是堆栈溢出的问题么?奇怪的是编译过程没有报错
回复

使用道具 举报

117

主题

598

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
1702
金钱
1702
注册时间
2012-5-10
在线时间
439 小时
发表于 2017-9-13 17:25:10 | 显示全部楼层
luqiancheng 发表于 2017-9-13 16:00
不是堆栈溢出的问题么?奇怪的是编译过程没有报错

任务内存小只有运行的时候才会出错,他是动态申请的,肯定是任务内存的问题
如有技术问题,微信扫头像交流,STM32,JAVA,服务器
回复

使用道具 举报

2

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
76
金钱
76
注册时间
2016-7-25
在线时间
8 小时
 楼主| 发表于 2017-9-14 16:37:50 | 显示全部楼层
Acuity 发表于 2017-9-12 16:08
1、函数内部定义数组;从栈上分配,动态分配,系统管理;栈一般设置不大,栈一般用于函数压栈、访问量大占 ...

学习了,多谢
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-18 22:41

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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