第一次直观理解单片机中栈的作用

定义局部变量的数组过大导致程序崩溃,程序进入void HardFault_Handler(void),这让我很疑惑,先附上问题代码

1、static double input[1024]与double input[1024]

此时前者可以正常运行,后者卡死

2、double input[50]与double input[100]

此时前者可以正常运行,后者卡死

问题归宗:

        不用static修饰,小数组可以,大数组不行;而使用static修饰大数组就可以正常使用    

分析问题:

        1、二者的主要区别在于是否使用了static修饰 。

        当static用来修饰局部变量的时候,它就改变了局部变量的存储位置,从原来的栈中存放改为静态存储区。静态变量的存储方式与全局变量一样,都是静态存储方式。

注:对static作用的补充

        C语言中static关键字用法和作用_static在c语言中的作用-CSDN博客

        https://blog.csdn.net/Naiva/article/details/123471473

        C 语言中 static 的作用_static在c语言中的作用-CSDN博客

        static关键字的作用总结_单片机中static关键字的作用-CSDN博客

        

        2、单片机中栈的定义

        在单片机启动文件第一行就对栈的大小进行了定义

        栈的内存分配这段代码的意思是,开辟了一个栈,这个栈的大小是0x00000400也就是1KB的大小,名字为STACK,不初始化,可读可写,2^3=8字节对齐。

        栈区保存的是局部变量,只是当时并没有深入研究它的大小问题。千万不要把栈区当成无止境大小!!堆栈溢出后,程序和参数就会完全乱了套,出现程序重启或者系统崩溃。如果我们定义的局部变量过大是会莫名其妙报错的。如果在特殊情况下真的需要很大的栈区空间,只需来这里进行栈区大小的修改即可。

        如此便可以解释为什么局部变量大数组会出错了,双精度(Double)数据在内存中占用8个字节(64位);1 KB = 1024 字节 = 1024 ÷ 8 = 128 个双精度数。所以按道理可以极限生成double input [128],但其中还保存一些系统变量,所以会出现上面的情况(小数组可以,大数组不行)。

注:静态变量和局部变量都是在SRAM中分配,以STM32F103ZET6为例,Cortex-M3内核32位处理器,72M主频,LQFP144封装,片内FLASH容量:512K,片内SRAM容量:64K。

STM32堆栈_area stack-CSDN博客

stm32f103zet6启动文件详解

        

  • 10
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值