Sistema Cortex-M3: Sistema de almacenamiento (2)

1. Descripción general de las funciones del sistema de almacenamiento

La memoria Cortex-M3 tiene las siguientes características:

        El mapa de memoria está predefinido y especifica qué bus se usa en qué ubicación.

        El sistema de memoria admite las llamadas operaciones de "banda de bits". A través de él, se realiza la operación atómica en un solo bit, y la operación de banda de bits solo es aplicable a algunas áreas de memoria especiales.

        El sistema de memoria admite el acceso no alineado y mutuamente excluyente.

        Se admiten las configuraciones little-endian y big-endian del sistema de memoria.

2. Mapeo de memoria

        El núcleo M3 tiene solo un único mapa de memoria fijo con un tamaño de espacio de direcciones de 4 GB. El núcleo M3 permite a los fabricantes de chips asignar espacio de memoria de manera flexible. Algunas ubicaciones en el espacio de almacenamiento se utilizan para depurar componentes y otros periféricos privados, y este segmento de dirección se denomina "área periférica privada". Los componentes del área periférica privada incluyen: recarga de dirección flash y unidad de punto de interrupción (FPB), unidad de punto de observación de datos (DWT), macrocelda de rastreo instrumentada (ITM), macrocelda de rastreo integrada (ETM), unidad de interfaz de puerto de rastreo (TPIU) ​, tabla de ROM .

        Los programas se pueden ejecutar en el área de código, el área de SRAM interna y el área de RAM externa . Pero debido a que el bus de instrucciones está separado del bus de datos, es ideal colocar el programa en el área de código, de modo que la búsqueda de instrucciones y el acceso a datos utilicen cada uno su propio bus.

        El tamaño del área de SRAM interna es de 512 MB, que se utiliza para permitir que los fabricantes de chips se conecten a la SRAM en el chip, y se accede a esta área a través del bus del sistema. En la parte inferior de esta área, hay una sección de 1 MB llamada "área de banda de bits". El área de banda de bits también tiene un "área de alias (alias) de banda de bits" correspondiente de 32 MB, que aloja 8M de "variables de bits". El área de banda de bits corresponde al rango de direcciones de 1 MB más bajo, y cada palabra en el área de alias de banda de bits corresponde a un bit del área de banda de bits. Las operaciones de banda de bits solo se aplican al acceso a datos, no a la obtención de instrucciones. A través de la función de la banda de bits, se pueden empaquetar múltiples datos booleanos en una sola palabra, pero aún se pueden usar desde el área de alias de la banda de bits como si se accediera a la memoria normal. Las operaciones de acceso en áreas con alias de banda de bits son atómicas.

        Los registros periféricos en el chip utilizan otro rango de 512 MB del espacio de direcciones. También hay un alias de banda de bits de 32 MB en esta área para facilitar el acceso rápido a los registros periféricos, y el uso es el mismo que el de la banda de bits en el área SRAM interna. Por ejemplo, se puede acceder fácilmente a varios bits de control y estado. Cabe señalar que no se permite la ejecución de instrucciones en el área periférica. También hay dos rangos de 1GB para conectar RAM externa y dispositivos externos, que no tienen bandas de bits. La diferencia entre ambos es que el área de RAM externa permite la ejecución de instrucciones, mientras que el área de dispositivos externos no.

        Finalmente, quedan 0,5 GB de espacio, incluidos los componentes a nivel del sistema, los buses periféricos privados internos, los buses periféricos privados externos y los periféricos del sistema definidos por los fabricantes de chips. Hay dos buses periféricos privados: AHB bus periférico privado, que solo se usa para periféricos AHB dentro de CM3, son: NVIC, FPB, DWT e ITM. ​ Bus periférico privado APB, que se utiliza tanto para dispositivos APB dentro de CM3 como para dispositivos externos (el "externo" aquí es para el núcleo). CM3 permite a los fabricantes de dispositivos agregar algunos periféricos APB en chip al bus privado APB, a los que se accede a través de la interfaz APB. El área donde se encuentra NVIC se denomina "espacio de control del sistema (SCS)". Además de NVIC, hay registros utilizados para SysTick, MPU y control de depuración de código en SCS.

        Finalmente, también se accede a las áreas específicas del proveedor no utilizadas a través del bus del sistema, pero no se permite que se ejecuten instrucciones en ellas. La MPU en el núcleo M3 es opcional y depende del fabricante del chip decidir si la iguala.

