El principio de funcionamiento de la preferencia sin el sistema operativo preventivo MMU ~

El sistema operativo es algo muy misterioso para los principiantes, muchos de los cuales no están claros, lo que hace que se rindan antes de comenzar.

Este artículo comenzará desde abajo y describirá en detalle el principio de preferencia de los sistemas operativos interrumpibles (la mayoría de los RTOS).

Contiene:

  • Principios básicos del hilo

  • Prelación entre hilos

  • Interrumpir hilo de preferencia

  • Interrupción de interrupción de preferencia

más fuerte Huang

1

Ejecutar varios hilos

1. "Hilo único" de un solo núcleo

Estrictamente hablando, un procesador de un solo núcleo solo puede ejecutar una instrucción a la vez, lo que significa que solo puede ser de "un solo subproceso". (Por supuesto, los procesadores multinúcleo no son lo mismo)

Para ejecutar varios subprocesos en un procesador de un solo núcleo, en realidad necesitamos cambiar rápidamente entre subprocesos de forma regular para que los usuarios sientan que varios subprocesos se ejecutan en paralelo.

Por ejemplo, el procesador ejecuta dos subprocesos, y el procesador en realidad alterna entre los dos subprocesos, como se muestra en la siguiente figura:

2. El procesador cambia entre subprocesos, ¿cómo lo hace?

El procesador de un solo núcleo del que estamos hablando es "single thread", tiene un conjunto de registros, a este conjunto de registros lo llamamos pertenecen a un "thread".

Por ejemplo, al calcular la suma de dos números:

//假设我们有两个整数:a和b
int c = a + b ;

La situación real es la siguiente (por supuesto, depende del tipo de MCU, pero la idea general es la misma):

# MIPS反汇编:


LW V0, -32744(GP)   # "a" 的值从RAM加载到寄存器V0
LW V1, -32740(GP)   # 值"b" 从RAM加载到寄存器V1
ADDU V0, V1, V0     # a、b值相加,结果保存到寄存器V0中
SW V0, -32496(GP)   # 寄存器V0的值存储在RAM中(变量c所在的位置)

Verá que se han realizado 4 acciones arriba, pero el sistema operativo preventivo puede adelantarse a otro hilo en cualquier momento, incluso entre estas 4 acciones.

Si otros hilos se adelantan en este proceso, otros hilos también se adelantan a los hilos actuales V0 y V1. Si V0 y V1 no se guardan, el hilo actual se ejecutará la próxima vez y el resultado será incorrecto.

Por lo tanto, para el problema actual, necesitamos guardar los valores de V0 y V1 antes de cambiar de hilo. Cuando cambie al hilo actual la próxima vez, restaure los valores de V0 y V1. El proceso general es el siguiente:

El significado aproximado es: cuando necesitamos cambiar de un hilo a otro, el kernel gana el control, realiza la limpieza necesaria (al menos guarda y restaura el valor del registro), y luego transfiere el control al siguiente hilo para que se ejecute.

más fuerte Huang

2

Pila de hilos

¿Dónde está la posición de preferencia mencionada anteriormente y qué valor de registro se almacena en cada hilo? Este es el contenido de la pila del hilo.

En los sistemas operativos con MMU, la pila de subprocesos (del usuario) puede crecer dinámicamente según sea necesario: cuanto más espacio de pila necesita un subproceso, más pila de subprocesos (si el kernel lo permite) .

Sin embargo, nuestra MCU general no tiene la característica de "gama alta" de MMU, y toda la RAM se asigna estáticamente al espacio de direcciones. Por lo tanto, cada hilo tendrá espacio RAM para la pila. Si la RAM utilizada por el hilo excede la cantidad de la pila, causará desbordamiento de memoria o errores sutiles. (En realidad, el espacio de pila de cada hilo es solo un espacio de matriz contiguo).

Por lo tanto, cuando decidimos cuánta pila asignar para cada subproceso, solo estimamos cuánta pila se puede necesitar, pero es posible que la cantidad exacta no sea muy clara.

Por ejemplo, si se trata de un hilo de GUI con múltiples llamadas anidadas, puede requerir varios kilobytes, pero si es un hilo pequeño con una luz de tubería, decenas de bytes pueden ser suficientes.

Suponiendo que tenemos tres subprocesos, su consumo de pila es el siguiente:

Como se mencionó anteriormente, el valor de registro de cada hilo se almacena en la pila del hilo. El conjunto de valores de registro de un hilo se denomina "contexto" del hilo. Como se muestra en la figura siguiente (el hilo A es el "hilo activo" que se está ejecutando):

Tenga en cuenta que el contexto del hilo A no se guarda en la pila, el puntero de la pila apunta a la parte superior de los datos de usuario del hilo A y los registros del procesador actual están dedicados al hilo A.

