Wed. Aug 17th, 2022

Este artículo analiza la naturaleza y el uso de las variables en lenguaje C en el contexto de las aplicaciones integradas.

información de soporte

Muchos de nosotros escuchamos la palabra "variable" en las clases de matemáticas mucho antes de saber mucho, si es que sabemos algo, acerca de la programación de computadoras. Una variable matemática es una cantidad cuyo valor no se conoce o no se limita a un número. Este uso es similar, aunque no idéntico, al concepto de una variable C. Dos diferencias importantes son: Primero, en matemáticas, usualmente usamos una letra como X o y para representar una variable, mientras que en C usamos con frecuencia una palabra o frase descriptiva como temperatura, Valor máximoo Número de muestras. En segundo lugar, hay situaciones en las que usamos una variable de C para identificar una cantidad que es conocida y no pretende ser nunca diferente del valor original.

Variables en Hardware

Las variables son convenientes e intuitivas para los programadores. Para el hardware computacional, por otro lado, no tienen un significado real. Los microprocesadores almacenan datos en registros y ubicaciones de memoria. Esta diferencia fundamental entre las personas que escriben firmware y las máquinas que ejecutan el firmware se supera mediante lenguajes de alto nivel como C, que maneja varios detalles asociados con la traducción entre variables basadas en texto y la realidad física de un procesador.

Los diseñadores de sistemas integrados a menudo trabajan con procesadores de 8 bits. En estos dispositivos, el tamaño fundamental de los datos es siempre un byte. La memoria se organiza de acuerdo con los bytes, el tamaño de los registros es de un byte y la CPU está diseñada para procesar datos de 8 bits. Esta es una limitación bastante incómoda porque hay muchas situaciones en las que el valor de una variable excederá el valor máximo de un número de 8 bits.

Al final, todas sus variables C cuidadosamente definidas y hábilmente nombradas terminan como bits en la memoria (o registros).

El lenguaje C no limita el tamaño de una variable a 8 bits, incluso cuando está trabajando con un procesador de 8 bits. Esto significa que una variable en su firmware puede corresponder a múltiples registros o ubicaciones de memoria en el hardware. "Manualmente" administrar variables multibyte (es decir, a través del lenguaje ensamblador) no es mi idea de diversión, pero a los compiladores no les importa en absoluto, y hacen el trabajo muy bien.

Definiendo variables

El primer paso para usar una variable es definir esa variable. Los componentes esenciales de una definición de variable son el tipo y el nombre.

Hay muchos tipos de variables; La lista completa, así como los detalles de la implementación del hardware, variarán según el compilador que estés usando. Aquí hay unos ejemplos:

  • carbonizarse: un valor de un byte firmado
  • En t: un valor firmado de dos o cuatro bytes
  • largo: un valor firmado de cuatro bytes
  • flotador: un valor de cuatro bytes que puede tener números después del punto decimal; en otras palabras, no está limitado a enteros
  • poco: el valor de la variable puede ser cero o uno

Cómo se interpreta de manera diferente una serie de bits en función de si una variable se interpreta como con signo o sin signo.

Esta es una representación visual de cómo una serie de bits se interpreta de manera diferente en función de si una variable se interpreta como firmada (utilizando la notación de complemento de dos) o sin firmar. Vea este artículo para más información.

El siguiente código muestra definiciones de variables que consisten solo en un tipo básico y un nombre (la forma más técnica de referirse al nombre es “identificador”):

                    int ADC_result;
char ReceivedByte;
flotador Referencia_Voltaje;
                  

Inicializando la Variable

En muchos casos, es una buena idea darle un valor inicial a una variable. Esto facilita la depuración y es esencial si la variable se usará antes de que se establezca en un valor conocido. Puede inicializar una variable en la definición o en otra parte de su código, pero incluir el valor inicial en la definición es una buena manera de mantener su código organizado y desarrollar el hábito de inicializar constantemente cuando sea necesario.

Aquí hay ejemplos de definiciones de variables que incluyen la inicialización:

                    int ADC_result = 0;
