Red de conocimiento informático - Problemas con los teléfonos móviles - ¿Cómo hacer que el compilador utilice preferentemente la "RAM" del chip en "Keil C51"?

¿Cómo hacer que el compilador utilice preferentemente la "RAM" del chip en "Keil C51"?

Análisis en profundidad de la estructura de la memoria C51\x0d\Al escribir una aplicación, defina una variable, una matriz o una tabla fija, y dónde se almacena cuando el tamaño de la variable definida excede el; rango de memoria de la MCU Qué hacer cuando se define la variable cómo controlar la definición de la variable para no exceder el rango de almacenamiento y cómo definir la variable para que la velocidad de acceso a la variable sea la más rápida y el programa escrito sea el más eficiente; . A continuación las responderemos una por una. \x0d\\x0d\1 Seis tipos de palabras clave (seis tipos de tipos de almacenamiento) \x0d\data idata xdata pdata code bdata\x0d\\x0d\ code: la memoria de código (memoria de programa, también conocida como memoria de solo lectura) es Se utiliza para guardar constantes o es un programa. La memoria de código utiliza codificación de línea de dirección de 16 bits, que puede estar dentro o fuera del chip. El tamaño está limitado a 64 KB\x0d\. Función: definir constantes, como tablas digitales de ocho segmentos o constantes utilizadas en programación. cuando se define código o las constantes definidas explícitamente se guardan en la memoria de código (solo lectura) \x0d\ Método de uso: \x0d\ char code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80 ,0x90 };\x0d\ El uso de esta palabra clave es equivalente a const\x0d\\x0d\data la memoria de datos (área de almacenamiento de datos) solo se puede usar para declarar variables y no se puede usar para declarar funciones. Esta área se encuentra en. El chip y utiliza codificación de línea de dirección de 8 bits tiene la velocidad de almacenamiento más rápida, pero el número está limitado a 128 bytes o menos. \x0d\ Uso: \x0d\ unsigned char data fast_variable=0;\x0d\\x0d\ idata la memoria idata (área de almacenamiento de datos) solo se puede usar para declarar variables y no se puede usar para declarar funciones. Esta área se encuentra en el. chip y utiliza codificación de línea de dirección de 8 bits, el tamaño de la memoria está limitado a 256 bytes o menos. El área de dirección baja de esta área es consistente con la dirección de la memoria de datos; el área de dirección alta es un área donde la serie 52 se expande en la serie 51 y tiene el mismo código de dirección que el registro de función especial. Es decir: la memoria de datos es un subconjunto de la memoria de datos. \x0d\ \x0d\ xdata La memoria xdata solo se puede usar para declarar variables, no funciones. Esta área está ubicada fuera de la MCU\x0d\ y está codificada usando líneas de dirección de 16 bits. El tamaño de almacenamiento está limitado a 64 KB. \x0d\ Uso: \x0d\ unsigned char xdata count=0;\x0d\\x0d\pdata La memoria pdata solo se puede usar para declarar variables, no funciones. Esta área está ubicada fuera de la MCU y usa líneas de dirección de 8 bits. codificación. El tamaño de almacenamiento está limitado a 256 bytes. Son los 256 bytes inferiores de la memoria xdata. su subconjunto. \x0d\ Uso \x0d\ unsigned char pdata count=0;\x0d\\x0d\ bdata La memoria bdata solo se puede usar para declarar variables, no funciones. Esta área está ubicada en la dirección de datos de bits internos 8051. La cantidad definida se almacena en el espacio interno de direcciones de bits y se puede leer y escribir directamente mediante instrucciones de bits.

\x0d\ Uso: \x0d\ unsigned char bdata varab=0\x0d\\x0d\ Nota: Algunos datos dicen que al definir una variable de carácter, cuando no está firmada de forma predeterminada, la variable de carácter predeterminada es sin firmar, lo cual es consistente con el estándar C es diferente, pero cuando lo probé en Keil uVision3, descubrí que ese no era el caso. De forma predeterminada, está firmado. Quizás los compiladores anteriores utilizaron de forma predeterminada unsigned. Entonces, cuando vea información que diga esto, debe prestarle atención. Los diferentes compiladores pueden ser diferentes. Entonces, cuando escribimos el programa, todavía agregamos firmado sin firmar. \x0d\ 2 Modos de almacenamiento de parámetros de funciones y variables locales \x0d\ El compilador C51 permite tres modos de memoria: PEQUEÑO, COMPACTO y GRANDE. El modo de memoria de una función determina el espacio de direcciones en la memoria de las variables locales de los parámetros de la función. Los parámetros de función y las variables locales en modo PEQUEÑO se encuentran en la RAM interna del microcontrolador 8051, y los parámetros de función y las variables locales en los modos COMPACTO y GRANDE utilizan la RAM externa del microcontrolador. Al definir una función, puede especificar explícitamente el modo de memoria de la función. El método consiste en agregar un modo de almacenamiento después de la columna de la lista de parámetros formales. \x0d\ \x0d\ El ejemplo es el siguiente: \x0d\ #pragma large //Esta precompilación debe colocarse delante de todos los encabezados\x0d\ int func0(char x,y) small;\x0d\ char func1(int x) grande;\x0d\ int func2(char La instrucción de control de compilación GRANDE dada después de que se compila el comando de precompilación, es decir, el modo de almacenamiento predeterminado al compilar este programa de ejemplo es GRANDE. Luego se definen tres funciones, se define la primera como modo de almacenamiento PEQUEÑO, y la segunda función se define como GRANDE. La tercera función no está especificada. Cuando se compila con C51, solo la última función se procesa de acuerdo con el modo de memoria GRANDE, y las demás se procesan de acuerdo con sus respectivos modos de memoria especificados. \x0d\ Este ejemplo muestra que el compilador C51 permite el llamado modo de memoria mixta, que permite que algunas funciones en un programa usen un modo de almacenamiento, mientras que otras usan otro modo de memoria, usando programación de modo mixto de memoria, puede hacer uso completo del espacio de memoria limitado en el microcontrolador de la serie 8051 y al mismo tiempo acelerar la ejecución del programa.

