una tarjeta programar moto microcontrolador memoria guardar externa eeprom dañada datos como ccs 18f4550 c microcontroller

tarjeta - moto c memoria externa



Cómo utilizar la memoria externa en un microcontrolador (2)

En general, así es exactamente como funciona. Debe configurar correctamente el hardware y / o el hardware puede que ya tenga las cosas codificadas en direcciones fijas.

Podría hacer la misma pregunta, ¿cómo sabe el hardware que cuando escribo un byte en la dirección 0x21000010 (acabo de hacer eso) que ese es el registro de espera de transmisión de uart y que eso significa que quiero enviar un byte? La respuesta porque está codificada en la lógica de esa manera. O la lógica podría tener un desplazamiento, la uart podría ser capaz de moverlo y podría estar en algún otro contenido de registro de control más 0x10. cambie ese registro de control (que a su vez tiene alguna dirección codificada) de 0x21000000 a 0x90000000 y luego escriba en 0x90000010 y otro byte sale de la uart.

Tendría que mirar esa parte en particular, pero si es compatible con la memoria externa, en teoría eso es todo lo que tiene que hacer para saber qué direcciones en el espacio de direcciones de los procesadores se asignan a esa memoria externa y las lecturas y escrituras causarán memoria externa accesos

Las computadoras basadas en Intel, las PC, tienden a gustar un gran espacio de direcciones, usan el comando lspci en su caja de Linux (si tiene uno) o algún otro comando si Windows o Mac, y encontrará que su tarjeta de video ha sido entregada. un trozo de espacio de direcciones. Si pasa a través de la protección de la cpu / sistema operativo y si escribe en una dirección en ese espacio, saldrá directamente del procesador a través de los controladores pcie y en la tarjeta de video, ya sea causando estragos o simplemente cambiando el color de un pixel Ya has tratado esto con tu avr y msp430s. Algunas direcciones en el espacio de direcciones son flash y otras son ram, hay algo de lógica fuera del núcleo de la CPU que analiza el bus de direcciones de los núcleos de CPU y toma decisiones sobre dónde enviar ese acceso. Hasta ahora, flash bank y ram bank y logic son todos autónomos dentro de los límites del chip, esto no es demasiado extenso más allá de lo que la lógica responde a una dirección, y de ahí crea un ciclo de memoria externa, cuando es listo o el resultado vuelve en una lectura, completa el ciclo de memoria interna y pasa a la siguiente cosa.

¿Eso tiene sentido o lo estoy empeorando?

En el pasado, he trabajado mucho con AVR de 8 bits y MSP430, donde tanto la memoria RAM como el flash se almacenaban directamente en el chip. Cuando compila y descarga su programa, este tipo de "simplemente funciona" y no necesita preocuparse por dónde y cómo se almacenan realmente las variables.

Ahora estoy empezando un proyecto en el que me gustaría poder agregar algo de memoria externa a un microcontrolador (un TI Stellaris LM3S9D92 si eso importa) pero no estoy completamente seguro de cómo obtiene su código para usar la RAM externa. Puedo ver cómo configura el bus externo casi como cualquier otro periférico, pero lo que me confunde es cómo el procesador realiza un seguimiento de cuándo hablar con la memoria externa y cuándo hablar con la interna.

Por lo que puedo decir, la RAM externa se asigna al mismo espacio de direcciones que la SRAM interna (la interna comienza en 0x20000000 y la externa comienza en 0x60000000). ¿Significa eso si escribí algo como esto?

int* x= 0x20000000; int* y= 0x60000000;

¿X e y apuntarían a los primeros 4 bytes (suponiendo 32 ints de bit) de RAM interna y externa respectivamente? Si es así, ¿qué pasa si hice algo como esto?

int x[999999999999]; //some super big array that uses all the internal ram int y[999999999999]; //this would have to be in external ram or it wouldn''t fit

Me imagino que tendría que decir algo sobre los límites de dónde está cada tipo de memoria o ¿lo tengo todo mal y el hardware lo soluciona por sí solo? ¿Los scripts del enlazador tratan con esto? Sé que tienen algo que ver con el mapeo de memoria, pero no sé exactamente qué. Después de leer acerca de cómo configurar un compilador cruzado ARM, tengo la sensación de que algo como winavr (avr-gcc) estaba haciendo muchas cosas como esta entre bastidores para que no tuviera que lidiar con eso.

Lo siento por divagar un poco, pero realmente apreciaría si alguien me pudiera decir si estoy en el camino correcto con estas cosas.

Actualizar

Para cualquier futuro lector, encontré esto después de otras pocas horas de googlear en http://www.bravegnu.org/gnu-eprog/index.html . Combinado con respuestas aquí me ayudó mucho.


Puede usar el registro de palabra reservado para sugerir al compilador que ponga esa variable en una ubicación de memoria interna: register int iInside; Con precaución; el compilador sabe cuántos bytes de almacenamiento de registro están disponibles, y cuando todo el espacio disponible haya desaparecido, no importará.

Use las variables de registro solo para cosas que se van a usar con mucha frecuencia, como los contadores.