amiga-news ENGLISH VERSION
.
Links| Forum| Kommentare| News melden
.
Chat| Umfragen| Newsticker| Archiv
.

amiga-news.de Forum > Programmierung > CPU per Library ermitteln [ - Suche - Neue Beiträge - Registrieren - Login - ]

-1- [ - Beitrag schreiben - ]

19.01.2007, 13:15 Uhr

MaikG
Posts: 5172
Nutzer
Wie kann ich per Library ermitteln welche CPU im Rechner ist?

Einige seriellen Devices kommen nicht mit einen kontinuierlichen
eingehenden Datenstrom klar - lassen den Puffer überlaufen und
geben die Daten erst weiter wenn der Transfer beendet ist.
Auf 060(evtl. auch 040) ist das kein Problem, aber auf 030/020 muss ich
das mit einem Workaround umgehen.

http://www.amiga-news.de/forum/thread.php?id=25334&BoardID=7

Dafür muss ich aber wissen welche CPU im Rechner ist...


[ Dieser Beitrag wurde von MaikG am 19.01.2007 um 13:16 Uhr geändert. ]

[ - Antworten - Zitieren - Direktlink - ]

19.01.2007, 13:40 Uhr

Gazelle
Posts: 151
Nutzer
Zitat:
Dafür muss ich aber wissen welche CPU im Rechner ist...

Siehe #include <exec/execbase.h>
Da gibt es ein SysBase->AttnFlags Feld.

Ich habe es selber noch nie gebraucht, daher weiß ich nicht, ob es dafür verwendet werden kann.

[ - Antworten - Zitieren - Direktlink - ]

19.01.2007, 14:03 Uhr

ZeroG
Posts: 1486
Nutzer
Doch, ist genau dafür gedacht, ab OS4 gibts dafür IExec->GetCPUInfo().

[ - Antworten - Zitieren - Direktlink - ]

19.01.2007, 16:59 Uhr

MaikG
Posts: 5172
Nutzer
>Siehe #include <exec/execbase.h>
>Da gibt es ein SysBase->AttnFlags Feld.

Das hab ich schon in so einem C-Programm gefunden, aber
wo ist die SysBase?

[ - Antworten - Zitieren - Direktlink - ]

19.01.2007, 17:29 Uhr

gni
Posts: 1106
Nutzer
Zitat:
MaikG:
wo ist die SysBase?

Ich bin mir jetzt nicht sicher ob ich darüber lachen oder weinen soll...

SysBase ist ein Variablennamen für eine Variable die die Basisadresse der exec.library enthält. Üblicherweise wird diese Variable vom Startupcode Deiner C-Laufzeitumgebung initialisiert. Wo diese Adresse herkommt, sollte jedem Amigaprogrammierer bekannt sein.

[ - Antworten - Zitieren - Direktlink - ]

19.01.2007, 18:01 Uhr

MaikG
Posts: 5172
Nutzer
>SysBase ist ein Variablennamen für eine Variable die die
>Basisadresse der exec.library enthält.

Verstehe was gemeint ist.

>Üblicherweise wird diese Variable vom Startupcode Deiner
>C-Laufzeitumgebung initialisiert. Wo diese Adresse herkommt,
>sollte jedem Amigaprogrammierer bekannt sein.

Das Programm schreib ich grade in MaxonBasic, kann man die
Adresse auch woanders her bekommen?

[ - Antworten - Zitieren - Direktlink - ]

19.01.2007, 18:07 Uhr

Der_Wanderer
Posts: 1229
Nutzer
Peek.l(4)
--
Thilo Köhler, Author von:
HD-Rec, Samplemanager, ArTKanoid, Monkeyscript, Toadies, AsteroidsTR, TuiTED, PosTED, TKPlayer, TKUnpacker
Homepage: http://www.hd-rec.de


[ - Antworten - Zitieren - Direktlink - ]

19.01.2007, 18:25 Uhr

MaikG
Posts: 5172
Nutzer
>Peek.l(4)

Und das darf man laut richtlinen?

[ - Antworten - Zitieren - Direktlink - ]

19.01.2007, 18:31 Uhr

ZeroG
Posts: 1486
Nutzer
@MaikG:

Ja, das darf man.
Es ist die einzige feste Adresse in AmigaOS und steht sogar als AbsExecBase im execbase.h Header.

[ - Antworten - Zitieren - Direktlink - ]

20.01.2007, 10:09 Uhr

MaikG
Posts: 5172
Nutzer
Aber auf einem AONE z.B. gibt es doch kein Chipmen, geht es da auch?

So scheint es zu gehen:

code:
execadr&=PEEKL(4)

IF PEEKW(execadr&+AttnFlags%) AND AFF_68000& THEN cpu$="68000"
IF PEEKW(execadr&+AttnFlags%) AND AFF_68010& THEN cpu$="68010"
IF PEEKW(execadr&+AttnFlags%) AND AFF_68020& THEN cpu$="68020"
IF PEEKW(execadr&+AttnFlags%) AND AFF_68030& THEN cpu$="68030"
IF PEEKW(execadr&+AttnFlags%) AND AFF_68040& THEN cpu$="68040"
IF PEEKW(execadr&+AttnFlags%) AND 16& THEN cpu$="68060"


