El principal problema con la verificación de si un puntero está en un rango específico es, desafortunadamente, el estándar C. La aritmética de punteros tiene un comportamiento definido solo si se realiza en punteros del mismo tipo dentro del rango de memoria del mismo objeto (es decir, dentro del mismo rango de matriz asignado). A los operadores de comparación se definen como operaciones aritméticas, esta restricción también se aplica a ellos. Una solución para este problema sería convertir los punteros al tipo uintptr_t
definido en stdint.h
, que es un tipo de número entero garantizado para mantener un valor de puntero. Y luego realice sus comparaciones.
Ahora a la parte de obtener los límites correctos. Normalmente, un proyecto de C contendría algún tipo de script de vinculador que definiera las regiones de memoria de la arquitectura específica. Comúnmente incluirá líneas similares a las siguientes:
MEMORY
{
FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x40000
SRAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x8000
}
luego, en el mismo script se pueden agregar las siguientes definiciones:
_flash_start = ORIGIN(FLASH);
_flash_end = ORIGIN(FLASH) + LENGTH(FLASH);
Y luego en el código C se puede acceder a estos símbolos usando:
extern int _flash_start ;
extern int _flash_end;
Y luego una parte difícil: la dirección de _flash_start
corresponderá a la dirección de inicio de flash, y la dirección de _flash_end
corresponderá al final de flash dirección. Es decir. &_flash_start
y &_flash_end
le dan el rango deseado.