|
IAR не линкуется проект, IAR не линкуется проект |
|
|
|
Nov 23 2009, 15:21
|
Группа: Участник
Сообщений: 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
Подскажите пожалуйста как правильно прописать в ИАР. Заранее благодарен.
|
|
|
|
|
 |
Ответов
(1 - 11)
|
Nov 24 2009, 09:10
|
Группа: Участник
Сообщений: 13
Регистрация: 23-10-09
Пользователь №: 53 160

|
Цитата(XVR @ Nov 24 2009, 10:18)  недостаточно. Еще должна где то быть прописана библиотека с самой XMK Т.е. указание на объектные файлы...Да, но эта ХМК заключает в себе просто сорсы, а не динамическую библиотеку. Т.е. как я понимаю, компилятору нужно где-то прописать чтобы он в начале, перед линковкой, создал и объектные файлы ХМК из имеющихся сорсов и их использовал. Только вот в том вопрос, как это прописать в IAR?
|
|
|
|
|
Nov 25 2009, 13:08
|
Группа: Участник
Сообщений: 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... Не подскажете в чём ошибка и как её устранить?
|
|
|
|
|
Nov 25 2009, 14:10
|

Гуру
     
Группа: Модераторы
Сообщений: 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)
|
|
|
|
|
Nov 25 2009, 15:39
|
Группа: Участник
Сообщений: 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 )
|
|
|
|
|
Nov 25 2009, 17:42
|

Участник

Группа: Участник
Сообщений: 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"
Желаю успехов!
--------------------
Вы пробовали выключить и снова включить?
|
|
|
|
|
Nov 30 2009, 12:36
|
Группа: Участник
Сообщений: 13
Регистрация: 23-10-09
Пользователь №: 53 160

|
Спасибо за помощь!!!
|
|
|
|
|
Aug 31 2012, 18:49
|
Группа: Новичок
Сообщений: 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\ создаётся. В чём может быть дело?
|
|
|
|
|
Aug 31 2012, 19:39
|
Гуру
     
Группа: Свой
Сообщений: 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 делали?
|
|
|
|
|
Aug 31 2012, 23:50
|
Группа: Новичок
Сообщений: 2
Регистрация: 19-08-11
Из: Москва
Пользователь №: 66 789

|
Да, файл test.c добавляю заново. Rebuild all делал...
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|