This commit is contained in:
Jose
2025-03-14 20:03:14 +01:00
parent 455ad9eed9
commit 07c7dd608c
34 changed files with 472 additions and 19 deletions

View File

@@ -13,7 +13,7 @@
"state": {
"type": "markdown",
"state": {
"file": "TERCERO/PI/Teoria_2425.md",
"file": "TERCERO/ATR2/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": {
@@ -177,22 +179,24 @@
},
"active": "fbdb92a309be8088",
"lastOpenFiles": [
"TERCERO/DAD/Teoria_2425.md",
"Pasted image 20250227131516.png",
"Pasted image 20250314122451.png",
"Pasted image 20250314121916.png",
"Pasted image 20250314121904.png",
"Pasted image 20250314115857.png",
"Pasted image 20250314115632.png",
"Pasted image 20250314115427.png",
"Pasted image 20250314114314.png",
"Pasted image 20250314114257.png",
"TERCERO/SETR1/Teoria_2425.md",
"Pasted image 20250227120032.png",
"Pasted image 20250227115420.png",
"Untitled.md",
"Pasted image 20250313122633.png",
"Pasted image 20250313115415.png",
"Pasted image 20250313114416.png",
"TERCERO/PI/Teoria_2425.md",
"Pasted image 20250225113929.png",
"Pasted image 20250225113139.png",
"Pasted image 20250225112945.png",
"Pasted image 20250225111938.png",
"Pasted image 20250225111801.png",
"Pasted image 20250225111612.png",
"Pasted image 20250225110824.png",
"TERCERO/ATR1/Teoría_2425.md",
"TERCERO/ATR2/Teoria_2425.md",
"SEGUNDO/AC/Teoría_2324.md",
"TERCERO/DAD/Teoria_2425.md",
"Untitled.md",
"TERCERO/ATR1/Teoría_2425.md",
"SEGUNDO/RC/Teoría_2324.md",
"conflict-files-obsidian-git.md",
"TERCERO/DAD/images",
@@ -221,7 +225,6 @@
"TERCERO/ATR1/images",
"TERCERO/ATR1/Welcome.md",
"SEGUNDO/ADDA/ADDA 23-24.md",
"SEGUNDO/ADDA/MODELOS.md",
"SEGUNDO/SO/Sin título.canvas"
]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 101 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 568 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 105 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 330 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 176 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 224 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 57 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 78 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 95 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 96 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 75 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 73 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 97 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 88 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 77 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 55 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 53 KiB

1
SEGUNDO/.obsidian/app.json vendored Normal file
View File

@@ -0,0 +1 @@
{}

1
SEGUNDO/.obsidian/appearance.json vendored Normal file
View File

@@ -0,0 +1 @@
{}

31
SEGUNDO/.obsidian/core-plugins.json vendored Normal file
View File

@@ -0,0 +1,31 @@
{
"file-explorer": true,
"global-search": true,
"switcher": true,
"graph": true,
"backlink": true,
"canvas": true,
"outgoing-link": true,
"tag-pane": true,
"properties": false,
"page-preview": true,
"daily-notes": true,
"templates": true,
"note-composer": true,
"command-palette": true,
"slash-command": false,
"editor-status": true,
"bookmarks": true,
"markdown-importer": false,
"zk-prefixer": false,
"random-note": false,
"outline": true,
"word-count": true,
"slides": false,
"audio-recorder": false,
"workspaces": false,
"file-recovery": true,
"publish": false,
"sync": true,
"webviewer": false
}

166
SEGUNDO/.obsidian/workspace.json vendored Normal file
View File

@@ -0,0 +1,166 @@
{
"main": {
"id": "bab4307730167481",
"type": "split",
"children": [
{
"id": "df5a61525955f9d8",
"type": "tabs",
"children": [
{
"id": "7fddb7c5714d2b20",
"type": "leaf",
"state": {
"type": "empty",
"state": {},
"icon": "lucide-file",
"title": "New tab"
}
}
]
}
],
"direction": "vertical"
},
"left": {
"id": "a79fde7e0786678d",
"type": "split",
"children": [
{
"id": "14746220aa380359",
"type": "tabs",
"children": [
{
"id": "ac7b040221400c06",
"type": "leaf",
"state": {
"type": "file-explorer",
"state": {
"sortOrder": "alphabetical",
"autoReveal": false
},
"icon": "lucide-folder-closed",
"title": "Files"
}
},
{
"id": "42620b8fa8566917",
"type": "leaf",
"state": {
"type": "search",
"state": {
"query": "",
"matchingCase": false,
"explainSearch": false,
"collapseAll": false,
"extraContext": false,
"sortOrder": "alphabetical"
},
"icon": "lucide-search",
"title": "Search"
}
},
{
"id": "d6c1dc02e2736d9b",
"type": "leaf",
"state": {
"type": "bookmarks",
"state": {},
"icon": "lucide-bookmark",
"title": "Bookmarks"
}
}
]
}
],
"direction": "horizontal",
"width": 300
},
"right": {
"id": "ae7a8b7d3da472ac",
"type": "split",
"children": [
{
"id": "48ed7629cb27121e",
"type": "tabs",
"children": [
{
"id": "3f8d79c3e4c8bb56",
"type": "leaf",
"state": {
"type": "backlink",
"state": {
"collapseAll": false,
"extraContext": false,
"sortOrder": "alphabetical",
"showSearch": false,
"searchQuery": "",
"backlinkCollapsed": false,
"unlinkedCollapsed": true
},
"icon": "links-coming-in",
"title": "Backlinks"
}
},
{
"id": "d356429e98de2117",
"type": "leaf",
"state": {
"type": "outgoing-link",
"state": {
"linksCollapsed": false,
"unlinkedCollapsed": true
},
"icon": "links-going-out",
"title": "Outgoing links"
}
},
{
"id": "97804396b48df5cb",
"type": "leaf",
"state": {
"type": "tag",
"state": {
"sortOrder": "frequency",
"useHierarchy": true,
"showSearch": false,
"searchQuery": ""
},
"icon": "lucide-tags",
"title": "Tags"
}
},
{
"id": "266c4f3ef1ada26f",
"type": "leaf",
"state": {
"type": "outline",
"state": {
"followCursor": false,
"showSearch": false,
"searchQuery": ""
},
"icon": "lucide-list",
"title": "Outline"
}
}
]
}
],
"direction": "horizontal",
"width": 300,
"collapsed": true
},
"left-ribbon": {
"hiddenItems": {
"switcher:Open quick switcher": false,
"graph:Open graph view": false,
"canvas:Create new canvas": false,
"daily-notes:Open today's daily note": false,
"templates:Insert template": false,
"command-palette:Open command palette": false
}
},
"active": "7fddb7c5714d2b20",
"lastOpenFiles": []
}

View File

Before

Width:  |  Height:  |  Size: 59 KiB

After

Width:  |  Height:  |  Size: 59 KiB

View File

@@ -72,7 +72,103 @@ Hay varios pasos en el reenvío:
8. Reenviar al PS
9. Enviar ICMP
## <mark style="background: #ADCCFFA6;">3. Información global</mark>
Todos los routers tienen la topología completa y la información de coste de los enlaces (**Algoritmo "link state"**).
## <mark style="background: #ADCCFFA6;">4. Información descentralizada</mark>
Los routers conocen los vecinos físicamente conectados y el coste del enlace a sus vecinos. En un proceso iterativo, intercambia información con sus vecinos (**Algoritmo "distance vector"**).
## <mark style="background: #ADCCFFA6;">5. Enrutamiento estático</mark>
Las rutas cambian lentamente. Es decir, todas las entradas de la tabla se habrán introducido manualmente. La información de ida no proporciona información sobre como volver ni lo asegura. **Convergencia:** todos los routers tienen información precisa y coherente.
## <mark style="background: #ADCCFFA6;">6. Enrutamiento dinámico</mark>
Las rutas cambian más rápido (actualizaciones periódicas y respuesta a los cambios en los enlaces).
### <mark style="background: #FFB86CA6;">Sistemas autónomos</mark>
Grupo de prefijos de red de uno o varios ISP en el que existe una política de enrutamiento única y claramente definida.
- Dentro de cada AS se utilizan protocolos de routing interiores (IGP)
- Entre cada AS se usarán protocolos de routing exteriores (EGP)
### <mark style="background: #FFB86CA6;">Componentes de un algoritmo de enrutamiento</mark>
1. Un proceso para enviar y recibir información sobre redes alcanzables a/de otros routers
2. Un proceso para calcular rutas óptimas (costes en cada enlace)
3. Un proceso para reaccionar y avisar de cambios en la topología
### <mark style="background: #FFB86CA6;">Cálculo del camino más corto</mark>
#### <mark style="background: #D2B3FFA6;">Vector distancia (Bellman-Ford)</mark>
- Cada router conoce la distancia (o coste) de sus vecinos directamente conectados
- Un router envía una lista de actualizaciones de enrutamiento a sus vecinos que contiene las redes alcanzables por él y su distancia
- Si todos los routers actualizan las redes alcanzables/distancias con la información recibida de sus vecinos, la red converge.
- Cada router conoce:
- Su ID
- Sus interfaces
- La distancia hasta el siguiente router de cada interfaz
- Actualizaciones periódicas: cada (~90s) se envía una actualización
- Actualizaciones por cambios: si hay cambios en la métrica de un enlace, se envía inmediatamente
- Actualizaciones de toda la TE: la mayoría de los protocolos que usan vector distancia, envían toda la TE a sus vecinos en las actualizaciones
- Tiempo para invalidar rutas: se invalidan las rutas en la TE si no son refrescadas, tras un valor típico 3-16 veces periodo de actualización
![[Pasted image 20250307112154.png]]
#### <mark style="background: #D2B3FFA6;">Estado del enlace (Dijkstra)</mark>
- Cada router conoce la distancia de sus vecinos directamente conectados
- La información de distancia (LS: Link State) es enviada por broadcast a todos los routers de la red
- Todos los routers construyen la topología de la red
- Cada router calcula el camino más corto a todas las redes alcanzables de manera independiente
## <mark style="background: #ADCCFFA6;">7. RIP</mark>
### <mark style="background: #FFB86CA6;">RIPv1</mark>
- Sufre los problemas típicos del vector distancia
- Sólo útil en redes pequeñas (5-10 routers)
- Métrica basada en número de saltos únicamente
- Máximo 15 saltos. Infinito 16.
- La información se intercambia cada 30s.
Los mensajes RIP se encapsulan en UDP en el puerto 520.
- Dirección destino broadcast dirigido
- Solo procesa actualización si origen pertenece a la red de la interfaz
En un mensaje RIP pueden enviarse hasta 25 entradas del vector distancias
- Vectores grandes -> varios mensajes
- Invalidación tras 180s
No usa máscara de red en los mensajes -> no soporta CIDR ni VLSM.
### <mark style="background: #FFB86CA6;">RIPv2</mark>
- Permite CIDR (tiene el campo de la máscara de subred).
- Campo próximo salto
![[Pasted image 20250307115920.png]]
# <mark style="background: #FFF3A3A6;">TEMA 3: Redes inalámbricas y móviles</mark>
Dos retos importantes aunque diferentes:
- **Sin cables:** comunicación a través de un enlace inalámbrico
- **Movilidad:** gestionando las conexiones cuando un usuario cambia de punto de acceso a la red sin perder su conexión
## <mark style="background: #ADCCFFA6;">1. Introducción</mark>
![[Pasted image 20250314114257.png]]
![[Pasted image 20250314114314.png]]
Hay dos formas de conectar dispositivos de forma inalámbrica
### <mark style="background: #FFB86CA6;">Modo infraestructura</mark>
![[Pasted image 20250314115427.png]]
- Las estaciones base conectan dispositivos de forma cableada.
- Transferencia: dispositivo cambia de estación base que provee la conexión a la red cableada.
# UN PUNTO DE ACCESO NO TIENE IP, ES DE NIVEL 2
![[Pasted image 20250314115632.png]]
**Inundación:** Tabla vacía. El equipo X transmite a la estación A.
**Envío de tráfico:** Si A contesta a X, el punto de acceso recibe una trama en el puerto I con dirección MAC_A de origen y MAC_X destino.
### <mark style="background: #FFB86CA6;">Modo ad hoc</mark>
![[Pasted image 20250314115857.png]]
- No hay estaciones base
- Los nodos sólo pueden transmitir a otros nodos en su alcance
- Los nodos se organizan a sí mismos en red: enrutamiento a través de ellos mismos
### <mark style="background: #FFB86CA6;">Otros modos</mark>
- **Modo Máster:** una estación inalámbrica actúa como punto de acceso
- **Modo Monitor:** permite capturar paquetes sin asociarse a un punto de acceso o red ad-hoc, es decir, permite monitorizar la red sin transmitir tráfico a la misma (modo pasivo).
- **Modo Promiscuo:** permite capturar paquetes de la red, pero hay que estar en ella.
## <mark style="background: #ADCCFFA6;">2. Topologías</mark>
- **BSS (Basic Service Set):** topología de red formada por un punto de acceso y estaciones inalámbricas.
- **ESS (Extended Service Set):** topología de red formada por varias BSS interconectadas entre ellas.
- **IBSS (Independent Basic Service Set):** topología de red formada únicamente por estaciones inalámbricas, operando en modo ad-hoc.
## <mark style="background: #ADCCFFA6;">3. Sistemas de distribución</mark>
### <mark style="background: #FFB86CA6;">Cableado</mark>
A través de red LAN IEEE 802.3
### <mark style="background: #FFB86CA6;">Inalámbricos</mark>
- **WLAN con rutas preconfiguradas estáticas:** WLAN basado en IEEE 802.11
- **WLAN con rutas no preconfiguradas o Redes Mesh:** Las redes Mesh se definen como el conjunto AP interconectadas mediante enlaces inalámbricos ocn configuración dinámica (algoritmos). El objetivo de las redes Mesh es llegar a todos los rincones del sitio con varios AP en una "malla" (mesh).
## <mark style="background: #ADCCFFA6;">4. Diferencias entre tipos de enlace</mark>
En redes inalámbricas hay problemas de obstáculos y distancia, ya que si hubiese tres equipos A,B,C, A y C no "se ven" y como la señal se debilita con la distancia entre ellos o el obstáculo entre ellos no se pueden comunicar.
| Obstáculo | Distancia |
| ------------------------------------ | ------------------------------------ |
| ![[Pasted image 20250314121904.png]] | ![[Pasted image 20250314121916.png]] |
## <mark style="background: #ADCCFFA6;">5. Code Division Multiple Access (CDMA)</mark>
Código único asignado a cada usuario. Todos los usuarios comparten la misma frecuencia pero cada uno tiene una frecuencia de chip para codificar los datos. Permite a usuarios coexistir y transmitir simultáneamente.
- **Señal codificada:** datos originales x secuencia de chip
- **Decodificación:** producto escalar entre la señal codificada y la secuencia de chip
![[Pasted image 20250314122451.png]]

View File

@@ -108,4 +108,18 @@ Por ejemplo para la escritura E/S:
- En general, cada dispositivo conectado al bus debe tener dirección única. Se podría cambiar la dirección o implementar un segundo bus.
- Este bus tiene una arquitectura maestro-esclavo. Es posible que haya más de un maestro pero **SÓLO** un maestro a la vez.
- Es síncrono, el maestro proporciona CLK.
- Tiene resistencias de pull-up a $V_{CC}$ .
- Tiene resistencias de pull-up a $V_{CC}$ .
# <mark style="background: #FFF3A3A6;">TEMA 3: Teclados</mark>
## <mark style="background: #ADCCFFA6;">1. Fundamentos físicos</mark>
![[Pasted image 20250311105624.png]]
![[Pasted image 20250311110117.png]]
Las teclas están "mapeadas" a unos códigos llamados Scan:
![[Pasted image 20250311110853.png]]
![[Pasted image 20250311111634.png]]
## <mark style="background: #ADCCFFA6;">2. Estructura y funcionamiento</mark>
![[Pasted image 20250311111721.png]]
![[Pasted image 20250311112420.png]]

View File

@@ -164,9 +164,150 @@ var2bit2 = 1;
![[Pasted image 20250227120032.png|500]]
### <mark style="background: #FFB86CA6;">Registros</mark>
![[Pasted image 20250306113133.png]]
- **R0-R12:** propósito general
- R0-R7: cualquier instrucción
- R8-R12: no siempre, por ejemplo para instrucciones Thumb (16b)
- **R13:** Stack Pointer. Hay dos SP, el MSP (Main Stack Pointer) para el modo privilegiado y el PSP (Process Stack Pointer) para el modo no privilegiado.
- **R14:** Link Register. Almacena la dirección de retorno de subrutina.
- **R15:** Program Counter.
- **PSR:** Program Status Register. Internamente 3 registros.
![[Pasted image 20250306113416.png]]
- APSR: flags de la última ejecución
- IPSR: código de la interrupción en ejecución
- EPSR: información de la instrucción en ejecución
### <mark style="background: #FFB86CA6;">Set de instrucciones</mark>
![[Pasted image 20250306113057.png]]
#### <mark style="background: #D2B3FFA6;">Instrucciones Thumb y Thumb-2</mark>
- Las instrucciones en los Cortex ocupan 32b.
- Se necesitan 4B por instrucción.
- Un mismo programa ocupa 4 veces más para un Cortex que para un procesador de 8b (ATMEGA, etc)
- Actualmente soportan el juego de instrucciones Thumb-2 (combinan instrucciones de 32b y 16b), pero implica un descenso en el rendimiento al añadir latencia de descodificación de instrucciones.
## <mark style="background: #ADCCFFA6;">4. Manipulación de bits</mark>
- **El método clásico:** Para cambiar un bit de un registro de (por ejemplo) 8 bits, se debe leer, aplicar máscara y escribir el valor modificado. En conclusión: RMW (Read-Modify-Write).
- **El problema:** Si una vez leído el registro, se interrumpe la tarea por otra que modifica otro bit del registro, al escribir el dato de antes, el nuevo bit se machaca.
### <mark style="background: #FFB86CA6;">Métodos de manipulación de bits específicos en μC</mark>
En C tradicional se suelen usar máscaras y campos de bit en structs. En principio, si la unidad mínima direccionable es el byte, los campos de bit implican la necesidad de realizar máscaras para el acceso a los datos sin modificar el resto.
```C
struct mybitfields
{
unsigned short a : 4;
unsigned short b : 5;
unsigned short c : 7;
} test;
int main(void)
{
test.a = 2;
test.b = 31;
test.c = 0;
}
```
Esto depende mucho del **compilador y del μC** ya que puede hacerse tradicionalmente (RMW) o en un sólo paso si se admite el direccionamiento a bit.
#### <mark style="background: #D2B3FFA6;">1. Mapa de memoria direccionable bit</mark>
Hay algunas instrucciones que direccionan a nivel de bit.
![[Pasted image 20250306121610.png]]
#### <mark style="background: #D2B3FFA6;">2. Instrucción compleja que realiza RMW de una vez</mark>
Por ejemplo las instrucciones:
```asm
BRSET dir, mascara, etiqueta
BSET dir, mascara, etiqueta
BCLR dir, mascara
BIC r0, r1, #1 // Pone a 0 en r1 los bits que diga en #X
```
#### <mark style="background: #D2B3FFA6;">3. Direccionamiento de bit dentro de un byte</mark>
```asm
BCF dirf, numbit (PIC)
SBI 0x18, 4 (ATMEGA)
```
#### <mark style="background: #D2B3FFA6;">4. Crear una zona de memoria en la que cada posición de 32 bits está asociada a un bit de otra zona de memoria: bit banding</mark>
![[Captura desde 2025-03-06 12-24-34.png]]
El tamaño máximo de SRAM son 512MB - 32MB ya que estos se usan para apuntar a los bits de la zona de memoria de bit banding.
| bitX | DATO | 0x4242028C |
| -------- | -------- | -------------- |
| **bit3** | **DATO** | **0x42420288** |
| **bit2** | **DATO** | **0x42420284** |
| **bit1** | **DATO** | **0x42420280** |
## <mark style="background: #ADCCFFA6;">5. Interrupciones</mark>
#### <mark style="background: #D2B3FFA6;">Aclaraciones</mark>
Según el origen:
- Hay interrupciones internas al procesador que se producen por algún dispositivo propio dentro del μC.
- Hay interrupciones externas que se activan mediante un pin externo (por nivel o por flanco).
Según el uso:
- Hay interrupciones debidas a fallos (excepciones).
- Hay interrupciones software (como saltos a subrutinas privilegiados).
- Hay interrupciones de gestión de periféricos (las normales).
Posibilidad de enmascarar:
- Interrupciones enmascarables
- Interrupciones no enmascarables (NMI).
### <mark style="background: #FFB86CA6;">Tipos de excepciones</mark>
- **Reset:** tras encendido o aplicar un '0' a la señal reset del CPU. Cuando se produce el CPU para la ejecución independientemente de la instrucción que estuviese ejecutando. Cuando reset se desactiva, se ejecuta la ISR de reset, reiniciando el procesador.
- **HardFault:** se dispara cuando hay un error en el tratamiento de una interrupción/excepción. Ej: ISR no definida
- **MemManage:** ocurre cuando el MPU falla o hay accesos a zonas de memoria reservada.
- **BusFault:** ocurre cuando una transacción en un bus falla o hay un error de E/S. Ej: no existe el periférico en puerto X.
- **UsageFault:** se produce cuando hay un fallo al ejecutar una instrucción
- Instrucción no definida
- Acceso desalineado ilegal
- Estado inválido durante ejecución (por ej. dividir por 0)
- Error en la finalización de una ISR
### <mark style="background: #FFB86CA6;">Tipos de interrupciones software</mark>
- **SVCall:** supervisor call. Se dispara por la instrucción SVC. La usa el SO para asegurarse de que sus instrucciones no se interrumpan y ejecutar bloques de código de forma atómica.
- **PendSV:** permite acceso privilegiado a memoria y registros.
### <mark style="background: #FFB86CA6;">Manejadores de Interrupciones/Excepciones</mark>
Las rutinas que las manejan se clasifican en:
- **Interrupt Service Routines (ISR):** manejan las interrupciones de los periféricos
- **Fault Handlers:** manejan las excepciones en caso de error
- **System Hanlders:** manejan las interrupciones del SO: PendSV, SVCall, SysTick
### <mark style="background: #FFB86CA6;">Gestión de periféricos</mark>
- A cada fuente de int se le asocia un trozo de código: ISR
- Las ISR en μC pequeños suelen no anidarse
- El concepto de anidamiento implica:
- Niveles de prioridad
- Un dispostivo hardware controlador de interrupciones
- Para saber en que sitio esta la ISR: tabla de vectores de interrupcion
![[Pasted image 20250313114416.png]]
### <mark style="background: #FFB86CA6;">NVIC: Nested Vector Interrupt Controller</mark>
- Integrado en el núcleo del Cortex
- Permite asignar niveles de prioridad
- Las interrupciones más prioritarias interrumpen a las de menos prioridad: interrupciones anidadas
- Permite configurar **150 interrupciones** con **16 niveles de prioridad**
- Diseñado para minimizar la latencia
- Permite cambiar la tabla de vectores de
- PPB (Private Programming Bus): para configurar por software
- Tiene múltiples conexiones con el Core:
1. Interrumpir al core y enviarle codigo de interrupcion
2. Conexion E/S para escribir su configuracion
3. Lineas de excepciones
### <mark style="background: #FFB86CA6;">Registros Cortex M4</mark>
```C
register int nombrereg _asm("r13");
__set_BASEPRI(10);
```
![[Pasted image 20250313115415.png]]
### <mark style="background: #FFB86CA6;">Máscaras del Cortex M3/M4</mark>
- PRIMASK: registro de 1 bit que permite excepciones NMI y hard fault y ninguna más.
- FAULTMASK: registro de 1 bit que permite excepciones NMI y ninguna más.
- BASEPRI: registro de 9 bits que define el nivel de prioridad de las máscaras. Cuando se activa, deshabilita las interrupciones >= que su valor (cuanto mas grande el numero, menor prioridad). Por defecto es 0.
### <mark style="background: #FFB86CA6;">Estado de las interrupciones dentro del controlador</mark>
1. Inactive: no se ha producido y no está pendiente
2. Pending: a la espera de ser atendida
3. Active: se está atendiendo por el CPU y no ha sido completada todavía
4. Active and pending: está siendo atendida por el procesador y se ha vuelto a pedir, por lo que se tiene que ejecutar de nuevo cuando se complete.
<hr>
### <mark style="background: #FFB86CA6;">Registros del NVIC</mark>
<h3 style="color:red;">MASCARAS</h3>
- NVIC_ISER (Interrupt Set Enable Register): si se pone a uno, habilita interrupciones.
- NVIC_ICER (Interrupt Clear Enable Register): si se pone a uno, deshabilita interrupciones.
<h3 style="color:red;">FLAGS</h3>
- NVIC_ISPR: marca interrupcion como pendiente
- NVIC_ICPR: resetea la flag de pendiente
- NVIC_IPRx: prioridad de la interrupcion (8 bits para cada interrupcion, 4 interrupciones en un registro de 32 bits)
- NVIC_IABR: activo si una interrupcion está siendo atendida
![[Pasted image 20250313122633.png]]
<div class="nota">
<h3>Si el BASEPRI del Core está a 0, se usa el nivel de prioridad del NVIC. Sin embargo si está > 0 el del Core, las interrupciones que lleguen al Core desde el NVIC con menos prioridad no se atenderán</h3>
<h3>La prioridad principal sirve para ver que interrupción puede o no interrumpir a otra. Sin embargo, la subprioridad sirve para que en caso de que lleguen "a la vez" se pueda decidir cual va primero. </h3>
</div>