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

amiga-news.de Forum > Suche [ - Suche - Neue Beiträge - Registrieren - Login - ]

Erste << 6 7 8 9 10 -11- 12 13 14 15 16 >> Letzte Ergebnisse der Suche: 1944 Treffer (30 pro Seite)
Mad_Dog   Nutzer

24.05.2008, 00:43 Uhr

[ - Direktlink - ]
Thema: Aufnehmen mit ahi.device
Brett: Programmierung

Hi,

Also ich hab's jetzt mal getestet (mit meinem Parallelportsampler und "Advanced AHI Recorder 1.5", ahi.device 5.3). Bei mir gibt's auch seltsame Knackser, die ich nicht habe, wenn ich mit etwas anderem aufnehme, was kein Ahi benutzt, wie z.B. die Original "StereoMaster" Software, die damals bei meinem Sampler dabei war. An der Hardware liegt's also nicht.

Habe noch nicht sehr viel mit den Ahi-Einstellungen experimentiert, habe aber gesehen, daß es da im Preferences-Programm von AHI unter "Erweiterte Einstellungen" eine Option "Standard Anti-Klick Zeit gibt". Ob das Abhilfe schafft? Hab's auf die Schnelle noch nicht ausprobiert.

Edit: Hier noch der Link zur Aufnahme:

test.aiff

Ist ein kurzer Ausschnitt (ca. 10 Sekunden) aus "Die Planeten - Neptun, der mytische" von Holst.

--
http://www.norman-interactive.com

[ Dieser Beitrag wurde von Mad_Dog am 24.05.2008 um 01:23 Uhr geändert. ]
 
Mad_Dog   Nutzer

23.05.2008, 22:03 Uhr

[ - Direktlink - ]
Thema: Nach Minimig kommt bald Natami.
Brett: Amiga, AmigaOS 4

Zitat:
Original von MaikG:

Das was ich per Mach Datenblatt kenne ist verhältnissmäßig premitiv
und sowas komplexes wie die Customchips nachzubilden...


Du hast Dir das Datenblatt eines bestimmten FPGAs von einem bestimmten Hersteller angeschaut. Toll. Aber FPGAs gibt's von "ganz klein" - mit wenig Gattern bis "ganz groß" mit zig tausenden Gattern.

Zum Thema CPU nachbauen: Ich hab auch schon mal eine RISC-CPU auf einem Fpga gebaut (nicht nachgebaut, sondern es war ein eigener Entwurf) und oh Wunder - sie hat sogar wunderbar funktioniert.

Die Sache mit den FPGAs sehe ich bei solchen Projekten nicht als problematisch an. Mittlrweile sind einfache Entwicklerboards von Xilinx oder Altera sogar in den Preisbereich gerückt, daß sie für den Hobbybastler durchaus erschwinglich sind. Die Hardware wird dann per VHDL am Rechner entworfen und simuliert.

Was ich allerdings erst glaube, wenn ich es mit eigenen Augen sehe, ist daß eine vollständige 68060 CPU (nicht LC oder EC) in der 50 MHZ Version ohne Probleme mit 90 MHZ läuft. In der Kühlung sehe ich da noch das geringste Problem. Wenn man es sich einfach machen will, dann montiert man eben eine große, wärmeleitfähige Metallplatte über sämtliche CPUs und Coprozessoren - so wie das einst beim Nintendo 64 gemacht wurde. Viel problematischer ist der hohe Strom, der da fließt (weit außerhalb der Spezifikationen des Herstellers), sowie die Flanken der Ausgangssignale. Wer kann, soll diese mal mit dem Oszi nachmessen und hier einen Screenshot davon platzieren. Ich fürchte, die Signale werden bei dieser Frequzen nicht mal mehr annähernd trapezförmig sein. Ich lasse mich aber auch gerne vom Gegenteil überzeugen.



--
http://www.norman-interactive.com
 
Mad_Dog   Nutzer

23.05.2008, 18:41 Uhr

[ - Direktlink - ]
Thema: Aufnehmen mit ahi.device
Brett: Programmierung

Ich habe hier leider nur bescheidene 68k-Hardware und einen Parallelport-Sampler. Falls Dir das was bringen sollte, kann ich mal versuchen, damit was über AHI aufzuzeichnen.

Aber irgendwie werde ich das dumpfe Gefühl nicht los, daß wir das selbe Problem in einem anderen Thread schonmal hatten - damals ging es um Mehrfrequenz-Tonwahl-Erkennung, Timing und Interrupts. Da hatten wir auch das Phänomen mir Knacken und Jaulen, was sich ja dann als Timing-Problem entpuppte.

