реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> IAR не линкуется проект, IAR не линкуется проект
chdm
сообщение Nov 23 2009, 15:21
Сообщение #1





Группа: Участник
Сообщений: 13
Регистрация: 23-10-09
Пользователь №: 53 160



Здравствуйте. У меня есть такая проблема. Хочу написать простое приложение типа 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

Подскажите пожалуйста как правильно прописать в ИАР.
Заранее благодарен.
Go to the top of the page
 
+Quote Post
XVR
сообщение Nov 24 2009, 08:18
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



Цитата
Additional Includes
недостаточно. Еще должна где то быть прописана библиотека с самой XMK
Go to the top of the page
 
+Quote Post
chdm
сообщение Nov 24 2009, 09:10
Сообщение #3





Группа: Участник
Сообщений: 13
Регистрация: 23-10-09
Пользователь №: 53 160



Цитата(XVR @ Nov 24 2009, 10:18) *
недостаточно. Еще должна где то быть прописана библиотека с самой XMK

Т.е. указание на объектные файлы...Да, но эта ХМК заключает в себе просто сорсы, а не динамическую библиотеку. Т.е. как я понимаю, компилятору нужно где-то прописать чтобы он в начале, перед линковкой, создал и объектные файлы ХМК из имеющихся сорсов и их использовал. Только вот в том вопрос, как это прописать в IAR?
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Nov 24 2009, 10:07
Сообщение #4


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



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


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
chdm
сообщение Nov 25 2009, 13:08
Сообщение #5





Группа: Участник
Сообщений: 13
Регистрация: 23-10-09
Пользователь №: 53 160



Спасибо за помощь. Но тут вот какая штука возникает: я добавил все эти файлы к проекту (имеется ввиду и вроде он создаёт даже 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... Не подскажете в чём ошибка и как её устранить?
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Nov 25 2009, 14:10
Сообщение #6


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(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();
}


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
chdm
сообщение Nov 25 2009, 15:39
Сообщение #7





Группа: Участник
Сообщений: 13
Регистрация: 23-10-09
Пользователь №: 53 160



Цитата(Сергей Борщ @ 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
Go to the top of the page
 
+Quote Post
Fktrctq
сообщение Nov 25 2009, 17:42
Сообщение #8


Участник
*

Группа: Участник
Сообщений: 38
Регистрация: 10-11-05
Из: Таганрог
Пользователь №: 10 659



Искренне советую в исходниках 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"

Желаю успехов!


--------------------
Вы пробовали выключить и снова включить?
Go to the top of the page
 
+Quote Post
chdm
сообщение Nov 30 2009, 12:36
Сообщение #9





Группа: Участник
Сообщений: 13
Регистрация: 23-10-09
Пользователь №: 53 160



Спасибо за помощь!!! smile.gif
Go to the top of the page
 
+Quote Post
tms320
сообщение Aug 31 2012, 18:49
Сообщение #10





Группа: Новичок
Сообщений: 2
Регистрация: 19-08-11
Из: Москва
Пользователь №: 66 789



Не линкуется проект под 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\ создаётся.
В чём может быть дело?
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Aug 31 2012, 19:39
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(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 делали?
Go to the top of the page
 
+Quote Post
tms320
сообщение Aug 31 2012, 23:50
Сообщение #12





Группа: Новичок
Сообщений: 2
Регистрация: 19-08-11
Из: Москва
Пользователь №: 66 789



Да, файл test.c добавляю заново. Rebuild all делал...
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 13:27
Рейтинг@Mail.ru


Страница сгенерированна за 0.01439 секунд с 7
ELECTRONIX ©2004-2016