Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Как сделать смешаный проект?
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > GNU/OpenSource средства разработки
777777
И calling convention я нигде не найду sad.gif
MrYuran
А вчём проблема?
посмотрите примеры из состава GCC, заодно и мэйк файл готовый можно взять
777777
Цитата(MrYuran @ Apr 30 2008, 09:01) *
А в чём проблема?

Проблема в том, что если я тупо включаю в проект .asm файл, то он не транслируется.
Цитата(MrYuran @ Apr 30 2008, 09:01) *
посмотрите примеры из состава GCC, заодно и мэйк файл готовый можно взять

Да где его найти-то? Все что там есть - это demo, largedemo и stdiodemo. И вообще, как-то туго у них с документацией: в gcc.pdf описан чисто С, а в avr-libc-user-manual - стандартные библиотеки. Где описание всего того, что индивидуально именно для AVR? В частности, calling convention - без него нет смысла писать ассемблерные функции.
aesok
Цитата(777777 @ Apr 30 2008, 09:38) *
Где описание всего того, что индивидуально именно для AVR? В частности, calling convention - без него нет смысла писать ассемблерные функции.


В avr-libc-user-manual.

Анатолий.

Цитата(777777 @ Apr 30 2008, 09:38) *
Да где его найти-то? Все что там есть - это demo, largedemo и stdiodemo.


Есть еще asmdemo.
mdmitry
Возможно, Вам надо отредактировать makefile в плане подключения исходных текстов на ассемблере и ключей запуска для ассемблера. Кажется, в makefile в текущей версии не все поправили в флагах. Посмотрите bugreports на предыдущие выпуски Winavr. Где-то были сообщения о флагах. И еще, прототипы функций в *.с должны быть указаны.
777777
Кое-что начало получаться (хотя и не все sad.gif ), но главная проблема, которую я увидел - ассемблерный файл транслируется вовсе не AVR-овским ассемблером. Подозреваю что это транслятор, который берет промежуточный ассемблерный файл, который получается после компиляци C-файла. Он не понимает никаких директив - ни .equ, ни .def

PS. А без мейкфайла, непосредственно в IDE нельзя указать что файл является ассемблерным?
MrYuran
Цитата(777777 @ Apr 30 2008, 12:19) *
Подозреваю что это транслятор, который берет промежуточный ассемблерный файл, который получается после компиляци C-файла.

после компиляции с-файла получается объектный файл, не имеющий ничего общего с ассемблером
Цитата
PS. А без мейкфайла, непосредственно в IDE нельзя указать что файл является ассемблерным?

Какая ИДЕ?
мэйк-файл нужен по любому, только формируете его либо вы (как вам надо), либо оболочка (как посчитает нужным)
на ассемблерность файла указывает его расширение (.s)
mdmitry
Цитата(777777 @ Apr 30 2008, 13:19) *
PS. А без мейкфайла, непосредственно в IDE нельзя указать что файл является ассемблерным?

Я использую Eclipce и правлю makefile только руками (типа все под контролем). AVRStudio что-то плодит, но в своем духе и разбираться желания не было.
777777
Цитата(MrYuran @ Apr 30 2008, 13:30) *
после компиляции с-файла получается объектный файл, не имеющий ничего общего с ассемблером

Не факт. Помнится, в юниксе на ЭВМ smile.gif СМ-4 c-шный компилятор создавал сначала ассемблерный файл, причем именно с расширением .s, а из него уже получал объектный. Скоре всего gcc тоже генерирует сначала ассемблерный файл и сразу передает его транслятору.
Цитата(MrYuran @ Apr 30 2008, 13:30) *
Какая ИДЕ?
мэйк-файл нужен по любому, только формируете его либо вы (как вам надо), либо оболочка (как посчитает нужным)

Да это понятно. Я и имел в виду - генерировать его из ИДЕ с помощью флажков. Впрочем, мне это уже удалось
Цитата(MrYuran @ Apr 30 2008, 13:30) *
на ассемблерность файла указывает его расширение (.s)

