文档章节

STM32 局部变量压住全局变量地址 原因分析

青春无极限
 青春无极限
发布于 07/27 13:03
字数 506
阅读 63
收藏 0

在做项目的时候,遇到一个情况,我是用的是ucosii系统,从OSTime获取时间,可是OSTime总是莫名其妙突变,比如1,2,3,939528300觉得很奇怪,怎么会突然突变呢。后来在调试模式下排查发现以下几个可疑点:

1.OSTime是个全局变量,地址是0x2400B5A4,长度四个字节

2.断点进入了一个局部变量里,int a, &a=0x2400B5A7 ,正好压住了OSTime的最高字节,导致OSTime跳变。

这是什么问题,典型的栈空间申请过小导致。 

下面科普一下堆栈知识:

(1)栈区(stack):由编译器自动分配和释放,存放函数的参数返回值、局部变量等,其操作方式类似于数据结构中的栈。
(2)堆区(heap):由程序员分配管理,比如malloc。
(3)全局区与静态区:存储全局变量和静态变量,其中初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。
(4)文字常量区:常量字符串存放。
(5)程序代码区:存放程序代码。

data段,bss段,heap段,stack段。包含对应上面所说的(1)(2)(3)。constdata(常量),和函数代码,对应上面的(4)(5);

data指的是初始化不为0的全局或静态(static)变量。bss指的是没有初始化,或者初始化为0的全局或静态变量。

看明白了吧,说白了局部变量放在栈里,把heap设置大点就好了

© 著作权归作者所有

青春无极限
粉丝 2
博文 127
码字总数 70524
作品 0
卢湾
程序员
私信 提问
block本质探寻二之变量捕获

一、代码 说明:本文章须结合文章《block本质探寻一之内存结构》和《class和object_getClass方法区别》加以理解; //main.m #import int a = 10;static int b = 10; int main(int argc, cons...

春天里的花骨朵
01/09
0
0
block本质探寻六之修改变量

说明: <1>阅读本文章,请参照前面的block文章加以理解; <2>本文的变量指的是auto类型的局部变量(包括实例对象); <3>ARC和MRC两种模式均适用; 一、无法修改的原因 //代码 很明显,强行给...

春天里的花骨朵
01/16
0
0
STM32跳入HardFault Handler中断分析

ARM芯片STM32出现HardFault Handler硬件中断一般有两种情况: 访问越界导致的Acess Violation或者内存溢出 堆栈溢出 这次遇到的问题是栈空间不够。 在Keil4的Build Out窗口中有下列的调试信息...

兔之
2014/04/22
2.4K
0
C语言之从内存角度理解不同类型的变量

我们都知道在C语言中不同类型的变量在内存中的存放位置不同的,从内存角度上讲,不同内存块中存放的代码或者变量其属性(主要是作用域、生命周期、链接属性)是不同的。 首先我们介绍一下作用...

科技小能手
2017/11/12
0
0
iOS正确使用const,static,extern

static 修饰局部变量 让局部变量只初始化一次 局部变量在程序中只有一份内存 并不会改变局部变量的作用域,仅仅是改变了局部变量的生命周期(只到程序结束,这个局部变量才会销毁) 修饰全局...

Daniel_s
2016/11/21
18
0

没有更多内容

加载失败,请刷新页面

加载更多

golang-字符串-地址分析

demo package mainimport "fmt"func main() {str := "map.baidu.com"fmt.Println(&str, str)str = str[0:5]fmt.Println(&str, str)str = "abc"fmt.Println(&s......

李琼涛
今天
4
0
Spring Boot WebFlux 增删改查完整实战 demo

03:WebFlux Web CRUD 实践 前言 上一篇基于功能性端点去创建一个简单服务,实现了 Hello 。这一篇用 Spring Boot WebFlux 的注解控制层技术创建一个 CRUD WebFlux 应用,让开发更方便。这里...

泥瓦匠BYSocket
今天
6
0
从0开始学FreeRTOS-(列表与列表项)-3

FreeRTOS列表&列表项的源码解读 第一次看列表与列表项的时候,感觉很像是链表,虽然我自己的链表也不太会,但是就是感觉很像。 在FreeRTOS中,列表与列表项使用得非常多,是FreeRTOS的一个数...

杰杰1号
今天
8
0
Java反射

Java 反射 反射是框架设计的灵魂(使用的前提条件:必须先得到代表的字节码的 Class,Class 类 用于表示.class 文件(字节码)) 一、反射的概述 定义:JAVA 反射机制是在运行状态中,对于任...

zzz1122334
今天
5
0
聊聊nacos的LocalConfigInfoProcessor

序 本文主要研究一下nacos的LocalConfigInfoProcessor LocalConfigInfoProcessor nacos-1.1.3/client/src/main/java/com/alibaba/nacos/client/config/impl/LocalConfigInfoProcessor.java p......

go4it
昨天
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部