单片机外部变量的使用_单片机外部中断可以通过变量实现吗 - CSDN
  • extern可以用来在其他模块中公用变量和函数。其用法如:例如:在a.c文件中定义一个变量 unsigned int intA; intA = 0x00;在b.c中要操作这个变量,就在 b.c文件中定义 extern unsigned int intA; intA = 0x03; 在b.c中...

    extern可以用来在其他模块中公用变量和函数。其用法如:

    例如:在a.c文件中定义一个变量  unsigned int intA; intA = 0x00;

    在b.c中要操作这个变量,就在 b.c文件中定义    extern unsigned int intA;   intA = 0x03;   

    在b.c中就把intA的值改为了0x03;

    然后在a.c文件中查看intA的值,值就为0x03。

    展开全文
  • 我们都知道有一个规则,那就是尽量不要使用全局变量,但自己写程序,有时感觉使用全局变量很方便,而且并没感到有什么缺点。 将网上查的的资料总结一下,发现全局变量的缺点主要有两个,其它具体的危害一般都是这两...

    我们都知道有一个规则,那就是尽量不要使用全局变量,但自己写程序,有时感觉使用全局变量很方便,而且并没感到有什么缺点。

    将网上查的的资料总结一下,发现全局变量的缺点主要有两个,其它具体的危害一般都是这两个的具体的显现。

    全局变量缺点:

    1.全局变量存在周周期长,将会占用更多的内存。

    2.全局变量多处被调用,使全局变量的值变得不确定。

    (1)用全局变量会增加程序的耦合性,会有一定移植麻烦,代码重用率低。

    (2)全局变量,使用和更改他的地方多了以后,各个地方逻辑关系难以确定。

    (3)过多的全局变量,大大降低程序的可读性,可维护性。

    (4)容易造成命名冲突 

     

    其实,全局变量是不可避免要用到的,比如说温度采集,我们将传感器送回来的数据处理后必须放在一个全局变量里。然后要使用它时,直接从全局变量中取便可以了。

    因为C语言中函数return只能放回一个值,使用全局变量便可以返回多个值,但这并不合适,因为这占空间,减慢了运算速度,又增加了这个函数的耦合性。可以定义数组,返回指针的方式传递多个参数。如果不希望改变原参数值,使用const限制指针。

    所以,传递参数不要用全局变量,可以使用指针。而像显示缓冲区,数据采集子程序,通信缓冲区。这样的地方,全局变量是不可避免要用到的。

     

    为什么呢?因为这些地方都有同一个特点。想一想,单片机的寄存器相当于全局变量吗?

    寄存器易变的,外部事件可改变。但一般只有一种事件可以改变它,而其它的地方使用但改变他的数值。

    可见,如果全局变量只有一处改变它,只要内存够,就可以大胆使用它。

    但无论如何全局变量使用多了,都会感觉程序混乱。

     

    使用全局变量的好习惯

    1.如果只有某.c文件用,就static到该文件中;如果只有一个函数用,那就static到函数里面去;

    2尽量把变量的作用范围控制在使用它的模块里面,如果其他模块要访问,就开个读或写函数接口出来,严格控制访问范围。(就是利用.h文件#include)

    3.当一个模块里面的全局变量超过3个(含)时,就用结构体包起来吧。要归0便一起归0,省得丢三落四的。

    4.如果一定要用全局变量,请遵守命名规范,比如在前面加"g_", 以防造成命名冲突。

    5.小程序结构简单,即使使用全局变量也方便管理。

     

     

    这还有一句话,“每一个设备底层几乎都需要它来记录当前状态,控制时序,起承转合。”从网上看到的,但还是不太理解其中的意思。

    展开全文
  • 全局变量是存在RAM中的,而局部变量是存在堆栈中的   全局变量是从低地址往高地址存,局部变量是从RAM的高地址往低地址存,如果你定义的变量太多就有可能是溢出了。 在MSP430中,局部变量如果不多,就会分配r4...

    全局变量是存在RAM中的,而局部变量是存在堆栈中的

     

    全局变量是从低地址往高地址存,局部变量是从RAM的高地址往低地址存,如果你定义的变量太多就有可能是溢出了

    在MSP430中,局部变量如果不多,就会分配r4-r15的寄存器,如果数量大就会用压栈处理。

     

    全局变量是使用相同的内存块在整个类中存储一个值.
    全局变量的存在主要有以下一些原因:
    1,使用全局变量会占用更多的内存(因为其生命期长),不过在计算机配置很高的今天,这个不成为什么问题,除非使用的是巨大对象的全局变量,能避免就一定要避免。
    2,使用全局变量程序运行时速度更快一些(因为内存不需要再分配),同样现在也快不了多少。
    3,对于局部变量的名字空间污染,这个在不使用太多变量时是可以避免的。
            总之,全局变量可以使用,但是全局变量使用时应注意的是尽可能使期名字易于理解,而且不能太短,避免名字空间的污染;避免使用巨大对象的全局变量。
    局部变量:在程序中,只在特定的过程或函数中可以访问的变量,是相对与全局变量而言的。
    全局变量也称为外部变量,是在函数的外部定义的,它的作用域为从变量定义处开始,到本程序文件的末尾。全局变量全部存放在静态存储区,在程序开始执行时给全局变量分配存储区,程序行完毕就释放。
    局部变量可以和全局变量重名,但是局部变量会屏蔽全局变量。在函数内引用这个变量时,会用到同名的局部变量,而不会用到全局变量。


    提高了耦合性,牵一发而动全身


    时间久了,代码长了,你都不知道全局变量被哪些函数改过,更怕全局的、起标志作用的变量,处理不好会被害死,同理外部变量比之更甚,尽量不用。不过不是绝对的,如果有清理的逻辑,和必要的时候使用这两种变量会是很好的解决方法。

    提高了模块间的耦合性,对后期维护、扩展和复用都带来极大影响。

    比如说你想在新的系统中复用旧系统的模块,你就会发现由于全局变量的存在,单个旧模块极难单独剥离出来;
    维护上来说,模块之间的全局变量,你会常常发现修改代码功能时,不同功能对同一全局变量的操作上经常发生冲突。。。

    呵呵,这些问题,你维护过一段时间这些代码就有体会了

    如果对此类问题感兴趣,推荐去看看《代码大全2》,里面对全局变量的使用有很好的建议;


    不但程序崩溃 人也会崩溃

    好处是:便于传递参数,数据能在整个程序中共享。不用很麻烦的传递参数,也省去了传递参数的时间,会减少程序的运行时间。
    坏处是:全局变量不好控制,不利于程序的结构化,因为程序中所有的函数都可以随便的修改全局变量,可能导致不可预测的错误,也不便于调试。另外由于全局变量可能会于局部变量冲突,导致程序混乱。

    因此一般的建议是尽量不用或少用局部变量。

    我不认为“传递参数”是一个麻烦,比较起强耦合带来的麻烦来,传递参数实际上完全不能算有麻烦

    要记住程序的“正确性”肯定是第一重要的,传递参数如果说有性能损失的话(我个人不认为有多少性能损失),和正确性比较起来实在是微不足道的。而全局变量带来的模块间的强耦合是造成程序不正确的很大的一个因素

    全局变量太多会增加代码维护的困难,也加大了内存的用量,增大程序的体积,某个地方出错,会造成很多地方出错,欲修改某个地方,可能会造成很多地方都要跟着修改。

    最明显的一个问题就是耦合性被增强,代码的维护和可移植性差。


    模块间全局变量太多,肯定是模块耦合太多,不利于程序稳定,当出问题的时候也不容易定位问题

     

    而且如果存在多个模块线程同时修改全局变量的话,也容易造成冲突,需要加线程锁,这样程序的复杂性就高了

     

    全局变量的值可能在你意想不到的地方改变,这点在多线程编程中显现的尤为突出。

     

    耦合性变高。不提倡用全局变量。如果你的程序没有全局变量。说明你是高手。否则。只能说程序写的不咋地。

    是嵌入式的代码,如果是底层的代码的话,这样效率会好些,当然逻辑上出错的可能性也比较大;如果是上层的代码的话,还是少全局变量好,减少耦合,增大封装。

    展开全文
  • 全局变量是存在RAM中的,而局部变量是存在堆栈中的 全局变量是从低地址往高地址存,局部变量是从RAM的高地址往低地址存,如果你定义的变量太多就有可能是溢出了。在MSP430中,局部变量如果不多,就会分配r4-r15的...
    全局变量是存在RAM中的,而局部变量是存在堆栈中的 全局变量是从低地址往高地址存,局部变量是从RAM的高地址往低地址存,如果你定义的变量太多就有可能是溢出了。在MSP430中,局部变量如果不多,就会分配r4-r15的寄存器,如果数量大就会用压栈处理。 全局变量是使用相同的内存块在整个类中存储一个值. 全局变量的存在主要有以下一些原因: 1,使用全局变量会占用更多的内存(因为其生命期长),不过在计算机配置很高的今天,这个不成为什么问题,除非使用的是巨大对象的全局变量,能避免就一定要避免。 2,使用全局变量程序运行时速度更快一些(因为内存不需要再分配),同样现在也快不了多少。
     3,对于局部变量的名字空间污染,这个在不使用太多变量时是可以避免的。 总之,全局变量可以使用,但是全局变量使用时应注意的是尽可能使期名字易于理解,而且不能太短,避免名字空间的污染;避免使用巨大对象的全局变量。 局部变量:在程序中,只在特定的过程或函数中可以访问的变量,是相对与全局变量而言的。 全局变量也称为外部变量,是在函数的外部定义的,它的作用域为从变量定义处开始,到本程序文件的末尾。全局变量全部存放在静态存储区,在程序开始执行时给全局变量分配存储区,程序行完毕就释放。局部变量可以和全局变量重名,但是局部变量会屏蔽全局变量。在函数内引用这个变量时,会用到同名的局部变量,而不会用到全局变量。提高了耦合性,牵一发而动全身时间久了,代码长了,你都不知道全局变量被哪些函数改过,更怕全局的、起标志作用的变量,处理不好会被害死,同理外部变量比之更甚,尽量不用。不过不是绝对的,如果有清理的逻辑,和必要的时候使用这两种变量会是很好的解决方法。提高了模块间的耦合性,对后期维护、扩展和复用都带来极大影响。比如说你想在新的系统中复用旧系统的模块,你就会发现由于全局变量的存在,单个旧模块极难单独剥离出来;
     维护上来说,模块之间的全局变量,你会常常发现修改代码功能时,不同功能对同一全局变量的操作上经常发生冲突。。。呵呵,这些问题,你维护过一段时间这些代码就有体会了如果对此类问题感兴趣,推荐去看看《代码大全2》,里面对全局变量的使用有很好的建议; 不但程序崩溃 人也会崩溃 好处是:便于传递参数,数据能在整个程序中共享。不用很麻烦的传递参数,也省去了传递参数的时间,会减少程序的运行时间。坏处是:全局变量不好控制,不利于程序的结构化,因为程序中所有的函数都可以随便的修改全局变量,可能导致不可预测的错误,也不便于调试。另外由于全局变量可能会于局部变量冲突,导致程序混乱。因此一般的建议是尽量不用或少用局部变量。我不认为“传递参数”是一个麻烦,比较起强耦合带来的麻烦来,传递参数实际上完全不能算有麻烦要记住程序的“正确性”肯定是第一重要的,传递参数如果说有性能损失的话(我个人不认为有多少性能损失),和正确性比较起来实在是微不足道的。而全局变量带来的模块间的强耦合是造成程序不正确的很大的一个因素全局变量太多会增加代码维护的困难,也加大了内存的用量,增大程序的体积,某个地方出错,会造成很多地方出错,欲修改某个地方,可能会造成很多地方都要跟着修改。最明显的一个问题就是耦合性被增强,代码的维护和可移植性差。模块间全局变量太多,肯定是模块耦合太多,不利于程序稳定,当出问题的时候也不容易定位问题
     而且如果存在多个模块线程同时修改全局变量的话,也容易造成冲突,需要加线程锁,这样程序的复杂性就高了 全局变量的值可能在你意想不到的地方改变,这点在多线程编程中显现的尤为突出。 耦合性变高。不提倡用全局变量。如果你的程序没有全局变量。说明你是高手。否则。只能说程序写的不咋地。是嵌入式的代码,如果是底层的代码的话,这样效率会好些,当然逻辑上出错的可能性也比较大;如果是上层的代码的话,还是少全局变量好,减少耦合,增大封装。
    
    展开全文
  • 局部变量,全局变量
  • 用extern声明外部变量

    2018-12-31 07:55:14
    全局变量(外部变量)是在函数的外部定义的,它的作用域为从变量的定义处开始,到本程序文件的末尾。在此作用域内,全局变量可以为本文件中各个函数所引用。编译时将全局变量分配在静态存储区。 有时需要用extern来...
  • 51单片机局部变量占用ram的问题 一、问题 自从工作以来基本不使用51或者增强型51之类的单片机。最近调试芯圣HC89S003F4增强型51,移植了32的实用代码,结果发现RAM爆了!!! 二、实践 为了看出问题,我又重新...
  • 若一个变量需要在同一个工程中不同文件直接使用...在单片机程序中,只需将extern声明在该.c文件对应的.h文件中,其他文件如需使用变量,只需包含(include)该头文件即可。 ![.h文件](https://img-blog.csdnimg....
  • 单片机变量存储问题

    2019-09-18 17:44:28
    要在程序中使用变量必须先用标识符作为变量名,并指出所用的数据类型和存储模式,这样编译系统才能为变量分配相应的存储空间。 定义一个变量的格式如下: [存储种类] 数据类型 [存储器类型] 变量名表 在定义格式...
  • [存储种类] 数据类型 [存储器类型] 变量名表  在定义格式中除了数据类型和变量名表是必要的,其它都是可选项。存储种类有四种:自动(auto),外部(extern),静态(static)和寄存器(register),缺省类型为...
  • 引言 8051内核单片机是一种通用单片机,在国内占有较大的市场份额。在将C语言用于51内核单片机的研究方面,Keil公司做得最为成功...1 CPU存储结构与变量的关系 变量都需要有存储空间,存储空间的不同使得变量使用时...
  • 首先bit与sbit完全不同,他...二宏定义是可以重复声明的,在用单片机用多文件处理时,sbit是可以重复声明的,如果要在别的文件中用到这个变量,那么再原样定义一次,问题就解决了,如果用extern sbit 声明就报错了。
  • c语言中静态全局变量的存储区是内存在程序编译的时候就已经分配好,而单片机c51的程序编译和运行的环境不是一样的,编译的时候是在windows集成开发环境uVision2下,而运行要程序在单片机中. 问题是我上述语句是要求它在...
  • 在函数内部声明的变量,只在本函数内部可以使用。 1.2全局变量 在函数外声明的变量就是全局变量。 二、变量的存储类别 变量的存储类别分为自动、静态、寄存器和外部四种。 局部变量如果不加static修饰都属于...
  • 51单片机入门教程(6)——外部中断
  •  全局变量是存在RAM中的,而局部变量是存在堆栈中的   全局变量是从低地址往高地址存,局部...全局变量使用相同的内存块在整个类中存储一个值. 全局变量的存在主要有以下一些原因: 1,使用全局变量会占
  • MCU 中常使用的存储器类型有:FLASH、RAM、ROM(包括EEPROM) 在软件角度来看,程序和数据的存储分为以下几个部分 代码段和常量段都可以用于保存常量数据,其主要区别是,如果常量可以作为汇编指令的一个操作...
  • Keil C 位变量外部引用的方法 Keil C 位变量外部引用的方法:具体可以参考keil 的help. 1.变量定义在可位寻址区: int bdata ibase; /* Bit-addressable int */ char bdata bary [4]; /* Bit-addressable ...
  • 本篇博客主要讲授华大半导(STM32、C51等单片机均可适用)复位(以看门狗复位为例)后变量数据保存的方法。 这里将用到__not_init属性,其用于变量声明,可禁止系统启动时变量的初始化,有了__not_init属性,编译器...
1 2 3 4 5 ... 20
收藏数 7,463
精华内容 2,985
关键字:

单片机外部变量的使用