¿Cómo almacenar una variable en una ubicación de memoria específica?

Como soy relativamente nuevo en C, debo usar lo siguiente para uno de mis proyectos: debo declarar algunas variables globales que deben almacenarse cada vez que el progtwig se ejecuta en la misma dirección de memoria. Leí un poco y descubrí que si lo declaro “estático” se almacenará en la misma ubicación de memoria.

Pero mi pregunta es: ¿puedo indicar el progtwig donde almacenar esa variable o no? Por ejemplo: int a para ser almacenado en 0xff520000. ¿Se puede hacer esto o no? He buscado aquí, pero no encontré ningún ejemplo relevante. Si hay alguna publicación antigua sobre esto, por favor, comparta el enlace.

Gracias a todos de antemano. Laurentiu

Actualización: estoy usando un 32uC

En su IDE habrá un mapa de memoria disponible a través de algún archivo enlazador. Contendrá todas las direcciones en el progtwig. Lea el manual de MCU para ver en qué direcciones hay memoria válida para su propósito, luego reserve algo de esa memoria para su variable. Tienes que leer la documentación de tu plataforma de desarrollo específica.

A continuación, tenga en cuenta que no tiene mucho sentido asignar variables a direcciones específicas a menos que sean registros de hardware o variables no volátiles que residan en flash o EEPROM.

Si el contenido de tal ubicación de memoria cambiará durante la ejecución, porque es un registro, o porque su progtwig contiene un algoritmo de progtwigción de arranque / NVM que cambia las celdas de memoria NVM, entonces las variables deben declararse como volátiles. De lo contrario, el comstackdor romperá su código completamente después de la optimización.

Lo más probable es que el comstackdor en particular tenga una forma no estándar de asignar variables a direcciones específicas, como un #pragma o, a veces, el operador @ extraño y no estándar. La única manera sensata de asignar una variable en una ubicación fija en el estándar C es la siguiente:

 #define MY_REGISTER (*(volatile uint8_t*)0x12345678u) 

donde 0x12345678 es la dirección donde se ubica 1 byte. Una vez que tenga una statement de macro como esta, puede usarla como si fuera una variable:

 void func (void) { MY_REGISTER = 1; // write int var = MY_REGISTER; // read } 

La mayoría de las veces, desea que este tipo de variables residan en el espacio de nombres global, por lo tanto, la macro. Pero si por alguna razón quiere que se reduzca el scope de la variable, entonces omita la macro y acceda a la dirección manualmente dentro del código:

 void func (void) { *(volatile uint8_t*)0x12345678u = 1; // write int var = *(volatile uint8_t*)0x12345678u; // read } 

Puede hacer este tipo de cosas con scripts de vinculador, que es bastante común en la progtwigción integrada.

En un sistema Linux, es posible que nunca obtenga la misma dirección virtual debido a la aleatorización del espacio de direcciones (una característica de seguridad para evitar explotaciones que dependen de conocer la ubicación exacta de una variable como la que describe).

Si solo desea un puntero repetible, puede asignar una dirección específica con mmap , pero eso no está garantizado.

No, no puede decirle explícitamente dónde almacenar una variable en la memoria. Sobre todo porque en los sistemas modernos tienes muchas cosas que el sistema hace con respecto a la memoria, eso está fuera de tu control. Dirigir la asignación al azar es una cosa que me viene a la mente que haría esto muy difícil.

Como se mencionó en otras respuestas, no puedes. Pero, puedes tener una solución. Si está bien que los globales se inicialicen en main() , puedes hacer algo de este tipo:

 int addr = 0xff520000; int main() { *((int*)addr) = 42; ... return 0; } 

Sin embargo, tenga en cuenta que esto depende mucho de su sistema y si se ejecuta en un entorno protegido, lo más probable es que sufra un locking en el tiempo de ejecución. Si está en un entorno integrado / no protegido, esto puede funcionar.

No en el nivel C. Si trabaja con lenguaje ensamblador, puede controlar directamente el diseño de la memoria. Pero el comstackdor de C hace esto por ti. Realmente no puedes meterte con eso.

Incluso con el assembly, esto solo controla el diseño relativo. La memoria virtual puede colocar esto en cualquier ubicación física (in) conveniente.

Puedes hacer esto con algunas extensiones de comstackdor, pero probablemente no sea lo que quieres hacer. El sistema operativo maneja tu memoria y pondrá las cosas donde quiera. ¿Cómo sabe siquiera que la dirección de memoria que desea se asignará en su progtwig? Ignore todo lo que se encuentra en este párrafo si está en una plataforma integrada, entonces debe leer el manual de esa plataforma / comstackdor o al menos mencionarlo aquí para que las personas puedan dar una respuesta más específica.

Además, las variables estáticas no necesariamente tienen la misma dirección cuando se ejecuta el progtwig. Muchos sistemas operativos utilizan ejecutables independientes de la posición y aleatorizan el espacio de direcciones en cada ejecución.

Puede declarar un puntero a una dirección de memoria específica y usar el contenido de ese puntero como una variable que supongo:

 int* myIntPointer = 0xff520000;