ELEKTRO FORUM

Elektroforum
It is currently December 3, 2008, 8:26 pm

All times are UTC





Post new topic Reply to topic  [ 8 posts ] 
Author Message
PostPosted: 2008-02-03 03:08:59
Online
Registered User

Joined: 2008-02-03 03:08:59
Hallo Gruppe,

und gerade ist mir beim Herumspielen noch etwas aufgefallen: Wenn ich
aus einer C-Datei, die ich mit avr-gcc übersetze auf einem AVR
einen
absoluten Jump einfügen will, ohne das jmp-Kommando zu verwenden
(das
unterstützen einige Einheiten ja nicht), muss ich auf rjmp
ausweichen.
Damit das automatisch die aktuelle Adresse verwendet:

asm volatile ("JumpLbl: rjmp .+0x100 - JumpLbl");

führt im Code dazu:

274: 73 cf rjmp .-282 ; 0x15c

d.h. immer 0x5c Bytes zu weit. Wenn ich diese 0x5c immer abziehe

asm volatile ("JumpLbl: rjmp .+0x100 - JumpLbl - 0x5c");

dann klappt es - aber eine "saubere" Lösung ist das
nicht. Insbesondere
denke ich mal, dass diese 0x5c davon abhängen für
welches Device ich
übersetze (Anzahl der Interruptvektoren u.ä.).
Ich nehme an, dass diese
Differenz damit zusammenhängt, dass das "JumpLbl"
Label aufgelöst wird,
bevor der Code reloziert ist (also vor dem Linkerskript). Wie bekomme
ich das Deviceunanhängig hin?

Viele GrÃ¼Ãźe,
Johannes

--
"PS: Ein Realname wäre nett. Ich selbst nutze nur keinen,
weil mich die
meisten hier bereits mit Namen kennen." -- Markus Gronotte aka Makus /
Kosst Amojan / maqqusz / Mr. G / Ferdinand Simpson / Quartillia
Rosenberg in dse <45608268$0$5719$9b4e6d93@newsspool3.arcor-online.net>


Top
 Profile
 
PostPosted: 2008-02-03 07:29:58
Online
Registered User

Joined: 2008-02-03 07:29:58
Johannes Bauer <dfnsonfsduifb@gmx.de> schrieb:

> und gerade ist mir beim Herumspielen noch etwas aufgefallen: Wenn
> ich aus einer C-Datei, die ich mit avr-gcc übersetze auf
einem AVR
> einen absoluten Jump einfügen will, ...

Was soll das denn für einen Sinn haben?

Wenn du Assembler schreiben willst, dann schreib Assembler, aber
irgendwie wild aus einer C-Datei rumspringen hat keinen Sinn.

--
cheers, J"org .-.-. --... ...-- -.. . DL8DTL

http://www.sax.de/~joerg/ NIC: JW11-RIPE
Never trust an operating system you dont have sources for. ;-)


Top
 Profile
 
PostPosted: 2008-02-03 14:00:21
Online
Registered User

Joined: 2008-02-03 14:00:21
Joerg Wunsch schrieb:

> Was soll das denn für einen Sinn haben?
>
> Wenn du Assembler schreiben willst, dann schreib Assembler, aber
> irgendwie wild aus einer C-Datei rumspringen hat keinen Sinn.

Ich will zwei Codeteile zusammenpappen, einen, den ich in Assembler
geschrieben habe und explizit an eine bestimmte Stelle linke (ganz ans
Ende, "Bootloader"). Dazu dann das "eigentliche" Programm,
das ganz
gewöhnlich compiliert wird. Zusammengepappt werden die
Codeschnipsel mit
etwas avr-objcopy und dd. An irgendeiner Stelle im Programm will ich nun
den unteren Teil anspringen, wenn z.B. eine bestimmte Magic-Sequenz
kommt. Dazu brauche ich das.

Alternativ: Den Bootloadercode in eine eigene Object-Datei compilieren,
die in eine eigene Section linken und die Position dieser Section
explizit definieren - geht das? Dann kann ich auch schön mit den
bekannten Symbolen arbeiten.

Viele GrÃ¼Ãźe,
Johannes

--
"PS: Ein Realname wäre nett. Ich selbst nutze nur keinen,
weil mich die
meisten hier bereits mit Namen kennen." -- Markus Gronotte aka Makus /
Kosst Amojan / maqqusz / Mr. G / Ferdinand Simpson / Quartillia
Rosenberg in dse <45608268$0$5719$9b4e6d93@newsspool3.arcor-online.net>


Top
 Profile
 
PostPosted: 2008-02-03 15:08:12
Online
Registered User

Joined: 2008-02-03 15:08:12
Johannes Bauer wrote:

> dass das "JumpLbl" Label aufgel


Top
 Profile
 
PostPosted: 2008-02-03 15:14:04
Online
Registered User

Joined: 2008-02-03 15:14:04
Johannes Bauer schrieb:
...
> Ich will zwei Codeteile zusammenpappen, einen, den ich in Assembler
> geschrieben habe und explizit an eine bestimmte Stelle linke (ganz ans
> Ende, "Bootloader"). Dazu dann das "eigentliche"
Programm, das ganz
> gewöhnlich compiliert wird. Zusammengepappt werden die
Codeschnipsel mit
> etwas avr-objcopy und dd.