Danke @all

[ Dieser Beitrag wurde von MaikG am 20.01.2007 um 10:09 Uhr geändert. ]

[ - Antworten - Zitieren - Direktlink - ]

20.01.2007, 10:47 Uhr

Ralf27
Posts: 2779
Nutzer
@MaikG:

EDIT: Zu schnell gepostet. AFF<->AFB ... muß ich auch mal testen

--
http://www.alternativercomputerclub.de.vu

[ Dieser Beitrag wurde von Ralf27 am 20.01.2007 um 10:51 Uhr geändert. ]

[ - Antworten - Zitieren - Direktlink - ]

20.01.2007, 12:53 Uhr

ZeroG
Posts: 1486
Nutzer
Zitat:
Original von MaikG:
Aber auf einem AONE z.B. gibt es doch kein Chipmen, geht es da auch?


Tut es. Es gibt zwar kein Chipmem mehr aber es ist halt anderer Speicher in diesem Adressbereich.

[ - Antworten - Zitieren - Direktlink - ]

20.01.2007, 13:51 Uhr

Holger
Posts: 8090
Nutzer
Zitat:
Original von ZeroG:
Tut es. Es gibt zwar kein Chipmem mehr aber es ist halt anderer Speicher in diesem Adressbereich.


Es kann aber trotzdem sein, dass zero-page Zugriffe nicht erlaubt sind, und erst im exception-handler überprüft wird, ob es sich um einen long-read auf (4) handelt und dann die exec-base zurückgegeben wird.

Aus diesem Grund, Classic: Chip-Mem Zugriff, NG: möglicherweise CPU-Exception, führen die Laufzeitbibliotheken den Zugriff nur genau einmal am Anfang durch und speichern das Resultat in der bekannten Variablen SysBase. Jedes Mal auf Adresse 4 zuzugreifen, kann die Performance sehr beeinträchtigen.

Deshalb sollte man auch in Basic nicht jedes Mal PEEKL(4) hinschreiben, wenn man die ExecBase bracht, sondern das Resultat am Anfang in einer Variablen (vorzugsweise SysBase& ;) ) speichern.

mfg
--
Good coders do not comment. What was hard to write should be hard to read too.

[ - Antworten - Zitieren - Direktlink - ]

20.01.2007, 15:26 Uhr

ZeroG
Posts: 1486
Nutzer
@Holger:
Das ist für Classics richtig, aber unter OS4 laufen alle Libraryfunktionsaufrufe über die Interfacepointer.
Und die können wieder überall liegen, also muß sich Ottonormalprogrammierer schon mächtig ins Zeug legen um überhaupt mehr als einmal (wenn überhaupt) auf die AbsExecBase zuzugreifen.

[ - Antworten - Zitieren - Direktlink - ]

21.01.2007, 17:16 Uhr

Holger
Posts: 8090
Nutzer
Zitat:
Original von ZeroG:
@Holger:
Das ist für Classics richtig, aber unter OS4 laufen alle Libraryfunktionsaufrufe über die Interfacepointer.
Und die können wieder überall liegen, also muß sich Ottonormalprogrammierer schon mächtig ins Zeug legen um überhaupt mehr als einmal (wenn überhaupt) auf die AbsExecBase zuzugreifen.

Das ist ja klar, die ExecBase kann ja auch überall liegen. Ottonormalprogrammierer macht auch unter AOS3.x in C normalerweise das richtige, weil SysBase kein Makro mit Zugriff auf 4, sondern eine hinzugelinkte Variable im eigenen Programm ist.
Hier geht es aber um einen Basic-Dialekt, der eh keinen Support für AOS4-Interfaces hat.
Deshalb ja auch nur der Hinweis, dass man, egal womit man programmiert, wenn man keine Support-Lib benutzt, die eh das richtige macht, Zugriffe auf die Adresse 4 auf das Minimum reduzieren sollte. Das gleiche gilt eben auch, wenn man Support-Libraries selber implementieren will.
Reentranter Code könnte auch die Bibliothek/das Interface für jeden Aufrufer erneut öffnen, trotzdem sollte die ExecBase nicht jedes Mal aus Adresse 4 gelesen werden...

mfg
--
Good coders do not comment. What was hard to write should be hard to read too.

[ - Antworten - Zitieren - Direktlink - ]


-1- [ - Beitrag schreiben - ]


amiga-news.de Forum > Programmierung > CPU per Library ermitteln [ - Suche - Neue Beiträge - Registrieren - Login - ]


.
Impressum | Datenschutzerklärung | Netiquette | Werbung | Kontakt
Copyright © 1998-2022 by amiga-news.de - alle Rechte vorbehalten.
.