3. Varios atributos de acceso a la memoria

        Además de definir el mapa de memoria, M3 también especifica 4 atributos para el acceso a la memoria, a saber: Bufferable , Cacheable , Executable y Shareble .

        Si se configura una MPU, se pueden configurar diferentes áreas de memoria a través de ella y se pueden anular los atributos de acceso predeterminados. El chip CM3 no está equipado con un caché, ni un controlador de caché, pero permite agregar un caché externamente. Por lo general, si se proporciona memoria externa, el fabricante de chips también agrega un controlador de memoria, que puede administrar el acceso a la memoria RAM dentro y fuera del chip, según la configuración de capacidad de almacenamiento en caché.

        El espacio de direcciones se puede dividir en ocho partes iguales de 512 MB de otra manera:

1. Área de código (0x0000_0000-0x1FFF_FFFF)

        Esta área puede ejecutar instrucciones y el atributo de caché es WT ("escribir a través", Write Through), es decir, no se puede almacenar en caché. Esta área también permite la colocación de la memoria de datos. La operación de datos en esta área se realiza a través de la interfaz del bus de datos (se estima que los datos de lectura usan el código D y los datos de escritura usan el sistema), y la operación de escritura en esta área se almacena en búfer.

2. Área SRAM (0x2000_0000–0x3FFF_FFFF)

        Esta área se usa para SRAM en el chip, la operación de escritura se almacena en búfer y se puede seleccionar el atributo de caché WB-WA (Write Back, Write Allocated). Esta área también puede ejecutar instrucciones para permitir que el código se copie en la memoria para su ejecución; a menudo se usa para trabajos de mantenimiento, como actualizaciones de firmware.

3. Área periférica en chip (0x4000_0000–0x5FFF_FFFF)

        Esta área se usa para periféricos en chip, por lo que no se puede almacenar en caché y las instrucciones no se pueden ejecutar en esta área (esto también se llama eXecute Never, XN. El manual de referencia de ARM usa este término de manera extensiva).

4. La primera mitad del área de RAM externa (0x6000_0000-0x7FFF_FFFF)

        Esta área se puede usar para diseñar la RAM en el chip o la RAM fuera del chip, se puede almacenar en caché (el atributo de caché es WB-WA) y puede ejecutar instrucciones.

5. La segunda mitad del área de RAM externa (0x8000_0000–0x9FFF_FFFF)

        Igual que la primera mitad, excepto que no se puede almacenar en caché (WT). 6. La primera mitad del área periférica externa (0xA000_0000–0xBFFF_FFFF). Registros usados ​​para periféricos fuera del chip, también usados ​​para memoria compartida en sistemas multinúcleo (requiere operaciones estrictamente secuenciales, es decir, no almacenable en búfer). Esta área también es un área no ejecutable.

7. La segunda mitad del área periférica externa (0xC000_0000–0xDFFF_FFFF)

        En la actualidad, es completamente consistente con la función de la primera mitad. 8. Área del sistema externo (0xE000_0000–0xFFFF_FFFF). Esta área es el área funcional privada periférica y específica del proveedor. El código no se puede ejecutar en esta área. El área del sistema involucra muchas partes clave, por lo que el acceso está estrictamente serializado (no almacenable en caché, no almacenable en búfer). Las áreas funcionales específicas del proveedor, por otro lado, se pueden almacenar en caché y almacenar en búfer.

Nota: Aquí hay una explicación de las diferencias entre escritura diferida, escritura simultánea y asignación de tiempo de escritura

        Write Back (Write Back): Los datos escritos permanecen primero en el caché y luego se implementan en la memoria final cuando es necesario. Esta es también la función más básica del caché, que se utiliza para mejorar la eficiencia de la transmisión de datos y reducir la necesidad de acceder a la memoria principal operaciones de acceso.

        Write Through: la operación de escritura "penetra" en la caché intermedia y cae directamente en la dirección de destino de la memoria final. Se puede ver que la operación de escritura simultánea vacía la memoria caché, pero hace que el resultado de la operación de escritura tenga efecto de inmediato. Esto se usa a menudo en la memoria compartida con periféricos en chip u otros procesadores, como la memoria de la tarjeta gráfica, los registros de periféricos en chip y la memoria compartida en sistemas de doble núcleo. La operación de escritura simultánea se puede usar junto con "volátil" en C: las variables con atributos volátiles a menudo se colocan en el rango de direcciones de escritura simultánea.

        Aplicar al escribir: si se pierde al escribir, los datos escritos se almacenarán primero en el caché y luego se escribirán en la memoria mediante el vaciado.