Falls das in diesem Fall ein Problem von AHI selbst sein sollte, kannst Du sowieso nichts dran ändern. :( Aber genau darum, das rauszufinden geht's Dir ja, wenn ich das richtig verstanden habe, oder?

--
http://www.norman-interactive.com
 
Mad_Dog   Nutzer

23.05.2008, 18:30 Uhr

[ - Direktlink - ]
Thema: Nach Minimig kommt bald Natami.
Brett: Amiga, AmigaOS 4

Zitat:
Original von MaikG:
Es geht ja um Umgebungswärme, die wird durch Kühlkörper nur verteilt
aber nicht vermieden.


Also ich habe es noch nie erlebt, daß bei einem FPGA die Hitzeentwicklung ein Problem wäre. Dieses "Retro-Reverse-Engineering" will ja "nur" die alten Custom-Chips nachbilden und nicht mit einer modernen GPU konkurieren.

Vielleicht haben das manche noch nicht verstanden, was ein FPGA eigentlich macht? Ein FPGA ist ein frei programmierbarer Logikbaustein. D.h. darauf befinden sich fertige Gatter, die dann individuell "Verdrahtet" werden. Somit kann man eine X-beliebige Logikschaltung darauf realisieren. Das kann was ganz einfaches sein, wie z.B. ein Zähler oder ein Zustandsautomat, kann aber auch eine komplette CPU samt Perepherie sein. Und der FPGA enthält dann tatsächlich genau die Schaltung, die man entworfen hat. Da wird also nicht etwa irgendwas Softwaremässig emuliert.



--
http://www.norman-interactive.com
 
Mad_Dog   Nutzer

23.05.2008, 13:46 Uhr

[ - Direktlink - ]
Thema: Nach Minimig kommt bald Natami.
Brett: Amiga, AmigaOS 4

Zitat:
Original von MaikG:

Da er bestimmt kein Chiphersteller für neue Customchips hat,
werden diese in anderen Chips(ähnlich Minimig) Emuliert werden
und die werden meistens warm bis heiss.


:dance3: :dance3: :dance3:

Was verstehst Du hier unter "emuliert"?

Bei solchen Systemen (wie auch z.B. Minimig) werden die Customchips komplett auf einem Fpga nachgebildet. Und das geht heutzutage so gut, daß diese Nachbildung dem Original in nichts nachsteht (abgesehen von den höheren Kosten).

So weit ich das mitbekommen habe, geht Natami sogar noch einen Schritt weiter und erweitert die Fähigkeiten der original-Chipsets sogar noch.
--
http://www.norman-interactive.com
 
Mad_Dog   Nutzer

21.05.2008, 20:14 Uhr

[ - Direktlink - ]
Thema: S: Maxon C++ 3.1
Brett: Kleinanzeigen (keine Auktionen!)

StromC 3.0, welches als kostenlose Beigabe (als Vollversion) auf der AmigaOS 3.5 Developer CD mitgeliefert wird, wäre auch noch eine Alternative.

Edit: Hier noch schnell der Link (ohne Schleichwerbung machen zu wollen):

http://www.vesalia.de/e_developer2.htm

Preis: 16.90 Euro

--
http://www.norman-interactive.com

[ Dieser Beitrag wurde von Mad_Dog am 21.05.2008 um 20:18 Uhr geändert. ]
 
Mad_Dog   Nutzer

21.05.2008, 17:36 Uhr

[ - Direktlink - ]
Thema: Nach Minimig kommt bald Natami.
Brett: Amiga, AmigaOS 4

Zitat:
Original von MaikG:
>Die vorletzte Revision konnte ja AFAIK schon 66 MHz passiv gekühlt.

Nicht auf BPPC/CPPC. Dabei würde die Rev.5 CPU 60°C überschreiten
(ausserhalb meines geschmacks). Evtl. freistehend.


Laut Motorola (alias Freescale) ist eine Kerntemperatur bis 120 Grad und eine Package-Temperatur bis 220 Grad im grünen Bereich.

Aber die Temperatur ist, wie gesagt nicht das einzige, um was ich mir da Sorgen machen würde. Die Hitze ist nur ein Symptom, dessen Ursache der höhere Strom ist. Die vom Hersteller angegebenen elektrischen Eigenschaften der CPU gelten nur für die angegebene Taktfrequenz. Falls es trotz "krimineller" Übertaktung trotzdem funktioniert - Glück gehabt.

Wer die Entsprechende Ausrüstung hat, möge doch mal bitte den Strom, den die CPU (bei Angabe der Revision und Strukturgröße) bei diesen Frequenzen zieht, sowie die Flanken der Ausgangssignale nachmessen, denn das würde mich wirklich interessieren (ich will Euch ja nicht den Spaß verderben, bin aber immernoch skeptisch).




--
http://www.norman-interactive.com

[ Dieser Beitrag wurde von Mad_Dog am 21.05.2008 um 17:37 Uhr geändert. ]
 
Mad_Dog   Nutzer

20.05.2008, 15:22 Uhr

[ - Direktlink - ]
Thema: Nach Minimig kommt bald Natami.
Brett: Amiga, AmigaOS 4

Zitat:
Original von Andreas_Wolf:
> eine bestimmte Version des Motorola 68060, welche eigentlich für 50 Mhz
> ausgelegt ist soll man angeblich problemlos mit 100 Mhz betreiben
> können, was ich allerdings stark bezweifle

"Problemlos mit 100 MHz" ist zwar übertrieben, aber 90 MHz sind garantiert (siehe mein Beitrag vom 12.03.2008, 1.23 Uhr).

> Und da es noch keiner gemacht hat

Doch, Rodolphe Czuba (siehe genannter Beitrag). Und Thomas Hirsch will dem (zumindest bis 90 MHz) beim Natami folgen, was auch hier bereits im Thread diskutiert wurde.


Vorsicht! Mit DEM 68060 sind sicherlich keiner derartigen (90 MHZ) Taktraten (sicher und dauerhaft) möglich.

Wie Mirko_Naumann schon richtig bemerkt hat, gibt es vom 68060 nur zwei Varianten mit unterschiedlicher zulässiger Taktung: 50 Mhz und 60 Mhz.

Von den Krüppel-Versionen (EC und LC, also ohne FPU bzw. ohne FPU und ohne MMU) gibt es auch eine offizielle 75 Mhz Version. Wenn man diese dann auchnoch übertaktet, kann ich mir schon vorstellen, daß man damit auf 90 Mhz kommt.

Aber welchen Spaß hat man an einer solchen CPU ohne FPU noch? Es ist doch gerade die FPU, die (bei dafür optimierten Programmen) den entscheidenden Vorteil bringt. Gut - mit einer übertakteten LC oder EC Variante hast Du zwar schön schnelle Integer-Werte, aber bei den meisten modernen Anwendungen, bei denen Du Rechenleistung brauchst (Skalierung von Bildern, 3D-Berechnung, Interpolation, MP3 oder Video-Playback/Encoding usw.) kommt es gerade darauf an, daß Du schnelle Fließkommaberechnungen machen kannst.

--
http://www.norman-interactive.com
 
Mad_Dog   Nutzer

19.05.2008, 22:36 Uhr

[ - Direktlink - ]
Thema: Nach Minimig kommt bald Natami.
Brett: Amiga, AmigaOS 4

Zitat:
Original von huepper:

Statt hier sinnfrei über unverständliche Formeln zu grübeln macht euch doch mal Gedanken ums Wetter oder ähnlich spannende Dinge ... :D


Das sind einfachste Elektrotechnik Grundlangen - da muß man kein Genie sein, um das zu verstehen.

Zitat:
CPU's sind nun mal zum übertakten da, no risk no fun. ;) (gilt nicht für die alten CPU's !!! )

Mir machen die Leute echt Sorgen, die ihre Classic-Hardware - an der doch soviel Herzblut klebt - ohne Sinn und Verstand im wahrsten Sinne des Wortes verheizen.

In einschlägigen Foren kursieren schon Listen, welche Übertaktungen angeblich möglich sein sollen. z.B. eine bestimmte Version des Motorola 68060, welche eigentlich für 50 Mhz ausgelegt ist soll man angeblich problemlos mit 100 Mhz betreiben können, was ich allerdings stark bezweifle - vor allem auf gängigen Amiga-Turbokarten.

Und da es noch keiner gemacht hat, kursieren dann ominöse Benchmarks, in denen auf Basis bestehender Benchmarks die Leistungsdaten bei imaginären Taktfrequenzen "hochgerechnet" werden. Wohl bemerkt: MIPS oder Mega Flops, aber nicht Ampere oder Watt! :nuke:

Das fatale daran ist, daß der eine oder andere Hobbybastler durch solche Berichte zur Nachahmung verleitet wird. Als Ergebnis findet man dann im bekannten Internet-Auktionshaus missglückte Bastelversuche. Ist echt traurig sowas. :(

--
http://www.norman-interactive.com
 
Mad_Dog   Nutzer

19.05.2008, 18:19 Uhr

[ - Direktlink - ]
Thema: Bild laden und anzeigen
Brett: Programmierung

Zitat:
Original von GMKai:
Das mit den 24-Bit-Screens lässt mich nicht los...
Im Aminet
http://aminet.net/dev/misc/CGraphX-DevKit.lha
gibts das entspr. SDK.
Ich habe bei mir CubicIDE installiert, wie kann ich dieses und für die Zukunft auch andere SDKs da einbinden?


Einfach die Includes in die passenden Verzeichnisse ziehen.
Eventuell musst Du noch einige Includes (z.B. pragma und protos) per fd2pragma selbst erstellen.



--
http://www.norman-interactive.com

[ Dieser Beitrag wurde von Mad_Dog am 19.05.2008 um 18:21 Uhr geändert. ]
 
Mad_Dog   Nutzer

19.05.2008, 16:24 Uhr

[ - Direktlink - ]
Thema: Nach Minimig kommt bald Natami.
Brett: Amiga, AmigaOS 4

Zitat:
Original von AmigaAlliance:

also vll. mag das ja auf 060 CPU's greifen mit deiner Formel: höherer Takt=mehr Wärme. Aber beziehe das nicht generell auf alle CPU's. Da Designveränderungen einen höheren Takt erlauben bei niedriger!! Abwärme. Bsp. CPU 1 braucht 1.4V und CPU2 nur 1.2V jeweils bei gleichem Takt. Was ziehen wir daraus??? Ganz einfach die konstante variable wird aufgelöst und CPU2 wird nicht so warm!!!


Schau Dir einfach mal die Formel für den Kapazitiven Blindwiderstand an:

Bild: http://upload.wikimedia.org/math/2/a/e/2aef2d00a28937e907085d08a56a7527.png

Überleg Dir mal, was passiert, wenn

a) Die Frequenz gegen unendlich geht
b) Die Kapazität gegen 0 geht

