| Автор |
Съобщение |
|
Ки4о
Ранг: Форумен бог
Регистриран на: Съб Юли 22, 2006 9:50 pm Мнения: 1638
|
 Смесване на С и Асемблер при 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' иска
|
| Пет Сеп 05, 2008 3:18 pm |
|
 |
|
woody
Ранг: Форумен бог
Регистриран на: Вто Юли 31, 2007 2:55 pm Мнения: 1792 Местоположение: София
|
Махни подчертавката и пробвай пак.
|
| Пет Сеп 05, 2008 3:23 pm |
|
 |
|
Ки4о
Ранг: Форумен бог
Регистриран на: Съб Юли 22, 2006 9:50 pm Мнения: 1638
|
.text
.global asmFunction
asmFunction:
mov #@_arr1, W8 // W8 = @arr1, point to a first element of array
...............
няма ефект - пак същото съобщение 
|
| Пет Сеп 05, 2008 3:36 pm |
|
 |
|
woody
Ранг: Форумен бог
Регистриран на: Вто Юли 31, 2007 2:55 pm Мнения: 1792 Местоположение: София
|
Със сигурност трябва да е без подчертавката.
Провери две неща:
1) дали си преасемблирал файла, най-добре дай пълен Rebuild
2) има вероятност да не го линк-ваш, загледай MAP файл и т.н.
|
| Пет Сеп 05, 2008 4:07 pm |
|
 |
|
Ки4о
Ранг: Форумен бог
Регистриран на: Съб Юли 22, 2006 9:50 pm Мнения: 1638
|
Подчертавам го защото така го иска :
• 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.
Имам чувството че съм се наврял в задънена улица 
|
| Пет Сеп 05, 2008 4:33 pm |
|
 |
|
woody
Ранг: Форумен бог
Регистриран на: Вто Юли 31, 2007 2:55 pm Мнения: 1792 Местоположение: София
|
Хм, хм. Не винаги документацията е вярна.  Някои го предпочитат със, други без чертичката.
Обаче така медиумските ми способности съвсем намаляха. Постни zip на цялото дърво с проекта след опит за Rebuild (даже ако можеш преди това да изтриеш всичко), може да видя нещо.
Не съм помирисвал нито dsPIC нито компилатора му.
|
| Пет Сеп 05, 2008 5:32 pm |
|
 |
|
woody
Ранг: Форумен бог
Регистриран на: Вто Юли 31, 2007 2:55 pm Мнения: 1792 Местоположение: София
|
Забравих - пусни всички опции за LST, MAP и т.н.
Пълно досие. 
|
| Пет Сеп 05, 2008 5:33 pm |
|
 |
|
Ки4о
Ранг: Форумен бог
Регистриран на: Съб Юли 22, 2006 9:50 pm Мнения: 1638
|
Ами над това се мъча
|
| Пет Сеп 05, 2008 6:47 pm |
|
 |
|
woody
Ранг: Форумен бог
Регистриран на: Вто Юли 31, 2007 2:55 pm Мнения: 1792 Местоположение: София
|
Не мога да разбера в проекта влиза или не влиза този асемблерски файл.
Пробвай:
1) Прекръсти файла да завършва на ".S" (по принцип GCC ги обича с голяма буква).
2) Направи синтактични грешки в асемблерския файл и дай Build/Rebuild. Поне да се разбере въобще меле ли го. 
|
| Пет Сеп 05, 2008 7:09 pm |
|
 |
|
miro_atc
Ранг: Форумен бог
Регистриран на: Нед Фев 26, 2006 6:52 pm Мнения: 11266 Местоположение: Добрич
|
90% това му е проблема, дано да го оправи преди да е пуснал "make clean" че тогава може да стане тъжно
Иначе Кичо, това за undefined reference го дава линкера (при GCC е добре да се ориентираш кой тул ти прави проблем). Сега не знам дали става въпрос за managed project или си пишеш сам makefile, но и при двата варианта би трябвало да може да пуснеш линкера ръчно с малко повечко диагностика. Но то щом ти казва че го няма, значи го няма (не е подаден съответния обеджект файл на линкера). Няма да те лъже я
пс. добре е да ползваш
.func xxxx
.endfunc
Това няма отношение към проблема ти, просто ако ползваш GDB това го ориентира за функциите и се дебъгва по-приятно...
|
| Пет Сеп 05, 2008 7:47 pm |
|
 |
|
Ки4о
Ранг: Форумен бог
Регистриран на: Съб Юли 22, 2006 9:50 pm Мнения: 1638
|
Ами аз ползвам средата на Микрочип. Прекръстих файла с голямо S.На линкера има една категория - Diagnostics след като изплю всички грешки почнах една по една да ги търся и да се опитвам да ги изправям.И най-накрая успях 
|
| Пет Сеп 05, 2008 8:30 pm |
|
 |
|
woody
Ранг: Форумен бог
Регистриран на: Вто Юли 31, 2007 2:55 pm Мнения: 1792 Местоположение: София
|
Честито, вече си подкован за следващия път. 
|
| Пет Сеп 05, 2008 8:35 pm |
|
|