Перейти к содержанию
    

Прозрачность программы для компилятора

В обоих указан инклюд, в котором находится конфликтующая ф-я. Причом она инлайновая.
Похоже этот заголовочник отлаживался в С++ режиме, а вы его пытаетесь в С использовать. Допишите перед определением функции static.

 

1 склеим все хедеры в один

2 склеим все сишники в один

3 склеим склееное в один супер сишник

4 выкинем лишнее, оставшееся от хедеров

Получаем удовольствие :08:

Получаем CodeVisionAVR :lol:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Охранные директивы в этом хедере есть. В чем проблема?

 

А причем тут охранные директивы? Они нужны только чтобы при компиляции хидер только один раз включался, если вдруг хидер по каким-то причинам несколько раз подключен. В вашем случае имеется два тела инлайновой (это кстати не главное в данном случае) функции в разных модулях. Вот линкер и не может разобраться. Надо бы ограничить зону видимости этой функции. Наверное static поможет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Линкер выдает такую ошибку:

Error[e27]: Entry "AT91F_ADC_CfgModeReg" in module BasicWEB ( ..\BasicWEB.r79 ) redefined in module SAM7_EMAC ( ..\SAM7_EMAC.r79 )

В обоих указан инклюд, в котором находится конфликтующая ф-я. Причом она инлайновая.

#include <lib_AT91SAM7X256.h>

С АЦП я вообще не работаю. Охранные директивы в этом хедере есть. В чем проблема?

 

Это уже линкер обругал Ваши объектные файлы... АЦП тут вовсе непричем.

 

Просто у Вас скорее всего в сишных файлах и/или инклюдниках есть два объявления функции AT91F_ADC_CfgModeReg, а именно в файлах

BasicWEB.с ( или в асмовском)

и в файле:

SAM7_EMAC.c ( или в асмовском)

 

Да Вы и сами причину написали:

В обоих указан инклюд, в котором находится конфликтующая ф-я. Причом она инлайновая.

 

вот не должно так быть... Охранные директивы - охраняют только в пределах одного *.c файла, между ними - охранные директивы не работают. Вот Вы и получили - в разных модулях - одну и ту же функцию, а линкер это обнаружил... Все правильно...

 

Наверное static поможет.

 

либо попробовать ее в одном из файлов как extern объявить, но если она не inline-естествоенно...

мне вообще странно что inline-функция вылезла аж до линкера. :biggrin:

Вроде бы ее тело должно просто быть подставлено в текст программы в каждой точке ее вызова и она не должна вылазить в распоряжение линкера?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Видимо проблема в том что компилятор умничает и игнорирует директиву inline, и поскольку эти функции описаны внутри хедера (а не с-шного файла) то получается конфликт. Этот хедер писали сами атмеловцы и не предусмотрели почемуто отключение эвристики компилятора. Хотя они заботливо подменили через дефайн слово inline строкой __inline. Небольшое исправление этого дефайна устранило проблему:

 

Было:

#define __inline inline

 

Стало:

#define __inline _Pragma("inline = forced")

 

================================================

Еще маленький вопросик - как в редакторе ИАР табом сдвинуть сразу несколько строк?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Еще маленький вопросик - как в редакторе ИАР табом сдвинуть сразу несколько строк?
Как и в большинстве редакторов - выделить несколько строк и нажать таб для сдвига вправо или шифт-таб для сдвига влево.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо. Просто у меня после паскалевских Ctrl-Shift-K и -N (кажется) не рождается таких простых ассоциаций насчет таба. =)))

 

Еще вопрос - можно ли в ИАР 4.40A при пользовании J-Link запускать отладку не прошивая кристалл? Тоесть прошил я один раз и отлаживаю. Смотрю по шагам прогу. День рабочий закончился или нечаянно вышел из дебаггера, если программу не менял - не хочется зря тратить ресурс флеша при новом запуске дебаггера...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Еще вопрос - можно ли в ИАР 4.40A при пользовании J-Link запускать отладку не прошивая кристалл?
Project->Options->Debugger->Download поставить галочку Suppress Download. Автоматически выключится галочка Use flash loader. Когда захотите прошить снова и будете снимать Suppress Dowload - не забудьте поставить Use flash loader. А можно создать вде конфигурации - одну с прошивкой, другую без. Создавать проще всего в текстовом редакторе, скопровав и переименовав соответствующие секции в *.ewd и *.ewp

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...