Du hast offensichtlich mein letztes Posting entweder nicht richtig durchgelesen oder nicht verstanden. Natürlich bringt die Verkleinerung der Strukturen in Sachen Stromverbrauch was: Je kleiner die Strukturen sind, umso kleiner werden auch die Kapazitäten der Gates. Und damit steigt auch der kapazitive Blindwiderstand (bei gleicher Frequenz). Höherer Widerstand -> weniger Strom. Und mach bitte nicht den Fehler, denn viele Elektrotechnik-Laien machen: Strom und Spannung verwechseln.

--
http://www.norman-interactive.com
 
Mad_Dog   Nutzer

19.05.2008, 16:15 Uhr

[ - Direktlink - ]
Thema: Nach Minimig kommt bald Natami.
Brett: Amiga, AmigaOS 4

Zitat:
Original von MaikG:
Das eine höher getaktete CPU mehr wärme abgibt hat er ja aktzeptiert.
Nun, woher kommt denn wohl ebend die zusätzliche Wärme?

Wenn die aus dem nichts käme hätten wir alle keine hohen
Heizkostenabrechnungen...


Wenn das so wäre, dann würden alle nurnoch mit Strom heizen. Vielleicht findet sich ja ein Tüftler, der ein paar CPUs zu einem Heizkörper zusammenlötet. :D
--
http://www.norman-interactive.com

[ Dieser Beitrag wurde von Mad_Dog am 19.05.2008 um 17:25 Uhr geändert. ]
 
Mad_Dog   Nutzer

19.05.2008, 07:47 Uhr

[ - Direktlink - ]
Thema: Nach Minimig kommt bald Natami.
Brett: Amiga, AmigaOS 4

Zitat:
Original von AmigaAlliance:

Schon mal von von Designverbesserungen gehört? Siehe AMD welche mit niedrige "45nm" Core mehr MHZ bei niedriger VCore bereitstellen können als z.b. mit einer "90nm" Core CPU. Also sorry aber deine Darstellung mehr MHZ=mehr Strombedarf=mehr Wärme lasse ich so nicht gelten!


Kleinere Strukturen führen logischerweise auch zu kleineren Gate-Kapazitäten. Damit ist der kapazitive Blindwiderstand eine "geschrumpften" CPU auch höher, als der seiner großen Schwestern.
Das hat die Folge, daß diese "geschrumpfte" CPU bei gleicher Taktfrequenz auch weniger Strom zieht.

--
http://www.norman-interactive.com
 
Mad_Dog   Nutzer

19.05.2008, 01:08 Uhr

[ - Direktlink - ]
Thema: Nach Minimig kommt bald Natami.
Brett: Amiga, AmigaOS 4

Zitat:
Original von AmigaAlliance:
@ MadDog
Und wieso soll eine höher getaktete CPU mehr Strom ziehen als eine niedrig getaktete??


Weil moderne CPUs wie auch die Motorola 68060 Feldeffekttransistoren verwenden. Bei FETs bewirkt ja bekanntlich die Gate-Source Spannung, daß der Transistor leitet. Es fließt aber vom Gate kein Strom. Damit wirkt der Transistor (als Nebeneffekt) auch als Kondensator (wenn auch mit geringer Kapazität).

Wenn man einen Kondensator an eine Wechselstromquelle anschießt (in dem Fall das Taktsignal), nähert sich der Blindwiderstand eines Kondensators bei wachsenden Frequenzen immer mehr dem Kurzschluß.

Siehe auch: http://de.wikipedia.org/wiki/Kondensator_%28Elektrotechnik%29#Frequenzabh.C3.A4ngiger_Widerstand

Ganz abgesehen davon: Hast Du je mal am Oszi gesehen, wie die Flanken der Signale von Digitalschaltungen aussehen, wenn man es mit der Taktung übertreibt? Glaubst Du ernsthaft, da wäre noch ein zuverläsiger Betrieb möglich?





--
http://www.norman-interactive.com
 
Mad_Dog   Nutzer

18.05.2008, 16:41 Uhr

[ - Direktlink - ]
Thema: Nach Minimig kommt bald Natami.
Brett: Amiga, AmigaOS 4

Zitat:
Original von AmigaAlliance:
Und die Lebensdauer kratzt das auch nicht. Die 060 CPU's im aktuellen Stepping können bis 100MHZ getaktet werden mein Freund. :dance1:


Dir ist aber schon klar, daß mit höherer Taktung der CPU auch der Strom ansteigt, den diese zieht und daß in Folge dessen nicht nur thermische Effekte auftreten, sondern z.B. auch so Sachen wie Ionenmigration? Ganz abgesehen davon leiden auch andere Teile Deines Rechners darunter. z.B. hat vermutlich bei Commodore damals niemand die Steckerleiste im A3000/A4000 für hohe Ströme ausgelegt. Und bei altersschwachen Amigas, bei denen diese Steckverbindungen eventuell schon etwas korrodiert sind (was den elektrischen Widerstand der Steckverbindung erhöht), brauchst Du hinterher nicht heulen, wenn Dir diese langsam aber sicher verkockelt.

Wenn Du Dir mal die Bilder der CyberstormPPC anschaust, wirst Du sehen, daß in der Nähe der PPC CPU recht dicke Kondensatoren angebracht sind. Diese sind eben genau dazu da, diese Spitzenströme abzufangen...

Einen Oldtimer mal über dem Limit zu fahren, mag ja mal ganz lustig sein, aber der Lebenserwartung wird das ganz bestimmt nicht zuträglich sein.



--
http://www.norman-interactive.com
 
Mad_Dog   Nutzer

07.05.2008, 15:47 Uhr

[ - Direktlink - ]
Thema: FD->BMAP Fehler
Brett: Programmierung

Zitat:
Original von MaikG:
>Benutz lieber fd2pragma aus dem Aminet.

Und wie benutzt man das?

Da kommt ständig so ein blöder Requester, der nach irgendwelchen
Buchstaben+Optionen fragt. Ich will doch nur eine fd zu bmap wandeln.


RTFM


--
http://www.norman-interactive.com
 
Mad_Dog   Nutzer

06.05.2008, 14:26 Uhr

[ - Direktlink - ]
Thema: Http Post Request
Brett: Programmierung

Zitat:
Original von MaikG:

Vielleicht ist es besser einfach ein Dynamisches LONG Array zu
nehmen und da die Speicheradressen reinzupacken.


