精华内容
下载资源
问答
  • 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

    展开全文
  • 建立3个文件分别是 MainMap.h SlaveMap.h MainMap.h//===============================================================MainMap.h文件添加在main.c即可 例如:#include "stm32f10x_lib.h"#include "MainMap.h" //...

    建立3个文件分别是 MainMap.h     SlaveMap.h    MainMap.h//===============================================================

    MainMap.h文件添加在main.c即可  例如:

    #include "stm32f10x_lib.h"

    #include "MainMap.h"      //添加在库的头文件下即可

    MainMap.h文件内容

    #define Eu32 u32

    #define Eu16 u16

    #define Eu8 u8

    #define Euc32 uc32

    #define Euc16 uc16

    #define Euc8 uc8

    #include "RamMap.h"

    //===============================================================

    //===============================================================

    SlaveMap.h文件添加在main.c以外的头文件里(只要main.c以外的文件用到全局变量就一定要添加)即可  例如

    #include "stm32f10x_lib.h"

    #include "SlaveMap.h"      //添加在库的头文件下即可

    SlaveMap.h文件内容

    #define Eu32 extern u32

    #define Eu16 extern u16

    #define Eu8 extern u8

    #define Euc32 extern uc32

    #define Euc16 extern uc16

    #define Euc8 extern uc8

    #include "RamMap.h"

    //===============================================================

    MainMap.h文件内容如下

    Eu16 Lcd;     //这个Lcd就是全局变量了,是否很简单呢

    download.gif附上上面的3个文件!

    展开全文
  • 描述今天在写SysTcik_Handler()这个中断函数时,总是报错,明明在开头定义全局变量extern u16 ntime,(ntime--写在stm32f10x_it.c的systick中断函数中)但是编译时总是报错,百度之后才有了解决方法,之前也注意到...

    描述

    今天在写SysTcik_Handler()这个中断函数时,总是报错,明明在开头定义的全局变量extern u16 ntime,(ntime--写在stm32f10x_it.c的systick中断函数中)但是编译时总是报错,百度之后才有了解决方法,

    362def6e1af30c0ca1933ce90a5d1092.png

    之前也注意到过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;

    2.在B中声明extern u16 temp2;

    7a60302e7c384c7d107ac115e4bb79be.png

    这里只是声明,不再赋值,否则会报错!

    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!

    打开APP阅读更多精彩内容

    点击阅读全文

    展开全文
  • 1.ST Visual Develop 开发环境下.h文件里面不能定义变量,要把变量定义在.C文件里面,然后在.H文件里面声明即可。补充:今天突然发现还有一种情况,变量在一个.h文件里定义后,在另外的一个.h文件里做extern声明后也...

    1.ST Visual Develop 开发环境下.h文件里面不能定义变量,要把变量定义在.C文件里面,然后在.H文件里面声明即可。补充:今天突然发现还有一种情况,变量在一个.h文件里定义后,在另外的一个.h文件里做extern声明后也可以,后来发现,这两个.h文件都没有自己的.c文件以及都是在工程文件的同层路径而不是在模块的文件里面。

    2.ST Visual Develop 开发环境如果出现进入或者退出DEBUG很慢,或者菜单栏消失这类问题,就是工程文件出现了异常,只要新建工程或者把近期OK的工程文件拷过来替换掉即可,不过后者可能不彻底,建议用前者去解决。

    转载于:https://www.cnblogs.com/mico-liu/p/4768794.html

    展开全文
  • 在自己的产品测试中 子机正常模式下运行毫无问题 都...lcd花屏 肯定是全局变量自己变化了的 是内存泄露或者覆盖问题串口接收死机 并非子机死机 ,而是串口接收不到数据了。实验中 接收不到数据的现象可以分为下面...
  • 最近在研究怎么把代码编译到自己想要的位置,然后只运行一次就自宫,分享一下。 方法一: void fun(void) __attribute((section(".ARM.__at_0x...定位变量: int val attribute((section(".ARM.__at_0x20000000"))) =
  • STM32全局变量占用程序存储空间吗?

    千次阅读 2015-01-04 20:09:47
    全局变量是否占用最终程序的存储空间,这个问题其实早在我们学习C语言的时候就已经告诉我们答案了。我隐约记得初学C语言的时候,书本上告诉我们: 全局自动变量——保存在读写数据段 全局静态变量——保存在读写...
  • SW4STM32 全局定义

    2017-12-29 08:20:00
    /*******************************************************************************... * SW4STM32 全局定义 * 说明: * 在解读B-L475E-IOT01程序的时候找不到USE_WIFI的宏定义,于是想应该是在哪里进行了宏...
  • 在自己的产品测试中 子机正常模式下运行毫无问题 都正常 ...lcd花屏 肯定是全局变量自己变化了的 是内存泄露或者覆盖问题 串口接收死机 并非子机死机 ,而是串口接收不到数据了。 实验中 接收不到数...
  • stm32下了解全局变量、局部变量、堆、栈对分区的了解各区特点stm32下实现对分区的了解 对分区的了解 在一个STM32程序代码中,从内存高地址到内存低地址,依次分布着栈区、堆区、全局区(静态区)、常量区、代码区,...
  • 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的const全局变量说起

    千次阅读 多人点赞 2017-07-22 13:22:01
      昨天在STM32程序中,把全局变量定义成const属性时,发现它所处的位置是在STM32内置的FLASH而非内置的SRAM中。顿时让我觉得十分奇怪,程序不都必须在RAM中运行?即使在静态常量区不也应该放在SRAM中?   ...
  • debug跟进去看不出什么逻辑错误,但发现函数内局部变量声明之后,全局变量的值被清零,后来查看局部变量地址已经超出栈的范围,于是确定是栈溢出。如果不稍微了解一下堆栈,在开发过程中可能碰到各种奇怪的错误。....
  • STM32单片机extern全局变量

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

    千次阅读 2020-06-17 00:39:37
    那么sButtonTick的值会正常的每10ms增加1,但是在仿真的过程中,将按键长按不松开,在变量窗口中动态显示却发现该值的变化速度特别快,而且值大于系统滴答计时器的计时时间,该值使用u16 类型进行定义,经常会跑到...
  • 二、STM32的USART串口通信程序实例三、C语言程序里全局变量、局部变量、堆、栈等概念,在ubuntu系统中编程,输出信息进行验证四、stm32的堆、栈、全局变量的分配地址 一、基于寄存器与基于固件库的stm32 LED流水灯...
  • 1 变量 /*!< */ 2 addtogroup /** @addtogroup 组名 * @{ */ /** * @} */ 3 defgroup /** @defgroup 组名 * @brief GPIO HAL module driver * @{ */ /** * @} */ 4 c文件头 /** **********...
  • stm32xxxx.it.c 有一个按键中断,当每次按键时进行次数统计 把中断采集到的值在main.c函数中进行使用 那么就要在stm32xxxx.it.c中 uint8_t key_num=0; //定义边且赋值 在main.c中 extern uint8_t key_num; ...
  • STM32 keilC 局部变量和全局变量

    千次阅读 2013-05-15 22:48:05
    keil C中的局部变量是放在栈中,而栈大小在启动文件中设置好了的,所以在写函数的局部变量的时候不应该定义大的数组,不然栈不够装,就会就会导致局部变量的地址和全局变量的地址重叠。
  • STM32关于堆栈,局部变量全局变量内存分配的问题 开发环境:IAR for ARM 8.30.1 MCU:STM32F103RCT6 以一个简单的bootloader程序为例,先来看看map文件中的内存分配: ***************************************...
  • STM32串口通信 文章目录STM32串口通信前言一、基于寄存器与基于固件库的stm32 LED流水灯的编程方式有什么差异。二、STM32的USART窗口通讯程序1.设置波特率为115200,1位停止位,无校验位。2.STM32系统给上位机...
  • 项目使用STM32L051C8T6,遇到一个奇怪问题:当增加全局变量或将全局数组增大(仅是从7个数组元素增加到10个)或将某段代码定义为函数进行调用时,程序都会100%死机(不是偶尔死机),有时某个全局变量的值还被莫名...
  • stm32的堆、栈、全局变量的分配地址 在一个STM32程序代码中,从内存高地址到内存低地址,依次分布着栈区、堆区、全局区(静态区)、常量区、代码区,其中全局区中高地址分布着.bss段,低地址分布着.data段。 总的...
  • 全局变量、局部变量、堆、栈一.C语言中堆、栈全局变量的地址分配二.stm32的堆、栈、全局变量的地址分配三.参考博客 一.C语言中堆、栈全局变量的地址分配 通过以下代码来进行理解C语言中各中变量的概念: #include &...
  • 文章目录stm32的堆、栈、全局变量的分配地址编程显示C程序代码各种类型变量的地址空间 stm32的堆、栈、全局变量的分配地址编程显示 在一个STM32程序代码中,从内存高地址到内存低地址,依次分布着栈区、堆区、全局...
  • 中断函数和子函数中临时用的变量要加volatil,全局变量不要加volatil。 const ; 只读变量 const变量的值在程序运行期间不能改变,不能再赋值。这种变量称为常变量(constant variable)或是只读变量(read-only-...
  • 在使用Keil开发环境编写stm32程序时我们经常会用到硬件在线仿真的功能,能在watch窗口中看到我们在程序中定义全局变量。我们希望在程序实时运行中看到变量的变化情况,但有时不能实时查看,原因是软件的设置不对。...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 6,656
精华内容 2,662
关键字:

stm32全局变量怎么定义