py: Big improvements to inline assembler.

Improved the Thumb assembler back end.  Added many more Thumb
instructions to the inline assembler.  Improved parsing of assembler
instructions and arguments.  Assembler functions can now be passed the
address of any object that supports the buffer protocol (to get the
address of the buffer).  Added an example of how to sum numbers from
an array in assembler.
This commit is contained in:
Damien George
2014-04-13 00:30:32 +01:00
parent 82c7b1b1d5
commit 8721087661
7 changed files with 401 additions and 170 deletions

View File

@@ -1,4 +1,5 @@
# flash LED #1 using inline assembler
# this version is overly verbose and uses word stores
@micropython.asm_thumb
def flash_led(r0):
movw(r1, (stm.GPIOA + stm.GPIO_BSRRL) & 0xffff)
@@ -13,69 +14,72 @@ def flash_led(r0):
label(loop1)
# turn LED on
str(r2, r1, 0)
str(r2, [r1, 0])
# delay for a bit
movw(r4, 5599900 & 0xffff)
movt(r4, (5599900 >> 16) & 0xffff)
label(delay_on)
subs(r4, r4, 1)
sub(r4, r4, 1)
cmp(r4, 0)
bgt(delay_on)
# turn LED off
str(r3, r1, 0)
str(r3, [r1, 0])
# delay for a bit
movw(r4, 5599900 & 0xffff)
movt(r4, (5599900 >> 16) & 0xffff)
label(delay_off)
subs(r4, r4, 1)
sub(r4, r4, 1)
cmp(r4, 0)
bgt(delay_off)
# loop r0 times
subs(r0, r0, 1)
sub(r0, r0, 1)
label(loop_entry)
cmp(r0, 0)
bgt(loop1)
# flash LED #1 using inline assembler
# this version uses the convenience assembler operation 'movwt'
# flash LED #2 using inline assembler
# this version uses half-word sortes, and the convenience assembler operation 'movwt'
@micropython.asm_thumb
def flash_led_v2(r0):
movwt(r1, stm.GPIOA + stm.GPIO_BSRRL)
movwt(r2, 1 << 13)
movwt(r3, 1 << (16 + 13))
# get the GPIOA address in r1
movwt(r1, stm.GPIOA)
# get the bit mask for PA14 (the pin LED #2 is on)
movw(r2, 1 << 14)
b(loop_entry)
label(loop1)
# turn LED on
str(r2, r1, 0)
strh(r2, [r1, stm.GPIO_BSRRL])
# delay for a bit
movwt(r4, 5599900)
label(delay_on)
subs(r4, r4, 1)
sub(r4, r4, 1)
cmp(r4, 0)
bgt(delay_on)
# turn LED off
str(r3, r1, 0)
strh(r2, [r1, stm.GPIO_BSRRH])
# delay for a bit
movwt(r4, 5599900)
label(delay_off)
subs(r4, r4, 1)
sub(r4, r4, 1)
cmp(r4, 0)
bgt(delay_off)
# loop r0 times
subs(r0, r0, 1)
sub(r0, r0, 1)
label(loop_entry)
cmp(r0, 0)
bgt(loop1)
flash_led(5)
flash_led_v2(5)