Diseño y Análisis de Actualización Remota de Plataforma Embebida Basada en Compresión y Algoritmo Diferencial

La solución de actualización remota integrada tradicional generalmente adopta el método de actualización de paquete completo, que tiene una gran cantidad de datos de actualización, ocupa mucho tiempo en el ancho de banda de la red y también aumenta el consumo de energía del dispositivo.

Apuntando a estos problemas, se proponen dos esquemas de actualización remota con el objetivo de reducir la cantidad de datos de actualización. Estos dos esquemas utilizan respectivamente compresión LZ77 y algoritmo diferencial BSDiff para procesar paquetes de actualización, reduciendo la cantidad de datos a transmitir; al mismo tiempo, en términos de transmisión de datos, se agrega una función de reanudación de punto de interrupción para permitir que la terminal continúe obteniendo datos del lugar desconectado, a fin de lograr el propósito de ahorrar tráfico del dispositivo y consumo de energía. Además, se diseña un método de partición FLASH, que optimiza el flujo de las operaciones de autoactualización local y elimina las operaciones de copia redundantes. Los dos esquemas se verifican y prueban en la plataforma integrada creada por STM32F407ZGT6 y NB-IoT. Los resultados experimentales muestran que la eficiencia de actualización promedio de estos dos esquemas de actualización aumenta en un 26,44 % y un 72,17 %, respectivamente, en comparación con el método de actualización de paquetes.

introducción

Con el desarrollo de tecnologías de comunicación inalámbrica como NB-IoT y GPRS, cada vez se utilizan más dispositivos terminales inalámbricos integrados en la vida diaria. La mejora de las funciones de estos dispositivos y la reparación de errores son inseparables de la actualización del firmware del sistema. Para mantener mejor estos dispositivos terminales, la función de actualización remota del firmware en línea es particularmente importante.

Sin embargo, en la solución tradicional de actualización remota de firmware, generalmente se usa todo el paquete de actualización. Aunque hay poca diferencia en las funciones de código entre los paquetes de actualización antiguos y nuevos, aún es necesario descargar el paquete de actualización completo a la memoria del hardware de forma inalámbrica. y luego Iniciar la actualización.Este método de actualización ocupa mucho tiempo en el ancho de banda de la red, y es propenso a la pérdida de paquetes y la desconexión cuando la red está congestionada, lo que a su vez afecta el consumo de energía del dispositivo y la eficiencia de la actualización. .

Algoritmo de compresión LZ77

LZ77 es un algoritmo de compresión sin pérdidas basado en diccionario.Primero, se definen respectivamente un búfer directo y una ventana deslizante de diferentes longitudes.
Los datos que se comprimirán entrarán en el búfer directo en orden. Supongamos que hay n datos en el búfer directo, que son X1, X2,..., Xn respectivamente. En este momento, estos datos formarán un diccionario Sj={( X1), (X1,X2),...,(X1,X2,...,Xn)}.
Posteriormente, estos datos ingresarán en la ventana deslizante en orden. Suponiendo que la ventana deslizante tiene m datos, se dividen en X1, X2,...,Xm. En este momento, estos datos forman un diccionario Sw={(X1, X2,...,Xm),( X2,...,Xm),...,(Xm)}

inserte la descripción de la imagen aquí
Con el movimiento del búfer de avance y la ventana deslizante, los contenidos de los diccionarios Sf y Sw también cambiarán continuamente.
Cada vez que deslice un bit, busque la cadena más larga en el diccionario Sf que pueda coincidir con el diccionario Sw. Si puede coincidir, márquelo como una codificación que consta de tres parámetros: compensación, longitud de datos coincidente y carácter nuevo; la salida no coincide.
El algoritmo LZ77 reemplaza los datos redundantes con estas marcas y luego logra el propósito de comprimir los datos.

Algoritmo de diferencia BSDiff

