Jump to content

    
Sign in to follow this  
Gradient

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

Recommended Posts

Собираю в 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

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this