Autor Thema: Abfrage freier Speicher / TOS 2.06  (Gelesen 52183 mal)

0 Mitglieder und 2 Gäste betrachten dieses Thema.

rainers

  • Gast
Abfrage freier Speicher / TOS 2.06
« am: Mo 29.04.2013, 22:00:50 »
Hallo,

kann mir jemand einen Tip geben (meine Bücher geben nichts Brauchbares her), wie auf einfache Art und Weise der noch freie Hauptspeicher unter TOS 2.06 ermittelt werden kann? Also einfach die Summe des gesamten freien Speichers. Schön wäre eine Systemfunktion (GEMDOS, BIOS, XBIOS) oder ev. auch eine ST-Pascal-Funktion.

Danke.
-R.

HamSTer

  • Gast
Re: Abfrage freier Speicher / TOS 2.06
« Antwort #1 am: Mo 29.04.2013, 22:13:37 »
schau doch mal beim toshyp vorbei. dort dann bei gemdos und den speicherfunktionen.
« Letzte Änderung: Mo 29.04.2013, 22:46:20 von HamSTer »

rainers

  • Gast
Re: Abfrage freier Speicher / TOS 2.06
« Antwort #2 am: Mo 29.04.2013, 22:20:58 »
Danke HamSTer für die tolle Seite, da kann ich ne Menge lesen, was ich noch nicht weiß.

Jedoch auf die Schnelle konnte ich unter der Rubrik "Speicherfunktionen" nichts finden, was dem entspricht, was ich möchte.
Aber schon für Deinen Link hat sich der Thread "gelohnt"  ;)

HamSTer

  • Gast
Re: Abfrage freier Speicher / TOS 2.06
« Antwort #3 am: Mo 29.04.2013, 22:47:20 »
malloc() mit -1 aufrufen.

rainers

  • Gast
Re: Abfrage freier Speicher / TOS 2.06
« Antwort #4 am: Mo 29.04.2013, 22:54:30 »
Nee, das isses nich.
Die gibt ja nur die Größe des größten zusammenhängenden Speicherblocks zurück.
Ich möchte aber den gesamten freien Speicher abfragen ;-)

Offline 1ST1

  • Benutzer
  • Beiträge: 8.661
  • Gesperrter User
Re: Abfrage freier Speicher / TOS 2.06
« Antwort #5 am: Mo 29.04.2013, 23:20:26 »
Nee, das isses nich.
Die gibt ja nur die Größe des größten zusammenhängenden Speicherblocks zurück.
Ich möchte aber den gesamten freien Speicher abfragen ;-)

Vorgehensweise:

Mit malloc(-1) den größten freien Speicherbereich ermitteln, diesen Speicher allozieren und merken wieviel das war. Dann wieder malloc(-1) und den Speicher allozieren und zum gemerkten Speicher dazuaddieren. Das solange wiederholen, bis malloc(-1) Null zurückliefert, anschließend den ganzen allozierten Speicher wieder frei geben.
« Letzte Änderung: Di 30.04.2013, 07:52:18 von 1ST1 »
Ausgeloggter Mitleser, der hier NIE mehr aktiv wird. Am besten, meine Inhalte komplett löschen. Dabei berufe ich mich auf mein Urheberrecht, die DSGVO und auf die Rechte, die mir unter Impressunm&Datenschutz zugestanden werden. Tschö!

rainers

  • Gast
Re: Abfrage freier Speicher / TOS 2.06
« Antwort #6 am: Mo 29.04.2013, 23:40:12 »
@1ST1: Das ist Dein Ernst? Du glaubst wirklich, daß TOS (2.06) und MagiC (6.20) auf diese Art und Weise vorgehen?
Solange Du mir hier nicht ein seriöses Programmbeispiel lieferst, glaube ich das nicht.

Schreib doch nicht immer nur so vor Dich hin, mach doch irgendwas mal ganz konkret. Für einen ATARI-GOTT wie Dich muß doch das aus dem Ärmel geschüttelt sein.  8) 8) 8) 8) 8) 8) 8) 8)

Offline 1ST1

  • Benutzer
  • Beiträge: 8.661
  • Gesperrter User
Re: Abfrage freier Speicher / TOS 2.06
« Antwort #7 am: Di 30.04.2013, 00:47:33 »
Ich liege schon im Bett. Ich schätze aber, eine andere Wahl hast du nicht, wenn du es tatscächlich wissen willst. GEMDOS sieht scheinbar keine andere Funktion vor. Im Sinne von möglichem Multitasking sollte dein Programm aber immer nur so viel dazu allozieren, wie du absehbar brauchst. Die Strategie "ich hol mir jetzt mal allen Speicher an Land" macht höchstens in Single-Tasking-TOS Sinn, aber auch nur wenn keine ACCs geladen werden, die dynamisch bei Bedarf auch zusätzlichen Speicher anfordern. Unter MiNT/Magic verbaust du dir damit jegliche Multitasking-Kooperation.

