局部变量与全局变量
发表:2023-08-29 11:59:41 阅读:47

局部变量与全局变量:变量根据使用范围分为全局变量与局部变量。全局变量保存在RAM中的一个固定的位置上,并且可以被程序中的任何部分访问;局部变量存放在堆栈(一般也是RAM)中,只能在定义该变量的功能模块中使用,而且只有在使用该变量的功能模块正在运行时才占用RAM。局部蛮量没有固定的存放地址,一般通过堆栈指针SP间址方式访问。

SP间址方式相对于H:X的间址,多了一个额外的指令字节和指令周期,因此如果程序访问多个连续存放的局部变量,编译器就会将SP传给H:x,并通过一般的间址模式访问变量。如果给局部变量增加一个static属性,这会导致局部变量像全局变量一样也存放在RAM中,虽然在函数调用过程中static局部变量会一直保存上次的数值,但仍然只能在定义该变量的功能模块中使用该变量。

全局变量当代码编译连接之后就在存储器中有一个固定的绝对的地址,而且没有任何保护措施,程序中的任意代码随时都可以访问任何一个全局变量,这会引发多字节全局变量的数据一致性问题。比如一个多字节全局变量,运算过程中只是确定了某些字节的数值,突然被硬件中断程序或者操作系统打断,并且中断程序中也要访问该多字节全局变量,此时该变量的数值显然是错误的,这种情形应该尽量避免,比如访问多字节全局变量时禁止中断。对于全局变量也可以添加“static”修饰,而且在一定程度上增加了该全局变量的保护,因为该变量只能被包含它定义的文件中的函数所使用。

编译器一般采用扩展寻址或者通过指针间址方式访问全局变量,与局部变量相比,全局变量的使用效率并没有明显优势,但有个特例除外,就是当全局变量位于存储器第零页(direct page or zero page)时,由于可以采用直接寻址方式访问变量,效率将大大提高。还有一个值得注意的问题是,全局变量的使用使得某些函数不能递归和重人,而且对微控制器的宝贵资源RAM的利用率不是太高。因此程序设计者必须小心地选择哪些变量使用全局变量,哪些不是。

 

阅读更多请您关注:

在汇编语言程序中访问C语言定义的常量、变量

C语言程序调用汇编语言子程序

基本数据类型

freescale代理