Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: IAR не линкуется проект
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
chdm
Здравствуйте. У меня есть такая проблема. Хочу написать простое приложение типа hello world для микроконтроллера ATmega168. При этом в проект подключаю RTOS XMK (видно не получается корректно подключить). Эта RTOS линкуется, как я понимаю статически. Я её прописал в Additional Includes. Компилятор отрабатывает, а линкер ругается:
Error[e46]: Undefined external "_Xmk_core_initialize" referred in main ( E:\atmel\Dimmer\Demo\Debug\Obj\main.r90 )
Error[e46]: Undefined external "_xmkIsrSp" referred in main ( E:\atmel\Dimmer\Demo\Debug\Obj\main.r90 )
Error[e46]: Undefined external "_xmkCurThread" referred in main ( E:\atmel\Dimmer\Demo\Debug\Obj\main.r90 )
Error[e46]: Undefined external "_xmkKrnStatus" referred in main ( E:\atmel\Dimmer\Demo\Debug\Obj\main.r90 )
Error[e46]: Undefined external "_xmkCurNext" referred in main ( E:\atmel\Dimmer\Demo\Debug\Obj\main.r90 )
Error[e46]: Undefined external "_Xmk_findNext" referred in main ( E:\atmel\Dimmer\Demo\Debug\Obj\main.r90 )
Error[e46]: Undefined external "PAL__XMK_startIdle" referred in main ( E:\atmel\Dimmer\Demo\Debug\Obj\main.r90 )
Error[e46]: Undefined external "_Xmk_createThread" referred in main ( E:\atmel\Dimmer\Demo\Debug\Obj\main.r90 )
Error while running Linker

Подскажите пожалуйста как правильно прописать в ИАР.
Заранее благодарен.
XVR
Цитата
Additional Includes
недостаточно. Еще должна где то быть прописана библиотека с самой XMK
chdm
Цитата(XVR @ Nov 24 2009, 10:18) *
недостаточно. Еще должна где то быть прописана библиотека с самой XMK

Т.е. указание на объектные файлы...Да, но эта ХМК заключает в себе просто сорсы, а не динамическую библиотеку. Т.е. как я понимаю, компилятору нужно где-то прописать чтобы он в начале, перед линковкой, создал и объектные файлы ХМК из имеющихся сорсов и их использовал. Только вот в том вопрос, как это прописать в IAR?
Сергей Борщ
Цитата(chdm @ Nov 24 2009, 11:10) *
Только вот в том вопрос, как это прописать в IAR?
Точно также, как вы подключаете к проекту свои исходные файлы, подключите исходные файлы библиотеки (Project->Add files). Можете создать отдельную группу, чтобы они не мешались в общей куче.
chdm
Спасибо за помощь. Но тут вот какая штука возникает: я добавил все эти файлы к проекту (имеется ввиду и вроде он создаёт даже r90 файлы в папке OBJ, как я понимаю это объектные файлы). Но не линкует... Пишет

Error[e46]: Undefined external "_Xmk_sysTickISR" referred in isrsystimer ( E:\atmel\Demo\Debug\Obj\isrsystimer.r90 )
........

я в isrsystimer.S объявил:

EXTERN _Xmk_sysTickISR

Если я прописываю :

#include "xmk/tmsys.h"

Тогда если посмотреть в браузере проекта, то файл isrsystimer.S включает по 2 файла tmsys.h, ну и куча других, по 2 файла. Компилятор выдаёт ошибки типа dublicate... Не подскажете в чём ошибка и как её устранить?
Сергей Борщ
Цитата(chdm @ Nov 25 2009, 15:08) *
я в isrsystimer.S объявил:

EXTERN _Xmk_sysTickISR
Поиском по файлам ищите объявление этой _Xmk_sysTickISR в исходниках ОС. Весьма вероятно, что она объявлена как встраиваемая статическая С-функция и, значит, не может быть вызвана из ассемблера. И заголовочные файлы могут быть несовместимы с ассемблером. Тогда вам надо написать в С-файле "обертку" для этиой функции и вызывать из ассемблера эту обертку:
Код
#include "xmk/tmsys.h"

