ENGLISH VERSION |
|
Links | | | Forum | | | Kommentare | | | News melden |
Chat | | | Umfragen | | | Newsticker | | | Archiv |
amiga-news.de Forum > Suche | [ - Suche - Neue Beiträge - Registrieren - Login - ] |
|
||||||
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: 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: 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: 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: 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: 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: Das sind einfachste Elektrotechnik Grundlangen - da muß man kein Genie sein, um das zu verstehen. Zitat: 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! 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: 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: 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: 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. -- 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: 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: 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: 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: RTFM -- http://www.norman-interactive.com |
|||||
Mad_Dog
Nutzer
06.05.2008, 14:26 Uhr [ - Direktlink - ] |
Thema: Http Post Request
Brett: Programmierung Zitat: 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: 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. -- http://www.norman-interactive.com |
|||||
Mad_Dog
Nutzer
06.05.2008, 00:40 Uhr [ - Direktlink - ] |
Thema: Task schläft ein
Brett: Programmierung Zitat: 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: 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? -- http://www.norman-interactive.com |
|||||
Mad_Dog
Nutzer
05.05.2008, 21:03 Uhr [ - Direktlink - ] |
Thema: Http Post Request
Brett: Programmierung Zitat: 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: 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: 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: 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: 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: 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: Auch eine sehr schöne Analogie. Fehlt nurnoch daß jemand kommt und mittels Typecast das Wasser zu Wein macht, dann passt wieder alles. -- 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: 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. -- 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[] = " |