una - Diferencia entre variables globales y variables declaradas en main en ARM C
variables globales y locales en visual basic (3)
- El compilador colocará variables globales en el segmento de memoria "datos" o "bss". Esta asignación es permanente, por lo que la variable nunca perderá su valor. Las variables locales de función se asignan dinámicamente en la pila y desactivas cuando la función retorna.
- Use variables globales cuando la variable debe mantener su valor entre llamadas a funciones, y debe ser accesible por código en múltiples funciones y / o archivos. Use variables de función local para todo lo demás.
También hay variables "estáticas". Funcionan de la misma manera que las variables globales, pero tienen un espacio de nombres más limitado. Se utilizan como variables locales de archivo y variables locales de función que mantienen su valor entre llamadas de función.
He intentado usar C
en Keil
para escribir un código de prueba para mi TM4C123G
, que usa un microcontrolador ARM
. No tengo ni idea sobre el ARM assembly
, pero he escrito algún código de ensamblaje para un AVR microcontroller
en el pasado.
¿Dónde se almacenan los valores de las variables, si declaramos una variable en C como global
, en lugar de declararla en main
?
¿Existen pautas generales sobre si debemos declarar una variable global
en lugar de en main
(cuando se trata de escribir C para un microcontrolador)?
Los Globals en ARM hacen que se coloque un desplazamiento en el área de "grupo" de la función de llamada. En general, cada global necesita su propia compensación. Si decide utilizar globales, colóquelos en una única estructura para que se pueda acceder a todas las variables a través de un desplazamiento de grupo singel.
Las variables definidas en el nivel de función viven en la pila. A estos, dentro de lo razonable, se puede acceder con un desplazamiento más simple desde el registro de la pila y tienden a ser un código de operación más eficiente y quizás más eficiente en función del caché, dependiendo del tipo de sistema que esté utilizando.
Cuándo usar cualquiera? Fuera de las guerras santas globales vs. locales de mantenibilidad, todo se reduce a lo que tu código quiere hacer. Si se está usando una variable en una tonelada de lugares y no quiere pasarla como un parámetro (una señal de que tal vez su diseño necesita funcionar ...) entonces un global sería el camino a seguir. Si necesita acceder a esta variable en varios paquetes de ensamblador (esa cosa de diseño otra vez ...) entonces quizás un global también está bien.
La mayoría de las veces, sin embargo, me gustaría ir con variables locales. Son mucho más seguros para subprocesos, y desde arriba, tienden a ser más eficientes. También son más fáciles de mantener, porque su alcance es mucho más limitado, lo que también ayuda a los compiladores a mejorar el trabajo allí también.
Los Globales están bien, tienen un lugar especialmente en cosas integradas como microcontroladores, donde tienes recursos muy limitados. Globals hace que sea más fácil administrar sus recursos donde los locales son muy dinámicos y difíciles para no meterse en problemas.
Pero ... En lo que respecta al montaje, no hay reglas, no existe realmente una noción de local versus global que sea estrictamente un lenguaje de nivel superior. Ahora puede haber implementaciones de lenguajes ensamblados que permitan / fuercen tales cosas, entiendan que C es un estándar (como otros) que cruzan plataformas y no son específicos de uno. Pero el ensamblaje no solo no tiene un estándar, sino que también es específico del procesador. el ensamblador define el lenguaje ensamblador (el programa que lo analiza y lo convierte en código de máquina). Y cualquiera y su hermano pueden golpear a un ensamblador e inventar el lenguaje o las reglas que quieran.
En general, si está tratando de implementar manualmente el código C en ensamble en lugar de hacer que el compilador lo haga (o en lugar de simplemente hacer que el compilador lo haga y al menos ver lo que hace). Tus globales a menos que estén optimizados obtendrán un hogar en ram. Los lugareños pueden o no, dependiendo de la optimización, obtener un lugar en la pila, pueden vivir temporalmente en registros, depende del número de registros del procesador disponibles, la compensación entre la preservación de registros que contienen algo más para preservar el local a favor de mantener el algo más en un registro.
Deberías simplemente tomar algunas funciones simples (no necesariamente programas completos) y ver qué hace el compilador.
si quieres escribir en ensamblaje puro y no tener la noción de convertir C, aún tendrías el mismo dilema de mantener algo en un registro durante mucho tiempo, ¿lo pongo en la pila durante este trozo de código o le asigno una dirección donde vive para siempre.
Sugiero que seas de mente abierta y trates de entender los porqués y por qué no, muchas de estas clases de reglas, no globales, pequeñas funciones, etc. son predicadas no por hechos sino solo por fe, alguien en quien confío me lo dijo, así que Predique también, no siempre, pero a veces puede cavar y descubrir que el miedo es real o que el miedo no es real, o tal vez se aplicó hace 30 años pero ya no, y así sucesivamente. Una alternativa a un global, por ejemplo, es un local en un nivel principal () o superior que sigas transmitiendo mientras anidas, lo que básicamente significa que es global desde la perspectiva de los recursos. De hecho, dependiendo del compilador (uno extremadamente popular en particular) ese nivel local principal que se transmite, en realidad consume recursos en cada nivel de anidación consumiendo una cantidad de RAM significativamente mayor que si acabara de declararse como global. Por otro lado, si no es el consumo de memoria ineficiente, pero el acceso, que puede meterse con esa variable y que no puede, los locales lo hacen bastante fácil, una buena cantidad de pereza, puede ser complicado. Hay que tener cuidado con los globales para no estropearlos. Tenga en cuenta que los locales estáticos también son globales desde una perspectiva de recursos, ya que se encuentran en el mismo espacio de datos para la duración del programa.
Hay una razón, muchas razones por las que C no puede morir. No ha aparecido nada que pueda reemplazarlo. Hay una razón por la cual es básicamente el primer compilador para cada nuevo conjunto de procesador / instrucción.
Escriba algunas funciones simples, compílelas, desmonte, vea qué se produce. tome algunas de sus aplicaciones de metal integrado / desnudo para estas plataformas, desmonte, vea lo que el compilador ha hecho. Globales y locales estáticos que no se pueden optimizar reciben una dirección en .data. A veces, algunos o todos los parámetros entrantes obtienen ubicaciones de pila y, a veces, algunas o todas las variables locales también consumen pila, tiene que ver con el compilador y la optimización si elige optimizar. También depende de la arquitectura un CISC que puede hacer memoria y registrar o memoria en operaciones de memoria no tiene que mover cosas dentro y fuera de los registros todo el tiempo RISC a menudo tiene que usar registros exclusivamente o a menudo usa registros, pero también suele tener un montón más disponible. Entonces el compilador lo sabe y administra el hogar para las variables como resultado.
Todo el mundo va a poner globales y estáticos locales en ram (a menos que puedan optimizar). El x86 tradicional trae los parámetros en la pila de todos modos y también va a poner a los lugareños allí y acceder a ellos allí. a mips o brazo va a tratar de minimizar la cantidad de ram utilizado, y apoyarse en registros, tratando de mantener algunas de las variables en registros exclusivamente y no consumir stack.
Un programador de ensambles, precompiladores, usó mucho del equivalente de globales, elige una dirección para cada variable. ahora post compiladores, puedes elegir simplemente hacerlo de esa manera configurar todas tus variables y apenas usar la pila aparte de regresar de las llamadas, o puedes programar como si fueras un compilador y hacer algunas reglas o simplemente seguir la convención de compiladores y tener algunos registros desechables y otros preservados y apoyados en la pila para la preservación y local para los elementos de la función.
Al final del día, aunque el ensamblado no tiene una noción de global vs local más de lo que tiene una noción de signo vs vs vs vs vs matriz o algo así como un lenguaje de alto nivel.