当在一个函数中声明一个较大的局部数组变量时,程序可以编译通过,但运行时,老是进入hardfaulthandler,导致出现改问题的原因可能是栈溢出。因为局部变量是存放在栈区的,而全局变量在全局区(静态区),如果栈区较小,会产生溢出。
解决这种问题的方法:
方法1:启动文件里面对栈的大小有固定的值。函数里面的数组是在调用该函数的时候,才给你分配空间。将启动文件下的堆栈改大
Stack_Size EQU 0x00000400 。
Stack Size,一般小工程0X400足够,大工程才设置0X1000就够用,所以默认无需设置太大。
方法2:用静态数组代替普通局部数组。
方法3:数组过大,栈溢出了,有可能覆盖了其他全局变量的值。如果使用很大的数组,可以定义成一个全局变量。如果使用的有os。就使用内存管理。
=================================================================================================
堆是在程序运行时,而不是在程序编译时,申请某个大小的内存空间。即动态分配内存,对其访问和对一般内存的访问没有区别。{堆是指程序运行时申请的动态内存,而栈只是指一种使用堆的方法(即先进后出)。}
栈是先进后出的,但是对于堆而言却没有这个特性,两者都是存放临时数据的地方。 对于堆,我们可以随心所欲的进行增加变量和删除变量,不要遵循什么次序,不管大小,只要你喜欢
*栈,用于存放局部变量,局部数组等
*堆,用于保存new 和malloc这些自定义的内存变量;
*全局静态区用于保存全局变量和静态变量;
*字符常量区,用于保存字符串;
*代码区,用于保存程序的二进制代码;
关键字:STM32 局部变量 数组
引用地址:
STM32局部变量的数组最大能到多少?
推荐阅读最新更新时间:2024-03-16 16:05
STM32的PWM的原理与使用
1、PWM是什么? 就是脉冲宽度调制,简称脉宽调制。利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术,就是对脉冲宽度的控制。 这里说的脉冲,就是我们产生的方波。方波就是N个这样的周期连续的产生。 一个周期内高电平持续的时间就是脉冲宽度(脉宽),而PWM(脉冲宽度调制)就是控制一个周期内的高电平的持续时间。 ---------------------------------------------------------------------------------------------------------------------------------------- 2、简单的P
[单片机]
stm32——串口1和串口2初始化
void USART1_Initialise(u32 bound) { //GPIO端口设置 GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO, ENABLE); //USART1_TX PA.9 GPIO_InitStructur
[单片机]
单片机学习之STM32中断
简介:STM32并没有使用CM3内核的全部东西,而是只用了它的一部分。STM32有84个中断,包括16个内核中断和68个可屏蔽中断,具有16级可编程的中断优先级。 1.中断优先级管理 嵌套向量中断控制器:Nested Vectored Interrupt Controller (NVIC) CM3内核支持256个中断,其中包含了16个内核中断和240个外部中断,并且具有256级的可编程中断设置。 STM32并没有使用CM3内核的全部东西,而是只用了它的一部分。 STM32有84个中断,包括16个内核中断和68个可屏蔽中断,具有16级可编程的中断优先级。 STM32F103系列上面,又只有60个可屏蔽中断(在
[单片机]
STM32 移植 STemwin
移植STemwin 平台STM32F429+LTDC+SDRAM 其实不难就是给自己做个记录,年纪大了记性不好。。。 自己先驱动好TFTLCD, LTDC, SDRAM等 Cubemx配置增大堆栈大小,不然容易出错 需要添加以下文件进行配置 挨个文件配置 GUIConf.c里面主要修改ram大小,酌情而定,不宜太大。 #define GUI_NUMBYTES (1024)*50 GUIDRV_Template.c里面修改以下函数TBD by customer部分添加画点,读点,填充函数 static void _SetPixelIndex(GUI_DEVICE * pDevice, int x, i
[单片机]
STM32串口DMA接收与发送
1 前言 直接存储器访问(Direct Memory Access),简称DMA。DMA是CPU一个用于数据从一个地址空间到另一地址空间“搬运”(拷贝)的组件,数据拷贝过程不需CPU干预,数据拷贝结束则通知CPU处理。因此,大量数据拷贝时,使用DMA可以释放CPU资源。DMA数据拷贝过程,典型的有: 内存— 内存,内存间拷贝 外设— 内存,如uart、spi、i2c等总线接收数据过程 内存— 外设,如uart、spi、i2c等总线发送数据过程 2 串口有必要使用DMA吗 串口(uart)是一种低速的串行异步通信,适用于低速通信场景,通常使用的波特率小于或等于115200bps。对于小于或者等于115200bps波特率的,
[单片机]
STM32 TFT学习笔记——读取ID
主机环境:Windows 7 SP1 开发环境:MDK5.14 目标板:ST NUCLEO-F303RE TFT型号:2.4英寸,带触摸,SD卡,240*320分辨率,26万色 驱动IC:ILI9325 ST库版本:STM32Cube_FW_F3_V1.1.0 之前ST社区搞活动抢了一块NUCLEO-F303RE的开发板,本来是想研究一哈USB开发的,后来拿到手之后发现硬件不得行,得自己接个USB接口,板子自带的USB是下载和当作串口用的,属于ST-LINK板。没搞头了,板子就研究了一哈串口,点亮了一下LED。。。后来在淘宝上看到一块TFT屏挺便宜的,就拍了回来配合NUCLEO板调调TFT吧,毕竟之前也一直
[单片机]
基于STM32的大功率数字式电镀电源并联均流系统设计
STM32系列处理器是由意法半导体ST公司生产、基于ARM公司Cortex-M3内核的MCU,专门为微控制系统、汽车控制系统、工业控制系统和无线网络等嵌入式应用领域而设计,具有高性能、低功耗、高集成度、丰富且性能出众的片上外设、编程复杂度低等优点。数字式电镀电源并联均流系统以数字通信和控制的方式实现多个电源模块的并联工作,提供更大的输出功率,具有组合灵活、可靠性高、人机接口友善、工作模式多样等优点。本文采用STM32F103VET6处理器作为主控芯片,实现了一种以CAN总线为通信媒介、具有稳压/稳流/安培时/工艺曲线/远程控制5种工作模式、液晶图形显示的数字式电镀电源并联均流系统(以下简称 并联均流系统 ),给出了系统主要软硬件的详
[单片机]
基于FPGA和STM32的FSMC通信
1、FSMC简介:FSMC即灵活的静态存储控制器,FSMC管理1GB空间,拥有4个Bank连接外部存储器,每个Bank有独立的片选信号和独立的时序配置;支持的存储器类型有SRAM、PSRAM、NOR/ONENAND、ROM、LCD接口(支持8080和6800模式)、NANDFlash和16位的PCCard。 2、在设计中将FPGA当做SRAM来驱动,使用库函数来实现FSMC的初始化配置代码如下: //初始化外部SRAM void FSMC_SRAM_Init(void) { FSMC_NORSRAMInitTypeDef FSMC_NORSRAMInitStructure; //定义FSMC初始化的结构体变量 FS
[单片机]