Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Assembler в CrossWorks 1.5
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
SimpleSoft
День добрый.
Столкнулся с проблемой, связанную с тем, что надо написать процедуры на ассемблере, которые в свою очередь надо вызывать из С кода.
Как не бился, не видит функции написанные на ASM.
Делал так:

asm.s :

.extern InitRoutine
.extern DoneRoutine

InitRoutine:
mov R12, PC
stdbm SP!, {R12, LR}
...
...

DoneRoutine:
mov R12, PC
...


Затем в asm.h
extern int InitRoutine(int param1, int param2);
extern int DoneRoutine(int param1, int param2);

А в основной программе делаю:

#include "asm.h"

int main(void)
{
InitRoutine(1,2);
....
DoneRoutine(3,4);
....
}

Линкер выдает ошибку:
undefined reference to `InitRoutine()'

Как можно заставить увидеть мою функцию?
Andy Mozzhevilov
Цитата(SimpleSoft @ Jan 26 2006, 16:52) *
День добрый.
Столкнулся с проблемой, связанную с тем, что надо написать процедуры на ассемблере, которые в свою очередь надо вызывать из С кода.
Как не бился, не видит функции написанные на ASM.
Делал так:

asm.s :

.extern InitRoutine
.extern DoneRoutine


а asm их нужно объявить как public

public InitRoutine
public DoneRoutine
SimpleSoft
Цитата(Andy Mozzhevilov @ Jan 26 2006, 15:59) *
Цитата(SimpleSoft @ Jan 26 2006, 16:52) *

День добрый.
Столкнулся с проблемой, связанную с тем, что надо написать процедуры на ассемблере, которые в свою очередь надо вызывать из С кода.
Как не бился, не видит функции написанные на ASM.
Делал так:

asm.s :

.extern InitRoutine
.extern DoneRoutine


а asm их нужно объявить как public

public InitRoutine
public DoneRoutine


Спасибо, но никак:

Error: bad instruction `public InitRoutine'

Похоже нет такой директивы.
SimpleSoft
Может у кого есть пример данной реализации? Пробежал Help бегло - решение проблемы не нашел.
Andy Great
может _InitRoutine? так было в х86 системах...
SimpleSoft
Решил проблему использованием .global и переименовыванием расширения cpp в c
Andy Mozzhevilov
Цитата(SimpleSoft @ Jan 26 2006, 23:44) *
Решил проблему использованием .global


В каждом асме свои заморочки.

Цитата
и переименовыванием расширения cpp в c


Чтож ты сразу не написал, что у тебя cpp. Говорил по чисто Ц код.
Из cpp можно вызывать ц-шные или асмовые функции, но объявление их прототипов
нужно обернуть в
extern "C" {
}
AndyBig
Базис Си++ smile.gif
Прототипы функций, написанных и откомпилированных в Си (без плюсов) в Си++ объявляются через extern "C" ...
В Вашем случае:
extern "C" int InitRoutine(int param1, int param2);
extern "C" int DoneRoutine(int param1, int param2);

Точно так же объявляются функции, написанные в Си++, если их нужно вызывать из модулей, написанных в Си (или в асме).
SimpleSoft
Цитата(AndyBig @ Jan 27 2006, 11:12) *
Базис Си++ smile.gif
Прототипы функций, написанных и откомпилированных в Си (без плюсов) в Си++ объявляются через extern "C" ...
В Вашем случае:
extern "C" int InitRoutine(int param1, int param2);
extern "C" int DoneRoutine(int param1, int param2);

Точно так же объявляются функции, написанные в Си++, если их нужно вызывать из модулей, написанных в Си (или в асме).


Как иногда нехватает полноценного знания С и С++, а также их различий... wink.gif
Alex03
Ну и как вариант можно небольшие асм-функции и в встроенном асме писать, а
соответствующие функции с __attribute__((naked))
AndyBig
Цитата
Как иногда нехватает полноценного знания С и С++, а также их различий...

"Этточно" ( (С)Белое солнце пустыни) smile.gif
Вообще, С++ - довольно сложная штука, лично я встречал не так уж много людей, более-менее полно знающих его smile.gif. Сам-то я бесконечно далек от полного знания smile.gif.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.