Wenn es in Maxon Basic dynamische Arrays gibt, dann nimm einfach diese und vergiß die verketteten Listen erstmal. Die verketteten Listen sollen ja hier nur einen dynamischen Speicher liefern. Aber wenn Deine Sprache schon "eingebaute" Sprachmittel bietet, die den selben Zweck erfüllen, brauchst Du das Rad ja nicht neu erfinden.



--
http://www.norman-interactive.com
 
Mad_Dog   Nutzer

06.05.2008, 01:02 Uhr

[ - Direktlink - ]
Thema: Task schläft ein
Brett: Programmierung

Zitat:
Original von woop:
Zitat:
Original von Mad_Dog:

Wenn das korrekt ist, dann kann ich es auch anderen Usern als Beispielcode anbieten. :)


Uhm, ohne dir zu nahe treten zu wollen, aber _dazu_ solltest du deine Beispiele noch ein wenig überarbeiten so dass z.B. Fehler sauber abgefangen werden und alle Ressourcen wieder freigegeben werden.


Stimmt natürlich auch wieder.

Ein typisches Beispiel dafür, was passieren kann, wenn man sich auf eine Maschine verlässt. Dazu mußt Du wissen, daß ich diese Beispiele mit StormC gemacht habe. Und aus Faulheit kommt man eben dann zwangsläufig auf den Gedanken "wenn der Resource-Tracker nach Beendigung des Programms nicht meckert, wird's schon o.k. sein". Da kann es schonmal passieren, daß man etwas übersieht, bzw. sich auf gewisse Automatismen verlässt. I-)

--
http://www.norman-interactive.com
 
Mad_Dog   Nutzer

06.05.2008, 00:40 Uhr

[ - Direktlink - ]
Thema: Task schläft ein
Brett: Programmierung

Zitat:
Original von woop:

4. Statt der Warte-for-Schleife ist ein Delay(25); hier viel schöner und aussagekräftiger: "Obwohl der Kindprozess schläft kann der Elternprozess wegen der gelockten Semaphore nicht weitermachen."


Diese for-Schleife ohne Anweisung ist natürlich eine bitterböse CPU-Zeit-verbraten Sache. Ehrlich gesagt habe ich das ursprünglich deshalb gemacht, weil mich der Hinweis aus den RKRMs, man dürfe aus einem Task die dos.library nicht benutzen, etwas irritiert hat (Delay() gehört ja schließlich auch zur dos.library). Aber ich verwende hier ja einen Prozeß und keinen Task, von daher müsste die Verwendung von Delay() innerhalb des Kind-Tasks klar gehen.

--
http://www.norman-interactive.com
 
Mad_Dog   Nutzer

05.05.2008, 23:02 Uhr

[ - Direktlink - ]
Thema: Task schläft ein
Brett: Programmierung

Zitat:
Original von woop:
@Mad_Dog:

Auch dein Semaphorenbeispiel sieht funktionstüchtig aus


Klar - funktionieren tut's. Aber zur Sicherheit lass ich es nochmal Leute sehen die (hoffentlich) mehr Erfahrung in Sachen Exec haben, als ich. Schließlich kann man auch Betriebssystemmechanismen in einer Weise anwenden, wie es sich er Erfinder eigentlich nicht gedacht hat (z.B. weil man es nicht richtig verstanden hat) und es funktioniert (mehr oder weniger zufällig) trotzdem.

Wenn das korrekt ist, dann kann ich es auch anderen Usern als Beispielcode anbieten. :)


--
http://www.norman-interactive.com
 
Mad_Dog   Nutzer

05.05.2008, 21:34 Uhr

[ - Direktlink - ]
Thema: Task schläft ein
Brett: Programmierung

Wo wir schonmal dabei sind, können wir das hier auch gleich durchsprechen:

Ich habe vor einiger Zeit ein kleines Beispuielprogramm geschrieben, um mich ein wenig in die Verwendung von Semaphoren unter AmigaOS einzuarbeiten.

Dazu habe ich mir ein einfaches Problem überlegt, bei dem zwei Prozesse derart gemeinsam auf eine Resource zugreifen, daß Race Conditions auftreten könnten. Bei diesem Beispiel versuchen zwei Prozesse auf eine Konsole zu schreiben. Die Konsole wird dabei durch eine Semaphore geschützt.
c code:
/*  Prozesse.c
 *  Ein Multitasking Beispiel
 *
 *  Autor: Norman Walter
 *  Datum: 27.5.2006
 *
 *  Ein Hauptprozeß startet einen Kindprozeß.
 *  Die gemeinsam genutzte Resource - das Konsolenfenster - wird
 *  über eine Semaphore geschützt. Die beiden Prozesse kommunizieren
 *  dabei über den MessagePort des Hauptprozesses. Der Kindprozeß setzt
 *  eine Nachricht ab, sobald er fertig ist. Auf diese Nachricht wartet
 *  der Hauptprozeß, bevor er sich beendet.
 *
 */

#include <stdio.h>
#include <stdlib.h>

#include <exec/types.h>
#include <exec/semaphores.h>
#include <dos/dostags.h>

#include <clib/exec_protos.h>
#include <clib/dos_protos.h>
#include <clib/alib_protos.h>

struct ReadyMessage {
  struct Message rdy_Msg;
  BOOL Ready;
};

struct Process *mainprocess, *childprocess;
BPTR output;
struct SignalSemaphore *LockSemaphore;

void child(void)
{
  unsigned long i,j;
  struct MsgPort *port;
  struct ReadyMessage *rdy;

  if (rdy = (struct ReadyMessage *) AllocMem(sizeof(struct ReadyMessage), MEMF_PUBLIC | MEMF_CLEAR))
  {
     rdy->rdy_Msg.mn_Node.ln_Type = NT_MESSAGE;
     rdy->Ready = TRUE;
  }

  ObtainSemaphore(LockSemaphore);

  PutStr("Kindprozeß gestartetn");
  Flush(Output());

  for (i=0;i<20;i++)
  {
     for (j=0;j<5000000;j++);
     PutStr(".");
     Flush(Output());
  }

  PutStr("n");

  Forbid();
  port=FindPort("MainPort");

  if (port)
  {
     PutStr("Kindprozeß setzt Nachricht abn");
     Flush(Output());
     PutMsg(port,(struct Message *)rdy);
  }
  else
  {
     printf("Fehler: Konnte MainPort nicht findenn");
  }

  Permit();

  PutStr("Kindprozeß endetn");
  Flush(Output());

  ReleaseSemaphore(LockSemaphore);

}

