Principal problema con la comprobación de si un puntero está en el rango específico es, lamentablemente, la C de la norma en sí misma. Aritmética de punteros tiene definido un comportamiento sólo si se realiza en los punteros del mismo tipo dentro del rango de memoria de un mismo objeto (es decir, dentro de la misma asignado rango de matriz). Un los operadores de comparación se definen como las operaciones aritméticas, esta restricción no se aplica a ellos también. Una solución para este problema sería la fundición de la punteros a la uintptr_t
tipo definido en stdint.h
, que es de tipo entero garantizado para mantener un valor de puntero. Y, a continuación, realizar sus comparaciones.
Ahora a la parte de la obtención del derecho de los límites. Normalmente, un C proyecto podría contener algún tipo de linker script de la definición de regiones de memoria de la arquitectura específica. Comúnmente se incluyen líneas similares a las siguientes:
MEMORY
{
FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x40000
SRAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x8000
}
luego, en la misma secuencia de comandos las siguientes definiciones se pueden añadir:
_flash_start = ORIGIN(FLASH);
_flash_end = ORIGIN(FLASH) + LENGTH(FLASH);
Y, a continuación, en el código de C estos símbolos se puede acceder mediante:
extern int _flash_start ;
extern int _flash_end;
Y, a continuación, una parte difícil: La dirección de la _flash_start
corresponderá a la flash a partir de la dirección, y la dirección de la _flash_end
corresponderá a la flash de la dirección final. I. e. el &_flash_start
y &_flash_end
están dando el rango deseado.