Mächtig kompliziert und fehlerträchtig.

> An irgendeiner Stelle im Programm will ich nun
> den unteren Teil anspringen, wenn z.B. eine bestimmte Magic-Sequenz
> kommt. Dazu brauche ich das.
>
> Alternativ: Den Bootloadercode in eine eigene Object-Datei compilieren,
> die in eine eigene Section linken und die Position dieser Section
> explizit definieren - geht das?

Ich mache es gerade so. Im assembler-programm wird beim Booten der UART
initialisiert. Kommt binnen X Sekunden kein bestimmtes Zeichen, wird
nach "0000" gesprungen. Das kann man so machen, daÃź man
zweimal 0 auf
den Stack pusht und dann "ret" ausführt.

Assembler code, "flash.S":
-------------------------
#include <avr/io.h>

.section .bootld
.org 0x0
;Set 9600 Bd
ldi r31,((F CPU)/(9600*16)-1)&0xff

... arbeiten ...
;RESET ins Programm
exitloops:
ldi r31,0
ldi r30,0
ijmp
--------------------------
Im Makefile steht u.a.:
ASFLAGS = -Wa,-adhlns=$(<:.S=.lst),-gstabs
ALL ASFLAGS = -mmcu=$(MCU) -I. -x assembler-with-cpp $(ASFLAGS)
ASRC = flash.S ...
OBJ = $(ASRC:.S=.o) $(SRC:.c=.o) ...
%.o : %.S
$(CC) -c $(ALL ASFLAGS) $< -o $@

Linkt sich alles prima zusammen.

Jetzt muÃź ich den eigentlichen Firmware-Updater noch in asm schreiben,
damit ich nicht auf die Initialisierung für C angewiesen bin,
wenn das
Flashen mal danebenging. Das ist leider recht wahrscheinlich...

Falk


Top
 Profile
 
PostPosted: 2008-02-03 15:35:09
Online
Registered User

Joined: 2008-02-03 15:35:09
Johannes Bauer wrote:

> Ich will zwei Codeteile zusammenpappen, einen, den ich in
> Assembler geschrieben habe und explizit an eine bestimmte
> Stelle linke (ganz ans Ende, "Bootloader"). Dazu dann das
> "eigentliche" Programm, das ganz gew


Top
 Profile
 
PostPosted: 2008-02-03 15:41:30
Online
Registered User

Joined: 2008-02-03 15:41:30
Wolfgang Draxinger schrieb:

> Also eigentlich macht man das ja so, dass man mit einem Pragma
> die Startadresse für die nachfolgenden Funktionen im C
Quelltext
> festlegt und in dieser Funktion dann, wenns denn sein muss,
> inline Assembler verwendet.

Welches Pragma ist das denn beim avr-gcc?

Viele GrÃ¼Ãźe,
Johannes

--
"PS: Ein Realname wäre nett. Ich selbst nutze nur keinen,
weil mich die
meisten hier bereits mit Namen kennen." -- Markus Gronotte aka Makus /
Kosst Amojan / maqqusz / Mr. G / Ferdinand Simpson / Quartillia
Rosenberg in dse <45608268$0$5719$9b4e6d93@newsspool3.arcor-online.net>


Top
 Profile
 
PostPosted: 2008-02-03 15:43:17
Online
Registered User

Joined: 2008-02-03 15:43:17
Falk Willberg schrieb:

> Ich mache es gerade so. Im assembler-programm wird beim Booten der UART
> initialisiert. Kommt binnen X Sekunden kein bestimmtes Zeichen, wird
> nach "0000" gesprungen. Das kann man so machen, daÃź man
zweimal 0 auf
> den Stack pusht und dann "ret" ausführt.

Hmm, du definierst dir die bootld-Section, die aber den Origin bei 0x0
hat - wie relozierst du die dann beim Linken, im Makefile hab ich dazu
nichts gefunden. Also sagen wir, du willst die komplette bootld-Section
nach 0x700 relozieren - was wären die Linkerbefehle?

Viele GrÃ¼Ãźe,
Johannes

--
"PS: Ein Realname wäre nett. Ich selbst nutze nur keinen,
weil mich die
meisten hier bereits mit Namen kennen." -- Markus Gronotte aka Makus /
Kosst Amojan / maqqusz / Mr. G / Ferdinand Simpson / Quartillia
Rosenberg in dse <45608268$0$5719$9b4e6d93@newsspool3.arcor-online.net>


Top
 Profile
 
Post new topic Reply to topic  [ 8 posts ] 

Who is online

Users browsing this forum: Matthias Voss <mat.voss@t-online.de>,Ulrich G,Georg Sauthoff <g sauthoff@web.de>, 7 guests, Życzenia parapety niszczarki tajemnica psyche Śmieszne zdjęcia asus Księgarnia iBook skonwert Health insurance quotes hosting duzo ip tapety na telefon tłumaczenia


New posts New posts    No new posts No new posts    Announce Announcement
New posts [ Popular ] New posts [ Popular ]    No new posts [ Popular ] No new posts [ Popular ]    Sticky Sticky
New posts [ Locked ] New posts [ Locked ]    No new posts [ Locked ] No new posts [ Locked ]    Moved topic Moved topic
You can post new topics in this forum
You can reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group