Siehe auch Profibuch Seite 251-256 zu den Speicherfunktionen malloc, mxmalloc, mfree und mshrink.
Ausgeloggter Mitleser, der hier NIE mehr aktiv wird. Am besten, meine Inhalte komplett löschen. Dabei berufe ich mich auf mein Urheberrecht, die DSGVO und auf die Rechte, die mir unter Impressunm&Datenschutz zugestanden werden. Tschö!

Offline mfro

  • Benutzer
  • Beiträge: 1.640
Re: Abfrage freier Speicher / TOS 2.06
« Antwort #8 am: Di 30.04.2013, 06:33:05 »
@1ST1: Das ist Dein Ernst? Du glaubst wirklich, daß TOS (2.06) und MagiC (6.20) auf diese Art und Weise vorgehen?

Doch, das stimmt schon. So wird's gemacht. Was anderes ist nicht vorgesehen.
And remember: Beethoven wrote his first symphony in C

Offline AltF4

  • Benutzer
  • Beiträge: 49
Re: Abfrage freier Speicher / TOS 2.06
« Antwort #9 am: Di 30.04.2013, 07:54:17 »
Doch, das stimmt schon. So wird's gemacht. Was anderes ist nicht vorgesehen.

Um hier noch eine Erklärung nachzuschieben:  Deine Fragestellung bezog sich ja laut Thread-Titel auf Tos 2.06.  Und dort ist tatsächlich keine andere Möglichkeit vorgesehen.  Bei MiNT gibt es m.Wn. schon die Möglichkeit, die Anzahl freier Mem-Pages abzufragen (und die Größe einer Page natürlich auch).  Und bei Magic dürfte es das auch geben, irgendwie.  Aber um Details zu nennen, bin ich da leider schon zu lange raus aus dem Theme.

Aber abgesehen von der Möglichkeit, solches in Erfahrung zu bringen, um seine Neugierde zu befriedigen, hat die Kenntnis darüber keinen echten Nutzen. Das liegt daran, das TOS (genauso wie MiNT und Magic) keine virtuelle Speicherverwaltung beherrschen.  Dadurch wird der Speicher nach längere Uptime irgendwann so fragmentiert, dass nur noch kleine "Speicher-Fitzelchen" zur Verfügung stehen.  Und wenn Du dann doch mal 32k zusammenhängenden Speicher brauchst, aber nur noch 1000 einzelne freie Pages mit immerwieder dazwischenliegenden benutzten Pages vorfindest, wirst Du feststellen, dass Malloc(-1) für den größtverfügbaren Speicherblock doch dein Freund ist.

Ich hoffe, ich habe mich soweit verständlich ausgedrückt, ohne zu sehr theoretisch zu werden  :-))

rainers

  • Gast
Re: Abfrage freier Speicher / TOS 2.06
« Antwort #10 am: Di 30.04.2013, 09:54:51 »
Dank Euch allen, insbesondere 1ST1  ;) (siehste mal, mit so einer Antwort, wie Deiner letzten, damit kann ich etwas anfangen  ;) ).

Also es sollte wirklich nur "nice to have" sein. Dafür werde ich den Aufwand dann aber nicht betreiben.
Nochmals Danke.

-R.

Offline mfro

  • Benutzer
  • Beiträge: 1.640
Re: Abfrage freier Speicher / TOS 2.06
« Antwort #11 am: Di 30.04.2013, 10:55:28 »
Mit MiNT kann man in der Tat den freien Speicher (sehr viel) einfacher abfragen. Einfach /kern/meminfo auslesen.

Allerdings hat man (gerade da) ganz und gar keine Garantie dafür, daß man den Speicher anschließend auch allokieren kann (da kann einem ganz leicht ein anderer Prozeß dazwischen funken).
And remember: Beethoven wrote his first symphony in C

Omikronman

  • Gast
Re: Abfrage freier Speicher / TOS 2.06
« Antwort #12 am: Di 30.04.2013, 12:27:56 »
Versuch´s doch mal mit PRINT FRE(0).

HamSTer

  • Gast
Re: Abfrage freier Speicher / TOS 2.06
« Antwort #13 am: Di 30.04.2013, 14:52:32 »
nein omi es werden programmiersprachen verwendet  ;D

aber das ergibt auch nur den grössten zusammenhängenden block freies st-ram

HamSTer

  • Gast
Re: Abfrage freier Speicher / TOS 2.06
« Antwort #14 am: Di 30.04.2013, 19:48:30 »
für mich als halblaie: was ist int_32t?

rainers

  • Gast
Re: Abfrage freier Speicher / TOS 2.06
« Antwort #15 am: Di 30.04.2013, 19:55:07 »
für mich als halblaie: was ist int_32t?

