Forum: Compiler & IDEs MIPS und der Global Pointer


von Mw E. (Firma: fritzler-avr.de) (fritzler)


Lesenswert?

Moinsen,
habe hier ein komisches Problem mit dem Global Pointer beim MIPS.

Im Linkerscript steht folgendes:
1
ENTRY(_start)
2
SECTIONS
3
{
4
  /*resetvector*/
5
  . = 0x00000000;
6
  reset : {
7
    *(.text.reset)
8
  }
9
  
10
  /*main*/
11
  . = 0x00000400;
12
  .text : {
13
    *(.text)
14
    main.o (.text)
15
  }
16
  
17
  /*.sbss und .sdata benutzt das Global Pointer Register
18
  daher passendes Symbol setzen fuer start.s*/
19
  _gp = .;
20
  
21
}

In der start.s setze ich dann auch den gp mit:
1
.section .text.reset
2
.extern main
3
_start:
4
  li $sp, 0x100000 /*1MB*/
5
  li $gp, _gp
6
  j main

li ist ein Pseudobefehl, der nach Größe von _gp ein lui, ein ori oder 
eine Kombination aus beiden erzeugt um die Variable ins Register zu 
bekommen.

Nun ist mein Programm etwas größer und der Globalpointer wird 17 Bit 
lang.
Allerdings werden mit dem li Pseudobefehl nur die untersten 16Bit nach 
$gp geladen und das Bit16 wird ignoriert.
Der Offset im restlichen Programm (wenn was aus .sdata geladen werden 
soll) ist auch nicht groß genug um über die 64k Grenze zu kommen.

Erst wenn ich das Bit16 manuell in das $gp schreibe funktioniert mein 
Programm:
1
.section .text.reset
2
.extern main
3
_start:
4
  li $sp, 0x100000 /*1MB*/
5
  lui $gp, 0x1
6
  ori $gp, $gp, _gp
7
  j main

Kann mir wer erklären was ich da falsch mache?
Zum Globalpointer findet sich leider nicht viel an Anleitung, außer:
"Zeigt in die Mitte des 64k Bereichs der .sdata und .sbss"

Nutze den GCC.

von René D. (Firma: www.dossmatik.de) (dose)


Lesenswert?

es gibt auch eine Pseudo instruction la

probier mal

la   $sp, 0x100000 /*1MB*/


Hast du noch was zu global pointer gefunden?
Machst du noch was mit MIPS?

von Mw E. (Firma: fritzler-avr.de) (fritzler)


Lesenswert?

Mit la gings dann auch, habs dann einfach mal eiskalt ausprobiert.
Kannte das la schon, aber das läd ja eigentlich die Adresse einer 
Variablen in das Register.
Bei Linkerscriptsymbolen ist das dann auf einmal anders.
1
main:
2
  la $1, var #load address 
3
  li $2, 0x80818283
4
  lw $3, 0($1)
5
idle:
6
  j idle
7
  
8
.text
9
var: .word 0x80818283

nach dem Ausführen:
$1 -> RAM Adresse von var
$2 -> 0x80818283
$3 -> 0x80818283

li erkennt eben einfach nicht, dass der immediate keine 16bit, sondern 
32bit hat.
Warum auch immer...

Inzwischen läufts und wurde hier verwendet:
http://www.fritzler-avr.de/spaceage2/soft_start.php

: Bearbeitet durch User
von René D. (Firma: www.dossmatik.de) (dose)


Lesenswert?

Dein Link ist heiß.

Da muss ich auch einen Link nachschieben.

http://www.dossmatik.de/mais-cpu.html

Falls du mal eine MIPS I  brauchst.

von Mw E. (Firma: fritzler-avr.de) (fritzler)


Lesenswert?

Hehe,
nen kleinen MIPS Kern mussten wir schon im 2. Semester in VHDL hacken.
Als Singlecycle, Multicycle und Pipelined.
Er musste zum Glück nur 5 Befehle können.
Dafür musste dann ein ARM9 Kern im 4. Semester komplett entworfen 
werden.

Zum Spaceage2 MIPS existiert ja auch VHDL Code, nur wurden eben erst die 
TTL ICs nachgebaut und dann in VHDL nach den Schaltplänen verdrahtet.
Ost ja auch nur zur Bugsuche vorhanden, jedenfalls kann die Synthese da 
fast garnichts optimieren.
-> 15MHz Maximaltakt auf nem ZYNQ7010

Wieso sind bei deinem MIPS die Branch Likely durchgestrichen aufgeführt?
Das sind MIPS II Befehle, also müssten die beim MIPS I nichteinmal 
erwähnt werden?
Sagt man dem GCC, dass man MIPS1 hat so nutzt er diese likely auch nicht 
mehr.

Das Pipelining ist mit forwarding, sehr schön.
Pipelining in TTL wär dann aber etwas zu hardcore geworden.

von René D. (Firma: www.dossmatik.de) (dose)


Lesenswert?

> fast garnichts optimieren.
> -> 15MHz Maximaltakt auf nem ZYNQ7010

Auf dem Spartan6 bin ich bei 100Mhz. Da bremmst micht die Multiplikation 
etwas aus. Beim ZYNQ7010 wäre noch mal eine Steigerung drinnen.



> Wieso sind bei deinem MIPS die Branch Likely durchgestrichen aufgeführt?
Historisch bedingt. Ich wollte gleich die Befehle von einer höheren Mips 
vorhalten. Die likely sind einfach misst.

> Das sind MIPS II Befehle, also müssten die beim MIPS I nichteinmal
> erwähnt werden?
Richtig, habe ich auch erst später gelernt, es gibt auch eine GCC option 
um Branch likely auszuschalten.

> Sagt man dem GCC, dass man MIPS1 hat so nutzt er diese likely auch nicht
> mehr.
>
> Das Pipelining ist mit forwarding, sehr schön.
> Pipelining in TTL wär dann aber etwas zu hardcore geworden.

Habt Ihr auch einfache AHA Software geschrieben?
So zur Demonstration.

von Mw E. (Firma: fritzler-avr.de) (fritzler)


Lesenswert?

Meinste jetz den Spaceage2 MIPS oder den kleinen VHDL MIPS?

Beim Spaceage2 MIPS gibts ne IO Plarine die aussieht wie nen 
Taschenrechner und das Gerät verhält sich dann auch so:
http://www.fritzler-avr.de/spaceage2/gallery/main.php?cmd=imageview&var1=SAM_1244k.jpg
Wird natürlich alles noch erweitert.

Beim kleinen VHDL MIPS sollte am Ende nen kleines Modulo geschrieben 
werden, welches aus den 5 möglichen Befehlen bestand:
lw/sw
add/sub
and/or
slt
beq

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.