STM32数组变量数组过大时的异常处理

 

文章系转载,原文地址:http://www.elecfans.com/emb/danpianji/20180613694714.html

当在一个函数中声明一个较大的局部数组变量时,程序可以编译通过,但运行时,老是进入hardfaulthandler,导致出现改问题的原因可能是栈溢出。因为局部变量是存放在栈区的,而全局变量在全局区(静态区),如果栈区较小,会产生溢出。

解决这种问题的方法:

方法1:启动文件里面对栈的大小有固定的值。函数里面的数组是在调用该函数的时候,才给你分配空间。将启动文件下的堆栈改大

Stack_Size EQU 0x00000400 。

Stack Size,一般小工程0X400足够,大工程才设置0X1000就够用,所以默认无需设置太大。

方法2:用静态数组代替普通局部数组。

方法3:数组过大,栈溢出了,有可能覆盖了其他全局变量的值。如果使用很大的数组,可以定义成一个全局变量。如果使用的有os。就使用内存管理。

堆是在程序运行时,而不是在程序编译时,申请某个大小的内存空间。即动态分配内存,对其访问和对一般内存的访问没有区别。{堆是指程序运行时申请的动态内存,而栈只是指一种使用堆的方法(即先进后出)。}

栈是先进后出的,但是对于堆而言却没有这个特性,两者都是存放临时数据的地方。 对于堆,我们可以随心所欲的进行增加变量和删除变量,不要遵循什么次序,不管大小,只要你喜欢

*栈,用于存放局部变量,局部数组等

*堆,用于保存new 和malloc这些自定义的内存变量;

*全局静态区用于保存全局变量和静态变量;

*字符常量区,用于保存字符串;

*代码区,用于保存程序的二进制代码;

### 如何在STM32定义数组变量STM32编程过程中,定义数组变量是一个常见的需求。以下是关于如何在STM32定义数组变量的相关说明和示例。 #### 数组的基本概念 数组是一种用于存储相同数据类型的多个值的数据结构。在C语言中,可以通过指定数据类型、名称以及小来声明一个数组。对于STM32开发而言,通常会使用标准的C语言语法规则来进行数组定义[^1]。 #### 定义全局数组 如果需要在整个程序生命周期内保持数组的存在,则应将其定义为全局变量。下面是一些常用的定义方式: ```c // 定义一个包含5个整数的全局数组 int globalArray[5] = {1, 2, 3, 4, 5}; // 如果不初始化,默认初始值为0 float floatGlobalArray[10]; ``` #### 局部数组定义 局部数组仅在其所在函数的作用域内有效。当离开该作用域,这些数组会被销毁。 ```c void exampleFunction(void) { // 定义一个长度为8的字符型数组并赋初值 char localCharArray[8] = {'H', 'e', 'l', 'l', 'o', ',', ' ', '!'}; // 打印字符串内容 for (int i = 0; i < sizeof(localCharArray); ++i){ printf("%c", localCharArray[i]); } } ``` #### 将数组放置于特定内存区域 有为了优化性能或者满足硬件接口的需求,可能希望把某些重要数据放在Flash或其他特殊地址上。这需要用到链接器脚本配合关键字`__attribute__((section("")))`完成定制化处理[^2]。 ```c const int flashArray[] __attribute__((section(".flash_data"))) = {10, 20, 30, 40, 50}; ``` 以上代码片段展示了如何利用GCC扩展特性将常量数组存放到名为`.flash_data`的部分里去。具体部分名需依据实际使用的链接描述文件设置调整。 #### 下载与调试注意事项 一旦完成了上述任何一种形式的数组定义之后,在正式运行前还需要确认目标MCU已加载最新版本固件镜像。借助集成环境如STM32CubeIDE中的Download选项即可方便快捷地达成此目的[^3]。 #### 软件架构关联思考 考虑到更复杂的场景比如物联网应用场合下的多传感器接入管理平台建设情况,合理规划好各类资源分配策略显得尤为重要。例如针对不同种类传感元件所获取的信息构建相应的缓冲池机制;再者就是考虑通讯协议层面的设计选型等问题均会对最终效果产生深远影响[^4]。 ---
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值