¿Qué es Access RAM en la serie PIC18 y cómo se usa exactamente?

Estoy leyendo recursos relacionados con optimizaciones de PIC y encontré un documento llamado CONSEJOS DE OPTIMIZACIÓN DE MPLAB® C18 . Una de las cosas que menciona es Access RAM. Sé que es la parte de la RAM que se puede usar sin necesidad de usar el registro de acceso bancario y que permite un acceso más rápido a las variables almacenadas en ella, pero todavía no me queda muy claro cómo exactamente debo usarla manualmente. y cuándo debo esperar que el compilador lo complete con variables.

Al principio no entendí por qué esto era difícil de entender, pero después de mirar esa guía, estoy de acuerdo: no tengo idea de lo que están tratando de mostrar, qué variable está en la RAM de acceso o incluso cómo se relaciona el código C. la ASM.

Respuestas (2)

Las direcciones de RAM en un PIC 18 tienen 12 bits de ancho. Eso es demasiado para incluirlo en instrucciones de una sola palabra, que tienen solo 16 bits de ancho. Para usar menos bits de dirección en las instrucciones de los que realmente tiene la memoria, el PIC 18 usa una arquitectura segmentada. Esto significa que la RAM se divide en segmentos que la documentación de PIC llama bancos . Cada banco tiene 256 bytes. Una memoria completa contiene 4096 bytes, por lo que hay 16 bancos. El desplazamiento de dirección de 8 bits dentro de un banco se especifica en las instrucciones y el número de banco de 4 bits se especifica con un estado que se puede configurar en tiempo de ejecución, que se denomina registro BSR.

Para permitir un acceso más eficiente a una porción seleccionada de esta memoria de 4096 bytes o 16 bancos, las instrucciones en realidad contienen un bit de dirección más. Este banco selecciona entre uno de dos bancos, el banco identificado por BSR y el banco de acceso , que es un conjunto fijo de 256 bytes definido para ese PIC. Los 256 bytes del banco de acceso se dividen entre algunos de los registros de funciones especiales al final del banco 15 y algo de RAM general al comienzo del banco 0. Dónde está esta división, es decir, cuántos bytes del banco de acceso hay en el banco 0 y cuántos en el banco 15 varía entre los modelos de la familia PIC 18.

El propósito del banco de acceso en general es un acceso rápido a cualquiera de las 256 ubicaciones seleccionadas, independientemente de la configuración actual de BSR. Ciertos registros centrales siempre están en la parte del banco de acceso en el banco 15, como STATUS, PRODH, PRODL, etc. Las ventajas de esto deberían ser obvias, ya que no se necesita código para configurar BSR, y el acceso a estos registros puede preservar BSR.

La ventaja en general RAM es similar. El código de la aplicación puede acceder a las variables en esa parte del banco de acceso sin la sobrecarga de tener que configurar el banco actual, lo que nuevamente, por lo tanto, tampoco corrompe la configuración del banco actual. Dado que la cantidad de memoria de acceso disponible para registros es limitada, debe considerar cuidadosamente qué desea colocar allí y qué es mejor colocar en la memoria almacenada para que otra persona pueda beneficiarse del acceso rápido del banco de acceso. Por ejemplo, el banco de acceso es generalmente inapropiado para grandes buffers. Un solo búfer fácilmente podría ser más grande que la parte RAM general del banco de acceso, y de todos modos es probable que se dirija indirectamente a través de los registros FSR. Estos contienen la dirección completa de 12 bits, por lo que la banca no se aplica a las referencias indirectas.

En general, mantenga las variables individuales y generalmente globales de uso frecuente en el banco de acceso. Hay mucho espacio si lo usa solo un byte a la vez. En mi sistema, por defecto, uso los primeros 16 bytes como registros generales que se usan con frecuencia como borrador local y para pasar parámetros dentro y fuera de la subrutina. Estos se golpean mucho, por lo que se benefician del fácil acceso. Después de eso, normalmente pongo las variables globales individuales en el banco de acceso y el estado local privado de cada módulo por completo en un banco cuando esto es posible y razonable. Eso significa que el código en cualquier módulo solo necesita acceder a los datos en un banco y las pocas variables globales en el banco de acceso.

