Микроконтролери и електроника
http://mcu-bg.com/mcu_site/

Смесване на С и Асемблер при dsPIC
http://mcu-bg.com/mcu_site/viewtopic.php?f=3&t=6083
Страница 1 от 1

Автор:  Ки4о [ Пет Сеп 05, 2008 3:18 pm ]
Заглавие:  Смесване на С и Асемблер при dsPIC

Опитван се да направя някой модули от мои програми изцяло на асемблер.При Хай-тековския компилатор нямам проблеми за 18 серия но като се опре до dsPIC-ожете става мазано.Та искам да компилирам следнта програмка (тестова) за да разбера как точно се осъществява смесването.
Главната програма е :

#define __dsPIC30F4013__
#include<p30fxxxx.h>

#include <math.h>

extern void asmFunction(void);

int arr1[20] __attribute__ ((address(0x0900))); // array of 20 signed-integer elements in X space
int arr2[20] __attribute__ ((address(0x0D00))); // array of 20 signed-integer elements in Y space

int main(void) //beginning of the main routine
{
asmFunction();


for( ; ; )
{
asmFunction();
}
}

Направил съм си един .s файл със тялото на функцията на асемблер:


.text
.global _asmFunction

_asmFunction:
mov #@_arr1, W8 // W8 = @arr1, point to a first element of array
mov #@_arr2, W10 // W10 = @arr2, point to a first element of array
mov #0, W4 // clear W4
mov #0, W6 // clear W6
clr A
repeat #20
mac W4*W6, A, [W8]+=2, W4, [W10]+=2, W6 // AccA = sum(arr1*arr2)
sftac A, #-16 // shift the result in high word of AccA
sac A, #0, W1 // W1 = sum(arr1*arr2)
return
.end

И компилатора дава :
C:\Program Files\Microchip\work\dsPIC30F4013\dsPIC30F4013.c:667: undefined reference to `asmFunction'
Не мога да разбера какъв reference to `asmFunction' иска

Автор:  woody [ Пет Сеп 05, 2008 3:23 pm ]
Заглавие: 

Махни подчертавката и пробвай пак.

Автор:  Ки4о [ Пет Сеп 05, 2008 3:36 pm ]
Заглавие: 

.text
.global asmFunction

asmFunction:
mov #@_arr1, W8 // W8 = @arr1, point to a first element of array
...............

няма ефект - пак същото съобщение :(

Автор:  woody [ Пет Сеп 05, 2008 4:07 pm ]
Заглавие: 

Със сигурност трябва да е без подчертавката.

Провери две неща:
1) дали си преасемблирал файла, най-добре дай пълен Rebuild
2) има вероятност да не го линк-ваш, загледай MAP файл и т.н.

Автор:  Ки4о [ Пет Сеп 05, 2008 4:33 pm ]
Заглавие: 

Подчертавам го защото така го иска :
• Variables or functions declared within a separate assembly file that will be
referenced by any C source file should be declared as global using the assembler
directive.global. External symbols should be preceded by at least one
underscore. The C function main is named _main in assembly and conversely an
assembly symbol _do_something will be referenced in C as do_something.
Undeclared symbols used in assembly files will be treated as externally defined.

Имам чувството че съм се наврял в задънена улица :cry:

Автор:  woody [ Пет Сеп 05, 2008 5:32 pm ]
Заглавие: 

Хм, хм. Не винаги документацията е вярна. ;) Някои го предпочитат със, други без чертичката.
Обаче така медиумските ми способности съвсем намаляха. Постни zip на цялото дърво с проекта след опит за Rebuild (даже ако можеш преди това да изтриеш всичко), може да видя нещо.

Не съм помирисвал нито dsPIC нито компилатора му.

Автор:  woody [ Пет Сеп 05, 2008 5:33 pm ]
Заглавие: 

Забравих - пусни всички опции за LST, MAP и т.н.
Пълно досие. :lol:

Автор:  Ки4о [ Пет Сеп 05, 2008 6:47 pm ]
Заглавие: 

Ами над това се мъча

Прикачени файлове:
TEST_dsPIC.rar [31.47 KiB]
157 пъти

Автор:  woody [ Пет Сеп 05, 2008 7:09 pm ]
Заглавие: 

Не мога да разбера в проекта влиза или не влиза този асемблерски файл.

Пробвай:
1) Прекръсти файла да завършва на ".S" (по принцип GCC ги обича с голяма буква).
2) Направи синтактични грешки в асемблерския файл и дай Build/Rebuild. Поне да се разбере въобще меле ли го. :)

Автор:  miro_atc [ Пет Сеп 05, 2008 7:47 pm ]
Заглавие: 

woody написа:
1) Прекръсти файла да завършва на ".S" (по принцип GCC ги обича с голяма буква).


90% това му е проблема, дано да го оправи преди да е пуснал "make clean" че тогава може да стане тъжно ;-)

Иначе Кичо, това за undefined reference го дава линкера (при GCC е добре да се ориентираш кой тул ти прави проблем). Сега не знам дали става въпрос за managed project или си пишеш сам makefile, но и при двата варианта би трябвало да може да пуснеш линкера ръчно с малко повечко диагностика. Но то щом ти казва че го няма, значи го няма (не е подаден съответния обеджект файл на линкера). Няма да те лъже я ;-)

пс. добре е да ползваш
.func xxxx
.endfunc

Това няма отношение към проблема ти, просто ако ползваш GDB това го ориентира за функциите и се дебъгва по-приятно...

Автор:  Ки4о [ Пет Сеп 05, 2008 8:30 pm ]
Заглавие: 

Ами аз ползвам средата на Микрочип. Прекръстих файла с голямо S.На линкера има една категория - Diagnostics след като изплю всички грешки почнах една по една да ги търся и да се опитвам да ги изправям.И най-накрая успях :)

Автор:  woody [ Пет Сеп 05, 2008 8:35 pm ]
Заглавие: 

Честито, вече си подкован за следващия път. 8)

Страница 1 от 1 Часовете са според зоната UTC + 2 часа [ DST ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/