STM32 内存溢出

数组定义导致内存溢出

	MEM_32 XX_time_mover[32]={0};									
	MEM_16 XX_counter_mover[32]={0};  

##异常现场

一发生串口中断,数组内容就会自动改变。

解决办法

在这里插入图片描述

修改Stack size 默认0x400 变0x800
stack的空间由操作系统自动分配/释放,heap上的空间手动分配/释放。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
STM32 HAL 中,如果发生了内存溢出,会触发硬件中断,此时应该执行内存溢出中断服务函数来处理这个问题。 内存溢出中断服务函数的代码示例如下: ```c void HardFault_Handler(void) { __ASM volatile("TST LR, #4"); __ASM volatile("ITE EQ"); __ASM volatile("MRSEQ R0, MSP"); __ASM volatile("MRSNE R0, PSP"); __ASM volatile("B hard_fault_handler_c"); } void hard_fault_handler_c(unsigned int * hardfault_args) { volatile unsigned int stacked_r0; volatile unsigned int stacked_r1; volatile unsigned int stacked_r2; volatile unsigned int stacked_r3; volatile unsigned int stacked_r12; volatile unsigned int stacked_lr; volatile unsigned int stacked_pc; volatile unsigned int stacked_psr; stacked_r0 = ((unsigned long) hardfault_args[0]); stacked_r1 = ((unsigned long) hardfault_args[1]); stacked_r2 = ((unsigned long) hardfault_args[2]); stacked_r3 = ((unsigned long) hardfault_args[3]); stacked_r12 = ((unsigned long) hardfault_args[4]); stacked_lr = ((unsigned long) hardfault_args[5]); stacked_pc = ((unsigned long) hardfault_args[6]); stacked_psr = ((unsigned long) hardfault_args[7]); printf("[HardFault]\n"); printf("R0 = %x\n", stacked_r0); printf("R1 = %x\n", stacked_r1); printf("R2 = %x\n", stacked_r2); printf("R3 = %x\n", stacked_r3); printf("R12 = %x\n", stacked_r12); printf("LR = %x\n", stacked_lr); printf("PC = %x\n", stacked_pc); printf("PSR = %x\n", stacked_psr); while (1); } ``` 在该代码中,`HardFault_Handler` 函数是内存溢出中断服务函数的入口函数。在该函数中,首先使用汇编代码判断当前使用的堆栈是主堆栈还是进程堆栈,然后再跳转到 `hard_fault_handler_c` 函数中执行实际的处理。 在 `hard_fault_handler_c` 函数中,首先将异常发生时的相关寄存器的值保存到变量中,然后输出相关信息,并在最后进入死循环,以防止程序继续执行。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值