Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Как скормить ASM модуль Visual Studio?
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
sz36
Hi, All!

Собираю проект для Toradex Colibri (ARMV4I) под MS Visual Studio 2008. В основном, все хорошо, но проект содержит один модуль на асме с парой функций, который masm, входящий в состав VS, отказывается компилировать. Изначально проект был под Embedded VC++ (это, собс-но, пример от Toradex). Как его перетащить под Visual Studio? MASM, вообще, инструкции от ARM понимает, и как ему это указать? Или надо использовать какой-то внешний ассемблер (какой)?
follow_me
Цитата(sz36 @ May 27 2012, 23:10) *
Hi, All!

Собираю проект для Toradex Colibri (ARMV4I) под MS Visual Studio 2008. В основном, все хорошо, но проект содержит один модуль на асме с парой функций, который masm, входящий в состав VS, отказывается компилировать. Изначально проект был под Embedded VC++ (это, собс-но, пример от Toradex). Как его перетащить под Visual Studio? MASM, вообще, инструкции от ARM понимает, и как ему это указать? Или надо использовать какой-то внешний ассемблер (какой)?


ну если он чем-то собирается , то может собрать либу и указать linker'у чтоб он её прилинковал
можно попробовать mingw
SBE
Цитата(sz36 @ May 28 2012, 01:10) *
Hi, All!

Собираю проект для Toradex Colibri (ARMV4I) под MS Visual Studio 2008. В основном, все хорошо, но проект содержит один модуль на асме с парой функций, который masm, входящий в состав VS, отказывается компилировать. Изначально проект был под Embedded VC++ (это, собс-но, пример от Toradex). Как его перетащить под Visual Studio? MASM, вообще, инструкции от ARM понимает, и как ему это указать? Или надо использовать какой-то внешний ассемблер (какой)?

Работал с этим модулем и под EVC и под VS. Проблем при переходе с EVC++ в студию 2005 не было, только нюансы. Само собой, что ассемблер под ARM в студии имеется, если студия умеет собирать проекты под WinCE.
В чем собственно проблема? Вы под какую собираете? Colibri SDK установили в студии?
sz36
Цитата(SBE @ May 28 2012, 21:48) *
В чем собственно проблема? Вы под какую собираете? Colibri SDK установили в студии?

С ассемблером я вроде уже разобрался (нужно было .rules файл создать для armasm.exe, который в другой папке наличествует). Colibri SDK, ес-но, установлен. Теперь другая проблема - ассемблерный модуль компилируется, но линкер не видит функций, которые в нем определены. Можно как-нибудь посмотреть, что есть в obj-файле? Hex-редактор показывает, что имена эти в объектнике есть, а линкер, мерзавец, не находит.

А не могли бы Вы прислать любой собирабельный проект под студию для ARM, в котором есть .с и .asm модули? А то я что-то в тупике, что ей еще надо
SBE
Цитата(sz36 @ May 29 2012, 01:02) *
С ассемблером я вроде уже разобрался (нужно было .rules файл создать для armasm.exe, который в другой папке наличествует). Colibri SDK, ес-но, установлен. Теперь другая проблема - ассемблерный модуль компилируется, но линкер не видит функций, которые в нем определены. Можно как-нибудь посмотреть, что есть в obj-файле? Hex-редактор показывает, что имена эти в объектнике есть, а линкер, мерзавец, не находит.

А не могли бы Вы прислать любой собирабельный проект под студию для ARM, в котором есть .с и .asm модули? А то я что-то в тупике, что ей еще надо


Ранее ассемблером не пользовался, без надобности. Попробовал, без особых проблем, если rules корректно прописать, или ручками Custom Biuld настроить.

obj-файл смотрится тулзой dumpbin.exe. Линкер не видит потому, что или совсем не ищет объектник или ищет не там (например в rules указан не тот путь, должно быть типа Ouput = "$(IntDir)\$(InputName).obj"), или asm-файл не экспортирует нужные символы (смотрится dumpbin или листингом asm), или С-файл импортирует что-то другое (например, декорированные имена с++ rolleyes.gif ).

