| Микроконтролери и електроника 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. Имам чувството че съм се наврял в задънена улица |
|
| Автор: | woody [ Пет Сеп 05, 2008 5:32 pm ] |
| Заглавие: | |
Хм, хм. Не винаги документацията е вярна. Обаче така медиумските ми способности съвсем намаляха. Постни zip на цялото дърво с проекта след опит за Rebuild (даже ако можеш преди това да изтриеш всичко), може да видя нещо. Не съм помирисвал нито dsPIC нито компилатора му. |
|
| Автор: | woody [ Пет Сеп 05, 2008 5:33 pm ] |
| Заглавие: | |
Забравих - пусни всички опции за LST, MAP и т.н. Пълно досие. |
|
| Автор: | Ки4о [ Пет Сеп 05, 2008 6:47 pm ] | ||
| Заглавие: | |||
Ами над това се мъча
|
|||
| Автор: | woody [ Пет Сеп 05, 2008 7:09 pm ] |
| Заглавие: | |
Не мога да разбера в проекта влиза или не влиза този асемблерски файл. Пробвай: 1) Прекръсти файла да завършва на ".S" (по принцип GCC ги обича с голяма буква). 2) Направи синтактични грешки в асемблерския файл и дай Build/Rebuild. Поне да се разбере въобще меле ли го. |
|
| Автор: | miro_atc [ Пет Сеп 05, 2008 7:47 pm ] | |||||||||
| Заглавие: | ||||||||||
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 ] |
| Заглавие: | |
Честито, вече си подкован за следващия път. |
|
| Страница 1 от 1 | Часовете са според зоната UTC + 2 часа [ DST ] |
| Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |
|