Lt. C++-Referenz das: Integer type with a width of exactly 32 bits.

HamSTer

  • Gast
Re: Abfrage freier Speicher / TOS 2.06
« Antwort #16 am: Di 30.04.2013, 20:38:00 »
ist das dann ein long? oder unsigned long? was besagt das t?

Offline simonsunnyboy

  • Moderator
  • *****
  • Beiträge: 1.807
  • Rock'n'Roll is the thing - Jerry Lee is the king!
Re: Abfrage freier Speicher / TOS 2.06
« Antwort #17 am: Di 30.04.2013, 20:46:01 »
t wie "type", das ist einfach eine Namenskonvention. I.d.R. wird das auf einem Atari einem long entsprechen.

BTW am Atari geht es immer um C, nicht C++, da gibt es subtile Unterschiede trotz vieler Ähnlichkeiten.
Zum Type int32_t empfehle ich Recherche unter dem Stichwort stdint.h, das ist ein Feature von C99 und sehr sinnvoll.
Ein long kann auf unterschiedlichen Plattformen unterschiedlich viele Bits lang sein, mit einem int32_t wird passend zur Plattform sichergestellt, daß man kein long sondern 32bit signed bekommt.

Paradize - ST Offline Tournament
Stay cool, stay Atari!
1x2600jr, 1x1040STFm, 1x1040STE 4MB+TOS2.06+SatanDisk, 1xF030 14MB+FPU+NetUS-Bee

HamSTer

  • Gast
Re: Abfrage freier Speicher / TOS 2.06
« Antwort #18 am: Mi 01.05.2013, 16:17:00 »
Ich habe das mal als Übung für mich versucht. Dabei ist dies herausgekommen:

#include <tos.h>
#include <stdio.h>

int main(void){
int i,j=0;
long mem=1,frei=0;
long merk[255];
for(i=0;i<255;i++){
merk[i]=0;
}
i=0;
while(mem != 0){
mem = Malloc(-1);
if(mem>0){
merk[i] = Malloc(mem);
frei=frei+mem;
i++;
}
}
for (j=0;j<i;j++){
Mfree(merk[j]);
}
printf("Bytes frei %ld",frei);
return 0;
}

Dabei bekomme ich dann Warnungen bei Malloc und Mfree: Non-portable Pointer assignment in function main
Was heißt das? Bei Pointern steig ich momentan vollkommen aus.

Offline simonsunnyboy

  • Moderator
  • *****
  • Beiträge: 1.807
  • Rock'n'Roll is the thing - Jerry Lee is the king!
Re: Abfrage freier Speicher / TOS 2.06
« Antwort #19 am: Mi 01.05.2013, 16:42:32 »
Du hast nirgendwo einen Pointer deklariert, die Funktionen wollen aber einen verwenden.
Zwar sind in der Tat am Atari 32Bit Zahlen auch gleichzeitig Adressen und pointer, aber C unterscheidet da. Und das ist auch richtig so, damit der Programmier auch weiß, womit er arbeitet.

Ein Zeiger auf einen Speicherbereich ist in C immer zweigeteilt, einmal der Pointer selbst, dargestellt durch * und einmal der Typ der Daten, auf die der Pointer zeigt.

Nimm an, du hast im Speicher tolle Zeichen liegen, die als char abgespeichert sind.
Dann kannst du in einem "Pointer auf char" die Startadresse dieser tollen Zeichen ablegen.

char meinZeichen = 'z';
char *ptr_auf_meinZeichen = &meinZeichen; /* definiere "pointer auf char"und gibt ihm die Speicheradresse von meinZeichen */


Malloc und co wissen nicht, welcher Typ dahinter liegt, deswegen geben sie normalerweise einen "void Pointer" zurück. Den muss man dann zur Verwendung auf die Art der Daten casten, auf die man dann zugreifen möchte.

void *speicher;
char *ptr_auf_zeichen;

speicher = malloc(50000); /* wir holen uns mal Speicher */
ptr_auf_zeichen = (char *)speicher; /* in diesem Speicher liegen in Zukunft chars */
*ptr_auf_zeichen = 'A'; /* ein großes A in diesem Speicher ablegen*/
ptr_auf_zeichen++; /* und auf die nächste Stelle zeigen lassen...*/

Vorschlag: Arbeite Dich bitte in ein sauberes und modernes C Tutorial auf dem PC ein. Wenn das sitzt, kann man das Wissen auf den Atari anwenden. Umgekehrt läuft man Gefahr, uralte C Dialekte zu verwenden und z.B. solche Fallen, wo aus Faulheit Adressen als long deklariert werden, weiterzuverwenden.
Paradize - ST Offline Tournament
Stay cool, stay Atari!
1x2600jr, 1x1040STFm, 1x1040STE 4MB+TOS2.06+SatanDisk, 1xF030 14MB+FPU+NetUS-Bee