Jump to content

    

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

 

 

 

Share this post


Link to post
Share on other sites
Собираю в 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", что приводит к проблемам из-за манглинга имён.

 

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

 

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

Share this post


Link to post
Share on other sites

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

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

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

 

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

Share this post


Link to post
Share on other sites
Надо признать, у меня квалификации не хватило пофиксить.

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

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

 

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

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

Share this post


Link to post
Share on other sites

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


Есть проект со смешанным кодом на 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 ничего более найти не удалось.

 

Edited by beketata

Share this post


Link to post
Share on other sites
25 минут назад, beketata сказал:

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

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

Share this post


Link to post
Share on other sites

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

Edited by beketata

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this