\x0d\\x0d\3Acceso a dirección absoluta absacc.h (muy importante)\x0d\\x0d\#define CBYTE ((código volátil de caracteres sin firmar *) 0)\x0d\#define DBYTE ((datos volátiles de caracteres sin firmar *) 0 )\x0d\#define PBYTE ((unsigned char volatile pdata *) 0)\x0d\#define XBYTE ((unsigned char volatile xdata *) 0)\x0d\ Función: CBYTE direccionando el área de CÓDIGO\x0d\ DBYTE direccionando el área de DATOS\ x0d\ Direcciones PBYTE Área XDATA (256 inferiores)\x0d\ Direcciones XBYTE Área XDATA\x0d\ Ejemplo: La siguiente instrucción accede al área de memoria externa en la dirección 0x1000\x0d\ XBYTE[0x1000]=20;\x0d\\x0d\# define CWORD ((unsigned int volatile code *) 0)\x0d\#define DWORD ((unsigned int volatile data *) 0)\x0d\#define PWORD (( unsigned int volatile pdata *) 0)\x0d\#define XWORD ((unsigned int volatile xdata *) 0)\x0d\\x0d\ Función: Similar a la macro anterior, excepto que el tipo de datos que especifican es unsigned int. \x0d\ Mediante el uso flexible de diferentes tipos de datos, se puede acceder a todos los espacios de direcciones 8051. \x0d\ Por ejemplo\x0d\DWORD[0x0004]=0x12F8;\x0d\Es decir, (0x08)=0x12; (0x09)=0xF8\x0d\\x0d\ en la memoria de datos interna. Es muy conveniente acceder a cualquier ROM y RAM dentro del microcontrolador. Hay otro método, que consiste en utilizar un reloj puntero. El puntero de C51 se presentará en detalle más adelante. \x0d\\x0d\4 Variable de registro (registro) \x0d\ Para mejorar la eficiencia de ejecución del programa, el lenguaje C permite que algunas de las variables más frecuentes se definan como las llamadas variables de registro que pueden usar hardware directamente. registros. Al definir una variable, anteponer "registro" antes del nombre del tipo de variable definirá la variable como una variable de registro. Una variable de registro puede considerarse un tipo de variable automática. El alcance efectivo también es el mismo que el de las variables automáticas. Porque los registros en el registro informático son limitados. No todas las variables se pueden definir como variables de registro. Por lo general, cuando se define una variable de registro en un programa, es solo una sugerencia para el compilador si la variable realmente se convierte en una variable de registro en función de la situación real. Por otro lado, el compilador C51 es capaz de identificar las variables utilizadas con más frecuencia en el programa y, cuando sea posible, el compilador tratará automáticamente la variable como una variable de registro incluso si no está definida como una variable de registro en el programa. El compilador determina en última instancia si la variable definida puede convertirse realmente en una variable de registro. \x0d\\x0d\5 Charla de acceso a la memoria\x0d\ 1 Reloj de dedo\x0d\El reloj de dedo en sí es una variable y el contenido almacenado en él es la dirección de la variable, es decir, datos específicos. La dirección de 8051 es de 16 bits, por lo que la variable de puntero ocupa dos unidades de almacenamiento. La descripción del puntero es similar a la descripción de la variable, simplemente agregue "*" antes del nombre del puntero.

\x0d\ Como int *int_point; declara un puntero entero \x0d\ char *char_point; declara un puntero de carácter \x0d\ Utilice punteros para acceder indirectamente a variables. Para lograr esto, se utilizan dos operadores especiales\x0d\ & para obtener la dirección de la variable\x0d\ * y obtener los datos señalados por el puntero\x0d\\x0d\Ejemplo 1:\x0d\int a,b;\x0d \ int * int_point; //Definir un puntero a una variable entera\x0d\ a=15;\x0d\ int_point=&a; //int_point apunta a a\x0d\ *int_point=5; la variable a señalada por int_point, que equivale a at a=5;\x0d\Ejemplo 2:\x0d\ char i,table[6],*char_point;\x0d\ char_point=table;\x0d\ for(i =0;yo