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

8051 ошибка линковки

Собираю в IAR порт scmRTOS под СС2540.

Линкер не хочет подключать асм функции.

Что только не мудрил - не получается.. может у кого будут идеи как пофиксить.

 

Linking

Warning[w46]: External function "os_start" in module main (main.r51) has no global definition

Warning[w46]: External function "os_context_switcher" in module OS_Kernel (OS_Kernel.r51 ) has no global definition

 

 

 

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


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

Собираю в IAR порт scmRTOS под СС2540.

Линкер не хочет подключать асм функции.

Что только не мудрил - не получается.. может у кого будут идеи как пофиксить.

 

Linking

Warning[w46]: External function "os_start" in module main (main.r51) has no global definition

Warning[w46]: External function "os_context_switcher" in module OS_Kernel (OS_Kernel.r51 ) has no global definition

Возможные причины, вроде, три:

 

1) Линкер по какой-то причине не видит объектные файлы с этими функциями.

2) Функции в асме не декларированы как экспортируемые в глобальное пространство имён (у IAR это, как помню, с помощью public делается).

3) В cpp файлах имена импортируются без extern "C", что приводит к проблемам из-за манглинга имён.

 

Надо посмотреть настройки проекта и упомянутые места в порте.

 

Вообще, я полагал всегда, что если линкер не находит имя, на которое ссылается код, то это ошибка, а не предупреждение.

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


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

Надо признать, у меня квалификации не хватило пофиксить.

Хотя "грызли всей семьёй" несколько дней.

Если есть желание посмотреть, могу скинуть в личку ссылку на проект, но он под последний IAR.

 

Изложенные 3 причины известны и проверены. Всё вроде правильно оформлено, дока пристально читалась и примеры изучались...

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


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

Надо признать, у меня квалификации не хватило пофиксить.

Хотя "грызли всей семьёй" несколько дней.

Если есть желание посмотреть, могу скинуть в личку ссылку на проект, но он под последний IAR.

 

Изложенные 3 причины известны и проверены. Всё вроде правильно оформлено, дока пристально читалась и примеры изучались...

Давайте, попробую тоже, вдруг получится. :)

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


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

Ну и как результат?


Есть проект со смешанным кодом на C++ и ASM.

Ассемблерная функция:

	NAME tools

	RSEG CODE_C:CODE:NOROOT

; =============== S U B	R O U T	I N E =======================================

	PUBLIC swap_bits

swap_bits:

		mov				A, R1

		mov				C, ACC.1
		rlc				A
		mov				ACC.2, C
		mov				C, ACC.3
		rlc				A
		mov				ACC.4, C
		mov				C, ACC.5
		rlc				A
		mov				ACC.6, C
		swap			A

		mov				R1, A

		ret

; End of function swap_bits

	END


Эта функция объявлена в C++
 

extern "C"
{
	unsigned char swap_bits( unsigned char );
}

и используется:

unsigned char bt;

...
  
bt = swap_bits( bt );

...

Линкер выдает предупреждение:
 

Warning[w46]: External function "swap_bits" in module ... has no global definition
 

В документации сказано:
 

If no other errors have been encounter, this error is generated by an assembler-language call from C
where the required declaration using the $DEFFN assembler-language support directive is missing.
The declaration is necessary to inform XLINK of the memory requirements of the function.

 

Но нигде в документации про директиву $DEFFN ничего более найти не удалось.

 

Изменено пользователем beketata

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


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

25 минут назад, beketata сказал:

Линкер выдает предупреждение:
Warning[w46]: External function "swap_bits" in module ... has no global definition

А если заглянуть в листинг си-файла - как там эта swap_bits называется? Может она там называется _swap_bits?

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


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

В листинге и в MAP файле название функции без подчеркивания.
Тут дело не в этом. Линкер эту функцию находит, линкует и программа в итоге работает.
Но хотелось бы избавиться от этого предупреждения.
Можно, конечно, добавить в опции линкера "-w46", но как-то это не комильфо.
 

Изменено пользователем beketata

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


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

тогда смотреть листинги других сишных функций и по ним угадывать параметры директивы $DEFFN.

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


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

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

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

Гость
Ответить в этой теме...

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

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

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

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

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

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