Unidad 3 / 9

Código de sistemas integrados y microcontroladores

Ganancias:

  • Capacidad para definir requisitos de registro, interrupción y temporización para el microcontrolador con un mensaje claro
  • Capacidad de comprobar el código C/Arduino producido por IA en términos de configuración de registro, desbordamiento del búfer y limitaciones de tiempo real.
  • Capacidad de aplicar el hábito de verificar el código generado midiéndolo en hardware (osciloscopio, puerto serie)

El desarrollo de sistemas integrados es donde se cruzan el software y el hardware: configurar un bit de registro incorrectamente, mantener una interrupción demasiado tiempo o desbordar un búfer causará fallas extrañas y difíciles de reproducir en el campo, a pesar de que el código se "compila" y se ejecuta. La IA es verdaderamente un acelerador en esta área; Puede producir esqueletos iniciales, funciones de abstracción de hardware, máquinas de estado y rutinas de comunicación. Pero la IA no ve la hoja de datos de su tarjeta, no conoce la frecuencia de su reloj y no detecta sus limitaciones de tiempo real. En esta unidad, cubriremos cómo definir claramente el trabajo del microcontrolador para la IA, cómo verificar el código C/Arduino generado y por qué se debe medir todo en el hardware.

Definición clara del requisito: registro, corte, sincronización

Decirle a la IA que "encienda un LED" no funcionará; ¿Qué tarjeta, qué pin, qué frecuencia de reloj, qué sincronización? Al asignar una tarea integrada a la IA, utilice este marco: hardware (familia MCU, reloj, pin), función (qué sucederá), restricción (sincronización, energía, memoria) e interfaz (registro, HAL, biblioteca Arduino).

Aviso débil / Aviso fuerte

DÉBIL: "Produzca PWM con STM32". (Resultado: qué temporizador, qué frecuencia, qué pin no está claro; general, probablemente código de nombre de registro incorrecto.) FUERTE: "Produzca 20 kHz, 0-100% de trabajo ajustable PWM en TIM3 CH1 (PA6) para STM32F103 (reloj del sistema de 72 MHz). Escriba en el nivel de registro (no HAL). - Los valores de preescalador y ARR para 20 kHz CALCULEN y muestren el cálculo en la línea de comentarios. - Establezca el deber con un parámetro de función entre 0-100: comente cada bit de registro que utilice. Tenga en cuenta que los valores cambiarán si su suposición de reloj es incorrecta.

La diferencia es que el poderoso mensaje hace que el modelo muestre el cálculo y revele la suposición del reloj. Para que puedas comprobar los valores del preescalador/ARR de forma independiente:

Para 20 kHz PWM (reloj de 72 MHz):Timer_clock = 72 MHzSi queremos preescalador = 72-1 → contador de reloj = 1 MHzARR = (1 MHz / 20 kHz) - 1 = 50 - 1 = 49Verificación: 1e6 / (49+1) = 20 000 Hz ✓

Auditoría del código de IA: ¿Qué buscar?

El hecho de que el código generado se compile no significa que funcione correctamente. Siga esta lista de verificación:

área de control

que buscar

Configuración de registro/bits

Exactamente compatible con la hoja de datos, máscara de bits correcta

Interrupción (ISR)

¿Es corto? ¿Sin retraso del bloqueador? ¿Se utiliza volátil?

buffer/matriz

¿Existe control fronterizo? ¿Riesgo de desbordamiento?

sincronización

¿Con retraso o temporizador? ¿Se cumple la limitación de tiempo real?

Tipo y ancho

Desbordamiento de 8/16/32 bits, confusión firmada/no firmada

poder/perro guardián

¿Perro guardián de alimentación de bucle infinito?

Las rutinas de servicio de interrupción (ISR) son la fuente más común de errores. La IA a veces coloca un retraso () o un bucle largo dentro del ISR. Esto hace que se pierdan otras interrupciones y se reinicie el mecanismo de vigilancia. Regla: el ISR debe ser lo más corto posible; El trabajo principal debería ser configurar una bandera y moverla al bucle principal.