4. Permisos de acceso predeterminados para el almacenamiento

        M3 tiene un permiso de acceso de almacenamiento predeterminado, que evita que el código de usuario acceda al espacio de almacenamiento de control del sistema y protege componentes clave como NVIC y MPU. El permiso de acceso predeterminado surte efecto bajo las siguientes condiciones: MPU no está equipada, MPU está equipada, pero la MPU está deshabilitada. Si la MPU está habilitada, la MPU puede dibujar varias regiones en el espacio de direcciones y especificar diferentes accesos para diferentes regiones. permisos Cuando se bloquea un acceso a nivel de usuario, se genera inmediatamente una falla de bus. Los permisos de acceso predeterminados para el almacenamiento se muestran en la figura.

5. Operación de banda de bits

        Con la compatibilidad con bandas de bits, las instrucciones normales de carga/almacenamiento se pueden usar para leer y escribir bits individuales. En CM3, las bandas de bits se implementan en dos regiones. Uno de ellos es el rango más bajo de 1 MB del área SRAM, y el segundo es el rango más bajo de 1 MB del área periférica en el chip. Además de que la dirección en estas dos bandas de bits se puede usar como una memoria RAM ordinaria, también tienen su propia "área de alias de banda de bits", y el área de alias de banda de bits expande cada bit en una palabra de 32 bits. Cuando accede a estas palabras a través del área de alias de la banda de bits, puede lograr el propósito de acceder a los bits originales. Diagrama de la relación de expansión entre el área de banda de bits y el área de alias de banda de bits.

 6. Transmisión de datos no alineados

        M3 admite transferencias no alineadas (dirección) en un solo acceso, y no es necesario alinear los accesos a la memoria de datos. En CM3, las transferencias de datos no alineados solo ocurren en instrucciones de transferencia de datos normales, como LDR/LDRH/LDRSH. No se admiten otras instrucciones, incluidas: carga/almacenamiento de datos múltiples (LDM/STM), operación de pila PUSH/POP, acceso de exclusión mutua (LDREX/STREX). La desalineación dará como resultado una operación de banda de bits de falla de uso. Debido a que solo el LSB es válido, los accesos no alineados pueden generar resultados impredecibles.

        De hecho, el acceso no alineado se convierte internamente en varios accesos alineados, y la unidad de bus de procesador completa esta acción de conversión. Este proceso de conversión es transparente para los programadores, por lo que no debe preocuparse al escribir programas. Sin embargo, dado que implementa un acceso no alineado a través de varios accesos alineados, se requieren más ciclos de bus. De hecho, hay muchas formas de ahorrar memoria, pero ninguna de ellas es la forma herejía de comprimir la dirección de los datos y destruir la alineación. Por lo tanto, se debe desarrollar un buen hábito para garantizar siempre la alineación de direcciones, que también es una condición necesaria para que el programa se transfiera a otros chips ARM.

        Para este propósito, el NVIC se puede programar para supervisar la alineación de direcciones. Genera un fallo cuando se encuentra un acceso desalineado. El método específico es establecer el bit UNALIGN_TRP en el "Registro de control de configuración". De esta forma, se garantiza que los accesos no alineados quedarán atrapados en el lugar durante todo el período de depuración.