int main (void)
{
  struct MsgPort *port;
  struct ReadyMessage *reply;

  port = CreateMsgPort();
  if (port)
  {
     port->mp_Node.ln_Name="MainPort";
     port->mp_Node.ln_Pri=0;
     AddPort(port);
  }
  else
  {
     printf("Fehler: Konnte MainPort nicht erzeugenn");
  }

  /* Semaphore zum Schützen des Konsolenfensters */
  LockSemaphore = AllocMem(sizeof(struct SignalSemaphore),MEMF_ANY);
  InitSemaphore(LockSemaphore);

  /* Den Hauptprozess finden */
  mainprocess = (struct Process *)FindTask(NULL);

  /* Öffne Konsolenfenster für Ausgabe */
  output = Open("*",MODE_OLDFILE);

  if(output==NULL)
  {
     printf("Fehler: Konnte Konsole nicht öffnenn");
  }
  else

  printf("Hauptprozeß gestartetn");

  /*  Kindprozeß starten:
   *  Falls dieser eine höhere Priorität wie der Hauptprozeß hat,
   *  verdrängt der Kindprozeß den Hauptprozeß (preemtives Multitasking)
   */
  childprocess = CreateNewProcTags( NP_Entry, child,    // Code
                                    NP_Name, "child",   // Name
                                    NP_Output, output,  // Ausgabe
                                    NP_Priority, 0,     // Priorität
                                    TAG_DONE
                                  );
  if (childprocess)
  {
     /*  Falls der Kindprozeß eine höhere Priorität wie der Hauptprozeß
      *  hat, wird dieser zuerst die Semaphore setzen und die
      *  Ausgabe erfolgt erst, wenn er die Semaphore wieder freigegeben hat
      */
     ObtainSemaphore(LockSemaphore);
     PutStr("Hauptprozeß versucht etwas auf die Konsole zu schreibenn");
     ReleaseSemaphore(LockSemaphore);
  }
  else
  {
     printf("Fehler: Konnte Kindprozeß nicht startenn");
  }

  /*  Der Hauptprozeß wartet nun auf Nachricht vom Kindprozeß */
  WaitPort(port);

  if (reply = (struct ReadyMessage *)GetMsg(port))
  {
     printf("Die Nachricht enthält: %ldn",reply->Ready);
  }

  printf("Hauptprozeß endetn");

  if (port) RemPort(port);
  if (LockSemaphore) FreeMem(LockSemaphore,sizeof(struct Semaphore));

  return 0;
}


Ich hoffe, daß ich dabei alles richtig gemacht habe? :dance3:

--
http://www.norman-interactive.com
 
Mad_Dog   Nutzer

05.05.2008, 21:03 Uhr

[ - Direktlink - ]
Thema: Http Post Request
Brett: Programmierung

Zitat:
Bei Basic hat man an sich ja keine Pointer.
Das sind Long Intergers mit einem Wert.


Pointer sind ja (auf low-Level Ebene) auch nichts anderes, als Variablen , in denen eben eine Adresse steht. Bei modernen Hochsprachen gibts da natürlich noch einen "high-Level Überbau" zwecks Typprüfung usw - jedenfalls bei stark typisierten Sprachen wie z.B. C, C++, Ada usw..

Pointer sollten aber nicht DER Grund sein, der die Implementierung von verketteten Listen in Basic schwierig macht.

Viel schwieriger macht es die Tatsasche, daß es (zumindest in Elementar-Basic) nichts gibt, was einem struct in C oder einem Record in Pascal/Modula 2/Ada entspricht. Damit wird es äußerst schwierig, erstmal einen Knoten zu formulieren.

Sicher kann man das auch auf Low-Level Ebene machen, indem man maschinennahe Befehle wie PEEk, POKE, DEEK, DOKE, VARPTR usw. verwendet. Aber dann könnte man es fast schon wieder in Assembler machen...


--
http://www.norman-interactive.com

[ Dieser Beitrag wurde von Mad_Dog am 05.05.2008 um 21:04 Uhr geändert. ]
 
Mad_Dog   Nutzer

05.05.2008, 20:39 Uhr

[ - Direktlink - ]
Thema: Task schläft ein
Brett: Programmierung

Hi,

Um das Prinzip Task per Message beenden (in diesem Fall sogar ein Prozeß) anzutesten, habe ich mal ein kleines Beispielprogramm geschrieben. Der Kindtask besteht dabei ebenfalls wieder aus einer Schleife, die in dem Fall solange läuft, bis eine Nachricht am MessagePort anliegt.

Könntet Ihr mal schauen, ob das so korrekt ist?
c code:
#include <stdio.h>
#include <stdlib.h>

#include <exec/types.h>
#include <exec/semaphores.h>
#include <dos/dostags.h>

#include <clib/exec_protos.h>
#include <clib/dos_protos.h>
#include <clib/alib_protos.h>

struct ReadyMessage {
  struct Message rdy_Msg;
  BOOL Ready;
};

struct Process *mainprocess, *childprocess;
BPTR output;

ULONG i;

void child(void)
{
  ULONG j;

  struct MsgPort *port;
  struct Message *Msg;

  port = CreateMsgPort();
  if (port)
  {
     port->mp_Node.ln_Name="ChildPort";
     port->mp_Node.ln_Pri=0;
     AddPort(port);
  }

  while (!(Msg = GetMsg(port)))
  {
    PutStr("Kindprozeß aktiv!n");
    Delay(50);
  }

  //ReplyMsg(Msg);

  RemPort(port);
  DeleteMsgPort(port);

}

int main (void)
{
  struct MsgPort *port;
  struct ReadyMessage *rdy;

  if (rdy = (struct ReadyMessage *) AllocVec(sizeof(struct ReadyMessage), MEMF_PUBLIC | MEMF_CLEAR))
  {
     rdy->rdy_Msg.mn_Node.ln_Type = NT_MESSAGE;
     rdy->Ready = TRUE;
  }

  /* Den Hauptprozess finden */
  mainprocess = (struct Process *)FindTask(NULL);

  /* Öffne Konsolenfenster für Ausgabe */
  output = Open("*",MODE_OLDFILE);

  /*  Kindprozeß starten:
   *  Falls dieser eine höhere Priorität wie der Hauptprozeß hat,
   *  verdrängt der Kindprozeß den Hauptprozeß (preemtives Multitasking)
   */
  childprocess = CreateNewProcTags( NP_Entry, child,    // Code
                                    NP_Name, "child",   // Name
                                    NP_Output, output,  // Ausgabe
                                    NP_Priority, 0,     // Priorität
                                    TAG_DONE
                                  );
  Delay(250);

  Forbid();
  port=FindPort("ChildPort");

  if (port)
  {
    PutStr("ChildPort gefundenn");
    PutMsg(port,(struct Message *)rdy);
  }

  Permit();

  Delay(250);

  FreeVec(rdy);

  PutStr("Programmenden");

  return 0;
}


P.S.: Daß das böses Polling ist, ist mir klar. Darum geht es mir aber bei diesem Beispiel garnicht.

--
http://www.norman-interactive.com
 
Mad_Dog   Nutzer

04.05.2008, 16:02 Uhr

[ - Direktlink - ]
Thema: Http Post Request
Brett: Programmierung

Zitat:
Original von MaikG:
>Wo ist das Problem? Du kannst, wenn Du willst auch sofort
>aussteigen, wenn Dir recv() -1 liefert:

Ja, schon. Aber ist es nicht besser es nochmal zu probieren?
Vielleicht kommt ja beim 2. mal etwas.


Du kannst es natürlich auch mehrmals versuchen, dann musst Du eben einen Zähler einführen, der die Anzahl Deiner Versuche zählt, in etwa so:

code:
try = 0  Rem Zähler für Versuche
t!=TIMER:laenge&=0
         WHILE TIMER-t!<5 AND try<5
          puffer&=Recv(fd&,MyMemory&+laenge&,1, MSG_PEEK%)
          IF puffer&>0 THEN
	    IF laenge&+puffer&>maxlaenge& THEN EXIT WHILE
            position&=Recv(fd&,MyMemory&+laenge&,puffer&, 0)
            
            Rem Falls recv fehlschlägt, Zähler hochzählen
            IF position%=-1 THEN try=try+1
            ELSE try=0

	    laenge&=laenge&+position&
	  ELSEIF puffer&=0 AND laenge&>0 THEN EXIT WHILE
          ELSE delay 1
          END IF
         WEND


Zitat:
>Der Overhead, den ich angesprochen habe, bezieht sich nur auf den
>Speicherbedarf. Sicher, Du mußt bei derser Methode zur Laufzeit
>ständig Speicher beschaffen und die Knoten in die Liste einhängen.
>Aber der "Rechenaufwand" (es wird ja nicht wirklich etwas dabei
>gerechnet, sondern es finden nur ein paar Zuweisungen statt)
>ist zu verschmerzen.

Unter Basic könnte das im ungünstigsten Falle schon um einiges
länger dauern als in C.


Ein weitaus größeres Problem sehe ich in der Frage, ob Maxon Basic überhaupt die geeigneten Sprachmittel bietet, um sowas ohne Verrenkungen zu formulieren.

--
http://www.norman-interactive.com
 
Mad_Dog   Nutzer

04.05.2008, 14:43 Uhr

[ - Direktlink - ]
Thema: Task schläft ein
Brett: Programmierung

Zitat:
Original von woop:

Der Message-Port fürs timer.device wird im Hauptprozess angelegt, aber im Kindtask per SendIO/WaitIO bedient. Das sig-bit des Kindtasks wird wohl noch entsprechend gesetzt obwohl es hier nicht sauber alloziert werden dürfte, aber das GetMsg() des Hauptprozesses kann die Message entfernen bevor WaitIO() das im Task für dich erledigt. Damit würde dann dein WaitIO deadlocken.


Danke, das war's.

Ich hab's jetzt so:
c code:
void Update(void)
{
   /*  Oszilloskop erzeugen:
    *  32Khz Samplingrate,
    *  Zeitfenster 0.0125 Sekunden
    *  Zeichenfarbe grün, Hintergrund schwarz
    */
   sc = CreateScope(Fenster,32000,0.0125,green,black);

  /*  Wichtig: Für diesen Zweck brauchen wir UNIT_MICROHZ.
    *  Die anderen Timer sind zu ungenau.
    */
   TimerDevice = OpenDevice(TIMERNAME,UNIT_MICROHZ,(struct IORequest *)sc->TimerIO,0L);
   if (TimerDevice !=0) ShutDown();

	while (1)
   {
     ReadFrame(sc);
     DrawScope(sc);
   }

}


Wobei ich mir jetzt noch was besseres anstelle der Endlosschleife einfallen lassen muß. :)
--
http://www.norman-interactive.com
 
Mad_Dog   Nutzer

04.05.2008, 13:46 Uhr

[ - Direktlink - ]
Thema: Http Post Request
Brett: Programmierung

Zitat:
Original von MaikG:

>Das Gequängel um den Fall, daß recv() -1
>zurückgibt, stimmt mich da arg nachdenklich, dabei brichst Du
>Dir nun wirklich keinen Zacken aus der Krone, wenn Du diesen
>Fall sauber abfängst. Ein oder zwei IF-Klauseln mehr, ist
>doch eigentlich ein Klacks, oder?

Kann ich machen. Aber ist das wirklich besser?
So probiert das Programm weiter, ist das nicht evtl. besser
als beim 1. Fehler abzubrechen?
Beim Lesen eine Diskette macht ADos auch 5 Retrys.


Wo ist das Problem? Du kannst, wenn Du willst auch sofort aussteigen, wenn Dir recv() -1 liefert:
basic code:
t!=TIMER:laenge&=0
         WHILE TIMER-t!<5
          puffer&=Recv(fd&,MyMemory&+laenge&,1, MSG_PEEK%)
          IF puffer&>0 THEN
	    IF laenge&+puffer&>maxlaenge& THEN EXIT WHILE
            position&=Recv(fd&,MyMemory&+laenge&,puffer&, 0)
            
            Rem Falls recv fehlschlägt, aus der Schleife aussteigen
            IF position%=-1 THEN EXIT WHILE

	    laenge&=laenge&+position&
	  ELSEIF puffer&=0 AND laenge&>0 THEN EXIT WHILE
          ELSE delay 1
          END IF
         WEND


Zitat:
>Implementier es einfach. Wenn Du es einmal wirklich benutzt hast,
>dann wirst Du es schätzen lernen.

Ich glaube mit dem overhead würde ich den Support von langsameren
Prozessoren einfach killen.


Der Overhead, den ich angesprochen habe, bezieht sich nur auf den Speicherbedarf. Sicher, Du mußt bei derser Methode zur Laufzeit ständig Speicher beschaffen und die Knoten in die Liste einhängen. Aber der "Rechenaufwand" (es wird ja nicht wirklich etwas dabei gerechnet, sondern es finden nur ein paar Zuweisungen statt) ist zu verschmerzen.

--
http://www.norman-interactive.com

[ Dieser Beitrag wurde von Mad_Dog am 04.05.2008 um 13:48 Uhr geändert. ]
 
Mad_Dog   Nutzer

04.05.2008, 01:05 Uhr

[ - Direktlink - ]
Thema: Http Post Request
Brett: Programmierung

Zitat:
Original von Maja:
Zitat:
Original von MaikG:
Nehmen wir einen Wassertonne, in die kontinuierlich Wasser reinläuft.
Wenn ich nicht immer mit der Gießkanne Wasser abnehme läuft diese
Über.


Jetzt nehme noch an, dieser Wassertonne gehört einem Wirt und neben der Wassertonne steht ein Weinfass. Das überlaufende Wasser läuft aus der Wassertonne in das Weinfass. Der Wein verwässert und der Wirt wird wegen Panscherrei verklagt.


Auch eine sehr schöne Analogie. :D

Fehlt nurnoch daß jemand kommt und mittels Typecast das Wasser zu Wein macht, dann passt wieder alles. :lach:

--
http://www.norman-interactive.com

[ Dieser Beitrag wurde von Mad_Dog am 04.05.2008 um 01:07 Uhr geändert. ]
 
Mad_Dog   Nutzer

04.05.2008, 00:52 Uhr

[ - Direktlink - ]
Thema: Task schläft ein
Brett: Programmierung

Zitat:
Original von woop:
@Mad_Dog:

Damit verbrätst du natürlich 100% CPU aber das macht dein Kind-Task so ja auch schon :)


Nun ja "fast" 100% ;)

ReadFrame() funktioniert so:

Ich lese einen Wert vom Parallelport, warte bis zur nächsten Periode lese wieder einen Wert usw. bis ich alle Werte habe.

Zum besseren Verständnis hier noch mein Include "scope.c":
c code:
/*  scope.c
 *
 */

#include "scope.h"

/*  Scope
 *
 *  Oszilloskop erzeugen:
 *
 *  Eingabeparameter: ULONG f  - Die Samplingfrequenz
 *                    double t - Dauer des Samples in Sekunden
 *                    LONG p   - Pen Nummer zum Zeichnen
 *                    LONG b   - Pen Nummer für Hintergrund
 *  Rückgabe:         struct Scope* - Zeiger auf Scope Struktur
 *
 */