// DÉBIL (la IA a veces produce esto): Función de bloqueo en ISR void TIM3_IRQHandler(void) { if (TIM3->SR & TIM_SR_UIF) { TIM3->SR &= ~TIM_SR_UIF; leer_sensor(); // puede tardar mucho tiempo - BAD CASE_Delay(10); // retraso en ISR - MUY MALO }}// FUERTE: ISR corto; el trabajo se mueve al bucle principal volátil uint8_t tick_flag = 0; // CONDICIÓN volátilvoid TIM3_IRQHandler(void) { if (TIM3->SR & TIM_SR_UIF) { TIM3->SR &= ~TIM_SR_UIF; bandera_tick = 1; //simplemente establece la bandera }}// en el bucle principal:if (tick_flag) { tick_flag = 0; leer_sensor(); }

Precaución: cualquier variable compartida entre la interrupción y el bucle principal debe ser volátil. De lo contrario, el compilador puede almacenar en caché la variable en el registro y perder la actualización. La IA a menudo olvida esta palabra clave; Búscalo específicamente al leer el código.

Desbordamiento de búfer y errores de tipo

La IA puede copiar datos del puerto serie en una matriz de tamaño fijo sin verificación de límites. En un sistema integrado, esto significa destruir la memoria contigua y fallas inexplicables. Asegúrese de que el límite esté verificado en cada strcpy, índice de matriz y búfer DMA. De manera similar, un contador de 8 bits se reinicia después de 255; La IA puede ignorar esto y confiar en una cuenta desbordada.

Verificación en hardware: el "funcionamiento" se mide, no se supone

En un sistema integrado, la evidencia más confiable es el medidor, no el compilador. Verifique el código generado de estas tres maneras:

  1. Osciloscopio/analizador lógico: mide la frecuencia PWM, la sincronización de la señal y la forma de onda de comunicación. Si querías 20 kHz, mira 20 kHz en la pantalla.
  2. Registro del puerto serie (UART): imprima valores de variables, transiciones de estado y contadores de errores y compárelos con el comportamiento esperado.
  3. Pruebas de límite y de estrés: pruebe si el sistema resiste la carga más alta, los datos más rápidos y el peor momento.

Si el valor medido no coincide con el cálculo, la suposición del reloj, el valor del preescalador o la configuración del registro son incorrectos; perseguir.

Mini caso

Un equipo de estudiantes hace que la IA imprima un código de medición de distancia con un sensor ultrasónico HC-SR04. El código se compila pero la distancia siempre da valores ridículos. Cuando lo conectan al osciloscopio, ven que el tramo de eco calcula su temporización en milisegundos en lugar de microsegundos; La IA usó millis() en lugar de micros(). Este error de una palabra confundió toda la medición en un factor de 1000. Cuando imprimen el tiempo de eco sin procesar en el registro en serie y lo comparan con una regla real, encuentran el error y lo solucionan. Lección: el código compilado no es código correcto; La medición en hardware revela el error inmediatamente.

Errores comunes

  • Aceptar nombres de registros y máscaras de bits sin compararlos con la hoja de datos.
  • Permitir retrasos de bloqueo o procesamiento prolongado dentro del ISR.
  • Olvidarse de los volátiles en las variables compartidas.
  • Omitir la verificación de límites de matriz y búfer; sin ver el desbordamiento.
  • Confiar en suposiciones de frecuencia de reloj y sincronización sin verificarlas.
  • Considerando que el código "funciona" sin medirlo con un osciloscopio/registro en serie.

En resumen

  • Defina claramente la tarea integrada en términos de hardware, función, limitaciones e interfaz.
  • Haga que la IA calcule valores de tiempo como el preescalador/ARR y los verifique de forma independiente.
  • Mantenga los ISR breves, utilice volátiles en variables compartidas.
  • Busque específicamente errores de registro, límite de búfer y ancho de tipo.
  • "Funciona" se demuestra con un osciloscopio, un analizador lógico y un registro en serie, no con el compilador.
  • Si el valor medido no concuerda con el cálculo, siga las suposiciones.

Tarea de aplicación

Con un microcontrolador que tengas (Arduino, STM32, ESP32), pídele a la IA PWM o una tarea periódica a una frecuencia determinada. Antes de cargar el código: (1) verifique los valores de frecuencia/tiempo independientemente de la cuenta en la línea de comentarios, (2) verifique volátil y de bloqueo en el ISR y las variables compartidas. Después de la carga, mida la frecuencia real con un osciloscopio o analizador lógico y compárela con el objetivo. Si hay una desviación, busque la fuente y corríjala, y anote lo que se asumió como incorrecto.