7. Acceso mutuamente excluyente

        No hay un comando como "SWP" en CM3. En los procesadores ARM tradicionales, se requiere la instrucción SWP para implementar un mutex. En CM3, la instrucción SWP fue reemplazada por el llamado acceso de exclusión mutua para implementar un mecanismo de protección de acceso a recursos compartidos más sofisticado. Los mutex se utilizan en entornos multitarea y también se utilizan entre las rutinas de servicio de interrupción y el programa principal para solicitar recursos compartidos (como una parte de la memoria compartida) para las tareas. Después de que un recurso compartido (exclusivo) sea propiedad de una tarea, ninguna otra tarea podrá acceder a él hasta que la tarea lo libere. Para establecer un mutex, es necesario definir una variable de bandera para indicar si el recurso compartido correspondiente ya es propiedad de una determinada tarea. Cuando otra tarea quiere obtener este recurso compartido, primero debe verificar este mutex para saber si el recurso compartido no está en uso. En los procesadores ARM tradicionales, esta operación de verificación se implementa a través de la instrucción SWP. SWP garantiza que las comprobaciones de exclusión mutua sean atómicas, lo que evita que dos tareas retengan un recurso compartido al mismo tiempo (una manifestación común de crisis de pánico).

        En las versiones más nuevas de los procesadores ARM, el acceso de lectura/escritura a menudo usa diferentes buses, lo que hace que SWP ya no garantice la atomicidad de las operaciones, porque solo la lectura/escritura en el mismo bus puede lograr una transferencia entrelazada. Por lo tanto, la transmisión entrelazada debe implementarse mediante otro mecanismo, que introduce el "acceso mutuamente excluyente". El concepto de acceso de exclusión mutua es muy similar a SWP, la diferencia es: bajo la operación de acceso de exclusión mutua, la dirección donde se encuentra el mutex puede ser accedida por otros maestros de bus, y también puede ser accedida por otras tareas. ejecutándose en la máquina, pero CM3 puede "Rechazar" una operación de escritura mutuamente excluyente que podría conducir a una condición de carrera. El acceso mutuamente excluyente se divide en carga y almacenamiento, y los pares de instrucciones correspondientes son LDREX/STREX, LDREXH/STREXH, LDREXB/STREXB, que corresponden a palabra/media palabra/byte respectivamente. Para facilitar la introducción, tome LDREX/STREX como ejemplo para describir su uso. El formato de sintaxis de LDREX/STREX es:

        La sintaxis de LDREX es la misma que la de LDR, por lo que no entraré en detalles aquí. Pero STREX es diferente. La ejecución de una instrucción STREX se puede "rechazar". Cuando el procesador acepta ejecutar STREX, el valor de Rxf se almacena en (Rn+offset) y el valor de Rd se actualiza a 0. Sin embargo, si el procesador rechaza la ejecución de STREX, no se producirá ninguna acción de almacenamiento y el valor de Rd se actualizará a 1.

        De hecho, el misterio radica en esta regla de "rechazo". Las reglas pueden ser indulgentes o estrictas, y la regla más estricta es: cuando se encuentra una instrucción STREX, solo si la instrucción LDREX se ejecutó antes y no se ejecutó ninguna otra instrucción STR/STREX después de ejecutar la última instrucción LDREX. Esta instrucción STREX puede ejecutarse, es decir, solo la STREX más cercana a ella en el tiempo puede ejecutarse con éxito después de ejecutar la LDREX. De lo contrario, descarte el STREX. Incluyendo: hay otras instrucciones STR ejecutadas en el medio, y otras instrucciones STREX se ejecutan en el medio. Esta regla más estricta es también la más fácil de implementar. En el manual de referencia técnica de CM3, se recomienda que el implementador marque una dirección limitada y solo aplique la regla de acceso exclusivo a esta dirección, en lugar de restringir todos los 4GB. Esta dirección generalmente comienza desde la dirección proporcionada por la familia de instrucciones LDREX y la longitud está en el rango de 16 bytes a 4K bytes. Pero los fabricantes de chips pueden preferir reglas más estrictas. Cuando se utiliza el acceso mutuamente excluyente, LDREX/STREX se debe utilizar en pares.

        Al ejecutar STREX, primero verificará si se ha marcado y, de ser así, verificará si la dirección de almacenamiento se encuentra dentro del rango de la marca. STREX solo se ejecutará si se pasan estos dos puntos de control. De lo contrario, se descarta STREX. Cuando se utiliza el acceso exclusivo, el búfer de escritura interno en la interfaz del bus CM3 se omitirá, incluso si la MPU especifica que esta área se puede almacenar en búfer. Esto asegura que la actualización del mutex siempre se pueda completar la primera vez, asegurando así que los datos sean consistentes entre los varios maestros de bus. Si el diseñador del sistema So diseña un sistema de múltiples núcleos, debe asegurarse de que los datos vistos entre los núcleos también sean consistentes.

8. Modo terminal

        CM3 admite el modo little endian y el modo big endian. Sin embargo, el diseño de otras partes del microcontrolador, incluidas las conexiones de bus, los controladores de memoria y la naturaleza de los periféricos, también determinan conjuntamente el tipo de memoria que se puede admitir. Por lo tanto, antes de diseñar el software, primero debe verificar los terminales disponibles en la hoja de datos de la microcomputadora de un solo chip. En la mayoría de los casos, los MCU basados ​​en CM3 utilizan el modo little-endian; para evitar problemas innecesarios, se recomienda a los lectores que utilicen el modo little-endian de manera uniforme.

        En CM3, qué endianness se usa se determina en el reinicio y no debe cambiarse en tiempo de ejecución. La captación previa de instrucciones siempre usa el modo little-endian, y el acceso al espacio de almacenamiento de control de configuración también usa siempre el modo little-endian (incluidos NVIC, FPB, etc.). Además, el área de dirección del bus privado externo 0xE0000000 a 0xE00FFFFF siempre usará el modo little endian. Cuando el diseño Soc utilizado no es compatible con el modo big-endian, pero algunos periféricos incluyen el modo big-endian, la instrucción REV/REVH se puede utilizar para completar la conversión del modo endian.

Supongo que te gusta

Origin blog.csdn.net/zichuanning520/article/details/131072788
Recomendado
Clasificación