struct Scope *CreateScope(struct Window *win, ULONG f,double t,LONG p, LONG b)
{
   struct Scope *sc;

   sc = (struct Scope *) AllocVec(sizeof(struct Scope),MEMF_CLEAR);

   sc->Window = win;

   sc->raster = AllocRasterBitmap((unsigned int)win->GZZWidth,(unsigned int)win->GZZHeight);
   SetColor(sc->raster,p);

   // Temporärern RastPort initialisieren
   sc->tmprp = *win->RPort;
   sc->tmprp.Layer = NULL;
   sc->tmprp.BitMap = AllocBitMap (win->GZZWidth,1,8,0,NULL);

   sc->SamplingFreq = f;
   sc->Time = t;
   sc->Period = (int)1E6/f;
   sc->Size = (ULONG)(f*t);
   sc->Data = (UBYTE *)AllocVec(sc->Size,MEMF_CLEAR);
   sc->Pen = p;
   sc->Background = b;
   sc->TimerMP = CreateMsgPort();
   sc->TimerIO = (struct timerequest *) CreateIORequest(sc->TimerMP,sizeof(struct timerequest));

   return sc; 
}

/*  FreeScope
 *
 *  Oszilloskop Struktur freigeben
 *
 *  Eingabeparameter struct Scope *sc - Zeiger auf Scope Struktur
 *  Rückgabe:        void
 *
 */ 
void FreeScope(struct Scope *sc)
{
   AbortIO((struct IORequest *)sc->TimerIO);
   WaitIO((struct IORequest *)sc->TimerIO);
   if (sc->TimerMP) DeleteMsgPort(sc->TimerMP);
   if (sc->TimerIO) DeleteIORequest((struct IORequest *)sc->TimerIO);
   FreeVec(sc->Data);
   FreeVec(sc);
   FreeRasterBitmap(sc->raster);
}


// Ein Zeitfenster lesen.
void ReadFrame(struct Scope *sc)
{
   unsigned int t;

   /*  Hier werden die Werte gesammelt
    */
   for (t=0;t<sc->Size;t++)
   {
      sc->TimerIO->tr_node.io_Command = TR_ADDREQUEST;
      sc->TimerIO->tr_time.tv_secs = 0;
      sc->TimerIO->tr_time.tv_micro = sc->Period;

      READ_PAR(sc->Data[t]);  // Wert vom Parallelport kopieren

      SendIO((struct IORequest *)sc->TimerIO);
      WaitIO((struct IORequest *)sc->TimerIO);

   }
}

/*  DrawScope
 *
 *  Zeichnet das Oszilloskop in ein Fenster
 *
 *  Eingabe: struct Scope  *sc  - Zeiger auf Oszilloskop Struktur
 */
void DrawScope(struct Scope *sc)
{
   register int t;
   register struct RastPort *rp;     // RastPort des Fensters
   register int zero;

   rp = sc->Window->RPort;

   //zero = sc->Window->GZZHeight/2;
   zero = 128;

   SetColor(sc->raster,sc->Background);
   ClearRaster(sc->raster);

   SetColor(sc->raster,sc->Pen);

   // Linien in Pixel Array eintragen
   for (t=0;t<sc->Size;t++)
   {
     rasterLine(sc->raster,t,zero,t,sc->Data[t]);
   }

   // Inhalt der Pixel Array auf RastPort des Fensters übertragen
   WritePixelArray8 (sc->Window->RPort,
	             0,0,
		     sc->Window->GZZWidth-1,sc->Window->GZZHeight-1,
		     (UBYTE *)sc->raster->data,
		     &sc->tmprp);

}




--
http://www.norman-interactive.com
 
Mad_Dog   Nutzer

04.05.2008, 00:14 Uhr

[ - Direktlink - ]
Thema: Task schläft ein
Brett: Programmierung

@woop:

Das ganze Programm ist ein einfaches Oszilloskop für Parallelportsampler, welches das Signal in einem Fenster auf der WB darstellt.

Die Funktion ReadFrame() liest dabei Daten vom Parallelport über ein vorgegebenes Zeitfenster ein - nimmt also ein Audio-Sample auf.

Die Funktion DrawScope() zeichnet dann die Grafik entsprechend den Werten des Audio-Samples in den RastPort des Fensters, welches im Hauptprogramm geöffnet wurde.

Bei dieser Endlosschleife habe ich mir folgendes gedacht:

Ursprünglich wurden diese zwei Funktionen nacheinender im Program an der stelle aufgerufen, wo im Moment noch case INTUITICKS steht. Das führt aber logischerweise dazu, daß der Fensterinhalt nur dann neu gezeichnet wird, wenn man das Fenster auch aktiviert hat. An dieser Stelle funktioniert das auch problemlos.

Das ändert sich aber, sobald ich diese beiden Funtionen inneralb dieser Endlosschleife in einem eienen Task aufrufe. Dann aktualiesiert sich der Fensterinhalt eine Weile und anschließend nicht mehr.

Eine Synchronisation habe ich nicht eingabaut, weil der Kind-Task (also diese Endlosschleife) bis zum Programmende laufen soll und dabei einfach das Audiosignal im Fenster darstellen soll.

Hier mal ein Link zur letzten Version, die noch ohne seperaten Task funktioniert: http://w3.norman-interactive.com/files/Monoscope_1_41.lha

In dieser Version wird das Neuzeichnen des Fensterinhalts von INTUITICKS angestoßen.

Zu meiner Entschuldigung muß ich ganz ehrlich eingestehen, daß ich mich noch nicht tiefgreifend mit dem Tasking des AmigaOS auseinandergesetzt habe. Mit Multitasking vom Automotive-Betriebssystem OSEC ja - aber AmigaOS Exec nein.
Also bitte nicht schlagen, falls ich da groben Unfug gemacht habe. :glow:

--
http://www.norman-interactive.com

[ Dieser Beitrag wurde von Mad_Dog am 04.05.2008 um 00:17 Uhr geändert. ]
 
Mad_Dog   Nutzer

03.05.2008, 19:44 Uhr

[ - Direktlink - ]
Thema: Task schläft ein
Brett: Programmierung

Hallo,

Ich habe versucht bei meinem Programm "Monoscope" das Neuzeichnen der Grafik in einen extra Task zu packen (Funktion Update).

Der Fensterinhalt wird zwar eine Weile upgedatet, aber dann scheint der Task einzuschlafen.

Was mache ich falsch?

Hier das Hauptprogramm:
c code:
#include <stdio.h>
#include <stdlib.h>

#include <exec/types.h>
#include <exec/exec.h>
#include <exec/memory.h>
#include <exec/libraries.h>
#include <dos/dos.h>
#include <intuition/intuition.h>
#include <intuition/gadgetclass.h>
#include <graphics/gfx.h>
#include <libraries/gadtools.h>
#include <devices/timer.h>

#include <proto/exec.h>
#include <proto/dos.h>
#include <proto/intuition.h>
#include <proto/graphics.h>
#include <proto/gadtools.h>

#include <clib/alib_protos.h>

#include "requesters.h"
#include "requesters.c"
#include "menu.h"
#include "menu.c"
#include "parallel.h"             // Makros für CIA Low-Level Zugriff
#include "scope.h"
#include "scope.c"