Увы. Кроме того, удалось догадаться о наличии в этом ассемблере директивы .global smile.gif
Сергей Борщ
Цитата(777777 @ Apr 30 2008, 12:19) *
но главная проблема, которую я увидел - ассемблерный файл транслируется вовсе не AVR-овским ассемблером.
Хм... а каким? Возможно, вы имели ввиду атмеловский AvrAssembler? Так и не должен - у avr-gcc есть собственный ассемблер, с собственным синтаксисом. Документация в Doc/binutils/as.
Цитата(777777 @ Apr 30 2008, 12:59) *
Не факт.
Да, это не факт. Это больше, чем факт - так оно и есть на самом деле. gcc в обычном режиме передает ассемблерный текст от компилятора к ассемблеру через pipe, т.е. файл на диске не создается. Вы можете попросить его создать такой файл, но это уже из другой оперы. А выходом уже ассемблера является объектный файл, но поскольку промежуточное ассемблирование вызывается неявно, снаружи выглядит так, что выходом компилятора является объектный файл. Поправьте меня кто-нибудь, если я не прав.
777777
Цитата(Сергей Борщ @ Apr 30 2008, 14:34) *
Хм... а каким? Возможно, вы имели ввиду атмеловский AvrAssembler?

Ну да, конечно.
Цитата(Сергей Борщ @ Apr 30 2008, 14:34) *
Так и не должен - у avr-gcc есть собственный ассемблер, с собственным синтаксисом.

И наверное с собственным форматом объектных файлов.
Цитата(Сергей Борщ @ Apr 30 2008, 14:34) *
Документация в Doc/binutils/as.

О, вот это ценная вещь. И директива .global там действительно есть smile.gif
Сергей Борщ
Цитата(777777 @ Apr 30 2008, 14:23) *
И наверное с собственным форматом объектных файлов.
Естественно. А зачем его скрещивать с атмеловским ассемблером? avr-gcc представляет собой законченный набор инструментов.
777777
В общем, все получилось за исключением одной "мелочи". В регистр Z надо поместить адрес таблицы, находящейся в памяти программ. Для этого надо его умножить на 2 и взять старшую и младшую часть. Но этот ассемблер, похоже, не позволяет выражений над перемещаемыми символами. Может таблицу надо поместить в какую-нибудь другую секцию?
InsolentS
Пишу так
Код
                EXPORT  Test
                EXTERN  func1

                AREA    |.text|, CODE, READONLY

Test
                LDR     R0, =func1
                BX      R0

                END

Линкер говорит что не может найти func1 , хотя вот так
Код
                EXPORT  Test
                EXTERN  _Z5func1v

                AREA    |.text|, CODE, READONLY

Test
                LDR     R0, =_Z5func1v
                BX      R0

                END

работает, но это бред. Как правильно?
Компилер RV
aaarrr
ИМХО, правильнее было бы так:
Код
                EXPORT  Test
                IMPORT  func1

                AREA    |.text|, CODE, READONLY

Test
                LDR     R0, =func1
                BX      R0

                END

Но у меня компилятор не ругается и в случае использования EXTERN.
InsolentS
Хмм..в случае с Си действительно работает. А как же тогда смешивать асм с С++ кодом?
xelax
Цитата(Сергей Борщ @ Apr 30 2008, 14:34) *
Да, это не факт. Это больше, чем факт - так оно и есть на самом деле. gcc в обычном режиме передает ассемблерный текст от компилятора к ассемблеру через pipe, т.е. файл на диске не создается.


Наблюдал во время сборки проекта с помощью arm-elf-gcc в папке, расположенной в Documents and Settings создаётся ассемблерный файл наборсимволов.S

Работаю в винде ХР
meister
Цитата(InsolentS @ May 4 2008, 01:18) *
Хмм..в случае с Си действительно работает. А как же тогда смешивать асм с С++ кодом?


extern "C" int funciya_is_cpp_faila(int);

или

extern "C"
{
int funciya_is_cpp_faila(int);
}

Почитайте про манглинг, extern "C" и вообще про C++.
777777
Цитата(InsolentS @ May 4 2008, 00:23) *
Пишу так
Код
                LDR     R0, =func1
                BX      R0