Любопытно, откуда ассемблерный файл для такой платформы. Неужто от Toradex? Для такого класса устройств даже в BSP asm файлов наперечет. А уж на пользовательском уровне они крайне редко могут быть действительно нужны.

sz36
Цитата(SBE @ May 29 2012, 19:25) *
obj-файл смотрится тулзой dumpbin.exe.

Спасибо, попробую. Пока вышел из положения скомпилировав asm-модуль в статическую либу под EVC++, и подцепив ее к проекту на MSVS. Во всяком случае, компилируется, но на устр-ве еще не проверял.

Цитата(SBE @ May 29 2012, 19:25) *
Любопытно, откуда ассемблерный файл для такой платформы. Неужто от Toradex?

Ага. Там фунции типа IRQEnable, IRQDisable, GetCPUId и т.п.
SBE
Цитата(sz36 @ May 29 2012, 19:39) *
Ага. Там фунции типа IRQEnable, IRQDisable, GetCPUId и т.п.


Хм. Эти функции были в библиотечных файлах (IntLib.lib, CoProcLib.lib, MapRegLib.lib), исходников к ним не было, и что-то сомневаюсь что они на ассемблере, ибо незачем. Без проблем использовал их в VS проектах.
Не ткнете откуда ассемблер, может что-то у Торадекса изменилось и пропустил.

sz36
Цитата(SBE @ May 29 2012, 20:05) *
Хм. Эти функции были в библиотечных файлах (IntLib.lib, CoProcLib.lib, MapRegLib.lib), исходников к ним не было, и что-то сомневаюсь что они на ассемблере

Мамой клянус! :-) Я ассемблер для АРМ не знаю, но вот, к примеру, кусочек кода
Код
IRQDisable PROC
        mrs     r0, cpsr
        orr       r0, r0, #0x80
        msr     cpsr_c, r0
        mov    pc,lr
        ENDP



Цитата(SBE @ May 29 2012, 20:05) *
Не ткнете откуда ассемблер, может что-то у Торадекса изменилось и пропустил.

Мы купили у них пример работы с VideoCapture, там все на С, но один модуль на ассемблере. Используются, собс-но, из этого модуля только 2 ф-ии - IRQDisable и IRQEnable


SBE
Цитата(sz36 @ May 29 2012, 22:11) *
Мамой клянус! :-) Я ассемблер для АРМ не знаю, но вот, к примеру, кусочек кода
Код
IRQDisable PROC
        mrs     r0, cpsr
        orr       r0, r0, #0x80
        msr     cpsr_c, r0
        mov    pc,lr
        ENDP


Мы купили у них пример работы с VideoCapture, там все на С, но один модуль на ассемблере. Используются, собс-но, из этого модуля только 2 ф-ии - IRQDisable и IRQEnable


Уже понятно rolleyes.gif , модуль видеозахвата тот самый случай, когда что-то на asm может быть уместно. Я попутал глобальное запрещение прерываний IRQenable с системными InterruptEnable и т.д., которые идут в их либах, так же как и GetCPUId.

А этот запрет по разному можно реализовывать. Коллега просто маскировал отображенные в память регистры контролера прерываний (я правда считал, что глобальная блокировка прерываний не очень оправдана в таких системах).

Правильно было бы использовать intrinsics _enable()/_disable(), если в MS положила их в студию для ARM, как для других ядер.

Если не хочется из-за нескольких строк кода подключать ассемблерный файл, то можно через прямое вложение кода:
Код
inline void _IRQDisable(void)
{
    __emit(0xe10f0000);
    __emit(0xe3800080);
    __emit(0xe121f000);
}

Или набраться наглости и поиспользовать невнятные instrinsics для ARM _ReadStatusReg/_WriteStatusReg:
Код
int CPSR = _ReadStatusReg(0);
    CPSR |= 0x80;
    _WriteStatusReg(CPSR,0,1);

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