Cuando el núcleo decide cambiar el control al hilo B, hará lo siguiente:

  • Guarde todos los valores de registro en la pila (guarde en la parte superior de la pila del hilo A);

  • Cambie el puntero de la pila a la parte superior de la pila del hilo B;

  • Restaurar todos los valores de registro de la pila (desde la parte superior de la pila del hilo B);

En este punto, verá:

más fuerte Huang

3

Prevención de interrupción (ISR)

Durante la ejecución de lo anterior, o al realizar el cambio de contexto, puede estar involucrado un contenido muy importante: la interrupción .

MCU generalmente tiene periféricos: TIM, UART, SPI, CAN, etc., y pueden ocurrir eventos importantes en cualquier momento para desencadenar interrupciones.

La condición de interrupción es que cuando se suspende el subproceso que se está ejecutando actualmente, el procesador realiza otras operaciones (Maneja la interrupción) durante un período de tiempo y luego regresa. Las interrupciones pueden desencadenarse en cualquier momento y debemos estar preparados para lidiar con ellas.

El manejador de interrupciones se llama ISR (rutina de servicio de interrupciones):

Las interrupciones pueden tener diferentes prioridades. Por ejemplo, si se activan algunas interrupciones de baja prioridad, el subproceso que se está ejecutando actualmente se suspenderá y el ISR obtendrá el control. Luego, si se activa una interrupción de alta prioridad, el ISR que se está ejecutando actualmente se suspenderá nuevamente y se ejecutará un nuevo ISR para la interrupción de alta prioridad.

De esta manera, una vez finalizado, el control volverá al primer ISR y, una vez finalizado, también se restaurará el hilo interrumpido.

Código clave importante:

En el proceso de actividad del hilo, si hay algo importante "código crítico", si ocurre una interrupción durante este proceso, es fácil causar resultados inesperados.

Necesitamos proteger esta parte del código crítico. Por lo general, nuestro enfoque es deshabilitar la interrupción global antes del "código crítico" e iniciar la interrupción global después de que se complete la ejecución.

Algo a tener en cuenta:

Apague la interrupción global, no habrá interrupción correspondiente en este momento, por lo que el "código crítico" no puede ser demasiado largo.

más fuerte Huang

3

Interrumpir pila

Como se mencionó anteriormente, si las interrupciones de alta prioridad reemplazan a las de baja prioridad, habrá un problema: el código de baja prioridad debe ser el mismo que los subprocesos para guardar la pila de datos.

Generalmente hay dos métodos:

  • Utilice la pila de hilos interrumpidos;

  • Utilice un espacio de pila separado para las interrupciones;

1. Utilice la pila de hilos interrumpidos

Si usa la pila de subprocesos interrumpidos, se parece a la siguiente figura:

Esta situación tiene un grave problema para ti, ¿sabes cuál es?

Interrupciones frecuentes, o más interrupciones, el propio espacio de pila del hilo pronto se agotará.

La pila de cada hilo debe contener lo siguiente:

  • Datos propios del hilo;

  • El contexto del hilo;

  • Los datos utilizados para realizar el peor caso ISR.

Por lo tanto, necesitamos cambiar un método para proporcionar un espacio de pila separado para todos los ISR.

2. Utilice un espacio de pila separado para las interrupciones

El uso de un espacio de pila separado para las interrupciones es aproximadamente como se muestra en la figura anterior.

Bueno, este artículo describe los diversos tipos de preferencia y contenido relacionado, ha aprendido algunos puntos y algunos no los entienden, bienvenido a dejar un mensaje para discutir.

1. ¡ Analice el impacto de la "interpretabilidad" en la inteligencia artificial desde una perspectiva integrada!

2. Registro [MCU], biblioteca estándar, biblioteca HAL, biblioteca LL, ¡tantas bibliotecas! ¿Cómo me pides que elija?

3. ¿Cuántos pasos hay para desarrollar proyectos embebidos con Linux?

4. ¿Cómo sabe el programa en sí su tamaño? ¡Esta es una cuestión de si una gallina pone un huevo o un huevo pone una gallina!

5. El entorno de desarrollo integrado nacional ayuda a RISC-V nacional a romper el monopolio de los gigantes extranjeros en la tecnología de chips

6. Al realizar el desarrollo integrado, ¿cómo se da cuenta de la pantalla LCD?

Descargo de responsabilidad: este artículo se reproduce en línea y los derechos de autor pertenecen al autor original. Si está involucrado en problemas de derechos de autor, contáctenos, confirmaremos los derechos de autor en función de los materiales de certificación de derechos de autor que proporcione y pagaremos la remuneración del autor o eliminaremos el contenido.

Supongo que te gusta

Origin blog.csdn.net/DP29syM41zyGndVF/article/details/109792042
Recomendado
Clasificación