SETR 15-05

This commit is contained in:
Jose
2025-05-15 12:22:40 +02:00
parent dc295f9f4b
commit a8a0bc2b81
16 changed files with 132 additions and 24 deletions

View File

@@ -4,16 +4,16 @@
"type": "split",
"children": [
{
"id": "af7b9ed910c8130c",
"id": "e000b54db04ae812",
"type": "tabs",
"children": [
{
"id": "586fa53a61c93a2c",
"id": "3eee65efd232b15f",
"type": "leaf",
"state": {
"type": "markdown",
"state": {
"file": "TERCERO/ATR2/Teoria_2425.md",
"file": "TERCERO/SETR1/Teoria_2425.md",
"mode": "source",
"source": false
},
@@ -78,7 +78,8 @@
}
],
"direction": "horizontal",
"width": 300
"width": 300,
"collapsed": true
},
"right": {
"id": "44cf06183e1c1c7d",
@@ -161,7 +162,8 @@
}
],
"direction": "horizontal",
"width": 367.5
"width": 367.5,
"collapsed": true
},
"left-ribbon": {
"hiddenItems": {
@@ -175,29 +177,28 @@
"obsidian-git:Open Git source control": false
}
},
"active": "586fa53a61c93a2c",
"active": "3eee65efd232b15f",
"lastOpenFiles": [
"TERCERO/ATR2/Pasted image 20250510225115.png",
"TERCERO/ATR2/Teoria_2425.md",
"TERCERO/ATR2/Pasted image 20250510225113.png",
"TERCERO/ATR2/Pasted image 20250510224952.png",
"TERCERO/ATR2/Pasted image 20250510224703.png",
"TERCERO/ATR2/Pasted image 20250510221130.png",
"TERCERO/ATR2/Pasted image 20250510222503.png",
"TERCERO/ATR2/Pasted image 20250510222038.png",
"TERCERO/ATR2/Pasted image 20250510222011.png",
"TERCERO/ATR2/Pasted image 20250510221553.png",
"TERCERO/ATR2/Pasted image 20250510221309.png",
"Untitled.md",
"Pasted image 20250515120558.png",
"Pasted image 20250515115411.png",
"Pasted image 20250515115243.png",
"Pasted image 20250515114753.png",
"Pasted image 20250515113822.png",
"Pasted image 20250515113807.png",
"Pasted image 20250515113537.png",
"Pasted image 20250515113438.png",
"Pasted image 20250515105628.png",
"Pasted image 20250515105326.png",
"Pasted image 20250515104852.png",
"TERCERO/IA/Teoría_2425.md",
"TERCERO/SETR1/Teoria_2425.md",
"TERCERO/DAD/Teoria_2425.md",
"TERCERO/ATR2/Teoria_2425.md",
"TERCERO/PI/Teoria_2425.md",
"TERCERO/PI/Presentación 24-25.md",
"TERCERO/PI",
"SEGUNDO/AC/Teoría_2324.md",
"TERCERO/SETR1/Teoria_2425.md",
"Untitled.md",
"Untitled 1.md",
"SEGUNDO/RC/Teoría_2324.md",
"TERCERO/DAD/Teoria_2425.md",
"SEGUNDO/AC/Teoría_2324.md",
"TERCERO/ATR1/Teoría_2425.md",
"conflict-files-obsidian-git.md",
"TERCERO/DAD/images",
@@ -205,8 +206,10 @@
"TERCERO/ATR2",
"Untitled",
"TERCERO/DAD",
"TERCERO/PI/Presentación 24-25.md",
"TERCERO/SETR1/Presentación 24-25.md",
"TERCERO/SETR1",
"TERCERO/PI",
"TERCERO/SPD/Teoría_2425.md",
"TERCERO/SS/SS 24-25.md",
"TERCERO/ATR1/Resolución 1 Parcial ATR1.md",

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 92 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 150 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 76 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 251 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 354 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 80 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 94 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 78 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 145 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 145 KiB

View File

@@ -415,4 +415,109 @@ Principales (importantes para el examen):
- Interface
- Endpoint
# 3300 VS 3333 en CLK: ruido frecuencia 1KHz por ruido porque los 23 datos anteriores se transfieren bien pero el ultimo da fallo al estar los tiempos tan apurados, 3333 se escucha mejor
#### 3300 VS 3333 en CLK: ruido frecuencia 1KHz por ruido porque los 23 datos anteriores se transfieren bien pero el ultimo da fallo al estar los tiempos tan apurados, 3333 se escucha mejor
# <mark style="background: #FFF3A3A6;">TEMA 6: Tolerancia a fallos</mark>
Los mecanismos de tolerancia a fallos integrados en los μC suelen ser bastante simples. Los problemas que pueden detectar, y en algún caso, resolver.
- Fallos de alimentación
- Errores de código: _stack overflow_ (WDT)
- Errores hardware: conexión externa interrumpida (WDT)
- Corrupción memoria (WDT)
- Fallo reloj (monitor de CLK)
Los principales mecanismos son:
- Watch Dog Timer (WDT) (Reset)
- Monitores de reloj (Reset)
- Instrucción no implementada (sin return)
- Memoria no implementada (Int/Reset)
## <mark style="background: #ADCCFFA6;">1. Reset encendido y fallos alimentación</mark>
La línea RST se conecta a un circuito RC para que la línea de RST se retenga hasta que $V_{CC}$ alcanza el mínimo valor de tensión para que el μC opere correctamente.
![[Pasted image 20250515114753.png]]
La solución del circuito RC en la línea de RST tiene a su vez dos fallos:
- Los fallos momentáneos de alimentación
- Momento de apagado
![[Pasted image 20250515115243.png]]
### <mark style="background: #FFB86CA6;">Solución: monitores de reset y alimentación</mark>
![[Pasted image 20250515115411.png]]a
## <mark style="background: #ADCCFFA6;">2. Watch Dog Timer</mark>
En los μC es un mecanismo que mezcla software con un elemento hardware para detectar fallos:
- Se basa en que el código en los SE es siempre cíclico y periódico
- Si se tiene bien caracterizado ese tiempo de repetición (Tr) podemos decir que si en alguna ocasión se supera es porque el sistema se ha colgado
- El WDT se programa para que produzca un Reset cada cierto tiempo Twdt > Tr
La clave está en limpiar en el código el WDT en varios puntos, para que nunca llegue a Reset. Si el código deja de operar como debe, no se limpiará y habrá un Reset. El Twdt tiene que estar ajustado, ya que si es muy corto, habrá resets innecesarios, y si es muy largo, se desperdicia tiempo colgado.
En el STM32, se usa un IWDT (Independent Clock WDT) para que si se cuelga el CLK del sistema, pueda dar un Reset. Y también se usa un WDWT (Window WDT), que marca una ventana temporal en la que se puede limpiar el timer, fuera de esa ventana no.
# <mark style="background: #FFF3A3A6;">TEMA 7: FreeRTOS</mark>
## <mark style="background: #ADCCFFA6;">1. Introducción</mark>
![[Pasted image 20250515104540.png]]
- **Tiempo real blando:** Se busca que el tiempo medio de respuesta sea menor que un tiempo predefinido.
- **Tiempo real duro:** Se busca cumplir los plazos de respuesta estrictamento.
### <mark style="background: #FFB86CA6;">Planificación manual para tiempo real</mark>
![[Pasted image 20250515104751.png]]
![[Pasted image 20250515104812.png]]
Este método es más complejo que los RTOS, los cuáles están más en uso hoy en día.
![[Pasted image 20250515104852.png]]
### <mark style="background: #FFB86CA6;">Qué es una tarea</mark>
Pieza de código ejecutable considerada un bloque básico en los STR, normalmente es un punto de entrada más el resto de funciones y recursos necesarios para su ejecución. Un programa tiene una o varias tareas.
## <mark style="background: #ADCCFFA6;">2. Programación sistemas tiempo real</mark>
### <mark style="background: #FFB86CA6;">1. Secuencial (bucle scan)</mark>
Se ejecutan todas las tareas hasta el final antes de iniciar la siguiente. Se comparte información mediante variables globales. Latencia relativamente grande.ç
![[Pasted image 20250515105326.png|200]]
### <mark style="background: #FFB86CA6;">2. Primer/segundo plano</mark>
Se usan interrupciones para disminuir la latencia de las tareas. Aparecen las zonas críticas, en las que hay que deshabilitar las interrupciones para evitar condiciones de carrera.
![[Pasted image 20250515105628.png|400]]
### <mark style="background: #FFB86CA6;">3. Sistema operativo tiempo real</mark>
**Sistema Operativo:** colección de llamadas al sistema que proveen un conjunto básico de servicios para interactuar con el hardware.
**Sistema Operativo Tiempo Real:** un SO que además proporciona mecanismos para permitir la programación de tareas en tiempo real. Suelen tener:
- Soporte para ejecución concurrente (colas FIFO, semáforos)
- **Planificador**
- Gestión dinámica de memoria
- Modular, para ahorrar recursos si algún módulo no se usa y se quiere quitar
- Acceso a hardware a bajo nivel
#### <mark style="background: #D2B3FFA6;">El planificador</mark>
Decide que tarea hay que ejecutar. Hay dos tipos:
- **Cooperativo:** las tareas llaman al planificador cuando terminan su ejecución o cuando consideran que llevan usando demasiado tiempo la CPU.
- **Expropiativo:** el planificador se ejecuta automáticamente de forma periódica (tick) y hay una interrupción periódica que ejecuta el planificador.
#### <mark style="background: #D2B3FFA6;">Planificación apropiativa</mark>
El planificador, a parte de ejecutarse periódicamente por la interrupción guiada por los _ticks_,
se ejecuta cada vez que una tarea realiza una llamada del sistema.
#### <mark style="background: #D2B3FFA6;">Planificación basada en prioridades</mark>
- **Prioridades fijas:**
- Rate Monotonic (RM): mayor prioridad a las tareas con periodo más corto
- Deadline Monotonic (DM): mayor prioridad a las tareas con plazo de ejecución más corto
- **Prioridades dinámicas:**
- Earliest Deadline First (EDF): se planifica la tarea cuyo plazo está más cercano a expirar.
## <mark style="background: #ADCCFFA6;">3. FreeRTOS. CMSIS-RTOS API</mark>
Hay dos tipos: proporcionados por el fabricante y gratuitos, y los desarrollados para varios microcontroladores (como FreeRTOS).
### <mark style="background: #FFB86CA6;">Estilo notación FreeRTOS</mark>
Antiguamente se precedía el nombre de variables con el tipo (cVariable para char, fVariable para float, etc).
### <mark style="background: #FFB86CA6;">Configuración de FreeRTOS</mark>
Algunos parámetros:
- USE_PREEMPTION: 1 RTOS expropiativo, 0 RTOS cooperativo
- MAX_PRIORITIES: nº de prioridades a usar
- TICK_RATE_HZ: frecuencia del tick
- MINIMAL_STACK_SIZE: minima RAM asignada a tarea
- TOTAL_HEAP_SIZE: RAM que puede usar el FreeRTOS
### <mark style="background: #FFB86CA6;">Semáforos</mark>
Cuando hay compartición de recursos hay tres mecanismos:
- Suspender interrupciones y planificador (`taskENTER_CRITICAL`, `taskEXIT_CRITICAL`)
- Suspender el planificador (`vTaskSuspendAll(osKernelLock)`, `vTaskResumeAll`)
- Utilizar semáforos
#### <mark style="background: #D2B3FFA6;">Interbloqueos</mark>
Dos tareas y dos recursos, una adquiere uno y la otra el otro, pero las dos necesitan ambos para seguir y cada una se queda esperando al otro infinitamente. Se puede evitar:
- Semáforos con un _timeout_, de esta forma no se espera infinitamente el semáforo.
- Pidiendo los semáforos en el mismo orden siempre, haciendo que si no se obtiene el primero, no se pide el segundo
- Haciendo que una sola función reentrante sea la que pide los recursos siempre en el mismo orden
#### <mark style="background: #D2B3FFA6;">Inversión de prioridades</mark>
![[Pasted image 20250515113438.png]]
Se puede producir inversión de prioridades por culpa de los semáforos si lo tiene una tarea de baja prioridad, bloqueando una de alta prioridad. Para solucionar esto, se usan **mutex** que son semáforos binarios con **herencia de prioridades**.
<div class="nota">
<h1>DEF</h1>
<span><strong>Herencia de prioridades:</strong> La tarea de baja prioridad (LP) hereda mientras tiene el semáforo la prioridad de la de tarea de alta prioridad (HP)</span>
</div>
### <mark style="background: #FFB86CA6;">Colas</mark>
![[Pasted image 20250515113537.png]]
### <mark style="background: #FFB86CA6;">Control de tiempo</mark>
#### <mark style="background: #D2B3FFA6;">No periódico</mark>
![[Pasted image 20250515113807.png]]
#### <mark style="background: #D2B3FFA6;">Periódico</mark>
![[Pasted image 20250515113822.png]]