У каждого типа памяти свое заранее известное адресное пространство.
Во-первых, Вы можете указать статической переменной (тому же буферу) абсолютный адрес, по которому она должна располагаться оператором @. Например:
Код
__no_init unsigned int LCD_BUFFER1[1024] @ 0x20000000
__no_init unsigned int LCD_BUFFER2[1024] @ 0x20000400
Этот примр создаст две статических переменных - массивы по 1024 беззнаковых интовых значений.
А во-вторых можете указать не конкретный адрес, а только сегмент, внутри которого линкер уже сам выберет место размещения:
Код
__no_init unsigned int LCD_BUFFER1[1024] @ "SDRAM_SEGMENT"
__no_init unsigned int LCD_BUFFER2[1024] @ "SDRAM_SEGMENT"
Это создаст две статические переменные - буфера - в сегменте SDRAM_SEGMENT по адресу, выбранному линкером.
Для ограничения адресного пространства Вы можете просто определить свой сегмент с заданными адресными границами и при создании переменных указывать его.
Это все справедливо для IAR ARM, но нечто подобное должно быть и в других средах. Смотрите хелп на компилятор, раздел наподобие "Controling data placement in memory"