Что это за LDR, BX? Я имею в виду 8-разрядный AVR. В нем для обращения к памяти программ нужно в два регистра записать адрес программной памяти, умноженный на 2, в один регистр младшую часть этого выражения, а в другой старшую. А компилятор WinAVR ругается н алюбые выражения над пеемещаемыми символами.
aesok
Цитата(777777 @ May 4 2008, 15:03) *
В нем для обращения к памяти программ нужно в два регистра записать адрес программной памяти, умноженный на 2, в один регистр младшую часть этого выражения, а в другой старшую. А компилятор WinAVR ругается н алюбые выражения над пеемещаемыми символами.


Опишите задачу которую хотите решить, приведите код который у вас не работает и ошибки котрые выдает ассемблер/линкер.

Анатолий.
777777
Цитата(aesok @ May 4 2008, 15:46) *
Опишите задачу которую хотите решить, приведите код который у вас не работает и ошибки котрые выдает ассемблер/линкер.

Задача простая: получить данные из памяти программ:

Код
            ldi        r30, (Table*2)&0xff
            ldi        r31, ((Table*2)>>8)&0xff
            lpm

Table:        .byte        1, 2, 3

Результат:

Error: invalid sections for operation on `Tbl' and `L0'

Возможно для gnu-того ассемблера такие таблицы следует помещать в какую-то особенную секцию, но в хелпе я ничего не нашел.
ReAl
GNU as для AVR поддерживает байтовую адресацию флеша, поэтому умножать на 2 не надо.
Для старшего/младшего байта есть модификаторы:
Код
    ldi        r30, lo8(Table)
    ldi        r31, hi8(Table)
    lpm


Если нужен адрес функции, то тогда надо бы делить на два, есть модификатор pm() и pm_lo8()/pm_hi8()
Сверх этого мне нужны были только разности перемещаемых величин для получения абсолютной (длина таблицы) или сумма/разность перемещаемой и абсолютной величин для получения смещённого относительно метки значения. Больше мне не было нужно, даже не знаю, насколько вольно он позволяет жонглировать перемещаемыми величинами.
_Pasha
Пока большинство с успехом пользуется С, у меня проблема на проблеме. smile.gif
Пользуюсь AVRstudio + GCC plugin
Цитата
AVR Studio 4.13.571 Service Pack 2
Plugins:
AvrPluginAvrAsmObject 1, 0, 0, 46
AvrPluginavrgccplugin 1, 0, 0, 9


Пишу обработчик прерывания на асме

Код
.section .text
.global TIMER1_OVF_vect
TIMER1_OVF_vect:
push r15
..........do something.......
pop  r15
reti


Плагин автоматом рожает Makefile, который меня вроде устраивает.
Прилагаю на всякий случай.
После компиляции наблюдаю присутствие вектора _vector_20 в файле *.lss
Все нормально? Хрен!
При запуске в студии не могу отладить свое прерывание. Тамошний дизассемблер говорит, что такого вектора нет!
Кто собирал смешанные проекты с отладкой на последней версии студии - отзовитесь! Нормально ли там получается отлаживать асмы?

З.Ы. Проблему решил костылем:
Код
// это в ассемблерном файле
.section .text
.global tov1_proc
tov1_proc:
push r15
.................
pop  r15
ret


//это в сишном
ISR(TIMER1_OVF_vect,ISR_NAKED)
{
tov1_proc();
reti();
}


Как бы это покультурнее выразиться ...
singlskv
Цитата(_Pasha @ May 29 2008, 17:25) *
Плагин автоматом рожает Makefile, который меня вроде устраивает.
Прилагаю на всякий случай.
После компиляции наблюдаю присутствие вектора _vector_20 в файле *.lss
Все нормально? Хрен!
При запуске в студии не могу отладить свое прерывание. Тамошний дизассемблер говорит, что такого вектора нет!

вызов _vector_20 при этом в __vectors есть ?
если есть, то для отладки по асм коду ищите опцию AS -gstabs
если нету то и не все OK ...

проще всего выложите полный(минимальный) проект.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.