精华内容
下载资源
问答
  • 原标题:STM32全局变量占用程序存储空间吗是否占用最终程序的存储空间,这个问题其实早在我们学习C语言的时候就已经告诉我们答案了。我隐约记得初学C语言的时候,书本上告诉我们:全局自动变量——保存在读写数据段...

    原标题:STM32全局变量占用程序存储空间吗

    是否占用最终程序的存储空间,这个问题其实早在我们学习C语言的时候就已经告诉我们答案了。我隐约记得初学C语言的时候,书本上告诉我们:

    全局自动变量——保存在读写数据段

    全局静态变量——保存在读写数据段

    全局常量——保存在只读数据段

    局部自动变量——保存在栈空间里的

    而我们在做程序的时候,由于都是用的C编程,所以数据的存储也是一样的。上面的读写数据段在单片机里就是RW-data段,上面的只读数据段在单片机里就是RO-data,还有一个零初始化数据段ZI-data段(由此可见,RW-data加上ZI-data就是总共要分配的RAM空间大小),最后一个Code段就不用介绍了,大家都明白。

    那么究竟一个程序编译链接完成后的BIN文件大小到底跟所申请的全局变量有没有关系呢?答案是无关!最终生成的BIN文件大小只与程序的代码段(Code段)和只读数据段(RO-data)有关,即BIN文件大小=Code段+RO-data段。

    为了验证这一点,我特地拿正点原子战舰开发板的案例《实验48 串口IAP实验》来给大家演示,证明目标代码的大小与程序中所申请的全局变量大小无关。选择正点原子的这个案例有两个原因:1.本人目前正在学习STM32 IAP编程;2.该例程中分配了一个全局变量u8 USART_RX_BUF[USART_REC_LEN],USART_REC_LEN的长度为55K,几乎占用了80%的SRAM空间,对本文的论点起着典范作用。

    首先我们不对工程进行修改,如下图:

    9bcff417c1148851bf8edf1b64f2427d.bmp

    编译链接后,生成的目标代码结果如下:

    61203f8eea9b707dc2f1713a2346d6eb.bmp

    可以看到,Program Size: Code=19208 RO-data=3036 RW-data=64 ZI-data=62400

    得出ROM=21.7K RAM=61K

    我们再将USART_REC_LEN宏的长度修改为55,空间大大缩小,如下图:

    32bf27f2972fb5fa70bce221f5f91e73.bmp

    编译链接后,目标代码大小如下:

    b8a55818eedc1c97f7e0693dc5190c38.bmp

    可以看到Program Size: Code=19208 RO-data=3036 RW-data=64 ZI-data=6136

    得到ROM=21.7K RAM=6K

    而两次编译后,我们到工程目录下找到IAP.BIN文件,查看该文件的大小,都是21.7K,如下图:

    932d1f1af8150cc92e6739ecf8fd0b2e.png

    a8698775c05a1ebf6afb680cf640dffe.bmp

    由此可见,目标代码的大小与程序中所申请的全局变量大小无关,而只与代码段(Code段)和只读数据段(RO-data段)有关,而全局变量的大小只会影响到占用SRAM的大小。那么既然最终的目标代码大小跟全局变量的大小无关,是不是目标代码就一点也不包含全局变量了呢?呵呵,如果不包含全局变量,那程序运行的时候就不知道全局变量在哪里啦!当然会包含全局变量啦,只是不是包含它们的存储空间,而是包含他们分配空间的信息,比如该全局变量的起始地址、空间大小、是否要用0初始化等信息,这样就只会占用目标代码非常少的空间。那全局变量又是在什么时候分配的呢?全局变量的分配是在程序复位中断执行后,进入main函数之前分配的。那么全局变量又是由谁来分配的呢?全局变量的分配工作在你的用户程序中是看不到的,它们是有开发环境提供的C运行时库提供的代码,是由链接器把他们嵌入到你的用户代码里的。

    现在,对于变量的空间分配,你是不是更了解了一些呢?

    责任编辑:

    展开全文
  • STM32全局变量的定义和声明

    万次阅读 2020-03-19 17:04:11
    STM32全局变量的定义和声明 今天在写SysTcik_Handler()这个中断函数时,总是报错,明明在开头定义的全局变量extern u16 ntime,(ntime–写在stm32f10x_it.c的systick中断函数中)但是编译时总是报错,百度之后才有...
           STM32全局变量的定义和声明
    

    今天在写SysTcik_Handler()这个中断函数时,总是报错,明明在开头定义的全局变量extern u16 ntime,(ntime–写在stm32f10x_it.c的systick中断函数中)但是编译时总是报错,百度之后才有了解决方法,STM32学习009_全局变量的定义和声明
    之前也注意到过extern变量,但是没有仔细思考过它的使用方法,今天碰到了,一定要把它弄明白,把这个关键字的一般作用弄清楚(仅仅是一般作用,C的博大精深不敢妄谈);
    当你建立一个头文件库时,经常会遇到一个问题,就是在A文件中定义一个temple变量,想把它的值传递给B文件使用,但是A文件操作中函数又不可以带返回参数,比如说中断服务函数,那该怎么办?如果你把temple定义在A中,然后让A.h和B.h包含在includes.h中,然后把includes.h放在A.c和B.c中单个编译是没有问题的,但是链接的时候会出现问题,
    “Symbol temple multiply defined(by A.o and B.o)”
    意思是这个变量被多次定义了!!!
    解决的方法是:
    在A中定义temple变量后,在B中用extern 声明一下就可以了,例如:
    1.在A中定义temple 并且赋值:u16 temp2=0;
    STM32学习009_全局变量的定义和声明
    在这里插入图片描述
    2.在B中声明extern u16 temp2;
    在这里插入图片描述
    STM32学习009_全局变量的定义和声明
    这里只是声明,不再赋值,否则会报错!
    Symbol temp2 multiply defined (by catch_pwm.o and app.o)

    这里要注意变量定义和变量声明的区别:
    变量定义使用“数据类型+变量名称”的形式,编译器需要给它分配内存单元的;
    而变量声明使用“extern 变量类型+变量名称”的形式,是告诉编译器我这个变量将在其他外部C文件中定义,我这里只是在外部用它。编译器就不会给它分配内存空间,而等到真正遇到变量定义时再给它分配内存空间。

    //以下是“聚海”de帖子///
    1、普通变量定义成全局变量
    如果是普通类型,完全可以不用*.h文件,直接在*.c文件中定义,在调用文件处用extern 声明,因为对于普通类型,编译器是可以识别的。比如在一个 my.c文件中,我定义了char name[10];那么在别的文件中只要用extern char name[](由于是声明,一位数组可以省略大小,但不建议用指针,比较指针和数组是两回事)外部声明就可以了,告诉编译器这个变量我已经定义过了,具体怎样,你慢慢找吧。这符合常理,因为char是编译器能自主识别的类型。
    2、自定义结构体类型定义成全局变量
    不同于普通类型,如果不预先通知编译器,编译器是不会识别你自定义的类型的。这个时候,.h文件便出现了。不是定义结构类型不占内存吗?那好,我大结构体的定义放在.h文件中,这样一来,无论你incude无数次,内存都不会被占用的。而且这样还有个好处,在别的文件中可以include这个*.h文件,这样,在这个文件中,编译器就可以识别你的自定义类型了,目的不就达到了? 假如我在global.h中定义了
    typedef struct _POSITION
    {
    int x;
    int y;
    }POSITION;
    那么我可以在一个global.c文件中实现全局变量的定义,不过要include那个*.h文件,比如

    include “global.h”
    POSITION current,;
    这样就定义了cunrrent这个变量,在别的文件中引用这个变量时,只要extern POSITION current;进行声明,然后就可以用了,不过这个文件也还得include “global.h” 因为如果不包含,在这个文件中是不识别POSITION类型的。

    1.如何引用一个已经定义过的全局变量?

    答:extern  可以用引用头文件的方式,也可以用extern关键字,如果用引用头文件方式来引用某个在头文件中声明的全局变理,假定你将那个编写错了,那么在编译期间会报错,如果你用extern方式引用时,假定你犯了同样的错误,那么在编译期间不会报错,而在连接期间报错。

    2.全局变量可不可以定义在可被多个.C文件中?为什么?

    答:可以,在不同的C文件中以static形式来声明同名全局变量。  可以在不同的C文件中声明同名的全局变量,前提是其中只能有一个C文件中对此变量赋初值,此时连接不会出错。

    OVER!

    9

    展开全文
  • 原文链接http://blog.csdn.net/hexiaolong2009/article/details/8908417全局变量是否占用最终程序的存储空间,这个问题其实早在我们学习C语言的时候就已经告诉我们答案了。我隐约记得初学C语言的时候,书本上告诉...

    原文链接http://blog.csdn.net/hexiaolong2009/article/details/8908417

    全局变量是否占用最终程序的存储空间,这个问题其实早在我们学习C语言的时候就已经告诉我们答案了。我隐约记得初学C语言的时候,书本上告诉我们:

    全局自动变量——保存在读写数据段

    全局静态变量——保存在读写数据段

    全局常量——保存在只读数据段

    局部自动变量——保存在栈空间里的

    而我们在做单片机程序的时候,由于都是用的C编程,所以数据的存储也是一样的。上面的读写数据段在单片机里就是RW-data段,上面的只读数据段在单片机里就是RO-data,还有一个零初始化数据段ZI-data段(由此可见,RW-data加上ZI-data就是总共要分配的RAM空间大小),最后一个Code段就不用介绍了,大家都明白。

    那么究竟一个STM32程序编译链接完成后的BIN文件大小到底跟所申请的全局变量有没有关系呢?答案是无关!最终生成的BIN文件大小只与程序的代码段(Code段)和只读数据段(RO-data)有关,即BIN文件大小=Code段+RO-data段。

    为了验证这一点,我特地拿正点原子战舰开发板的案例《实验48 串口IAP实验》来给大家演示,证明目标代码的大小与程序中所申请的全局变量大小无关。选择正点原子的这个案例有两个原因:1.本人目前正在学习STM32 IAP编程;2.该例程中分配了一个全局变量u8 USART_RX_BUF[USART_REC_LEN],USART_REC_LEN的长度为55K,几乎占用了80%的SRAM空间,对本文的论点起着典范作用。

    首先我们不对工程进行修改,如下图:

    440e40ff4267a3a20d753ae39fd1d136.bmp

    编译链接后,生成的目标代码结果如下:

    852c6d4249b763c9b64c24941cbd11e1.bmp

    可以看到,Program Size: Code=19208 RO-data=3036 RW-data=64 ZI-data=62400

    得出ROM=21.7K RAM=61K

    我们再将USART_REC_LEN宏的长度修改为55,空间大大缩小,如下图:

    3a1df3e4a6b12683615a367f5e075733.bmp

    编译链接后,目标代码大小如下:

    ac32cbe78356548832b0c41c42c1b1e6.bmp

    可以看到Program Size: Code=19208 RO-data=3036 RW-data=64 ZI-data=6136

    得到ROM=21.7K RAM=6K

    而两次编译后,我们到工程目录下找到IAP.BIN文件,查看该文件的大小,都是21.7K,如下图:

    2d86223a12be7cc3d118f5893278d274.png

    0a4f934870e68cd66ba6a3ac43f622d1.bmp

    由此可见,目标代码的大小与程序中所申请的全局变量大小无关,而只与代码段(Code段)和只读数据段(RO-data段)有关,而全局变量的大小只会影响到占用SRAM的大小。那么既然最终的目标代码大小跟全局变量的大小无关,是不是目标代码就一点也不包含全局变量了呢?呵呵,如果不包含全局变量,那程序运行的时候就不知道全局变量在哪里啦!当然会包含全局变量啦,只是不是包含它们的存储空间,而是包含他们分配空间的信息,比如该全局变量的起始地址、空间大小、是否要用0初始化等信息,这样就只会占用目标代码非常少的空间。那全局变量又是在什么时候分配的呢?全局变量的分配是在程序复位中断执行后,进入main函数之前分配的。那么全局变量又是由谁来分配的呢?全局变量的分配工作在你的用户程序中是看不到的,它们是有开发环境提供的C运行时库提供的代码,是由链接器把他们嵌入到你的用户代码里的。

    现在,对于变量的空间分配,你是不是更了解了一些呢?

    展开全文
  • 最近在研究怎么把代码编译到自己想要的位置,然后只运行一次就自宫,分享一下。 方法一: void fun(void) __attribute((section(".ARM.__at_0x...定位变量: int val attribute((section(".ARM.__at_0x20000000"))) =

    最近在研究怎么把代码编译到自己想要的位置,然后只运行一次就自宫,分享一下。
    方法一:

    void fun(void) __attribute((section(".ARM.__at_0x8100000")));

    方法二:

    #pragma arm section code=".ARM.__at_0x8100000"

    void fun(void)

    {

    }

    #pragma arm section

    定位变量:

    int val attribute((section(".ARM.__at_0x20000000"))) = 0x00;

    展开全文
  • STM32全局变量占用程序存储空间吗?

    千次阅读 2013-05-10 00:53:35
    全局变量是否占用最终程序的存储空间,这个问题其实早在我们学习C语言的时候就已经告诉我们答案了。我隐约记得初学C语言的时候,书本上告诉我们: 全局自动变量——保存在读写数据段 全局静态变量——保存在读写...
  • 建立3个文件分别是 MainMap.h SlaveMap.h MainMap.h//===============================================================MainMap.h文件添加在main.c即可 例如:#include "stm32f10x_lib.h"#include "MainMap.h" //...
  • 描述今天在写SysTcik_Handler()这个中断函数时,总是报错,明明在开头定义的全局变量extern u16 ntime,(ntime--写在stm32f10x_it.c的systick中断函数中)但是编译时总是报错,百度之后才有了解决方法,之前也注意到...
  • 在自己的产品测试中 子机正常模式下运行毫无问题 都...lcd花屏 肯定是全局变量自己变化了的 是内存泄露或者覆盖问题串口接收死机 并非子机死机 ,而是串口接收不到数据了。实验中 接收不到数据的现象可以分为下面...
  • 在做项目的时候,遇到一个情况,我是用的是ucosii系统,从OSTime获取时间,可是OSTime总是莫名其妙突变,比如1,2,3,939528300觉得很奇怪,怎么会突然...1.OSTime是个全局变量,地址是0x2400B5A4,长度四个字节...
  • STM32实验全局变量、局部变量、堆、栈 1.实验环境 1.野火STM32指南者(STM32F103VET6) 2.keil5 3.野火多功能调试助手.exe 全局变量、静态局部变量保存在全局数据区,初始化的和未初始化的分别保存在一起。普通局部...
  • debug跟进去看不出什么逻辑错误,但发现函数内局部变量声明之后,全局变量的值被清零,后来查看局部变量地址已经超出栈的范围,于是确定是栈溢出。如果不稍微了解一下堆栈,在开发过程中可能碰到各种奇怪的错误。....
  • STM8全局变量溢出问题解决

    千次阅读 2016-01-27 10:27:17
    STM8S105系列CPU的RAM地址范围为0~0x7FF的2K空间,其中默认将高512字节分配给堆栈,剩下0~0x5FF字节为变量存储空间 。在0~0x5FF的空间范围内,低256字节被定义为Zero page,其中包括.bsct,.ubsct,.bit,.share,各...
  • stm32下了解全局变量、局部变量、堆、栈对分区的了解各区特点stm32下实现对分区的了解 对分区的了解 在一个STM32程序代码中,从内存高地址到内存低地址,依次分布着栈区、堆区、全局区(静态区)、常量区、代码区,...
  • 1.ST Visual Develop 开发环境下.h文件里面不能定义变量,要把变量定义在.C文件里面,然后在.H文件里面声明即可。补充:今天突然发现还有一种情况,变量在一个.h文件里定义后,在另外的一个.h文件里做extern声明后也...
  • } } 按照正常的逻辑,每10ms 进入到该程序中,如果按键一直处于按下状态,那么sButtonTick的值会正常的每10ms增加1,但是在仿真的过程中,将按键长按不松开,在变量窗口中动态显示却发现该值的变化速度特别快,...
  • STM32中断中读写全局变量

    千次阅读 2016-08-08 14:50:57
    STM32中断中读写全局变量 根据中断的频率和调用变量的频率,选择是否加锁。 如果读、写全局变量的操作是原子操作,可以不加锁,否则需要加锁视具体情况而定
  • STM32单片机extern全局变量

    千次阅读 2020-10-27 16:44:14
    当你建立一个头文件库时,经常会遇到一个问题,就是在A文件中定义一个temple变量,想把它的值传递给B文件使用,但是A文件操作中函数又不可以带返回参数,比如说中断服务函数,那该怎么办? 如果你把temple定义在A中...
  • 哈佛和冯诺依曼,从STM32的const全局变量说起

    千次阅读 多人点赞 2017-07-22 13:22:01
      昨天在STM32程序中,把全局变量的定义成const属性时,发现它所处的位置是在STM32内置的FLASH而非内置的SRAM中。顿时让我觉得十分奇怪,程序不都必须在RAM中运行?即使在静态常量区不也应该放在SRAM中?   ...
  • stm32中断函数改变全局变量

    千次阅读 2017-02-22 11:39:00
    先描述下问题:  当检测到有按键按下时,实现PA.0led闪亮,函数肯定不能在中断服务程序里写,就想着在进入中断函数后改变变量biaozhi的值(0变成1),然后main中while循环一直检测biaozhi的值若... 然后在stm32f10x
  • C语言程序里全局变量、局部变量、堆、栈等概念 一. 基于寄存器与基于固件库的stm32 LED流水灯的编程方式的差异 寄存器:相对来说是属于更底层的,类似于驱动层,在寄存器在使用时必须要清楚自己要操作那个一个...
  • 二、STM32的USART串口通信程序实例三、C语言程序里全局变量、局部变量、堆、栈等概念,在ubuntu系统中编程,输出信息进行验证四、stm32的堆、栈、全局变量的分配地址 一、基于寄存器与基于固件库的stm32 LED流水灯...
  • 在自己的产品测试中 子机正常模式下运行毫无问题 都正常 ...lcd花屏 肯定是全局变量自己变化了的 是内存泄露或者覆盖问题 串口接收死机 并非子机死机 ,而是串口接收不到数据了。 实验中 接收不到数...
  • stm32xxxx.it.c 有一个按键中断,当每次按键时进行次数统计 把中断采集到的值在main.c函数中进行使用 那么就要在stm32xxxx.it.c中 uint8_t key_num=0; //定义边且赋值 在main.c中 extern uint8_t key_num; ...
  • STM32关于堆栈,局部变量全局变量内存分配的问题 开发环境:IAR for ARM 8.30.1 MCU:STM32F103RCT6 以一个简单的bootloader程序为例,先来看看map文件中的内存分配: ***************************************...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 8,686
精华内容 3,474
关键字:

stm32全局变量