SM
Guest
Thu May 06, 2010 6:00 am
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
Jacek Radzikowski
Guest
Thu May 06, 2010 6:11 am
On 05/06/2010 02:00 AM, SM wrote:
[...]
Quote:
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?
Kompilujesz w trybie thumb, a tam zdaje się masz dostęp tylko do
rejestrów R0-R7
pzdr.
j.
SM
Guest
Thu May 06, 2010 6:19 am
Quote:
Kompilujesz w trybie thumb, a tam zdaje się masz dostęp tylko do
rejestrów R0-R7
pzdr.
j.
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
Zbych
Guest
Thu May 06, 2010 6:50 am
SM pisze:
Quote:
Kompilujesz w trybie thumb, a tam zdaje się masz dostęp tylko do
rejestrów R0-R7
pzdr.
j.
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?
thumb2?
SM
Guest
Thu May 06, 2010 10:08 am
Zbych pisze:
Quote:
SM pisze:
Kompilujesz w trybie thumb, a tam zdaje się masz dostęp tylko do
rejestrów R0-R7
pzdr.
j.
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?
thumb2?
Nie łyka ani:
-mcpu=cortex-m3 -mthumb2
ani:
-mcpu=cortex-m3 -mthum-2
SM
SM
Guest
Thu May 06, 2010 10:13 am
Zbych pisze:
Quote:
SM pisze:
Kompilujesz w trybie thumb, a tam zdaje się masz dostęp tylko do
rejestrów R0-R7
pzdr.
j.
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?
thumb2?
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
SM
Guest
Thu May 06, 2010 1:43 pm
Quote:
Kompilujesz w trybie thumb, a tam zdaje się masz dostęp tylko do
rejestrów R0-R7
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
SM
Guest
Thu May 06, 2010 2:03 pm
SM pisze:
Quote:
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
No i chyba znalazłem odpowiedź:
-mthumb -march=armv7-m uaktywnia thumb-2
do tego w kodzie .syntax unified.
SM
cepu69
Guest
Thu May 06, 2010 2:12 pm
Jacek Radzikowski wrote:
Quote:
On 05/06/2010 02:00 AM, SM wrote:
[...]
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?
To jest wlasnie przyczyna
Quote:
Kompilujesz w trybie thumb, a tam zdaje się masz dostęp tylko do
rejestrów R0-R7
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
SM
Guest
Thu May 06, 2010 2:22 pm
cepu69 pisze:
Quote:
Jacek Radzikowski wrote:
On 05/06/2010 02:00 AM, SM wrote:
[...]
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?
To jest wlasnie przyczyna
Kompilujesz w trybie thumb, a tam zdaje się masz dostęp tylko do
rejestrów R0-R7
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
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
cepu69
Guest
Thu May 06, 2010 4:51 pm
SM wrote:
Quote:
cepu69 pisze:
Jacek Radzikowski wrote:
On 05/06/2010 02:00 AM, SM wrote:
[...]
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?
(..)
Quote:
Cortex-M3 nie ma thumb, tylko thumb-2 i wtedy ma dostęp
do wszystkich rejestrów.
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"
Quote:
-mthumb jest OK, brakowało mi "-march=armv7-m" - to przełącza
gcc na thumb-2 a .syntax unified "łączy" ARM i thumb.
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.
SM
Guest
Thu May 06, 2010 5:55 pm
Quote:
...
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.
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
Adam Dybkowski
Guest
Fri May 07, 2010 6:09 am
W dniu 2010-05-06 08:00 SM napisał(a):
Quote:
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 pom
lrrrrsaqqwr
--
Adam Dybkowski
http://dybkowski.net/
U/waga: przed wysłaniem do mnie maila usuń cyfry z adresu.
-