Нужна информация об использовании Inline Assembly для WinCE, ARM9 - PullRequest
4 голосов
/ 17 ноября 2011

Я не очень хорош во встроенной сборке, но планирую использовать ее для оптимизации в Embedded-проекте.Поскольку я не знаю много информации об этом, мне нужна некоторая помощь.

У меня Win CE 6.0 с ARM9 , используя MS Visual Studio 2005 (с использованием MFC).

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

Это было бы очень полезно для меняесли я смогу получить какую-либо онлайн-ссылку или примеры использования регистров, имен переменных, указателей (некоторые вещи, связанные с передачей памяти и побитовыми операциями) и т. д. для моей конкретной среды .

РЕДАКТИРОВАТЬ после ответа ctacke:

Было бы очень полезно для меня, если есть какая-либо ссылка или небольшие примеры для работы с файлами .s, в частности, написание и экспорт функций из .s, а также шаги, связанные собъединяя их с моим приложением MFC.Любой маленький пример сделает это.

Спасибо.

С уважением, Aftab

1 Ответ

5 голосов
/ 17 ноября 2011

Компиляторы ARM, поставляемые с Visual Studio (все версии), не поддерживают встроенный ASM - только встроенные ASM x86 поддерживают встроенный ASM. Чтобы использовать ASM для ARM (или SH или MIPS), вы должны создать отдельный файл кода (обычно файл .s), экспортировать функции из вашего ASM и вызывать их.

EDIT

Вот простой пример ( взято отсюда ):

AREA asm_func, CODE, READONLY
; Export my_asm function location so that C compiler can find it and link
EXPORT my_asm

my_asm
;
; ARM Assembly language function to set LED1 bit to a value passed from C   
; LED1 gets value (passed from C compiler in R0)
; LED1 is on GPIO port 1 bit 18
; See Chapter 9 in the LPC1768 User Manual
; for all of the GPIO register info and addresses
; Pinnames.h has the mbed modules pin port and bit connections
;

; Load GPIO Port 1 base address in register R1 
LDR     R1, =0x2009C020 ; 0x2009C020 = GPIO port 1 base address

; Move bit mask in register R2 for bit 18 only
MOV.W   R2, #0x040000   ; 0x040000 = 1<<18 all "0"s with a "1" in bit 18

; value passed from C compiler code is in R0 - compare to a "0" 
CMP     R0, #0          ; value == 0 ?

; (If-Then-Else) on next two instructions using equal cond from the zero flag
ITE EQ

; STORE if EQ - clear led 1 port bit using GPIO FIOCLR register and mask
STREQ   R2, [R1,#0x1C]  ; if==0, clear LED1 bit

; STORE if NE - set led 1 port bit using GPIO FIOSET register and mask
STRNE   R2, [R1,#0x18]  ; if==1, set LED1 bit

; Return to C using link register (Branch indirect using LR - a return)
BX      LR
END
...