amiga-news DEUTSCHE VERSION
.
Links| Forums| Comments| Report news
.
Chat| Polls| Newsticker| Archive
.

amiga-news.de Forum > Programmierung > CPU per Library ermitteln [ - Search - New posts - Register - Login - ]

-1- [ - Post reply - ]

2007-01-19, 13:15 h

MaikG
Posts: 5172
User
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. ]

[ - Answer - Quote - Direct link - ]

2007-01-19, 13:40 h

Gazelle
Posts: 151
User
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.

[ - Answer - Quote - Direct link - ]

2007-01-19, 14:03 h

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

[ - Answer - Quote - Direct link - ]

2007-01-19, 16:59 h

MaikG
Posts: 5172
User
>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?

[ - Answer - Quote - Direct link - ]

2007-01-19, 17:29 h

gni
Posts: 1106
User
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.

[ - Answer - Quote - Direct link - ]

2007-01-19, 18:01 h

MaikG
Posts: 5172
User
>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?

[ - Answer - Quote - Direct link - ]

2007-01-19, 18:07 h

Der_Wanderer
Posts: 1229
User
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


[ - Answer - Quote - Direct link - ]

2007-01-19, 18:25 h

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

Und das darf man laut richtlinen?

[ - Answer - Quote - Direct link - ]

2007-01-19, 18:31 h

ZeroG
Posts: 1488
User
@MaikG:

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

[ - Answer - Quote - Direct link - ]

2007-01-20, 10:09 h

MaikG
Posts: 5172
User
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. ]

[ - Answer - Quote - Direct link - ]

2007-01-20, 10:47 h

Ralf27
Posts: 2779
User
@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. ]

[ - Answer - Quote - Direct link - ]

2007-01-20, 12:53 h

ZeroG
Posts: 1488
User
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.

[ - Answer - Quote - Direct link - ]

2007-01-20, 13:51 h

Holger
Posts: 8116
User
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.

[ - Answer - Quote - Direct link - ]

2007-01-20, 15:26 h

ZeroG
Posts: 1488
User
@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.

[ - Answer - Quote - Direct link - ]

2007-01-21, 17:16 h

Holger
Posts: 8116
User
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.

[ - Answer - Quote - Direct link - ]


-1- [ - Post reply - ]


amiga-news.de Forum > Programmierung > CPU per Library ermitteln [ - Search - New posts - Register - Login - ]


.
Masthead | Privacy policy | Netiquette | Advertising | Contact
Copyright © 1998-2025 by amiga-news.de - all rights reserved.
.