Por supuesto, esas son solo pautas generales. Cada proyecto es diferente y hay que pensar en lo que tiene sentido.

Para asignar memoria en el banco de acceso en ensamblador, usa la directiva UDATA_ACS en lugar de solo UDATA para la memoria almacenada. Creo que el compilador tiene un mecanismo de sonido similar. Vea el manual del compilador para más detalles.

Hola, ¿interferirá el uso de direcciones bancarias de acceso con los valores de los registros SFR? En PIC18, las direcciones de 0xFD8 a 0xFFF se utilizan como SFR.

Según el PIC y el conjunto de instrucciones que esté utilizando, puede haber entre 0 y 128 bytes de "RAM de acceso". Se puede acceder a las variables ubicadas dentro de la RAM de acceso más rápidamente y con menos código que a las variables en otros lugares, pero a menos que un programa sea bastante simple, no será posible colocar todas las variables en la RAM de acceso. En teoría, los compiladores pueden juzgar cuánto código se guardaría colocando variables particulares o combinaciones de las mismas en la memoria RAM de acceso, pero nunca he visto que una haga un buen trabajo. Además, los compiladores generalmente no pueden decir qué aceleraciones pueden ser importantes o no importantes. En consecuencia, a veces es útil para los programadores designar ciertas variables para colocarlas en Access RAM. Colocar tantas variables como sea posible en la RAM de Access generalmente no hará daño, siempre que haya Hay espacio en Access RAM para todas las variables así designadas. Intentar colocar más variables en Access RAM de las que caben generalmente causará un error del enlazador.

1: No creo que haya ningún PIC 18, ni lo habrá nunca, con 0 bytes en la parte RAM general del banco de acceso. 2: desbordar el banco de acceso provoca un error del enlazador , no un error del compilador.
@OlinLathrop: la hoja de datos para PIC18F8722 especifica que las direcciones de banco de acceso 0x60-0xFF representan SFR y especifica que cuando XINST está habilitado, las direcciones de banco de acceso 0x00-0x5F representan accesos indirectos fuera de FSR2. ¿Qué rango de direcciones de banco de acceso se asignaría a la RAM?
@OlinLathrop: Me parecería una tontería que un PIC tenga el modo XINST que convierta TODA la RAM de acceso en un espacio de direccionamiento indirecto fuera de FSR2 (en realidad, creo que engullir más de 32 bytes para FSR2 es simplemente un desperdicio; el uso óptimo probablemente sería use 15 bytes para direccionar FSR2 y 7 para FSR0 y FSR1). No obstante, según mi lectura de la hoja de datos, el PIC antes mencionado hace precisamente eso.
No estaba pensando en el conjunto de instrucciones extendidas. No sé cómo afecta eso al banco de acceso de la parte superior de mi cabeza. Recuerdo mirar el conjunto de instrucciones extendido cuando salió por primera vez y decidir que tenía más inconvenientes que beneficios para mí, especialmente teniendo en cuenta que mi entorno de desarrollo PIC ya usa el PIC 18.
@OlinLathrop: De ahí mi comentario, "según el PIC y el conjunto de instrucciones ". La única desventaja del conjunto de instrucciones extendidas es que consume RAM de acceso. Si uno pudiera renunciar a 15 bytes de RAM de acceso para el direccionamiento indirecto de FSR2 (con compensaciones de 1 a 15 bytes), y 3 o 7 bytes de FSR0 y FSR1, probablemente valdría la cantidad de RAM de acceso en muchas aplicaciones. . Desafortunadamente, por la razón que sea, Microchip requiere que las aplicaciones que usan un conjunto de instrucciones extendidas cedan 96 bytes de RAM de acceso para el direccionamiento FSR2.