Das Hauptproblem bei der Überprüfung, ob sich ein Zeiger in einem bestimmten Bereich befindet, ist leider der C-Standard selbst. Zeigerarithmetik hat nur dann ein definiertes Verhalten , wenn sie an Zeigern desselben Typs innerhalb des Speicherbereichs desselben Objekts (dh innerhalb desselben zugewiesenen Arraybereichs) ausgeführt wird. Wenn die Vergleichsoperatoren als arithmetische Operationen definiert sind, gilt diese Einschränkung auch für sie. Eine Problemumgehung für dieses Problem wäre das Umwandeln der Zeiger in den in uintptr_t
definierten Typ, bei stdint.h
dem es sich um einen ganzzahligen Typ handelt, der garantiert einen Zeigerwert enthält. Und dann führen Sie Ihre Vergleiche durch.
Nun zum Teil, die richtigen Grenzen zu erreichen. Normalerweise enthält ein C-Projekt eine Art Linker-Skript, das Speicherbereiche der spezifischen Architektur definiert. Im Allgemeinen enthält es Zeilen ähnlich den folgenden:
MEMORY
{
FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x40000
SRAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x8000
}
Im selben Skript können dann die folgenden Definitionen hinzugefügt werden:
_flash_start = ORIGIN(FLASH);
_flash_end = ORIGIN(FLASH) + LENGTH(FLASH);
Und dann können Sie im C-Code auf diese Symbole zugreifen, indem Sie:
extern int _flash_start ;
extern int _flash_end;
Und dann ein kniffliger Teil: Die Adresse von _flash_start
entspricht der Flash-Startadresse, und die Adresse von _flash_end
entspricht der Flash-Endadresse. Dh die &_flash_start
und &_flash_end
geben Ihnen die gewünschte Reichweite.