En un sistema integrado, incluso si se agrega o elimina una pequeña cantidad de código fuente, el archivo ejecutable binario compilado aún tendrá una gran diferencia, porque el código fuente modificado, después de la compilación, hará que el código original se bloquee y la dirección apuntada por el bloque de datos ha sufrido una gran cantidad de cambios, pero este cambio es regular y se puede resumir en dos reglas:

  1. En las áreas que no se ven afectadas por el nuevo código, los cambios son escasos y las diferencias entre los bytes modificados son pequeñas, normalmente con una diferencia de unos pocos bytes.
  2. Aunque el área afectada varía mucho, la mayoría de ellos pertenecen al desplazamiento general del puntero del bloque de código y del bloque de datos, y el valor de desplazamiento es un valor fijo.

inserte la descripción de la imagen aquí

La figura enumera la diferencia en bytes del contenido de los archivos ejecutables antiguos y nuevos después de insertar una sola línea de código.
Muchos bytes de diferencia son 0, por lo que el archivo de diferencia es altamente comprimible.

Los pasos son:

  1. Ordene los datos del archivo antiguo por sufijo.
  2. Use la búsqueda binaria para encontrar la longitud de la cadena más larga que pueda coincidir y calcule las diferencias y adiciones.
  3. Comprima la parte de diferencia y la parte nueva para generar un paquete de parche de diferencia.

Optimización de la solución del sistema de actualización remota

El Esquema 1 utiliza el algoritmo de compresión LZ77 como núcleo y su diagrama de bloques general se muestra en la Figura 3.
Primero, coloque el archivo ejecutable de la nueva versión en el servidor, ejecute el algoritmo de compresión LZ77 y comprima los datos en el archivo ejecutable para generar un paquete comprimido. En segundo lugar, el paquete comprimido se enviará al dispositivo terminal a través de la red inalámbrica NB-IoT. Después de que el dispositivo terminal integrado reciba los datos, permitirá que el LZ77 descomprima el programa y restaure los datos en un paquete de actualización completo. A continuación, el dispositivo terminal verificará los datos actualizados. ;Finalmente realice una actualización de reinicio.

inserte la descripción de la imagen aquí

inserte la descripción de la imagen aquí
La solución 2 utiliza el algoritmo diferencial BSDiff como núcleo. Primero, el servidor debe guardar el paquete de actualización de la versión anterior. Cada vez que hay un dispositivo terminal que necesita actualizarse, el paquete de actualización de la nueva versión se coloca primero en el servidor. y el servidor ejecuta el programa BSDiff para reemplazar los paquetes de actualización antiguos y nuevos. Los datos del parche se comparan y calculan para obtener el paquete de parche Patch entre las dos versiones, y luego los datos del paquete de parche se envían al dispositivo terminal. a través de la red inalámbrica NB-IoT.
Después de que el terminal del dispositivo reciba el paquete de parches, permitirá que el programa BSPatch combine los datos del paquete de actualización binario anterior con los datos del paquete de parches para generar un nuevo paquete de actualización completo, y el dispositivo terminal verificará los datos actualizados; finalmente ejecute el programa de actualización de reinicio para completar la renovación.

Diseño de Protocolo de Comunicación

El sistema utiliza el módulo Quectel BC26 como módulo de comunicación inalámbrica NB-IoT.
El módulo BC26 tiene ricas interfaces externas (UART, SPI, ADC, etc.) y varias pilas de protocolos de red (TCP, CoAP, MQTT, etc.), y utiliza principalmente comandos AT para realizar tareas.

Comandos AT relacionados:
inserte la descripción de la imagen aquí
cuando STM32 envía comandos AT al módulo BC26 a través del puerto serie, el módulo BC26 devolverá OK, NULL y otra información a través del puerto serie para informar si el comando AT se ejecutó correctamente.

Después de encender STM32, envíe los comandos AT correspondientes a través del puerto serie para permitir que BC26 establezca una conexión TCP con el servidor y consulte activamente si hay una nueva versión. Después de encontrar una nueva versión, continúe solicitando los datos del paquete de actualización del servidor.

