STM32 i GNU assembler - problem z movs

Do you have a question? Post it now! No Registration Necessary

Translate This Thread From Polish to

Threaded View
Witam,

Zacząłem coś pisac na STM32F103 i mam problem z
GNU assembler (Sourcery G++ Lite).

Wywołuję go: as.exe -mcpu=cortex-m3 -mthumb
I nie wiem czy aby poprawnie, bo nie łyka mi

movs R11, #0x000B

Pisze:
   only lo regs allowed with immediate -- 'movs R11,#0x000B'

Czy ten asembler się nie nadaje dla tego procka?
A może użyte opcje są niewłaściwe?

Z góry dzięki za pomoc,
   SM

Re: STM32 i GNU assembler - problem z movs
[...]
Quoted text here. Click to load it

Kompilujesz w trybie thumb, a tam zdaje się masz dostęp tylko do
rejestrów R0-R7

pzdr.
j.


Re: STM32 i GNU assembler - problem z movs
Quoted text here. Click to load it

No właśnie - chyba używam złej opcji dla asemblera
że nie łyka mi tej instrukcji.

Czy ktoś mógłby podpowiedzieć jakiej opcji użyć
aby można było kompilować pod STM32F103?
Może niewłaściwa wersja asemblera GCC?

SM

P.S.
   W Programming Manual PM0056 z www.st.com
strona 81/154 przykład użycia MOV jak byk
jest:
    MOVSR11, #0x000B; write value of 0x000B to R11, flags get updated

Re: STM32 i GNU assembler - problem z movs
SM pisze:
Quoted text here. Click to load it

thumb2?

Re: STM32 i GNU assembler - problem z movs
Zbych pisze:
Quoted text here. Click to load it

Nie łyka ani:

-mcpu=cortex-m3 -mthumb2

ani:

-mcpu=cortex-m3 -mthum-2

SM

Re: STM32 i GNU assembler - problem z movs
Zbych pisze:
Quoted text here. Click to load it

Nie mam jeszcze procka, więc nie wiem czy to łyknie,
ale działa coś takiego:

   as.exe -mcpu=cortex-m3 -mimplicit-it=thumb

i na początku w kodzie programu:

   .syntax unified
   .code 16

SM

Re: STM32 i GNU assembler - problem z movs
Quoted text here. Click to load it

Cortex-M3 pracuje tylko w Thumb-2 więc musi mieć dostęp do
wszystkich rejestrów w tym trybie bo praca w trybie ARM
(tylko 32bit instrukcje) tam nie istnieje.
Thumb-2 łączy w sobie zarówno ARM jak i Thumb (wielkość
opcode dla instrukcji może być 16 lub 32 bit).

SM

Re: STM32 i GNU assembler - problem z movs

Quoted text here. Click to load it

To jest wlasnie przyczyna
Quoted text here. Click to load it

Wujek Googel mowi :

gas/config/tc-arm.c :
 if (inst.operands[1].isreg)
    {
        (...)
    }
 else
    {
      if (inst.operands[0].reg > 7)
        {
          inst.error = _("only lo regs allowed with immediate");
          return;
        }


Polecam zapoznanie sie z asemblerem procesora, np.
http://theory.cs.uni-bonn.de/info5/system/parlab/dnard/thumbquickref.pdf

Re: STM32 i GNU assembler - problem z movs
cepu69 pisze:
Quoted text here. Click to load it

Cortex-M3 nie ma thumb, tylko thumb-2 i wtedy ma dostęp
do wszystkich rejestrów.
-mthumb jest OK, brakowało mi "-march=armv7-m" - to przełącza
gcc na thumb-2 a .syntax unified "łączy" ARM i thumb.

SM

Re: STM32 i GNU assembler - problem z movs

Quoted text here. Click to load it
(..)

Quoted text here. Click to load it
Niekoniecznie :
http://www.arm.com/files/pdf/IntroToCortex-M3.pdf
"The Cortex-M3 core contains a decoder for
traditional Thumb and new Thumb-2 instructions"

Quoted text here. Click to load it
Czlowiek uczy sie cale zycie :)

eCos http://ecos.sourceware.org/ (pozwole sobie na drobna reklame)
ma ustawine opcje gcc takie jak uzywales poczatkowo
-mcpu=cortex-m3 -mthumb
i jak najbardziej wykorzystywane sa instrukcje thumb-2
(...)
        .syntax unified
        .thumb
(...)
        .global hal_switch_state_vsr
        .thumb
        .thumb_func
        .type   hal_switch_state_vsr, %function
hal_switch_state_vsr:

        mov     r0,#CYGNUM_HAL_CORTEXM_PRIORITY_MAX
        msr     basepri,r0
        ^^^^^^^
    to jest raczej thumb-2
        mov     r0,#2                   // Set CONTROL register to 2
        msr     control,r0
        isb                             // Insert a barrier

Dziwnie to wyglada jak dla mnie.

BTW.
http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0337e/Chdbhfja.html

2.3.1. General-purpose registers

The general-purpose registers r0-r12 have no special architecturally-defined
uses. Most instructions that can specify a general-purpose register can
specify r0-r12.

Low registers

    Registers r0-r7 are accessible by all instructions that specify a
general-purpose register.
High registers

    Registers r8-r12 are accessible by all 32-bit instructions that specify
a general-purpose register.

    Registers r8-r12 are not accessible by all 16-bit instructions.



Re: STM32 i GNU assembler - problem z movs
 > ...
Quoted text here. Click to load it
http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0337e/Chdbhfja.html
Quoted text here. Click to load it

Jest dokładnie tak jak piszesz. Podstawa to ".syntax unified".

Cortex-M3 używa Thumb-2, a więc łączy on ARM (32 bitowe
instrukcje) i Thumb (16 bitowe instrukcje) "na raz"-
nie trzeba przestawiać procka do pracy w tryb tylko ARM
albo tylko Thumb.

Napisałem program używając zarówno instrukcji ARM 32-bit jak
i Thumb 16-bit w trybie asemblera Thumb-2.

Potem to wylistowałem. Efekt był taki, że w Thumb-2 można
używać zarówno instrukcji ARM jak i Thumb a asembler
sam wstawia odpowiednie opcode. Jeśli instrukcja jest
dozwolona jako Thumb 16bit, wstawia opcode 16bit,
jeśli tylko jako ARM 32bit wstawia opcode 32bit.

SM

Re: STM32 i GNU assembler - problem z movs
SM pisze:
Quoted text here. Click to load it

No i chyba znalazłem odpowiedź:
-mthumb -march=armv7-m uaktywnia thumb-2
do tego w kodzie .syntax unified.

SM

Re: STM32 i GNU assembler - problem z movs
W dniu 2010-05-06 08:00 SM napisał(a):
Quoted text here. Click to load it



lrrrrsaqqwr

--
Adam Dybkowski
               http://dybkowski.net /

We've slightly trimmed the long signature. Click to see the full one.

Site Timeline