¿Es seguro definir una sección de memoria en varias memorias físicas?

4

Estoy trabajando en la asignación de memoria en mi MCU. Digamos que tengo este mapeo de física para recuerdos:

 0x1000
     RAM 0
 0x2000
     RAM 1
 0x3000

Entonces tengo asignación de memoria. En esta parte, la RAM 1 no se utiliza como un todo:

RAM0 : origin = 0x1000, length = 0x1000
RAM1 : origin = 0x2000, length = 0x400  // <= Only 1Ko used

Luego tengo secciones:

.stack : > RAM0
.ebss  : > RAM1

Esto es solo un ejemplo, ya que no es la realidad de mi proyecto.

Para evitar perder memoria en la RAM 1, me gustaría crear una asignación de memoria en ambas memorias:

RAM0_M1PART1 : origin = 0x1000, length = 0x1C00  // <= Added 3Ko here
RAM1_PART2   : origin = 0x2C00, length = 0x400   // Moved at the end of the range (2C00 -> 3000)

La pregunta es bastante simple : ¿es segura?

¡Gracias!

    
pregunta Plouff

3 respuestas

1

Dependiendo de la arquitectura de la MCU en particular, tratar diferentes bloques de memoria física como un área contigua puede o no ser seguro. Los bloques pueden especificarse por separado simplemente porque así se definen en el hardware, o pueden ser diferentes tipos de memoria que requieren diferentes procedimientos para acceder (por ejemplo, Flash vs RAM, RAM interna vs. RAM externa) o tienen acceso restringido ( por ejemplo, el puntero de pila solo puede dirigirse a un área fija pequeña de la RAM, el controlador DMA está conectado a un bloque en particular).

El propósito de la asignación de memoria es decirle al compilador cómo usar la memoria. El compilador normalmente espera que diferentes secciones estén separadas unas de otras, ya sea en los mismos o diferentes bloques de memoria física. Si una sección se asigna sobre otra, intentará usar esa misma memoria para diferentes propósitos, lo que podría hacer que el programa falle (por ejemplo, la pila se ejecuta en bss y las variables corruptas). Esto obviamente no es seguro !

La única vez que es seguro asignar una sección sobre otra es si pretende que la memoria se use para diferentes propósitos en diferentes puntos del programa, y sabe que el compilador no confundirse por este doble uso.

Entonces, en su ejemplo donde desea 3k más en la primera sección, primero verifique que el hardware sea capaz de usar los dos bloques de RAM de forma contigua para ese propósito (por ejemplo, el puntero de pila no está restringido al primer bloque). Luego, asigne la segunda sección en el área libre que queda, así: -

RAM0_M1PART1 : origin = 0x1000, length = 0x1C00  // <= Added 3Ko here
RAM1_PART2   : origin = 0x2C00, length = 0x400
    
respondido por el Bruce Abbott
3

Hay varias interpretaciones de 'seguro'.

Uno es, ¿puede el procesador acceder a los bloques de RAM como bloques contiguos?

Eso se describirá en la hoja de datos de la pieza. Yo esperaría que los microcontroladores con RAM separada pero adyacente pudieran tener algunas restricciones. Por ejemplo, puede que no haya restricciones para la CPU, pero el bus puede impedir el acceso a algunos bloques por parte de DMA.

Por lo tanto, puede desarrollar un programa y luego descubrir que necesita usar DMA. Ese sería un momento en que el comportamiento podría volverse "inseguro". Rastrear el error podría ser difícil si la memoria necesaria en las transferencias de DMA está cruzando y desviando el límite de la memoria a medida que el programa evoluciona.

Un segundo uso de diferentes nombres de segmentos para la misma memoria es "reutilizar" la memoria en diferentes etapas del ciclo de vida de un programa. Por ejemplo, algunos bloques de variables pueden ser necesarios durante una fase temprana de la vida del programa, por ejemplo, para la inicialización, pero nunca más tarde. Por lo tanto, podría tener las variables de "superposición" del vinculador con tiempos de vida diferentes. Esto puede ser difícil de depurar y hacer que el mantenimiento sea mucho más difícil porque su programa está administrando la vida útil de sus variables.

¿Para qué va a utilizar los segmentos de memoria alternativos (RAM0, RAM1, RAM0_M1PART1 y RAM1_PART2) para?

¿Planea pedirle al vinculador que coloque variables o código en los cuatro segmentos de memoria dentro de un programa? Como se explicó anteriormente, es poco probable que esto sea seguro a menos que se administre cuando los segmentos de memoria alternativos están 'vivos', de modo que sus vidas no se superpongan.

    
respondido por el gbulmer
2

Para muchos tipos de acceso a la memoria, el procesador no tendrá ninguna razón para preocuparse por los límites entre las secciones de memoria. Sin embargo, hay ocasiones en que puede ser importante. En algunos DSP de TI, por ejemplo, hay regiones de memoria (llamadas DARAM, RAM de doble acceso) que pueden, al usar una instrucción especial, haber leído una palabra y copiarla sobre la palabra anterior. Sin embargo, esas instrucciones fallarán si se usan en la primera palabra de una de esas regiones de memoria, ya que no hay un mecanismo para seleccionar una región para la lectura y otra para la escritura. Sin embargo, a menos que uno use dichos mecanismos, la mayoría de las operaciones individuales se llevarán a cabo completamente dentro de una sola región de memoria, y al procesador no le importará si las diferentes operaciones en una secuencia provienen de diferentes lugares.

    
respondido por el supercat

Lea otras preguntas en las etiquetas