void _Xmk_sysTickISR_wrapper()
{
    _Xmk_sysTickISR();
}
Но есть подозрение, что достаточно (и гораздо эффективнее скомпилится) просто написать обработчик прерывания таймера на С. что-то вроде
Код
#pragma vector = TIMER0_OVF_vect
__interrupt void Xmk_sysTickISR()
{
    _Xmk_sysTickISR();
}
chdm
Цитата(Сергей Борщ @ Nov 25 2009, 16:10) *
void _Xmk_sysTickISR_wrapper()
{
_Xmk_sysTickISR();
}[/code]

Т.е. создать другой .с и .h файлы и с этой этой функцией?

И также я попробовал, закоментировать в ассемблеровском коде вызовы функций, но ничего не дало. Не линкуется по-прежнему:

Error[e46]: Undefined external "_Xmk_core_initialize" referred in main ( E:\atmel\Dimmer\Demo\Debug\Obj\main.r90 )
Error[e46]: Undefined external "_xmkIsrSp" referred in main ( E:\atmel\Dimmer\Demo\Debug\Obj\main.r90 )
Error[e46]: Undefined external "_xmkCurThread" referred in main ( E:\atmel\Dimmer\Demo\Debug\Obj\main.r90 )
Error[e46]: Undefined external "_xmkKrnStatus" referred in main ( E:\atmel\Dimmer\Demo\Debug\Obj\main.r90 )
Error[e46]: Undefined external "_xmkCurNext" referred in main ( E:\atmel\Dimmer\Demo\Debug\Obj\main.r90 )

smile3046.gif
Fktrctq
Искренне советую в исходниках RTOS ничего не менять, если у Вас порт под Вашу платформу то она должна работать без Вашего вмешательства. Если же у Вас просто исходники ОС, не портированные под Вашу платформу - тоды ой. В этом случае Вам сначала придется сделать порт или взять другую ОС (благо под AVR их валом).
Что касается линковки:
1. Посмотрите в исходниках ОС, в заголовочных файлах присутствуют такие строки(первые две в начале, последняя - в конце):

#ifndef XXXX_XXX
#define XXXX_XXX


#endif /* XXXX_XXX */

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

2. Возможно Вам нужно настроить пути к директориям с исходниками ОС в препроцессоре, и так, лезем вот сюда: Project options -> C/C++ Compiler -> Preprocessor, там Вы должны увидеть memo поле "Additional Include Directories (One Per Line)", попробуйте вбить туда пути к исходникам ОС, если в исходниках ОС имеется заголовочный файлик из разряда "misc" или "conf" с кучей подключаемых библиотек внутри, то возможно его стоит прописать в графу (на той же вкладке настроек проекта) "Preinclude file"

Желаю успехов!
chdm
Спасибо за помощь!!! smile.gif
tms320
Не линкуется проект под MSP430.
В проекте два файла:

main.c:
Код
#include <msp430.h>
extern void test(void);
int main(void)
{
    test();
    return 0;
}

test.c:
Код
void test(void)
{
    int i = 0;
}


Если файл test.c находится в корневой папке проекта (там же, где и main.c), то всё компилируется и линкуется без проблем.
Если же я помещаю test.c в отдельную подпапку внутри папки проекта, то линковщик выдаёт ошибку:
Error[e46]: Undefined external "test()" referred in main ( D:\...\Debug\Obj\main.r43 )
Объектник test.r43 в папке \Debug\Obj\ создаётся.
В чём может быть дело?
_Артём_
Цитата(tms320 @ Aug 31 2012, 21:49) *
Если же я помещаю test.c в отдельную подпапку внутри папки проекта

А файл test.c вы заново добавляете в проект?

Цитата(tms320 @ Aug 31 2012, 21:49) *
Объектник test.r43 в папке \Debug\Obj\ создаётся.

А может он остался с тех времён, когда test.c был в одной папке с main.c? Rebuild all делали?
tms320
Да, файл test.c добавляю заново. Rebuild all делал...
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.