IHC12变量定义.docVIP

  1. 1、本文档共8页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
IHC12变量定义

1.全局变量和局部变量 全局变量为整个程序而定义,在整个程序运行期间,它们占用固定的RAM资源。在C语言中,在所有函数外部声明的变量都认为具有全局作用域,这些声明通常置于源文件的顶部。“全局”实际上仅仅意味着标识符从声明点到文件末尾的范围内是可访问的,当程序包含多个源文件时,则在一个文件中定义的全局变量在其他文件引用时,需要使用extern关键字声明。在引用文件内部,标识符的作用域是由extern声明的位置确定的。如果该声明是全局的,那么该标识符对于文件是全局的;如果该声明是放在块内的,则它对于那个块就是局部的。局部变量为某个函数或子程序而定义,只在函数运行时,从堆栈空间中分配存储空间;函数运行结束,所占用堆栈空间释放。 2.变量修饰符 变量定义有三个修饰符值得注意,虽然它们与标准C是相同的,但是在嵌入式C语言中又有不同的含义。 (1) volatile 大多数编译器对源程序编译时做优化操作,其中一种优化方法是基于这种假设:除非明确地把某值写到内存,否则内存中的值不会改变。所以如果源程序中频繁使用某个内存,编译器会把这个内存放到CPU寄存器或高速缓存中,提高代码运行速度。在嵌入式系统中,这种优化会影响程序的正确执行,典型的情况是: ①硬件外设寄存器的值随时都在变化,并且这种变化是不需要在写寄存器程序来改变。 ②内存变量在主程序中没有显示改变,但在中断服务程序被改变,如果编译器在主程序中将内存以寄存器来取代,中断服务程序对变量的改变就不能传递到主程序中。对于这两种情况做变量声明时,需要加前缀volatile,告诉编译器不要对这些变量做优化操作。 例如:volatile char device_status (2) static 在子函数中用static声明的变量是局部变量,局部的范围可能是一个文件、函数、过程中,在局部的范围内,变量可以调用,变量值可以共享。下面给出了一个子函数中使用的局部变量的用法。 void MyFunction (void) { static char myVar = 0; //用 static声明的局部变量 myVar = myVar + 1; } void main (void) { MyFunction(); //调用之前myVar = 0,调用之后myVar = 1 MyFunction(); //调用之前myVar = 1,调用之后myVar = 2 } (3) const 修饰符const可以用在任何变量之前,用于声明变量值不会被改变,即“只读的”。这提供了一种保护性编程,编译器会将任何想修改这种变量的行为看成是违犯语法的行为。const声明的变量必须包含一个初值,不允许在以后的使用中修改它的值。宏定义常量和const有一些相似之处,但const还声明了数据类型,编译器对它们的处理也有所不同,如: #define TYPEA 10 /*字符”TYPEA”在编译时用10来代替*/ const unsigned int typeA=10; /*typeA 是一个无符号整型数值为10*/ 当在一个指针声明中使用const关键字时,其意义有所不同,如: const int *p; /*P是一个可修改的指针,指向一个只读的int值*/ int *const p=i; /*P是一个只读的指针,指向一个可修改的int值*/ const int * const p=i; /*P是一个只读的指针,指向一个只读的int值*/ 在嵌入式系统编程时,const修饰的变量应该把它看成一种常量,常量值存储在ROM中。 5.4.2 变量存储空间分配 嵌入式内部数据存储器RAM只有几百字节,如果通过扩展外部存储器RAM来提高数据存储量必将会增加了硬件成本,使系统更加的复杂,访问外部存储器比访问内部存储器所需的代码也要长得多。有效地使用片内存储器、提高存储器空间的利用率对开发者来说十分关键。 内部处理器、内部堆栈、压缩栈、所有程序变量和所有包含进来的库函数都将使用数量有限的内部数据存储器RAM。因为C语言采用了存储器的覆盖技术,可以在程序进行连接时,它将那些已经被其它程序段释放了的存储器空间重新定义给另一个程序段的变量使用,当这个程序运行结束时再将这些存储器释放以供其它程序段使用。全局变量的作用范围是整个程序,因此不能被释放;静态变量由于在函数的调用中也不能被释放;只有局部变量中的动态变量可以被释放。 因此在进行程序设计时应该尽量的使用局部变量,提高内部数据存储器的使用率。在C语言中程序中间结果及参数传递是通过内部的寄存器来完成的,要是内部的存储器不够,将会给你的程序带来许多莫名其妙的错误。例如在进行程序设计时语句不应太长,一条长语句可以分成多条语句,这样可以减少中间变量。若语句太长可能造成临时寄存器不够

文档评论(0)

wangz118 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档