char ReceivedByte = 0x00;
flotante Reference_Voltage = 2.4;
                  

Definiciones de variables de ajuste fino

Hay varias otras palabras que se pueden incluir en una definición de variable. Estos se utilizan para especificar con mayor precisión la naturaleza de la variable o para dar instrucciones al compilador sobre cómo implementar la variable en el hardware.

Las siguientes palabras clave podrían ser útiles en sus proyectos de firmware:

  • no firmado: Como habrás adivinado, esto le dice al compilador que interprete la variable como un valor sin signo en lugar de un valor con signo. Defino la mayoría de mis variables como sin signo, porque rara vez necesito números negativos.
  • const: El calificador de tipo const indica al compilador que el valor de una variable no debe cambiar. Como mencioné al principio del artículo, a veces el valor de una "variable" C no es variable. Si comete un error en su código e intenta modificar el valor de una variable const, el compilador generará un error.
  • volátil: Los compiladores sofisticados no solo toman su código original y lo traducen directamente al ensamblaje. También intentan hacer que el código funcione de manera más eficiente, y este proceso se conoce como "optimización". En general, la optimización es algo bueno. Sin embargo, de vez en cuando, puede arruinar tu día, porque el compilador se optimiza solo en función del código y no puede tener en cuenta los eventos de hardware que interactúan con tu código. Cuando una variable tiene el calificador de tipo volátil, el compilador sabe que debe tener cuidado con las optimizaciones relacionadas con esa variable.

Una interrupción puede hacer que el valor de una variable se modifique de una manera que el compilador no espera, y esto puede llevar a una optimización problemática.

Una interrupción puede hacer que el valor de una variable se modifique de una manera que el compilador no espera, y esto puede llevar a una optimización problemática.

  • tipos de memoria, tales como xdata, idatay código: Estas palabras obligan al compilador a ubicar una variable en una parte específica de la memoria del microprocesador. El tipo de memoria de código es particularmente útil: los recursos de RAM en un microcontrolador a menudo son mucho más limitados que la memoria de programa no volátil, y el tipo de memoria de código le permite utilizar memoria de programa adicional para almacenar datos usado en tu programa pero nunca modificado.

Aquí hay unos ejemplos:

                    unsigned char UART_byte; // El rango de valores aceptables de la variable es de 0 a 255.
const float PI = 3.14159;
volatile unsigned char ADC_Register // El registro puede ser modificado por el hardware, por lo que usamos el calificador volátil para evitar optimizaciones que podrían hacer que el programa ignore los eventos generados por el hardware.
código de calibración sin firmar CalibrationValue = 78;
                  

Usando tus variables

No hay mucho que decir acerca de cómo usar sus variables después de que se hayan definido. En realidad, con respecto a la variable en sí, la definición es la mayor parte del trabajo. Después de eso, simplemente incorporas el identificador de la variable en operaciones matemáticas, bucles, llamadas a funciones, etc. Un buen compilador no solo manejará los detalles de la implementación del hardware sino que también buscará formas de optimizar el código con respecto a la velocidad de ejecución o el tamaño del programa.

Quizás el error más común relacionado con el uso variable es un desbordamiento. Esto se refiere a una situación en la que el valor asignado a una variable está fuera del rango numérico asociado con el tipo de datos de la variable. Debe pensar en todos los escenarios posibles relacionados con una variable determinada y luego elegir el tipo de datos en consecuencia.

Conclusión

La funcionalidad básica de la variable proporcionada por el lenguaje C es intuitiva y directa, pero hay algunos detalles que pueden ayudarlo a hacer que una aplicación integrada sea más confiable y eficiente. Si tiene alguna pregunta relacionada con las variables de C, no dude en mencionarlas en la sección de comentarios a continuación, e intentaremos incorporar la información relevante en los artículos futuros.

By Maria Montero

Me apasiona la fotografía y la tecnología que nos permite hacer todo lo que siempre soñamos. Soñadora y luchadora. Actualmente residiendo en Madrid.