Este documento diseña el protocolo de comunicación entre el terminal y el servidor. La Tabla 2 muestra la estructura del terminal que solicita al servidor el paquete de protocolo de actualización, incluido el encabezado del protocolo, la longitud del protocolo y el código de operación.
Donde, la longitud del protocolo es la longitud total de un paquete de datos sin el código de verificación, y el código de verificación es la suma de los datos totales en el paquete de datos de una trama sin el propio código de verificación.
inserte la descripción de la imagen aquí
En el protocolo de datos devuelto por el servidor, cuando el valor del tamaño total del paquete de actualización es 0x0000, significa que no hay una nueva versión en el lado del servidor que no necesite actualizarse.
Cuando el valor del tamaño total del paquete de actualización no es 0x0000, significa que se requiere una actualización y su valor real es el número total de bytes del paquete de actualización.
En este momento, el terminal continuará solicitando los datos del paquete de actualización del servidor de acuerdo con el formato del paquete de protocolo para solicitar los datos de actualización en la Tabla 3.

Dado que el módulo BC26 tiene un límite en la cantidad de datos enviados y recibidos en cada trama, la longitud de los datos del paquete individual solicitado por el terminal al servidor en cada paquete se establece en el código para que sea 0x0100 (256 bytes), que Es decir, cada solicitud al servidor para una actualización de datos del paquete de 256 bytes, mientras que el último paquete de actualización se transmite de acuerdo con la longitud real.
Después de que se transmite cada trama de datos, el terminal realiza el procesamiento de la cadena de caracteres en esta trama de datos y extrae los datos del paquete de actualización hasta que se transmiten todos los paquetes de datos.

Optimización de procesos IAP

En la programación de aplicaciones (IAP), los usuarios pueden usar el cargador de arranque para borrar y programar el FLASH en el chip de la MCU, actualizando así el programa de la aplicación local.

Pasos de actualización tradicionales:

  1. Guarde todos los datos del paquete de actualización en FLASH fuera del chip.
  2. Realice un reinicio e ingrese al cargador de arranque Bootloader.
  3. Copie los datos del paquete de actualización guardados en el FLASH fuera del chip en el área del programa principal del usuario en el chip.
  4. Saltar a la nueva entrada del programa.

inserte la descripción de la imagen aquí
Este sistema optimiza la función IAP y divide el FLASH en chip de STM32 en tres áreas.
Se divide en un área de guía del cargador de arranque y dos áreas de programa principal del usuario, y define las direcciones de inicio de User1 y User2 FLASH respectivamente.

El IAP optimizado adopta el método de actualizar el área principal del programa de Usuario1 y Usuario2 alternativamente.

  1. Guarde los datos de todos los paquetes de actualización directamente en User2 y configure el bit de bandera.
  2. Ejecute un reinicio para ingresar al cargador de arranque BootLoader.
  3. Vaya a la entrada del programa principal de Usuario2.
  4. Para la próxima actualización, guarde los datos del paquete de actualización en Usuario1, configure el bit de bandera, ejecute el paso 2 y luego salte a la entrada del área principal del programa de Usuario1.

Motivo: En el intercambio de datos entre FLASH, la mayor parte del tiempo se dedicará a borrar y copiar datos. El IAP optimizado no solo ahorra el uso de espacio FLASH fuera del chip, sino que también elimina el enlace de actualización de la copia de datos del paquete, lo que reduce aún más el tiempo necesario para las autoactualizaciones locales.

Los pasos generales de implementación de la actualización remota de la plataforma integrada

