{"id":1311,"date":"2020-02-03T16:54:38","date_gmt":"2020-02-03T16:54:38","guid":{"rendered":"http:\/\/robots-argentina.com.ar\/didactica\/?p=1311"},"modified":"2020-11-02T00:56:00","modified_gmt":"2020-11-02T00:56:00","slug":"comprendiendo-variables-al-programar-en-c","status":"publish","type":"post","link":"https:\/\/robots-argentina.com.ar\/didactica\/comprendiendo-variables-al-programar-en-c\/","title":{"rendered":"Comprendiendo Variables al programar en C"},"content":{"rendered":"

Este es un an\u00e1lisis de la naturaleza y el uso de las variables en lenguaje C en el contexto de las aplicaciones para microcontroladores<\/strong><\/p>\n

\"\"<\/a><\/p>\n

Muchos de nosotros escuchamos la palabra \u00abvariable\u00bb en las clases de matem\u00e1ticas mucho antes de saber mucho, si es que sabemos algo, acerca de la programaci\u00f3n de computadoras. Una variable matem\u00e1tica es una cantidad cuyo valor no se conoce o no se limita a un n\u00famero. Este uso es similar, aunque no id\u00e9ntico, al concepto de una variable C.<\/p>\n

Dos diferencias importantes: primero, en matem\u00e1ticas, usualmente usamos una letra como x o y para representar una variable, mientras que en C usamos frecuentemente una palabra o frase descriptiva como contadorPulsos<\/em><\/strong>, velocidadMedia<\/em><\/strong> o cantidadVueltas<\/em><\/strong>. En segundo lugar, hay situaciones en las que usamos una variable de C para identificar una cantidad conocida y que no se pretende que cambie del valor original.<\/p>\n

Variables en hardware<\/strong><\/p>\n

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 el idioma de m\u00e1quina y las m\u00e1quinas que ejecutan este programa se supera mediante lenguajes de alto nivel como C, que maneja varios detalles asociados con la traducci\u00f3n entre variables basadas en texto y la realidad f\u00edsica de un procesador.<\/p>\n

Los dise\u00f1adores de sistemas integrados trabajan a menudo con procesadores de 8 bits. En estos dispositivos, por lo general, el tama\u00f1o fundamental de los datos es un byte<\/strong>. La memoria se organiza de acuerdo con los bytes, el tama\u00f1o de los registros es de un byte<\/strong> y la CPU est\u00e1 dise\u00f1ada para procesar datos de 8 bits. Esta es una limitaci\u00f3n bastante inc\u00f3moda porque hay muchas situaciones en las que el valor de una variable exceder\u00e1 el valor m\u00e1ximo de un n\u00famero de 8 bits.<\/p>\n

\"\"<\/a>

Finalmente, todas las variables C cuidadosamente definidas y con un nombre ilustrativo terminan como bits en la memoria (o registros)<\/b><\/p><\/div>\n

El lenguaje C no limita el tama\u00f1o de una variable a 8 bits, incluso cuando est\u00e1 trabajando con un procesador de 8 bits. Esto significa que una variable en el programa en lenguaje de m\u00e1quina que ejecuta el microprocesador puede corresponder a m\u00faltiples registros o ubicaciones de memoria en el hardware. \u00abManualmente\u00bb administrar variables de m\u00faltiples bytes (es decir, a trav\u00e9s del lenguaje ensamblador) no parece muy deseable, pero a los compiladores no les importa en absoluto, y hacen el trabajo muy bien.<\/p>\n

Definiendo variables<\/strong><\/p>\n

El primer paso para usar una variable es definir esa variable. Los componentes esenciales de una definici\u00f3n de variable son el tipo y el nombre.<\/p>\n

Hay muchos tipos de variables; La lista completa, as\u00ed como los detalles de la implementaci\u00f3n del hardware, variar\u00e1n seg\u00fan el compilador que est\u00e9 utilizando. Aqu\u00ed hay unos ejemplos:<\/p>\n

\u25a0 char<\/strong> : un valor con signo de un byte
\n\u25a0 int<\/strong> : un valor con signo de dos o cuatro bytes
\n\u25a0 long<\/strong> : un valor con signo de cuatro bytes
\n\u25a0 float<\/strong> : un valor de cuatro bytes que puede tener n\u00fameros despu\u00e9s del punto decimal; en otras palabras, no est\u00e1 limitado a enteros
\n\u25a0 bit<\/strong> : el valor de la variable puede ser cero o uno<\/p>\n

Esta es una representaci\u00f3n visual de c\u00f3mo una serie de bits se interpreta de manera diferente en funci\u00f3n de si una variable se considera con signo (utilizando la notaci\u00f3n de complemento a dos) o sin signo:<\/p>\n

\"\"<\/a><\/p>\n

El siguiente c\u00f3digo muestra definiciones de variables que consisten solo en un tipo b\u00e1sico y un nombre (la forma m\u00e1s t\u00e9cnica de referirse al nombre es \u00abidentificador\u00bb):<\/p>\n

int ADC_result;\r\nchar ReceivedByte;\r\nfloat Reference_Voltage; \r\n<\/pre>\n

Inicializando variables<\/strong><\/p>\n

En muchos casos, es una buena idea darle un valor inicial a una variable. Esto facilita la depuraci\u00f3n y es esencial si la variable se utilizar\u00e1 antes de que le fije un valor conocido. Puede inicializar una variable en la definici\u00f3n, o en otra parte de su c\u00f3digo, pero incluir el valor inicial en la definici\u00f3n es una buena manera de mantener el c\u00f3digo organizado y desarrollar el h\u00e1bito de inicializar siempre que sea necesario.<\/p>\n

Aqu\u00ed hay ejemplos de definiciones de variables que incluyen una inicializaci\u00f3n:<\/p>\n

int ADC_resultado = 0;\r\nchar ReceivedByte = 0x00;\r\nfloat Referencia_Voltaje = 3.25;\r\n<\/pre>\n

Definiciones de variables delicadas<\/strong><\/p>\n

Hay varias otras palabras que se pueden incluir en una definici\u00f3n de variable. Estos se utilizan para especificar con mayor precisi\u00f3n la naturaleza de la variable o para dar instrucciones al compilador sobre c\u00f3mo implementar la variable en el hardware.<\/p>\n

Las siguientes palabras clave podr\u00edan ser \u00fatiles en sus proyectos de programa para microcontroladores:<\/p>\n

\u25a0 unsigned : como habr\u00e1 adivinado, esto le dice al compilador que interprete la variable como un valor sin signo en lugar de un valor con signo. Uno defino le mayor\u00eda de sus variables como sin signo, porque rara vez se necesitan n\u00fameros negativos.<\/p>\n

\u25a0 const : el calificador de tipo const indica al compilador que el valor de una variable no debe cambiar. Como dice al principio del art\u00edculo, a veces el valor de una \u00abvariable\u00bb C no es variable. Si usted comete un error en su c\u00f3digo e intenta modificar el valor de una variable const, el compilador generar\u00e1 un error.<\/p>\n

\u25a0 volatile : los compiladores sofisticados no solo toman su c\u00f3digo original y lo traducen directamente al lenguaje de m\u00e1quina. Tambi\u00e9n intentan hacer que el c\u00f3digo funcione de manera m\u00e1s eficiente, y este proceso se conoce como \u00aboptimizaci\u00f3n\u00bb. En general, la optimizaci\u00f3n es algo bueno. Sin embargo, de vez en cuando, puede arruinar el d\u00eda, porque el compilador se optimiza solo en funci\u00f3n del c\u00f3digo y no puede tener en cuenta los eventos de hardware que interact\u00faan con el c\u00f3digo. Cuando una variable tiene el calificador de tipo vol\u00e1til, el compilador sabe que debe tener cuidado con las optimizaciones relacionadas con esa variable.<\/p>\n

\"\"<\/a>

Una interrupci\u00f3n 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\u00f3n problem\u00e1tica<\/b><\/p><\/div>\n

\u25a0 tipos de memoria, como xdata , idata y code : estas palabras obligan al compilador a ubicar una variable en una parte espec\u00edfica de la memoria del microprocesador. El tipo que aloja en la memoria de programa es particularmente \u00fatil: los recursos de RAM en un microcontrolador a menudo son mucho m\u00e1s limitados que la memoria de programa no vol\u00e1til, y el tipo de memoria de c\u00f3digo le permite utilizar memoria de programa adicional para almacenar datos que se usan en su programa pero nunca se modifican.<\/p>\n

Aqu\u00ed hay unos ejemplos:<\/p>\n

unsigned char UART_byte; \/\/ The variable's range of acceptable values is 0 to 255. \r\nconst float PI = 3.14159; \r\nvolatile 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. *\/\r\nunsigned char code CalibrationValue = 78;\r\n<\/pre>\n

Uso de las variables<\/strong><\/p>\n

No hay mucho que decir acerca de c\u00f3mo usar sus variables despu\u00e9s de que se hayan definido. En realidad, con respecto a la variable en s\u00ed, la definici\u00f3n es la mayor parte del trabajo. Despu\u00e9s de eso, usted simplemente incorpora el identificador de la variable en operaciones matem\u00e1ticas, bucles, llamadas a funciones, etc. Un buen compilador no solo manejar\u00e1 los detalles de la implementaci\u00f3n del hardware, sino que tambi\u00e9n buscar\u00e1 formas de optimizar el c\u00f3digo con respecto a la velocidad de ejecuci\u00f3n o el tama\u00f1o del programa.<\/p>\n

Quiz\u00e1s el error m\u00e1s com\u00fan relacionado con el uso variable es un desbordamiento. Esto se refiere a una situaci\u00f3n en la que el valor asignado a una variable est\u00e1 fuera del rango num\u00e9rico asociado con el tipo de datos de la variable.<\/p>\n

Se debe pensar en todos los escenarios posibles relacionados con una variable determinada y luego elegir el tipo de datos en consecuencia.<\/p>\n

Resumen<\/strong><\/p>\n

La funcionalidad de la variable b\u00e1sica proporcionada por el lenguaje C es intuitiva y directa, pero hay algunos detalles que pueden ayudarlo a hacer que una aplicaci\u00f3n integrada sea m\u00e1s confiable y eficiente. Si tiene alguna duda relacionada con las variables de C, no dude en preguntar en nuestro grupo en Facebook Robots Did\u00e1cticos<\/a>.<\/p>\n


\n