Cómo adaptar el código fuente del sistema operativo: trasplantar el módulo de administración de memoria de FreeRTOS al chip básico ARMV8

Cómo recortar el código fuente del sistema operativo

El escenario de requisitos para este artículo es trasplantar el módulo de administración de memoria para la IP del procesador que carece de implementación de biblioteca estándar, es decir, implementar las funciones malloc()y free()en la biblioteca estándar C para el chip básico.

El método específico consiste en eliminar el código fuente necesario del componente de gestión de memoria del sistema operativo y adaptarlo al entorno de desarrollo del procesador de destino (subdirectorio del proyecto SDK/IDE/CMAKE).

1 Determinar los requisitos: comprender la gestión de la memoria/gestión del montón

1.1 Esquema de gestión de memoria en la biblioteca estándar de C

La biblioteca estándar de C proporciona un conjunto de funciones de administración de memoria para la asignación dinámica de memoria y las operaciones de liberación en los programas de C. Estas funciones incluyen principalmente malloc, calloc, realloc y free.

función malloc: La función malloc se utiliza para asignar un bloque de memoria de un tamaño específico y devolver un puntero al bloque de memoria. Su prototipo de función es:

void* malloc(size_t size);

Acepta un tamaño de parámetro, indicando el tamaño del espacio de memoria a asignar (en bytes). La función malloc asigna un bloque continuo de memoria en la memoria del montón y devuelve un puntero a la dirección inicial del bloque de memoria.

función calloc: La función calloc también se utiliza para asignar un bloque de memoria de un número y tamaño especificados, y devuelve un puntero al bloque de memoria. A diferencia de malloc, calloc inicializa cada byte en el bloque de memoria asignado a 0. Su prototipo de función es:

void* calloc(size_t num, size_t size);

El parámetro num indica el número de elementos que deben asignarse y el parámetro de tamaño indica el tamaño de cada elemento (en bytes). La función calloc asigna un bloque de memoria de tamaño num * tamaño en la memoria del montón y devuelve un puntero a la dirección inicial del bloque de memoria.

función realloc: la función realloc se utiliza para cambiar el tamaño de un bloque de memoria previamente asignado. Su prototipo de función es:

void* realloc(void* ptr, size_t size);

El parámetro ptr es un puntero a un bloque de memoria previamente asignado por malloc o calloc, y el parámetro de tamaño indica el tamaño (en bytes) que debe ajustarse. La función realloc reasigna el bloque de memoria de acuerdo con el nuevo tamaño y devuelve un puntero a la dirección inicial del bloque de memoria reasignado. Si el bloque de memoria no se puede reasignar, la función de reasignación puede crear un nuevo bloque de memoria y copiar los datos del bloque de memoria original al nuevo bloque de memoria.

función libre: La función libre se utiliza para liberar el bloque de memoria previamente asignado por la función malloc, calloc o realloc. Su prototipo de función es:

void free(void* ptr);

El parámetro ptr es un puntero a un bloque de memoria previamente asignado. Al llamar a la función libre, el bloque de memoria se marcará como libre y podrá asignarse nuevamente para otras necesidades de memoria.

1.2 Adaptación de la demanda

Los programas de chip desnudo están limitados por los recursos de memoria y, por lo general, se diseñan utilizando métodos de asignación estática. Solo se deben proporcionar métodos básicos de administración de memoria dinámica cuando se trasplantan algunos controladores periféricos, y hay poca necesidad de nueva memoria dinámica preasignada. . Por lo tanto, realloclas funciones y callocse pueden omitir, de modo que nuestra carga de tareas se reduce a la mitad.

2 Encuentra la rueda - aprende del sistema operativo

El sistema operativo es una abstracción del hardware. La mayoría de los requisitos en el chip desnudo se pueden encontrar en el código fuente del sistema operativo. Entonces, ¿por qué reinventar la rueda y simplemente agarrar la lana del sistema operativo?

2.1 Esquema de gestión de memoria en FreeRTOS

FreeRTOS proporciona varios esquemas de administración de montones. La complejidad y las funciones de estos esquemas son diferentes y son adecuados para diferentes escenarios de demanda. Consulte la figura a continuación para obtener más información.
inserte la descripción de la imagen aquí
En resumen, FreeRTOS nos brinda 5 implementaciones opcionales de módulos de administración de memoria en el directorio de código fuente Source/Portable/MemMang:

  • heap_1: versión minimalista, no admite liberación de memoria (sin función gratuita)
  • heap_2: admite la liberación, pero no fusiona los bloques de memoria liberados
  • heap_3: admite malloc seguro para subprocesos y funciones gratuitas
  • heap_4: Combinar bloques de memoria liberados para evitar la fragmentación de la memoria
  • heap_5: admite la asignación en varios bloques de memoria sobre la base de 4

Aquí elegimos de acuerdo con nuestras propias necesidades.Este artículo elige el trasplante heap_2, porque las funciones básicas son lo suficientemente completas y simples.

2.2 Extraer código fuente

Busque Source/Portable/MemMang/heap2.c en el árbol de fuentes, como se muestra a continuación.
inserte la descripción de la imagen aquí
Cuando lo abre, puede ver que las funciones de asignación y liberación están al alcance de su mano, nombradas pvPortMallocy vPortFreerespectivamente, y agregadas a nuestro proyecto, y luego observe más de cerca las dependencias de este archivo fuente, extraiga las dependencias del árbol fuente y descarte los archivos innecesarios.El módulo de administración de memoria se elimina del sistema operativo.

2.3 Eliminación de dependencias

heap_2.c contiene dos archivos de encabezado relacionados con FreeRTOS: FreeRTOS.h y task.h, el último es una declaración relacionada con el programador de tareas, obviamente no lo necesitamos, simplemente elimínelo directamente. FreeRTOS es una definición de macro de algunos elementos de configuración. Recortamos los relacionados con la administración de memoria y no es necesario conservar todo el archivo FreeRTOS.h.

inserte la descripción de la imagen aquí

Luego, hay una definición de macro que se usa para hacer que el tamaño del espacio de la memoria administrada cumpla con los requisitos de alineación de la memoria:

/* A few bytes might be lost to byte aligning the heap start address. */
#define configADJUSTED_HEAP_SIZE    ( configTOTAL_HEAP_SIZE - portBYTE_ALIGNMENT )

Tanto configTOTAL_HEAP_SIZE como portBYTE_ALIGNMENT requieren que #definamos manualmente
inserte la descripción de la imagen aquí
heap_2.c y usemos una definición de macro portBYTE_ALIGNMENT_MASK:
inserte la descripción de la imagen aquí
originalmente en FreeRTOS.h, lo agregamos a portmacro.h:
inserte la descripción de la imagen aquí
el resto son algunos reemplazos de tipos básicos, y los colocamos en portmacro En el archivo . h archivo:
inserte la descripción de la imagen aquí
también se requiere projdefs.h, y hay macros de truey en él:false
inserte la descripción de la imagen aquí

2.4 Código fuente disponible

Repositorio Github: memManPort

3 pruebas

Puede usar la siguiente demostración para probar la usabilidad de los resultados del trasplante. Siempre que los valores de pb y pc sean consistentes, es básicamente correcto.
inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/qq_33904382/article/details/132130018
Recomendado
Clasificación