inserte la descripción de la imagen aquí
Primero, el tamaño del paquete de actualización se reduce mediante el algoritmo de compresión LZ77 o el algoritmo diferencial BSDiff.
En segundo lugar, en el enlace de transmisión de datos de la red inalámbrica, se agrega la función de reanudación del punto de interrupción.Cuando hay situaciones anormales, como fallas en el suministro eléctrico y desconexión de la red, el número de serie del paquete de actualización anterior se escribirá en el FLASH fuera del chip, y la energía se encenderá nuevamente o el estado de la red es bueno. En el caso del paquete de actualización, continúe solicitando los datos del paquete de actualización desde el número de serie del paquete de actualización registrado, sin solicitar los datos del paquete de actualización desde el principio; finalmente, por optimizando la ejecución local de la función IAP, se ahorra el tiempo de copia de datos entre FLASH.

  1. Después de encender el sistema, inicialice el GPIO, el reloj, el puerto serie y otras funciones para asegurarse de que el sistema pueda funcionar normalmente e ingrese al programa de arranque BootLoader.
  2. De acuerdo con el bit de bandera del programa principal, salte al área del programa Usuario1 (Usuario2) para comenzar.
  3. STM32 envía los comandos AT correspondientes al módulo BC26 a través del puerto serie, lo que le permite crear un socket TCP y conectarse al servidor.
  4. Una vez completada la conexión, envíe la información del número de versión de software actual del terminal al servidor de acuerdo con el protocolo de comunicación de la Tabla 2. En el paquete de respuesta devuelto por el servidor, si el valor del tamaño del paquete de actualización es 0x0000, no es necesario actualizar, y luego salir de la actualización; si Cuando el valor no es 0x0000, indica que se requiere una actualización y se realiza el paso 5.
  5. De acuerdo con el protocolo de comunicación en la Tabla 3 y el número de serie del paquete de actualización registrado en el FLASH fuera del chip actual, solicite los datos del paquete de actualización del servidor y agregue 1 al número de serie del paquete de actualización, y luego devuelva los datos del paquete de actualización bit de datos del marco de datos mediante el análisis del servidor Escriba los datos analizados en el FLASH fuera del chip a través de la función Flash_Write (wBuf, WriteAddr, NumByteToWrite), donde wBuf es el paquete de actualización de datos que se almacenará, la dirección de inicio que se almacenará en el bit WriteAddr, y NumBByteToWrite es el número total de palabras que se almacenarán Número de sección.
  6. Divida la cantidad total de datos del paquete de actualización por 256 bytes para calcular la cantidad total de paquetes de datos que deben solicitarse. Si se han solicitado todos los paquetes de actualización, vaya al paso 8; de lo contrario, vaya al paso 7.
  7. Si la solicitud no se completa, se tomará una decisión adicional. Si la comunicación se interrumpe o se agota el tiempo debido a anomalías como fallas en el suministro eléctrico y mala señal, el número de serie del paquete de actualización anterior se registrará, se escribirá en FLASH y se desconectará de el socket TCP y vaya al paso 3; si la transmisión no se interrumpe y se agota el tiempo de espera, vaya al paso 5 para solicitar el siguiente paquete de actualización.
  8. Después de que se completen todas las solicitudes del paquete de actualización, el programa de descompresión se ejecutará de acuerdo con el plan experimental correspondiente o se restaurará la diferencia para restaurar el paquete de actualización.
  9. Utilice la función Iap_WriteBin(BinAddr, BinBuf, BinSize) para guardar todos los datos del paquete de actualización restaurado en el programa principal User2.
  10. Después de guardar, configure el bit indicador del programa principal y restablezca el número de serie del paquete de actualización a 1.
  11. Reinicie el sistema, luego ingrese el programa de inicio Bootloader, ejecute la función Iap_LoadBin (BinAddr) para inicializar el puntero de la pila y salte al área del programa de usuario cuyo valor es BinAddr de acuerdo con el bit de bandera del programa principal que acaba de establecer, es decir, complete la actualización y registre el número de versión del software.

Supongo que te gusta

Origin blog.csdn.net/Caramel_biscuit/article/details/131914565
Recomendado
Clasificación