#define WIDTH 400   // Breite des Fensters
#define HEIGHT 256  // Höhe des Fensters

struct Window *Fenster = NULL;               // Zeiger auf Window-Struktur
struct Screen *mysc = NULL;
struct IntuitionBase *IntuitionBase = NULL;  // Zeiger auf IntuitionBase-Struktur
struct GfxBase *GfxBase = NULL;              // Zeiger auf GfxBase-Struktur
struct Library *GadToolsBase = NULL;
void *vi = NULL;                             // Visual Info

struct Scope *sc;

struct Task *child = NULL;
char *childname = "Uptate Scope";

UBYTE TimerDevice;

UBYTE vers[] = "$VER: Monoscope 1.5";

// Resourcen freigeben
void ShutDown(void)
{
    if (mysc) UnlockPubScreen(NULL, mysc);
    if (GadToolsBase) CloseLibrary(GadToolsBase);
    if (Fenster) CloseWindow(Fenster);
    if (GfxBase) CloseLibrary((struct Library *) GfxBase);
    if (IntuitionBase) CloseLibrary((struct Library *) IntuitionBase);
}

extern void Update(void)
{
   while (1)
   {
     ReadFrame(sc);
     DrawScope(sc);
   }

}

int main(void)
{
   /* Variablen zur Message-Bearbeitung */
   struct MsgPort *Port;             // Zeiger auf Message Port Struktur
   struct IntuiMessage *Nachricht;   // Zeiger auf Intuition Message Struktur

   LONG black,green;  // Variablen für die Pen Nummern

   ULONG  klasse;
   USHORT code;

   BOOL Ende;

   Ende = FALSE;
   Freeze = FALSE;  // Anzeige einfrieren (TRUE/FALSE)

   // Intuition Library öffnen
   IntuitionBase = (struct IntuitionBase *) OpenLibrary("intuition.library",36L);
   if (IntuitionBase == NULL) ShutDown();

   GfxBase = (struct GfxBase *) OpenLibrary("graphics.library",0L);
   if (GfxBase == NULL) ShutDown();

   // GadTools Library öffnen
   GadToolsBase = OpenLibrary("gadtools.library", 37L);
   if (GadToolsBase == NULL) ShutDown();

   mysc = LockPubScreen(NULL);

   // Fenster mittels Tags öffnen
   Fenster = OpenWindowTags(NULL,
                            WA_Left, 100,    // Abstand vom linken Rand
                            WA_Top, 100,     // Abstand vom oberen Rand
                            WA_InnerWidth, WIDTH,    // Innere Breite
                            WA_InnerHeight, HEIGHT,  // Innere Höhe
                            WA_Title, "Monoscope",          // Fenstertitel
                            WA_ScreenTitle,"Monoscope V1.5 © 2008 by Norman Walter",
                            WA_CloseGadget, TRUE,           // Close-Gadget
                            WA_DragBar, TRUE,               // Ziehleiste
                            WA_DepthGadget, TRUE,           // Depth-Gadget
                            WA_GimmeZeroZero, TRUE,         // Ursprung 0/0
                            WA_NewLookMenus, TRUE,
                            WA_IDCMP,
                            IDCMP_CLOSEWINDOW | IDCMP_MENUPICK | IDCMP_INTUITICKS | IDCMP_REFRESHWINDOW,
                            WA_Activate, TRUE,              // Fenster aktivieren
                            TAG_DONE);

   if (Fenster==NULL) ShutDown();

   vi = GetVisualInfo(mysc, TAG_DONE);
   menu = CreateMenus(mynewmenu, TAG_DONE);
   LayoutMenus(menu, vi, GTMN_NewLookMenus, TRUE, TAG_DONE);
   SetMenuStrip(Fenster, menu);

   Port=Fenster->UserPort;

   /* Pens ermitteln: Schwarz und Grün */
   black = ObtainBestPen(Fenster->WScreen->ViewPort.ColorMap,
                         0x00000000,0x00000000,0x00000000,
                         OBP_Precision,PRECISION_GUI,
                         TAG_DONE);

   green = ObtainBestPen(Fenster->WScreen->ViewPort.ColorMap,
                         0x00000000,0xFFFFFFFF,0x00000000,
                         OBP_Precision,PRECISION_GUI,
                         TAG_DONE);

   /*  Oszilloskop erzeugen:
    *  32Khz Samplingrate,
    *  Zeitfenster 0.0125 Sekunden
    *  Zeichenfarbe grün, Hintergrund schwarz
    */
   sc = CreateScope(Fenster,32000,0.0125,green,black);

   /*  Wichtig: Für diesen Zweck brauchen wir UNIT_MICROHZ.
    *  Die anderen Timer sind zu ungenau.
    */
   TimerDevice = OpenDevice(TIMERNAME,UNIT_MICROHZ,(struct IORequest *)sc->TimerIO,0L);
   if (TimerDevice !=0) ShutDown();

   // Den Parallelport in den Lesemodus versetzen
   SET_PARALLEL_PORT_READ;

   child = CreateTask(childname,0L,Update,4000L);

   while (!Ende)
   {
      // Lese Zeitfenster
      //if (!Freeze) ReadFrame(sc);

      WaitPort(Port);

     /* Schleife läuft bis alle Ereignisse
      * abgearbeitet sind.
      */
      //while(Nachricht=(struct IntuiMessage *)GetMsg(Port))
      while((!Ende) && (Nachricht=GT_GetIMsg(Port)))
      {

        klasse = Nachricht->Class;
        code =  Nachricht->Code;
        GT_ReplyIMsg(Nachricht);

        /* Welches Ereignis ist eingetreten? */
        switch(klasse)
        {
          /* Close Gadget wurde angeklickt */
           case CLOSEWINDOW :
                Ende = TRUE; // Programmende
           break;

           case MENUPICK:
		          Ende = HandleMenuEvent(code);
		     break;

          /* Intuition hat sich gemeldet */
          case INTUITICKS :
               // Zeichne das Oszilloskop
               if (!Freeze)
               {
 						//Update();
               }
          break;

          case IDCMP_REFRESHWINDOW:
               GT_BeginRefresh(Fenster);
               GT_EndRefresh(Fenster,TRUE);
          break;

        } // Ende der switch-Verzweigung

       /* Wir sind mit der Bearbeitung fertig
        * und beantworten die Nachricht.
        */
       //ReplyMsg((struct Message *)Nachricht);

     }
   }

   Forbid();
   DeleteTask(child);
   Permit();

   // Die Pens wieder freigeben
   ReleasePen(Fenster->WScreen->ViewPort.ColorMap,black);
   ReleasePen(Fenster->WScreen->ViewPort.ColorMap,green);

   FreeScope(sc);

   ShutDown();

   return 0;
}

--
http://www.norman-interactive.com

[ Dieser Beitrag wurde von Mad_Dog am 03.05.2008 um 19:44 Uhr geändert. ]
 
 
Erste << 6 7 8 9 10 -11- 12 13 14 15 16 >> Letzte Ergebnisse der Suche: 1944 Treffer (30 pro Seite)

Suchbegriffe
Schlüsselwörter      Benutzername
Suchoptionen
Nur in diesen Foren suchen
   nur ganze Wörter
Nur Titel anzeigen
alle Treffer anzeigen

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