кто-то когда-то написал такую вещь, честно говоря не проверял (+)
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено 0men 30 марта 2004 г. 16:10
В ответ на: Не проходит. отправлено Сергей Борщ 30 марта 2004 г. 16:06

В каком-нибудь ассемблерном файле объявить сегмент (можно пустой) типа 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