|
В каком-нибудь ассемблерном файле объявить сегмент (можно пустой) типа COMMON
COMMON NAME_COMMON_SEGMENT:DATA(0)
Важно, чтобы при линковке данный файл линковался первым. В оболочке IDE для
этого достаточно объявить его с первым по алфавиту именем (по сравнению
с другими файлами проекта).
В других Си файлах можно было запросто объявлять данные в этом COMMON-сегменте,
например, так:
#pragma memory = dataseg(NAME_COMMON_SEGMENT)
int a;
char b;
....
#pragma memory = default
При линковке выдавалось предупреждение о несоответствии типов сегментов,
но тип присваивался тот, который линковщик видел в первом линкуемом файле,
имеющем сегмент с таким именем. А так как мы уже позаботились о том, чтобы
первым линковался файл, имеющий нужный тип сегмента, то все проходило на ура.
Думаю, что тот же фокус пройдет и в новом компиляторе.
В общем сделать так получается, но при этом все переменные, размещенные
в данном сегменте, оказываются по одному адресу, даже те, которые определены в
одном модуле :(
Определение переменные в одних "скобках" pragma гарантирует у них разные адреса.
А приведенный Вами эффект зависит не от предложенного способа (т.е. Ваше
выражение "при этом" не относится к данному способу). Просто IAR, очевидно,
считает, что объявленные в разных местах (включая повторное объявление
сегмента в том же модуле) переменные должны иметь перекрывающееся адресное
простанство. И, по-моему, это логично, иначе как можно понять Ваши намерения,
хотите ли Вы чтобы адреса перекрывались (даже в том же модуле) или нет.
E-mail: info@telesys.ru