发 帖  
原厂入驻New

[经验] 了解C编程中的变量

2020-9-8 21:03:22  323 c语言 变量
分享
3
我们中的许多人早在对计算机编程了解甚多之前就已经在数学课上听说过“变量”一词。数学变量是其值未知或不限于一个数值的数量。这种用法类似于C变量的概念,尽管不尽相同。两个重要的区别是:首先,在数学中,我们通常使用诸如xy之类的字母表示变量,而在C中,我们经常使用诸如temperatureMaxValueNumber_of_Samples之类的描述性单词或短语。其次,在某些情况下,我们使用C变量来标识一个既已知又无意与原始值不同的数量。

硬件变量变量对于程序员而言既方便又直观。另一方面,对于计算硬件,它们没有实际意义。微处理器将数据存储在寄存器和存储器位置中。诸如C之类的高级语言克服了编写固件的人与执行固件的机器之间的根本区别,该语言处理与基于文本的变量和处理器的物理现实之间的转换相关的各种细节。
嵌入式系统的设计人员通常使用8位处理器。在这些设备中,数据的基本大小始终为一个字节。内存按字节组织,寄存器的大小为一个字节,CPU本身设计为处理8位数据。这是一个相当尴尬的限制,因为在许多情况下,变量的值将超过8位数字的最大值。


最后,所有经过仔细定义,巧妙命名的C变量最终都将作为内存(或寄存器)中的位。
即使使用8位处理器,C语言也不会将变量的大小限制为8位。这意味着固件中的一个变量可以对应于硬件中的多个寄存器或存储器位置。“手动”管理多字节变量(即,通过汇编语言)并不是我的乐趣,但编译器根本不介意,而且做得很好。

定义变量使用变量的第一步是定义该变量。变量定义的基本组成部分是类型和名称。
有很多变量类型。完整列表以及硬件实现的详细信息将根据您使用的编译器而有所不同。这里有些例子:
  • char:一个一字节的有符号值
  • int:两字节或四字节的有符号值
  • long:一个四字节的有符号值
  • float:一个四字节的值,可以在小数点后有数字-换句话说,它不限于整数
  • bit:变量的值可以为零或一


这是根据变量是被解释为带符号(使用二进制补码)还是无符号来不同地解释一系列位的直观表示。有关更多信息,请参见本文。
以下代码显示了仅由基本类型和名称组成的变量定义(引用该名称的更多技术方法是“标识符”):
  1. int ADC_result;
  2. char ReceivedByte;
  3. float Reference_Voltage;
复制代码

初始化变量在许多情况下,给变量一个初始值是一个好主意。这有助于调试,并且在将变量设置为已知值之前使用该变量至关重要。您可以在定义中或代码的其他地方初始化变量,但是在定义中包含初始值是保持代码井井有条并养成在必要时保持一致初始化的习惯的好方法。
以下是包含初始化的变量定义的示例:
  1. int ADC_result = 0;
  2. char ReceivedByte = 0x00;
  3. float Reference_Voltage = 2.4;
复制代码
微调变量定义变量定义中可以包含其他各种词。这些用于更精确地指定变量的性质或为编译器提供有关如何在硬件中实现该变量的指令
以下关键字在您的固件项目中可能很有用:
  • unsigned:您可能已经猜到了,这告诉编译器将变量解释为无符号值而不是有符号值。我将大多数变量定义为无符号的,因为我很少需要负数。
  • const:const类型限定符向编译器指示变量的值不得更改。正如我在本文开头所提到的,有时C“变量”的值不是变量。如果您在代码中输入错误,并尝试修改const变量的值,则编译器将生成错误。
  • volatile:复杂的编译器不仅获取原始代码并将其直接转换为汇编语言。他们还尝试使代码更有效地运行,此过程称为“优化”。通常,优化是一件好事。但是,有时编译器会仅根据代码进行优化,并且无法考虑与您的代码进行交互的硬件事件,因此有时会毁了您的一天。当变量具有易失性类型限定符时,编译器知道必须谨慎对待与该变量相关的优化。


中断可能导致变量的值以编译器无法预期的方式被修改,这可能导致优化出现问题。
  • 内存类型,例如xdataidatacode:这些词迫使编译器在微处理器内存的特定部分中定位变量。该代码存储器类型是特别方便:在微控制器RAM资源往往远远超过非易失性程序存储器的限制,并且代码存储器类型,您可利用额外的程序存储器,用于存储数据是使用你的程序,但从来没有修改


这里有些例子:
  1. unsigned char UART_byte;   // The variable’s range of acceptable values is 0 to 255.
  2. const float PI = 3.14159;
  3. volatile unsigned char ADC_Register   // The register can be modIFied by hardware, so we use the volatile qualifier to avoid optimizations that would cause the program to ignore hardware-generated events.
  4. unsigned char code CalibrationValue = 78;
复制代码
使用变量定义变量后如何使用它们并没有太多要说的。实际上,关于变量本身,定义是大部分工作。之后,您只需将变量的标识符合并到数学运算,循环,函数调用等中。一个好的编译器不仅会处理硬件实现的细节,还会寻找在执行速度或程序大小方面优化代码的方法。
与变量用法有关的最常见错误可能是溢出。这是指分配给变量的值超出与变量的数据类型关联的数值范围的情况。您必须考虑与给定变量相关的所有可能情况,然后相应地选择数据类型。

结论
C语言提供的基本变量功能是直观而直接的,但是有很多细节可以帮助您使嵌入式应用程序更可靠,更高效。如果您对C变量有任何疑问,请在下面的评论部分中提及它们,我们将尝试将相关信息纳入以后的文章中。


评论

高级模式
您需要登录后才可以回帖 登录 | 注册

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容图片侵权或者其他问题,请联系本站作侵删。 侵权投诉
发经验
关闭

站长推荐 上一条 /8 下一条

快速回复 返回顶部 返回列表