Home

crest-c

image

Contents

1. strcepy rce_A gt file_name READ_A TIMEOUT xFF rce_A gt reclen 50 Hier Laenge eintragen rt_transfer_ce rce_A CE an den Treiber schicken 2 Wenn man hier angekommen ist ist der Puffer entweder ke gefuellt oder ein Fehler aufgetreten 5 if rce_A gt reclen lt 0 FEHLER Wenn beim Ablaufen des Timeout s 49 der 50 Zeichen eingelaufen sind dann werden Sie das ni rfahren die sind jetzt schlicht alle futsch else Hier stehen die 50 Datenbytes im Puffer ptr rce_A gt buffer Pointer auf Puffer for count 0 count lt rce_A gt reclen count printf d Zeichen 081X n count 1 ptr count amp OxFFUL r Und jetzt mit dem noch existierenden CE weiterspielen und ein paar Abbruchbedingungen ausprobieren Das Lese CE fuer den A Port umkonfigurieren auf 25 Zeichen der angeforderte Puffer reicht schliesslich fuer 50 Zeichen und weniger Zeichen sind nicht schaedlich E rce_A gt drive port_info_A drive Timeout Kennzeichnung wegschalten rce_A gt mode MODMWA Auf Beendigung des I O Vorgangs warten MODMNE Echo bei der Eingabe abschalten MODMCR Bei Carriage Return abbrechen MODMLF Bei Linefeed abbrechen MODMEO Bei End Of File D abbrechen IOCNE Fehlermeldungen im CE liefern IOCRWI Befehl READ WRI
2. 66 4 6 System Traps Kapitel 5 Der Linker cln Beim CLN handelt es sich um ein Werkzeug zum Linken von Programmen Er stellt die Endstufe des Verarbeitungsprozesses dar der die aus den Quelltexten erzeugten Objektdateien eines Projektes mit einem Startupfile versieht und die ben tigten Bibliotheksroutinen hinzubindet Als Resultat liefert der CLN wahlweise frei ladbare oder an feste Addressen gebundene S Records Bei Fehlbedienungen oder Aufruf ohne Parameter gibt der CLN einen kurzen berblick ber die un terst tzten Optionen aus Sie k nnen diese Usage Meldungen im Anhang cln68k Abschnitt C 3 cln ppc Abschnitt C 4 nachschlagen Als Aufrufparameter erwartet der CLN minimal die Angabe einer Linkdatei Die Linkdatei muss eine Liste der zu bindenden Startupdatei Objektdateien und Bibliotheken enthalten F r ein Projekt TEST das aus der Quelltextdatei test c entstehen soll und das Verhalten einer Task auf einem CPU32 Zielsystem an den Tag legen soll sieht der beispielhafte Aufbau einer Linkdatei test Ink wie folgt aus tstart obj test obj std3fast lib Erfolgt die Angabe der zu bindenden Datei ohne Verwendung absoluter Pfadangaben so ist ein optionaler Suchpfad ber Umgebungsvariablen oder als Kommandozeilen Option angebbar siehe Abschnitt5 1 13 Als optionaler zweiter Parameter wird der Name der zu generierenden Ausgabedatei erwartet Fehlt dieser so bildet der CLN diesen automatisch aus dem Na
3. 228 RBS ENDES DE ECHSS KEP 4 An au hb eh tie E a ap ke ai te es ds 229 BO EXCEPTION oren a ohare OD ae ann ran hae hl 229 BIAOSHEADER A 45 28 au a an ans ea ee ae ne BORA On Bere 229 B 11 INELUDEZONEE er ln eet A EE EE d ec a tee See de re 229 B2l2 ENTERRUPT a aan erde TE TEL 230 BAS INTERRUPRTERXT T ar ee a e Ale Hee ae dod aha 230 B 14 TNTERRBUPT PROCEDURE lt i nu Sob Al ee ea len el E A 230 Bas KAGCSTART are addy A Ne OA eee RE en 231 B16 MEMBER PAPDINGZOF FE Asaia 2 2 2 Soa ae nde a ae bre le Baw E EN 231 INHALTS VERZEICHNIS XI B 17 MEMBER PADDING N e 2 a A AA A O ds A oe 231 B 18 1MEMORY 4 5 9 Wan wind weenie A A eee e Ze 231 BOS MG DU EE 231 BO PEARL PROCEDURE i e A bh it Mae erh 231 Pal RAVERANGES 2 4 0 4 2 2 2 8 Beh eae Se Pe BRS eee PA lee 232 B 22 SCAN RANGES a0 2 4 a ar RA RTL eo ae Ba aoe Pale oa a e 232 Bi23 SE T MEC LOR i AAA a eat Aida Se Rea Aa e A 232 BZA START SLICE SRIF ge aa a a al ar aha 232 RRE PADDING OTF A A eu 8 Sansa ta hen de EE de Ge AA 233 B 26 STRUCH PADDINGON rreri Gee sh ae das a oe ae es ards ae Pk 233 B2T SUBTASK et ore tind a A ee Bol eatin ee Ai ae ee A hl 233 Bi2S SYSPEMTAGKS fo esa n t Oy ege ence ces Se Syn ak ay ee ok ae Ale oe yee ea ee oe ES 234 B29 T AGC OP VeB Yel Bags e ie eases cad id Ge ES 234 BIO TAG COP SWORD ict EB De ee a Se eas ee e A 234 Biol TAG COPY LONG 2 Ae ea en e ed EN ee a EN a es 234 B32
4. Abbildung 13 7 C Task im EPROM 13 3 C Subtasks RTOS UH zeichnet sich neben der Echtzeitf higkeit dadurch aus dass eine nahezu ungegrenzte Zahl verschiedenster Prozesse quasi gleichzeitig ihr Unwesen im Rechner treiben k nnen Mittels der bis lang vorgestellten C Shellmodule und C Tasks bietet sich Ihnen bislang lediglich die Chance meh rere unabh ngige Prozesse anzulegen die keinerlei direkte Kommunikationsm glichkeiten besitzen Durch die Shellmoduleigenschaft der CREST C Programme kennen sich die dynamisch generierten C Tasks selbst dann untereinander nicht wenn Sie auf identischen Codebereichen ablaufen In den meisten F llen ist das recht praktisch denn schliesslich wollen Sie an einem Editor sitzend nicht 98 13 3 C Subtasks unbedingt die Auswirkungen der Kommandos Ihres Nebenmannes der ebenfalls ein Briefchen hackt auf Ihrem Schirm erleben Zumindest sollte das nicht passieren k nnen In anderen F llen ist es jedoch w nschenswert wenn zwei oder mehr Prozesse direkt miteinander kom munizieren k nnen ANSI C bietet daf r leider keinerlei Ans tze Die UNIX L sungen zu diesem Thema setzen den Einsatz einer MMU zwingend voraus Alles nun Folgende ist eine implementierungs bedingte Eigenschaft von CREST C und stellt einen Versuch dar die M glichkeiten von RTOS UH sinnvoll auszunutzen ohne dabei das Sprachkonzept von C allzusehr mit F ssen zu treten Beim Starten von CREST C Programmen werden Sie schon
5. macro replace Define argumentfree macro B No slice for lt common gt section C address Set lt common gt section address E Autostart for task startup F files Number of FILE structures H size Extended taskhead L path Set library directory M Dump loader map N name Set name of shellmodule or task 0 Usable for PROM P digit Enable PEARL interface 0 No 1 PEARL80 2 PEARL9O Q prio Priority for task startup R name Set RAM module name S size Set stacksize T address Set lt text gt section address U Resident for task startup V Verbose messages h Use of global variables forbidden 2 Dump debug infos 0 Link 68000 Code Link 68020 Code C 4 clnppc 241 3 Link CPU32 Code fpu Link Code for FPU CA clnppe Crest S Record Linker CLN PPC Version for Linux x86 Copyright C 1987 1999 by Stephan Litsch Release 2 597 Nov 4 1999 12 28 00 Usage clnppc linkfile outputfile options file Read option file macro replace Define argumentfree macro B No slice for lt common gt section C address Set lt common gt section address E Autostart for task startup F files Number of FILE structures H size Extended taskhead L path Set library directory M Dump loader map N name Set name of shellmodule or task O Usable for PROM P digit Enable PEARL interface 0 No 2 PEARL9O Q prio0 Priority for task startup R name Set RAM module name S size Set stacksize
6. Unbekannte Task return status Tabelle 15 4 Implementierung von rt_task_status Wenn Sie sich sicher sind dass eine zu berwachende Task deren Zustand Sie interessiert dauerhaft im Speicher bleibt so kann nach einmaligem Aufruf der Funktion rt_search_task die gelieferte TID gespeichert und direkt im Taskkopf der zu tiberwachenden Task herumgestochert werden Dabei ist jedoch zu beachten dass RTOS UH sich darauf versteift Tasks deren Namen mit einem Doppelkreuz beginnen nicht finden zu wollen Es handelt sich dabei um eine Art Abwehrhaltung des Betriebssy stems das verst ndlicherweise verhindern m chte dass Nutzer an systemeigenen Tasks herumspielen k nnen und deshalb so tut als w ren sie nicht in der Speicherverwaltung eingetragen Task rt_search_task char name 136 15 3 Multi Tasking Ein Task kann sich selbstverst ndlich auch in den eigenen Taskkopf schauen Durch den Aufruf der Funktion rt_my_TID kann eine Task ihren eigenen Taskkopf lokalisieren Task rt_my_TID void Alternativ zu diesem Systemaufruf kann eine Task sich selbst lokalisieren indem sie direkt in der Systemzelle 802 L f r die aktuell laufende Task nachschaut Der Zugriff k nnte z B Task 0x802UL lauten und spart den Overhead des Funktionsaufrufes rt_my_TID Sie sollten allerdings niemals an der Speicherzelle 802 L herumspielen und immer nur lesend darauf zugreifen Wenn Sie dort Unfug eintragen knallt der Dispa
7. Der Nukleus muss stets in einem der zu berscannenden Bereiche liegen weil in ihm grunds tzlich Scheiben enthalten sind die zum Betrieb des Systems absolut unverzichtbar sind Das folgende Beispiel k nnte z B f r ein System sinnvoll sein das einen Nukleus von 64KB besitzt und bei dem der Anwender zudem den Bereich von 0xD00000 bis OxDFFFFO nach Systemkomponenten durchsucht haben m chte Initial_ScanTable DC L 500000001 0000FFF1 FIRST SCAN RANGE DC L 500D00000 00DFFFFO ADDITIONAL SCAN RANGE DC L 0 END MARKER Wenn zwei Scanbereiche nicht ausreichen so besteht fiir den Anwender oder Implementator des Gesamt Betriebssystems die M glichkeit RTOS UH auf die Suche nach einer neuen Scan Tabelle zu schicken Enthalten die ersten beiden Langworte der Initial Tabelle den Wert Null so wird das zwei te Langwortp rchen dazu verwendet nach einer Scheibe mit der Definition einer neuen Scan Tabelle zu suchen Diese Option ist mit Vorsicht zu verwenden Findet RTOS UH in der Kaltstartphase auf der Suche nach einer neuen Scantabelle keine Scheibe mit der Kennung 0 SLICE 0 im definierten Scanbereich dann steht st tzt das System kommentarlos ab Aus Anwendersicht passiert eben nichts keine Startmeldung und der Schirm bleibt absolut leer Eine Scheibe zur Definition einer neuen Scan Tabelle l sst sich bei Verwendung von CREST C mittels des Kommandos pragma SCAN_RANGES einrichten Die Vernichtung der Originaltabel le wird v
8. T address Set lt text gt section address U Resident for task startup V Verbose messages h Use of global variables forbidden z Dump debug infos fpu Link Code for FPU C 5 Ink68k Crest Library Linker LNK 68K Version for Linux x86 Copyright C 1987 1999 by Stephan Litsch Release 2 597 Nov 4 1999 12 25 28 Usage 1nk68k linkfile outfile options file Read option file macro replace Define argumentfree macro L path Set library directory M Dump loader map V Verbose messages Z Add debug informations to library 242 C 7 ssl68k 0 Link 68000 Code 2 Link 68020 Code Link CPU32 Code fpu Link Code for FPU Cp Inkppc Crest Library Linker LNK PPC Version for Linux x86 Copyright C 1987 1999 by Stephan Litsch Release 2 597 Nov 4 1999 12 28 00 Usage lnkppc linkfile outfile options file Read option file macro replace Define argumentfree macro L path Set library directory NM Dump loader map V Verbose messages Z Dump debug infos fpu Link Code for FPU C 7 ssl68k Crest Shared Library Linker SSL 68K Version for Linux x86 Copyright C 1987 1999 by Stephan Litsch Release 2 597 Nov 4 1999 12 25 28 Usage ssl68k linkfile outfile options file Read option file macro replace Define argumentfree macro L path Set library directory M Dump loader map P digit Enable PEARL interface 0 No 1 PEARL80 2 PEARL9O T address Set lt text gt section address V Verbose mess
9. char long l_name_entry long name_ptr name_ptr gt lname name_mark 0 strncpy l_name_entry str len l_name_entry len xFF Pointer auf die Rueckverkettung bestimmen netto char long l_name_entry len 2 amp IL Rueckverkettung fuer spaetere Freigabe aufbauen UnlinkedWorkspace netto header char netto sizeof UnlinkedWorkspace Wir sind ein MODUL und haben Speicher UnlinkedWorkspace header gt head typ 0x0010 UnlinkedWorkspace header gt user_data netto rt_user_mode user_stack return netto void rt_named_free_memory void addr Pointer auf Rueckverkettung holen addr char addr sizeof UnlinkedWorkspace 188 15 7 CPU Status wechseln Pointer auf Modulkopf holen addr UnlinkedWorkspace addr Modulkopf rauswerfen rt_free_memory addr 15 6 3 Speicherplatzreservierung beim Systemstart Bei vielen Programmen besteht die Notwendigkeit tiber gemeinsame Datenbereiche mit anderen Pro zessen in Verbindung zu bleiben Dazu ist es bei RTOS UH m glich sich bereits beim Hochlaufen des Systems Speicher zu beschaffen Es muss lediglich eine entsprechende Scheibe im Scanbereich des Sy stems untergebracht werden Als Resultat dieser Bem hungen richtet das RTOS UH einen gel schten Speicherbereich als eigenst ndiges Modul ein pragma MEMORY
10. 15 6 2 1 Die Procedureworkspace Traps o o 182 15 6 2 2 Procedureworkspace leicht verwaltet 184 15 6 2 3 Dauerhafte Speicherbl cke als Module 185 15 6 3 Speicherplatzreservierung beim Systemstartt 0 188 15 7 CPU Status wechsel ii ee ar ee AP Al ge ne aye a ae 188 15 8 Fehlermeldtingen a 4 amp SoMa eh 8 una a Rae wa A ete 190 15 8 1 Das Error Handling von RTOS UH e 192 16 Systemkonfiguration 195 16 1 Pre Cold y oi ts A BAe Sod A en HA A 195 16 2 Kaltstart 2 cst hal a aa E Se OS 196 16 2 1 Initialisieren der Systemvariablen e 196 16 2 2 Installieren des Scheiben Scanners 196 16 2 3 Ausf hren von Kaltstart Code 200 16 2 4 Scannen nach Systemtasks 201 16 2 5 Anforderung der Interruptpuffer o e e e 201 16 2 6 Suchen nach Device Treibern o o 0000000004 201 16 2 7 Installieren der Error Puffer o o 000 000 201 16 2 8 Suchen nach Device Parametern o onen 201 16 2 9 Scannen nach Shell Befehlen o een 201 16 2 10 Einrichten des verwalteten RAMis o 201 16 2 11 Aufbau der RTOS UH Speicherverwaltung 202 16 2 12 Einrichten von Modulvariablen Bereichen o o 202 16 2 13 Suchen nach Systemtasks o o ee 202 16 3 Wartistatt Lema EE E otra Ye 202 16 3 1 L schen der Interruptbuffer o 203 16 3 2
11. 2 2 2 aa 164 15 11 Aufbau des Errorcodes ee 190 15 12 Aufbau des Errorcodes ab NUK7 x 2 oo ee 191 16 1 Scanbereiche 2 2 u ae nk 2 Ra a a ee EEN a ete a ee A 199 Urheberrecht und Haftung Alle Rechte an diesen Unterlagen liegen bei der IEP GmbH Langenhagen Die Vervielfaltigung auch auszugsweise ist nur mit unserer ausdriicklichen schriftlichen Genehmigung zul ssig In Verbindung mit dem Kauf von Software erwirbt der K ufer einfaches nicht bertrag bares Nutzungsrecht Dieses Recht zur Nutzung bezieht sich ausschliesslich darauf dass dieses Produkt auf oder in Zusammenhang mit jeweils einem Computer zu benutzen ist Das Erstellen einer Kopie ist ausschliesslich zu Archivierungszwecken unter Aufsicht des K ufers oder seines Beauftragten zul ssig Der K ufer haftet f r Sch den die sich aus der Verletzung seiner Sorgfaltspflicht ergeben z B bei unautorisiertem Kopieren unberech tigter Weitergabe der Software etc Der K ufer gibt mit dem Erwerb der Software seine Zustimmung zu den genannten Be dingungen Bei unlizensiertem Kopieren muss vorbehaltlich einer endg ltigen juristischen Kl rung von Diebstahl ausgegangen werden Dies gilt ebenso f r Dokumentation und Soft ware die durch Modifikation aus Unterlagen und Programmen dieser Distribution hervor gegangen ist gleichg ltig ob die nderungen als geringf gig oder erheblich anzusehen sind Eine Haftung des Autors f r Sch den die auf d
12. 3 4 1 3 Strukturzuweisungen oaoa 30 3 4 2 Bitfelder s 242 3 zur ah Ea A RE er a 30 Vereinigungsdatentypen u araa oo nn nen 32 Die Prototypen Laos sesa ar Sok a EE a SEE 33 3 6 1 Prototypen f r R ckgabewerte 34 3 6 2 Prototypen f r Argumente e 35 3 6 3 Abweichende Funktionsaufrufe 2 2 CC o o 36 Der Stacks ethene a As eet ap A tea ner ee ee 37 INHALTS VERZEICHNIS 3 8 Lokale Variablen und Argumentiibergabe 3 9 Dynamische Stackverwaltung 3 10 3 11 3 12 3 13 3 14 3 15 3 16 3 17 3 18 Interner Registergebrauch von CRESTA e 3 10 1 Besonderheiten des PowerPC Verschieblicher Code Variablen und Konstanten unter CREST C Syntaxerweiterungen unter CREST C 2 onen Schl sselworte f r Speicherklassen 3 14 1 Das Schl sselwort absolute Lebensdauer von Variablen G ltigkeitsbereich von Variablen Zugriffs Modifizierer 22222 Como onen Sections unter CREST C Cm m m nn 3 18 1 Die ZEezt Section wa zu Para le 3 18 2 Die data Section 3 18 3 Die bss Section een 3 18 4 Die common Section 2 2m eoe e e e 3 18 5 Die local Section 4 Der interne Assembler 4 1 4 2 4 3 4 4 4 5 4 6 Die Die Die Die Die SEERESSECHON e Ee tans ese ok Ee N Se he D Dos wa Ae AS Data Ante at ke wane
13. ausgel st Die Semaphore wird um Eins erh ht Die aufrufende bleibt dabei grunds tzlich lauff hig Stellt RTOS UH bei der Freigabe der Semaphore fest dass eine oder mehrere Tasks auf diese Sema wartet so wird die h chst priorisierte Task die auf diese Semaphore gewartet hat lauff hig gemacht void rt_release_sema Sema sema Eine weitere Funktionalit t der C Bibliothek besteht darin eine Semaphore nichtblockierend anzufor dern Die Funktion rt_try_sema funktioniert hnlich wie die Funktion rt_request_sema blockiert die aufrufende Task jedoch nicht wenn die Semaphore zum Zeitpunkt der Anforderung bereits vergeben war Sema rt_try_sema Sema sema Im Erfolgsfall wird die Semaphore belegt und die Funktion liefert den Wert der Semaphore vor der Anforderung zur ck also immer einen Wert gr sser Null Wenn die Funktion den Wert Null liefert so haben war die Semaphore blockiert und konnte nicht requestet werden In Hinsicht auf Multiprozessorsysteme ist zudem der MC680xxx Maschinenbefehl TAS von Bedeu tung der es erlaubt mittels eines unteilbaren Lese Schreibzyklus ein Byte im Speicher zu modifizieren Der TAS Befehl wurde als Funktionsanschluss bereitgestellt int rt_Test_And_Set void ptr Die Funktion rt_Test_And_Set liefert 0 wenn der TAS Befehl gescheitert ist und einen R ck gabewert ungleich Null wenn das getestete Byte Null enthielt 15 3 Multi Tasking 147 15 3 3 2 Bolts Bolts
14. beschafft wurde so ist die anfordernde Task fortan der Eigent mer dieses speziellen Speicherblocks In tid of owner ist die Task ID die ser Task eingetragen Dieser Pointer ist quasi die Absenderangabe des Paketes Nebenbei erfolgt ber die beiden Pointer fort und backt eine doppeltverzeigerte Verkettung mit dem Taskworkspace des Eigent mers Diese Kleinigkeiten hat RTOS UH bei der Beschaffung des CE s bereits f r uns initiali siert 15 5 VO unter RTOS UH 157 Abbildung 15 6 Verkettung der CE s mit der Task Jetzt geht es darum dem Betriebssystem mitzuteilen wen wir mit der Bearbeitung des I O Auftrages besch ftigen wollen Der Eintrag 1dn Logical Drive Number dient dabei als eine Art Postfachnum mer RTOS UH kann maximal 128 derartige Postf cher verwalten die Nummern laufen von 00 bis 7F In der Regel sind es aber ein paar weniger denn RTOS UH schaut bei der Konfiguration des Systems nach der h chsten LDN aller Betreuungstasks und richtet nur bis zu dieser Nummer auch Briefk sten ein An der Position 89A W finden Sie im Speicher den Wert der die h chste im System unterst tzte LDN plus Eins enth lt also die Zahl der eingerichteten Tabelleneintr ge f r O Queues N here Informationen entnehmen Sie bitte dem Abschnitt 15 5 2 3 Der Versuch ein CE an eine LDN zu verschicken die gr sser als die maximale LDN des Systems ist wird von RTOS UH mit WRONG LDN XIO beantwortet was soviel heisst wie Adre
15. max_tasks atol argv 1 if max_tasks lt O max_tasks gt NUMBER_OF_SUBTASKS max_tasks NUMBER_OF_SUBTASKS printf Es werden ld Subtasks gestartet n max_tasks for t 0 t lt max_tasks t Subtask starten und Namen merken sub_name t counter t printf Subtask s aktiviert n sub_name t Subtask zur zyklischen Ausgabe des count Feldes bauen dump dumper printf Subtask s aktiviert n dump Jetzt warten wir bis alle counter Kinder tot sind Wenn wir main einfach terminieren so ziehen wir den Kindern den Code und die Daten unter dem Hintern weg af for weiter 1 weiter Signale waeren schoener aber mit zyklischen Pollen geht es auch rt_resume_after 1000L for t 0 fertig 1 t lt max_tasks t if rt_task_status sub_name t OXFFFFFFFFL Die Task ist schon tot continue else Mindestens eine Counter Task laeuft noch fertig 0 break weiter fertig 13 3 C Subtasks 101 dann den Dumper rauswerfen for continue_dump 0 rt_resume_after 100L if rt_task_status dump OxFFFFFFFFL continue break printf nFERTIG n Abbildung 13 8 Beispiel zur Generierung von C Subtasks Sie sollten sich gut berlegen mit welcher Priorit t die Subtasks gestartet werden Wenn main mit niedrig
16. nes Helferlein konzipiert die eine Aufgabe erfiillen und dann wieder aus dem System verschwinden soll Der bliche Abschluss einer dynamischen Task besteht demnach darin RTOS UH dar ber zu informieren dass sie ihre Aufgabe beendet hat und gerne verschwinden m chte Wenn keine weiteren Aktivierungen oder Einplanungen f r die dynamische Task vorliegen so r umt RTOS UH die internen Ketten der Task ab vernichtet den TWSP worin bis jetzt noch kein Unterschied zu einer normalen Task besteht und schmeisst den zuvor generierten Taskkopf der Subtask aus dem Speicher die dy namische Task ist tot und aus dem System verschwunden Bei normalen Tasks bleibt der Taskkopf auch nach der Terminierung der Task im Speicher liegen und steht demnach bei Neuaktivierungen sofort wieder zur Verf gung Die Generierung einer dynamischen Task aus einem Shellmodul kostet dagegen etwas mehr Zeit da der Taskkopf erst noch geschaffen werden muss Sie sollten also bei der Auswahl ob ein C Programm als Task oder als Shellmodul laufen soll immer abw gen ob Sie wirklich bergabeparameter oder den Vorteil dynamisch mehrere Tasks auf identischem Code ablaufen lassen zu k nnen ben tigen Der riesige Nachteil der Shellmodule liegt zudem darin dass Sie keine autostartf higen Shellmodule kodieren k nnen Eine Task vermerkt ihre Autostartf higkeit im Taskkopf und Shellmodule besitzen eben keinen 14 3 Speichersektionen RTOS UH unterteilt den Speicher eines Re
17. nungszustand genau wiederzuspiegeln Die Bezeichnungen sind der Tabelle 15 1 zu entnehmen Task wartet auf ATAFTER xx ACTIVATE Cyclic Activate ALL xx ACTIVATE WHEN EV xxx ACITVATE AT AFTER xxx CONTINUE WHEN EV xxx CONTINUE Tabelle 15 1 Einplanungszust nde 134 15 3 Multi Tasking REQUEST RELEASE ACTIVATE Aktivieren SUSPEND Aussetzen Terminieren TERMINATE Fortf hren CONTINUH PREVENT Terminieren TERMINATE Abbildung 15 1 Zustands berg nge Um von C Programmen aus an die Informationen ber den aktuellen Taskzustand einer Task heran zukommen gibt es mehrere M glichkeiten Ist nur der Name der zu begutachtenden Task bekannt so dient die Funktion rt_task_status dazu die Task zu finden und den gerade aktuellen Zustand der gefundenen Task als Langwort abzuliefern ULONG rt_task_status char name Konnte die Task nicht im System gefunden werden so liefert die Funktion das Bitmuster OxFFFFFFF FUL Ansonsten ist die Antwort gem ss Abbildung 15 2 zu interpretieren SCHEDULE Byte BLOCK Byte DISPATCHER Byte Abbildung 15 2 R ckgabewert von rt_task_status Wenn das h chste Bit im DISPATCHER Byte gel scht ist so befindet sich die Task aktuell in der Dispatcher Kette des Betriebssystems und ist in irgendwelche Aktivit ten verwickelt Der Aufbau des BLOCK Bytes kann Tabelle 15 2 entnommen werden Entsprechendes gilt f r das SCHEDULE Byte und die Tabelle 15
18. s auf den Stack Fliesskomma Datentypen werden als 96 Bit long double s transferiert der ANSI C Standard m chte da zwar gerne double Typen sehen aber manchmal bin ich eben etwas dickk pfig wenn ich den Sinn einer unsinnigen Anweisung nicht erkl rt bekomme F r Assembler Programmierer stellt sich nat rlich die Frage an welcher physikalischen Position die Parameter zu finden sind Wie bereits erl utert w chst der Stack zu kleineren Adressen hin Nach einem Funktionsaufruf liegt ganz oben auf dem Stack die R cksprungadresse zur aufrufenden Funktion 0x0000 SP RETURN 0x0004 0x0008 0x000C int z Die Parameter schliessen sich nach blicher C Konvention dahinter an werden also in umgekehrter Reihenfolge ihrer Deklaration auf den Stack geschoben Der Programmierer darf die bergabe Parameter jetzt beliebig modifizieren hat jedoch daf r Sorge zu tragen dass der Stack beim Verlassen der Funktion an der alten Position steht und die R cksprung adresse niemals unbeabsichtigt ver ndert wird 3 9 Dynamische Stackverwaltung 41 Innerhalb der Funktion darf beliebiger Assemblercode auftreten Der Programmierer ist allerdings ange halten ver nderte Registerinhalte beim Verlassen der Funktion zu restaurieren Die Ausnahme best tigt hier mal wieder die Regel Funktionen mit R ckgabewert transferieren diesen in einem Register an die aufrufende Funktion Dieses Register sollte einleuchtenderweise hinterher nicht auf den u
19. void rt_pwsp_free_memory void data_ptr register LinkedWorkspace header data_ptr register void user_stack header user Stack rt_supervisor_mode 0x2700U header gt fort gt backt header gt backt header gt backt gt fort header gt fort rt_user_mode user_stack rt_free_memory void header 15 6 2 3 Dauerhafte Speicherbl cke als Module Die Procedureworkspace Bereiche verschwinden automatisch bei Terminierung der Besitzertask Meist ist dieser Automatismus das erw nschte Verhalten Wenn Speicherbereiche einen ABORT oder das Ende des ersten Besitzers berleben sollen ist es jedoch unumg nglich alle verwandtschaftlichen Beziehun gen zwischen Task und Block aufzuk ndigen Das Verfahren besteht wiederum im Ausklinken aus der PWSP Kette der anfordernden Task Auch hier stehen unter CREST C spezielle Funktionen bereit die diese Aktionen implizit vornehmen void rt_named_alloc_memory_fixed char name vo id start void end void rt_named_alloc_memory_backward char name size_t size void rt_named_alloc_memory_forward char name size_t size void rt_named_free_memory void addr Die Funktionen liefern keinen PwSP Speicher sondern Bl cke mit der Kennung MDLE Als Program mierer sind Sie alleine f r die Verwaltung dieser Speicherbl cke zust ndig Uber das Argument name kann dem Modul ein Name zugeordnet werden Da die Module das Ende der anforder
20. 19 n 20 q 13 227 r 14 s 19 t 19 x 19 CCC_68K_LIBS 5 69 71 74 CCC_INCLUDE 5 CCC_PPC_LIBS 5 69 71 74 CE 153 CE mode Byte EXCLU 167 IOBLCK 167 IOCAP 167 IOCCE 167 IOCCLO 167 IOCCMD 167 IOCDI 167 IOCEF 167 IOCER 167 IOCFL 167 IOCFOD 167 IOCFOS 167 IOCFRE 167 IOCLNK 167 IOCMDI 167 IOCNE 167 IOCRDI 167 IOCREN 167 IOCREW 167 IOCRTN 167 IOCRW 167 IOCRWI 167 IOCRWN 167 IOCRWS 167 IOCSAV 167 IOCSEK 167 IOCSYN 167 IOCTOU 167 MODBIN 167 MODMCR 167 MODMEO 167 MODMLE 167 MODMNE 167 MODMOU 167 251 MODMSC 167 MODMWA 167 CE status Byte STABFL 170 STABRE 170 ceil 224 char 26 clm 75 clm68k 75 clmppce 75 cln 67 cln Optionen fpu 69 B 69 C address 69 E 68 F files 69 H size 68 L path 69 74 M 68 N name 68 O 68 Q prio 68 R name 69 S size 68 T address 69 U 68 V 67 h 69 z 70 cln68k 67 elnppc 67 Clock Tick 150 cmake 79 cmake Einbau Makros 84 S 84 _LINUX_ 84 _NT_ 84 _RTOSUHL 84 cmake Kommandozeilen Makros 84 _CPU32__ 84 _FPU_ 84 _M68K 84 _MAKFALL_ 84 _MC68000__ 84 _MC68020__ 84 _MPPC_ 84 cmake Optionen fpu 84 0 84 2 84 3 84 252 79 A 79 84 I 80 K 84 P 84 T 80 V 79 macro replace 80 cmake Pr prozessor elif 85 else 85 endif 85 error 85 86 if 85 include 85 86 message 85 86 COLDSTART 114 121 196 227 Communi
21. 207 231 NEWSTACK 41 NO_ALLOC 233 235 NO_DISPATCHER CALL 109 229 230 NO_FILES 233 235 NO_FPU 104 233 235 NOID 109 230 NO_MALFUNCTION 109 230 NO_SETUP 233 235 NO_TASKSTART 103 233 235 NO_VECTOR 109 230 Normalbetrieb 203 offsetof 28 30 Padding 26 Members 27 28 Tags 27 28 PATH 5 pearl 50 Pearl Interface 92 PEARL_PROCEDURE 231 PIT 152 PMDL 127 Pointer 26 POT 152 INDEX Power On 195 Pre Cold 195 Pre Cold 195 PRIO 105 233 235 PRIORITY 105 233 235 Procedureworkspace siehe PWSP Prozessinterrupt 116 143 144 149 PWS 133 134 137 138 154 PWSP 94 127 137 154 181 185 QUEUE 106 234 Queue 153 Quick Scanner 200 R Symbole 46 RAM _RANGES 208 232 RANGE 41 realloc 180 register 21 24 50 53 99 Registervariablen 21 24 53 RELEASE 145 Relocations Data Relocations 47 Local Relocations 47 Text Relocations 47 Relokationsfehler 12 Reportcode 139 REQUEST 145 RESERVE 147 RESET_STACK 230 RESIDENT 106 233 235 RFILE 165 round 224 rt_activate 138 rt_activate_quick 138 rt_after_continue 143 rt_after_continue_quick 143 rt_alloc_memory _backward O 183 rt_alloc_memory_fixed 183 184 rt_alloc_memory_forward 183 rt_allocated_bytes 181 rt_at_continue 143 rt_at_continue_quick 143 rt_continue 141 rt_continue_quick 141 rt_decode_error 191 rt_delete_drive 161 rt_disable_event 149
22. 5 long double lexp long double zi Die Funktion exp liefert das Resultat der Berechnung d Wertebereich und Fehler Wird als Parameter x eine unzul ssige Zahl angegeben NaN oder Inf so wird ein domain error durch das Setzen der Variable errno auf EDOM angezeigt Bei NaN und Inf wird der Eingabeparameter zur ckgegeben bei Inf liefert die Funktion Null Die Wertebereiche in denen darstellbare Ergebnisse geliefert werden h ngen von der jeweiligen Flies skommaaufl sung ab Bei float liegt der Bereich bei etwa 87 bei double entsprechend 708 und bei long double ungef hr bei 11355 Bei kleineren Argumenten wird immer Null als Resultat geliefert gr ssere Argumente liefern Inf und f hren zu einem range error der durch das Setzen von errno auf ERANGE angezeigt wird A 4 2 exp2 Syntax float fexp2 float x double exp2 double x long double lexp2 long double x Die Funktion exp2 liefert das Resultat der Berechnung 2 A 4 3 exp10 Syntax A 4 Exponential und logarithmische Funktionen float fexpl0 float x double expl0 double x long double lexp10 long double x Die Funktion exp10 liefert das Resultat der Berechnung 10 AAA fmod 221 Syntax float ffmod float X float yo double fmod double x double y long double lfmod long double x long double y A 4 5 frexp Syntax float ffrexp float value in
23. R B 15 S O Q lt S X Read argument file OBJ Flags reading of section info building of section info shstrtab strtab symtab text rel text data rel data crest_debug_module additional hexdump LIB Flags reading of section info building of section info shstrtab strtab crest_library_dir additional hexdump REF Flags reading of section info building of section info shstrtab strtab Crest_reference_dir additional hexdump DBG Flags reading of section info building of section info Elf32_Ehdr shstrtab strtab symtab Text rel text data rel data crest_debug_program additional hexdump Function flags reading of section info building of section info shstrtab strtab crest_objects Functions Variables Registers 125253 28 C 11 cop68k C 12 copppe C crest_structures U crest_unions E crest_enums Y crest_typedefs additional hexdump M Module flags R reading of section info B building of section info P shstrtab S strtab A crest_macros T crest_types L crest_member_table O crest_objects X Functions V Variables C crest_structures U crest_unions E crest_enums Y crest_typedefs M crest_members I crest_file_dir F crest_func_dir D crest_compounds K crest_breakpoints additional hexdump P Program flags reading of section info building of section info shstrtab strtab crest_entry_dir
24. RUN SUSP SCHD und SEMA Die Operationen die Zu stands berg nge veranlassen k nnen sind Aktivieren Terminieren Aussetzen Fortfihren Einplanen Ausplanen und Synchronisationsoperationen sowie das Eintreten von Zeitpunkten und Events Hier werden die Wirkung der Operation sowie die veranlassenden Bedienbefehle und die analogen C Anweisungen grob beschrieben detailliertere Erl uterungen finden sich im RTOS UH Handbuch im Kapitel Bedienbefehle sowie f r Assemblerprogrammierer im Kapitel ber die Traps 15 3 2 1 Aktivieren Aktivieren hat nur auf Tasks im Zustand DORM direkte Wirkung sie werden in den Zustand RUN ver setzt und die Programmausf hrung beginnt bei der Zuteilung des Prozessors am Programmanfang Eine Aktivierung einer Task in einem anderen Zustand ist m glich und hat eine sogenannte gepuffer te Aktivierung zur Folge RTOS UH merkt sich im Taskkopf dass diese Task aktiviert wurde und startet sie von Programmanfang an neu sobald sie wieder in den Zustand DORM geraten will Bei der Aktivierung teilt RTOS UH zun chst der Task den Speicherplatz f r ihre lokalen Variablen zu TWSP anschliessend wird die Task vom Anfang an gestartet Steht bereits f r diese Aktion nicht gen gend Speicherplatz zur Verf gung so wird die Task in den Zustand PWS versetzt RTOS UH berpr ft dann bei jeder nderung der Speicherbelegung ob die Anforderung bedient werden kann und teilt den Prozessor erst zu wenn der Task auch TWSP
25. Use system trap Accept global register variables Generate 68000 Code Generate 68020 Code Generate CPU32 Code Number of reserved Ax registers Number of reserved Dx registers Dump internal expression trees Number of reserved FPx registers Use of global variables forbidden Parametertransfer for floatingpoint ANSI compliant float double long double Suppress optimization of bit operations Dump all optimizations to opl File Show all floatingpoint casts as warnings Preprocess pragma s Generate s File Add stack infos to obj File Generate lst File No undef warnings Add debug infos to obj File Enable some C9X features Force ANSI casting Generate Code for FPU C 2 cccppc 239 C 2 cccppc Crest C Compiler CCC PPC Version for Linux x86 Copyright C 1987 1999 by Stephan Litsch Release 2 597 Nov 4 1999 12 28 00 Usage cccppc infile outfile options macnam repl Define an argumentfree macro file Read argument file A digit Stop compiler 0 never after fatals 2 after fatals and errors 3 after fatals errors and warnings B Generate err File C digit Addressing mode for lt data gt and lt bss gt variables 0 Word access 1 Long access D digit Addressing mode for lt text gt constants 0 Word access 1 Long access E digit Addressing mode for lt local gt variables 0 Word access 1 Long access G digit Generate
26. Wert Bedeutung IOFMNE O FMR FMO FML i FMD FMN FME FMO FMF i FMF i FMC FMS FMR FMN FMC M 0x0002 0x0001 Tabelle 15 5 Bitmuster f r Ger te Eigenschaften 15 5 2 3 I O Queues und Geratetreiber Wenn eine Task unter RTOS UH einen VO Auftrag mit rt_transfer_ce losschickt dann ge langt das versandte CE nicht unmittelbar zum zust ndigen Ger tetreiber sondern landet zun chst in der f r die angegebene LDN zust ndigen I O Queue auch Warteschlange genannt F r jede g ltige LDN existiert eine kleine Struktur mittels derer sich eine priorit tengesteuerte doppeltverkettete Liste ver walten l sst Der Abbildung 15 7 k nnen Sie die zugeh rige C Struktur entnehmen Fassen Sie diese Struktur bitte als kleinen berblick und nicht als Aufforderung daran herumzubasteln auf RTOS UH erlaubt den Zugriff auf seine Innereien nur ber die amtlichen Traps bzw C Funktionsaufrufe struct Ce SEOLrS Ce backs Prio prio IOqueue 128 Abbildung 15 7 Interner Aufbau einer Warteschlange Ein einlaufendes CE wird zun chst usserst rudiment r auf G ltigkeit gepr ft Anschliessend wird es gem ss der eingetragenen Priorit t der verschickenden Task so in die Kette der zugeh ri 160 15 5 I O unter RTOS UH gen LDN eingereiht dass es hinter allen CE s mit h herer oder gleicher Priorit t auftaucht Gerade Anf ngern erscheint es immer etwas uneinsichtig d
27. bei 107 entsprechend bei doub1le Arithmetik 10 und bei long double Rechnung 10 Die Funktionen liefern in diesem Fall eine Null als Funktionsergebnis und zeigen den Verlust s mtlicher signifikanter Stellen durch das Setzen von err no auf EDOM A 2 7 on 10 5 0 5 10 3 2 1 0 1 2 3 Syntax float ftan float x double tan double x long double ltan long double x Die Funktion tan x berechnet den Tangens des Argumentes x das im Bogenmass anzugeben ist Bei grossen Argumenten verlieren die Resultate an Genauigkeit Wertebereich und Fehler Wird als Parameter x der Wert NaN oder Inf angegeben so wird ein domain error durch das Setzen der Variable errno auf EDOM angezeigt Die Funktion liefert den Parameter x zur ck In der N he der Polstellen 7 2 3 x m 2 kann es zu berl ufen bei der jeweils ausgew hlten Fliesskommaaufl sung kommen Theoretisch deckt die Funktion tan x den gesamten Zahlenbereich der Rationalen Zahlen ab Ver ursacht durch die begrenzte Aufl sung der Fliesskommadarstellungen verliert der Parameter x jedoch bereits bei der Reduktion auf den internen Wertebereich von 0 lt x lt 2 x m an Genauigkeit Entspre chend ungenauer werden die Funktionsergebnisse Beim Einsatz von loat Arithmetik liegt die Grenze ab der das Resultat definitiv keinerlei erkennba ren Zusammenhang mehr mit dem Aufrufparameter hat bei 107 entsprechend bei doub1e Arithmetik
28. bereits ber die Absch tzung des Stackbedarfs rekursiver Funktionen einiges ausgesagt In dem kleinen Beispiel einen Sinn werden Sie darin brigens nicht finden wird jeweils die maximale Auslastung des aktuellen Stacks angezeigt Dazu sollte der CCC selbstverst ndlich mit der Option U aufgerufen werden da sonst keine Statistik betrieben wird und rt used stack nur einen Haufen unbefriedi gender Nullen liefert Weiterhin sollten Sie die Entwicklungsbibliotheken st dx 1lib oder fltx lib hinzulinken da nur diese ebenfalls eine Stack berwachung eingebaut haben Mit allen anderen Biblio theken spielen Sie ohne Netz und doppelten Boden F r jede Rekursion werden hier grob 120 Bytes auf dem Stack allokiert dieser Wert ist jedoch abh ngig von der Compilerversion die Sie gerade benutzen und kann nach oben oder unten variieren Ohne das pragma Kommando ber der Funktion w rde die Angelegenheit etwa 60 Durchl ufe lang gutgehen solange man auf die Ausgaben ber printf verzichtet wenn man von einer Stack gr sse des Testprogramms von 8kB ausgeht Danach erwischt es die globalen Variablen sofern vor handen und dann die interne RTOS UH Verzeigerung Jetzt gehen die Lichter an Ihrem Rechner entweder an oder aus jedenfalls redet das Ding vermutlich hinterher nicht mehr mit Ihnen da eine derartige Breitseite mitten in den Speicher wohl kaum auf viel Gegenliebe stossen wird Wenn Sie die printf Ausgabe wieder einbauen s
29. crest_obj_dir crest_ref_dir additional hexdump B Generate Breakpoint Sources V Verbose all infos 97 OF mom D DW CU copppc Crest Object Inspector COP PPC Version for Linux x86 Copyright C 1987 1999 by Stephan Litsch Release 2 597 Nov 4 1999 12 28 00 Usage cop crest binaryfile options file Read argument file 0 OBJ Flags R reading of section info B building of section info P shstrtab 245 246 rn to DW rn Uw D E QUtATHKN oO D HK om D D DW CO om D Dm K PC A Kl lt C 12 copppc strtab symtab e EE rel text data rel data crest_debug_module additional hexdump LIB Flags reading of section info building of section info shstrtab strtab crest_library_dir additional hexdump REF Flags reading of section info building of section info shstrtab strtab Crest_reference_dir additional hexdump DBG Flags reading of section info building of section info Elf32_Ehdr shstrtab strtab symtab text rel text data rel data crest_debug_program additional hexdump Function flags reading of section info building of section info shstrtab strtab crest_objects Functions Variables Registers crest_structures crest_unions crest_enums crest_typedefs additional hexdump Module flags reading of section info building of section info C 13 cmake P shstrtab S strtab A crest_macro
30. hren Dabei werden die Extensions B Wund L hin ter den Sprunganweisungen Bcc im Quelltext schlicht ignoriert und durch optimal kurze Sprungbefehle ersetzt was auch bedeuten kann dass redundante Sprunganweisungen wegoptimiert werden k nnen Mit der Option t k nnen diese Eigenm chtigkeiten des Assemblers bei Bedarf unterdr ckt werden Im Schnitt bringt die standardm ssige Optimierung jedoch in durchschnittlichen C Quelltexten etwa 10 Codeeinsparungen und auch Laufzeitgewinne in dieser Gr ssenordnung und sollte nicht ohne besonderen Grund abgeschaltet werden 3 1 17 Unterdr ckung von MOVEM Optimierungen Der interne Assembler versucht die vom Compiler generierten MOVEM Befehle zum Retten und Re staurieren der Register bei Unterprogrammaufrufen zu verbessern Es werden die MOVEM Kommandos komplett gestrichen wenn die angegebene symbolische Registerliste leer ist Bei Operationen mit bis zu zwei Registern wandelt der Assembler den MOVEM Befehl in ein oder zwei einzelne MOVE s um was nach Aussage von Taktzyklentabellen noch minimale Laufzeitgewinne bringt und beim Retten eines Einzelregisters auch noch jeweils ein Wort im Code einspart Da bei MOVE s mit Datenregistern das Statusregister modifiziert wird l sst sich die Optimierung des Assembler mit der m Option abschalten F r vom CCC erzeugte Assemblerdateien besteht in dieser Hinsicht keinerlei Gefahr da der CCC das Statusregister nach einem Funktionsaufruf stets als undef
31. r eine gewisse Zeit entzogen wurde Terminiert sich eine Task so wird von den Ausnahmen abgesehen der TWSP wieder als frei 14 2 Taskk6pfe bei Shellmodulen 125 struct Taskworkspace MemSectionHeader head MemSect ionHeader FEOLE MemSectionHeader backt Task TID_of_owner A PRegister A7UW 7 PRegister A7SW F PRegister data 8 7 PRegister address 7 UWORD sys_stack 6 MemSectionName opname s TimeSchedule opfati R TimeSchedule opintv 5 TimeSchedule oplti R UWORD pearl_buffer 21 LineNo lineno R WORD dummy A long double fpu_regs SH WE Char fpu_format 184 Abbildung 14 2 Aufbau des System Taskworkspaces er Speicher ans Betriebssystem zur ckgegeben Auch die Speicherketten die w hrend der Laufzeit der Task angelegt wurden werden wieder abgebaut Die Terminierung einer Task bewirkt eine Art Aufr umaktion im Speicher Es werden s mtliche zur Laufzeit der Task angeforderten Speicherberei che das betrifft den Procedureworkspace und auch die CE Ketten wieder freigegeben oder so behandelt dass sie wenn sie ihre Aufgabe erf llt haben automatisch verschwinden Und jetzt kurz zu den erw hnten Ausnahmen Eine Task die mit dem Typ TASK resident bzw ATSK resident siehe Tabelle 14 1 eingetragen ist beh lt ihren TWSP auch nach der Terminierung Der Vorteil besteht darin dass bei einer erneuten Aktivierung bereits ein Taskworkspace existiert und nicht neu geschaffen werden
32. rer Form die Informationen ber den Aufbau der erzeugten Shared Library enth lt Diese Datei muss beim Linken von Programmen die die Shared Library nutzen wollen in der Linkdatei angegeben werden die der CLN verwendet 7 1 Die Optionen des ssl 7 1 1 Ausgaben w hrend der Linkerlaufes Die Option V veranlasst den SSL die gerade von ihm durchgef hrten Aktionen auf dem Bildschirm auszugeben 7 1 2 Erzeugung einer map Datei Die Option M generiert eine Mapdatei deren Name sich aus dem Ausgabefilenamen durch die Er setzung der Extension mit map ergibt Die Mapdatei enth lt sowohl die Gr ssen der Sections siehe Abschnitt 3 18 als auch deren relative bzw absolute Lage auf dem Zielsystem 7 1 3 Vorgabe von Ladeadressen Der SSL verlangt zwingend die Verwendung der Option T address um die resultierende Shared Library fest auf eine Adresse address zu binden 73 74 7 1 Die Optionen des ssl 7 1 4 Suchpfade f r Startup und Bibliotheken Der SSL sucht die in der Linkdatei aufgefiihrten Dateien sofern keine absoluten Dateinamen ange geben sind relativ zum aktuellen Workingdirectory Kann dort auf die angegebene Datei nicht zugegriffen werden so wird f r 68K System die Um gebungsvariable CCC_68K_LIBS ausgewertet F r PPC Systeme lautet der Name der Variable CCC_PPC_LIBS Wo die Umgebungsvariablen vorbesetzt werden k nnen ist in Abschnitt 2 1 erl utert Die Vorgabe der Umgebungsvariable l t sich mittels der O
33. rt_enable_event 149 rt_enter_bolt 147 rt_error 190 192 rt_event_activate 143 255 rt_event_activate_quick 143 rt_event_continue 144 rt_event_continue_quick 144 rt_event_resume 144 rt_fetch_ce 154 rt_free_bolt 147 rt_free_memory 184 rt_get_device_descriptor 159 rt_get_filedata 165 rt_get_LINENOO 18 rt_get_prio 132 rt_get_report_code 139 rt_get_taskname 103 rt_LDN to_TidO 158 160 rt_LDN_to_USER_Tid 158 rt_leave_bolt 147 rt_make_drive 161 rt_my_TIDO 106 136 rt_named_alloc_memory_backward 185 rt_named_alloc_memory_fixed 185 rt_named_alloc_memory_forward 185 rt_named_free_memory 185 rt_peripheral_input 152 rt_peripheral_output 152 rt_prevent_task 144 rt_prevent_task_quick 144 rt_pwsp_free_memory 184 rt_pwsp_memory_backward 184 rt_pwsp_memory _forward 184 rt_read_battery_clock 149 rt_read_clock 149 rt_read_memory_byte 152 rt_read_memory _long 152 rt_read_memory_word 152 rt_release_ce 162 rt_release_sema 146 rt_request_sema 146 rt_reserve_bolt 147 rt_scan_firstQ 205 rt_scan_next 205 rt_search_modul 186 rt_search_named_memory 186 rt_search_task 106 135 rt_set_device_descriptor 159 rt_set_LINENOO 18 rt_set_prio 132 rt_set_report_code 139 rt_super_read_memory_byte 152 rt_super_read_memory_long 152 rt_super_read_memory_word 152 rt_super_write_memory_byte 152 rt_su
34. und MODMWA das dar ber entscheidet ob die anfordernde Task auf die Beendigung des des I O Vorganges warten soll Bei MODMCR MODMLF und MODMEO handelt es sich um die Abbruchbedingungen die ein Ger tetreiber bei der Interpretation eines Ein Ausgabe Datensatzes zu ber cksichtigen hat 0x0080 EOF Bit bei Eingabe 0x0040 0x0020 Tabelle 15 8 Sonderkonditionen im mode Byte eines CE s Die drei Bits xxEx legen gewisse Sonderkonditionen fest Die f nf niederwertigsten Bits xx1F sind zur Kodierung des eigentlichen Kommandos bestimmt wce_A gt mode MODMWA Auf Beendigung der Ausgabe warten IOCNE Fehlermeldungen ins CE schreiben MODMOU Output einstellen IOCRWI Befehl READ WRITE Wie Ihnen nicht entgangen sein wird geschah hier noch so manch andere Sache Das Kommando fiir Lesen Schreiben wird durch das Bit IOCRWI gesteuert Die Richtung in der die Operation erfolgen soll wird durch das Bit MODMOU gesteuert Ist MODMOU gesetzt so wird ausgegeben ansonsten handelt es sich eben um eine Leseoperation 168 15 5 I O unter RTOS UH READ WRITE OLD ERASE RETURN CLOSE READ WRITE ANY REWIND OLD APPEND FILE FILES FREE DIR 0x0000 0x0001 0x0004 0x0006 0x0007 0x0008 0x0009 0x000C IOCDI CF FRE 0x000D Ox000E 0x00 0x00 0x007 0x007 0x001 0x00 0x00 0001 0x001 0x00 0x001 0x001B 0x001C 0x001F Tabelle 15 9 Kommandos im mode Byte eines CE s AVE POINT
35. und der internen FPU im MC68040 bzw MC68060 A 1 Fliesskommadarstellung Sowohl bei den Fliesskommaprozessoren als auch in der Fliesskomma Emulation innerhalb des CREST C Paketes werden Zahlendarstellungen entsprechend IEEE 754 verwendet Dies gew hr leistet den problemlosen Austausch von Bin rdaten zwischen CREST C Programmen mit und ohne FPU Unterstiitzung Unterst tzt werden drei unterschiedliche Fliesskommaaufl sungen 1 Single Precision 2 Double Precision 3 Extended Precision Diese unterscheiden sich sowohl in der Mantissengenauigkeit als auch im Bereich des darzustellenden Exponenten Um b se berraschungen bez glich Rechenzeit Speicherbedarf und Rechengenauigkeit zu vermeiden sind in den folgenden Abschnitten einige wesentliche und grundlegende Informationen zusammengefasst um durch die richtige Auswahl der Mittel zum Ziel zu gelangen A 1 1 Single Precision Bei dieser Fliesskommaufl sung handelt sich um den kleinsten Datentyp Er belegt 32 Bit im Speicher und ist unter CREST C als Datentyp float anzusprechen Die interne Darstellung enth lt 24 Bit Mantisse ein Bit davon ist nur implizit enthalten 8 Bit Exponent und ein Vorzeichenbit Die float Mantisse bietet eine maximale Aufl sung von etwas mehr als 7 Dezimalstellen exakt In 2 In 10 24 Die gr sste darstellbare Zahl betr gt 3 402823E 0038F die kleinste darstell bare Zahl entsprechend 2 938736E 0039F Die kleinstm gliche Ann herung an die Zahl
36. und von der Ger tekennung befreite Name in C Nomenklatur eingetragen void A3_Info void auto RFILE port_info_A if rt_get_filedata amp port_info_A A3 name printf A3 LDN 3d DRV 3d n int port_info_A ldn int port_info_A drive Liefert die Funktion rt_get_filedata dagegen eine Null so ist die Dekodierung des bergebe nen Namens gescheitert und der undefinierte Inhalt die Struktur rfile sollte besser nicht zur Kodie rung eines CE s herangezogen werden Das kann z B folgende Gr nde haben 1 Die Ger tekennung ist dem System unbekannt So werden z B willk rliche Angaben wie Hu go Egon oder Waltraud nur auf den wenigsten RTOS UH Systemen zum Aha Erlebnis f hren und sinnvolle 1dn drive Kombinationen liefern Warum bin ich mir nur so sicher dass Sie jetzt ihren n chsten Treiber Emil oder Willy taufen werden 166 15 5 I O unter RTOS UH 2 Die Ger teangabe fehlt ganz Nicht weiter schlimm denn dann versucht die Funktion das ak tuelle Workingdirectory zu ermitteln und liefert 1dn drive f r das aktuelle Laufwerk Wenn jedoch kein Workingdirectory eingestellt ist kommt es zum Fehlerabbruch 3 Der Name ist unsinnig soll heissen zu lang um vom RTOS UH System auf dem der Aufruf stattfand akzeptiert zu werden Sie wissen schon 23 Zeichen plus Terminator 0 xFF respektive an der Position 8F2 Wim Speicher die maximale Pfadl nge sauber auslesen 15 5
37. 0x3BC0443844000002 OXAOSA 0x2050 0xA066 OxA0SC 0xA052 0xA034 0x3BC0446844000002 DVDSC 0xA012 0x3BC0442444000002 ENAB 0xA032 0x3BC0446444000002 4 ENTRB OxA076 0x3BC044EC44000002 ERROR 0xA002 0x3BC0440444000002 FETCE 0x4E48 0x3BC040A044000002 FREEB OxA074 0x3BC044E844000002 GAPST 0OxA00E 0x3BC0441C44000002 0x3BC0447844000002 0x3BC0449844000002 0xA078 0xA036 0xA038 0x3BC0448C44000002 0x3BC044E044000002 0x3BC040AC44000002 0xA02E 0x3BC0445C44000002 Tabelle 4 1 Notation der System Traps Teil 1 4 6 System Traps 0x3BC0446044000002 0xA022 0x3BC0444444000002 0xA054 0x3BC044A844000002 0x4E43 0x3BC0408C44000002 OxAO1E 0x3BC0443C44000002 4 RBCLOCK 0xA06A 0x3BC04 4000002 4 4 0xA03E 0xA086 RETN 0xA020 0x3BC0445444000002 OXAO5E 0x3BC044BC44000002 SCAN 0x4E45 0x3BC0409444000002 0xA028 TERME 0xA000 0x3BC0440044000002 TERMEQ 0xA058 0x3BC044B044000002 TERMI 0x4E41 0x3BC0408444000002 0x3BC0442044000002 0x3BC0442C44000002 0xA07C 0x3BC044F844000002 0xA024 0x3BC0444844000002 0xA07E 0x3BC044FC44000002 0xA018 0x3BC0443044000002 0xA080 150044000002 OxA04E 149044000002 0xA082 0x3BC0450444000002 OxA02C 0x3BC0445844000002 0xA084 TOQ TRIGEV 0xA026 0x3BC0444C44000002 OXAOTA OxAOGE OxA00C 0xA008 0xA004 X10 EE Tabelle 4 2 Notation der System Traps Teil 2 4 4
38. 1 3 Speicherbedart x 2 ne iin 132 15 2 1 4 Residente Tasks e 133 15 2 1 5 Autostart F higkeit 133 5 3 Multi TaskiN8 EEN OE ee aa ra anne rn 133 15 3 1 Task Zust nde e dot dhs va a neh ee att bed 133 15 3 1 1 DORM Schlafend 136 15 3 1 2 RUN Lau Willie ota a ea ee ar Ber ar 136 15 3 1 3 SUSP Ausgesetzt e 136 15 3 1 4 SCHD Eingeplant e 137 15 3 1 5 1 0 Blockiert durch YO Vorgang 137 15 3 1 6 PWS Blockiert durch Speicheranforderung 137 15 3 1 7 CWS Blockiert durch CE Anforderung 137 15 3 1 8 SEMA Blockiert durch SEMA Anforderung 137 15 3 1 9 2 Mehrfachblockierung 138 15 3 2 Taskzustands berg nge aay EEE ee hs 138 Ett 2 2 rt en re aie 138 A Le EE EE EENEG 139 15323 Terminieren ee 2 A eo de Ged OG AaB dh ee Se ee 139 INHALTS VERZEICHNIS VII 15 3 2 4 Aussetzen 6 is Soh ee eh e Parken BS 140 15 3 2 3 FOrtsetzen gt 24 2 2 Sept ah ae hed ore RE ed 141 15 3 2 6 Eimplanen ete ut hi She nen MO Rod Se A ORS 141 15 3 2 17 Ausplanen Ses 2 2 eege Mee dd Ae I ea Aer 144 15 3 3 Synchronisationsoperationen 145 15 3 3 1 Semaph fre ce ira Bar 2a a Par AAA Bin a ia 145 15 33 2 BONS an a aa ey ar ana ar Br Dane 147 15 3 3 3 Interne Blockierbedingung 147 15 3 4 Ereigniseintritt uo A dee ek ek dees ee LEE ie nee 148 15 4 Interrupt Routinen 150 15 4 1 System In
39. 1 9 Includedateien ce 0 0 2 a E a A nenne 14 3 1 9 1 Kontrollausgaben w hrend der Compilation 14 3 1 9 2 Einmaliges Includieren o een 15 3 1 9 3 Ausgabe von Datei Abh ngigkeiten 16 3 1 10 Anschalten der Stack berwachung o 16 3 1 11 Generierung von C Zeilennummern im Assemblercode 17 3 1 12 Generierung von C Zeilennummern im Programmcode 17 3 1 13 Assemblercode in C Quelltexten 18 3 1 14 Ausgabe einer Assemblerdatei ooa 19 3 1 15 Ausgabe eines Assemblerlistings 22222 on 2002000004 19 3 1 16 Unterdr ckung von BRA Optimierungen 19 3 1 17 Unterdr ckung von MOVEM Optimierungen o 19 3 1 18 Unterdr ckung von 68K Optimierungen 20 3 1 18 1 Der CLR Befehl bei ogk CPUre oo o 20 3 1 18 2 68K Bitzugriffe auf l O Bereiche 20 3 1 19 Globale Registervariablen onen 21 3 1 20 Fehlerbehandlung 22 2 2 Con nn n nn 21 3 1 21 Bekannte Compilerfehler 2 22 on nn 23 3 1 21 1 Fehler bei der Syntaxanalyse von Symbolen 23 3 1 21 2 Fehlerhafte Registerverteilung 24 Vordefinierte Makros im ccc o oo 25 Basisdatentypen A7 td ed u ey Me Anen dla A 26 Benutzereigene Datentypen 26 3 4 1 Padding innerhalb von Strukturen 26 3 4 1 1 Memberpadding 68K 27 3 4 1 2 Memberpadding PPC 2 2 une 28
40. 1 betr gt 5 960464E 0008F Die entsprechenden Konstanten sind in der Includedatei lt float bz als Ma kros abgelegt 211 212 A l Fliesskommadarstellung define FLT_MANT_DIG 24 define FLT_DIG 7 define FLT_EPSILON 5 960464E 0008F define FLT_MIN 2 938736E 0039F define FLT_MAX 3 402823E 0038F A 1 2 Double Precision Bei dieser Fliesskommaufl sung handelt sich um einen Kompromiss aus Speicherplatzbedarf und Rech nengenauigkeit Er belegt 64 Bit im Speicher und ist unter CREST C als Datentyp double anzuspre chen Gleichzeitig handelt es sich beim Datentyp double um den default Typen f r Fliesskommaan gaben Die interne Darstellung enth lt 53 Bit Mantisse ein Bit davon ist nur implizit enthalten 11 Bit Exponent und ein Vorzeichenbit Die double Mantisse bietet eine maximale Aufl sung von knapp 16 Dezimalstellen exakt In 2 In 10 x53 Die gr sste darstellbare Zahl betr gt 1 797693134862315E 0308 die kleinste darstellbare Zahl entsprechend 5 562684646268003E 0309 Die kleinstm gliche Ann herung an die Zahl 1 betr gt 1 110223024625156E 0016 Die entsprechenden Konstanten sind in der In cludedatei lt float bz als Makros abgelegt define DBL_MANT_DIG 53 define DBL_DIG 16 define DBL_EPSILON 1 110223024625156E 0016 define DBL_MIN 5 562684646268003E 0309 define DBL_MAX 1 797693134862315E 0308 A 1 3 Extended Precision Bei dieser Fliesskommaufl sung handelt sich um
41. 22 Common 120 Beispiel eines Traps MG nana a ar ee ae el ee ee 120 Beispiel einer Line A Funktion in C aaa aaa 121 Memzectpon Typen 127 Einplanungszust nde 2 22 2 Common 133 Belegung des BLOCK Bytes 2 2 oo onen 135 Belegung des SCHEDULE Bytes 2 2 o o e e 135 Implementierung von rt_task_status o Con 135 Bitmuster f r Ger te Eigenschaften 159 Nomenklatur bei DOS hnlichen Pfadangaben 163 Steuerbedingungen im mode Byte eines CHE 167 Sonderkonditionen im mode Byte eines CES o o e 167 Kommandos im mode Byte eines CE s 1 2 2 2 nme 168 15 10 Bitmuster f r das st atus Byte eines CEis e 170 Abbildungsverzeichnis 3 1 Makroverarbeitung und Expressionauswertung in pragma Zeilen 14 3 2 Beispielprogramm f r die Y Option 18 3 3 Erzeugter Code bei Y Option f r Zeile 18 3 4 Beispiel fiir 68K Padding in Strukturen 27 3 5 Beispiel f r PPC Padding in Strukturen 29 3 6 Deklaration eines Bitfeldes 2 2 2 CC Cm n o o 000002 2 2 ee 31 3 7 Speicherbelegung eines Bitfelds oo o e 31 3 8 Lage des EREST C St cks cota RR a Aa a 38 3 9 Beispielfunktion zur Speicherplatzabsch tzung o o 39 3 10 Absch tzung des lokalen Speicherbedarfs einer Funktion 39 3 11 Auszug aus stdargbh AA A E E E T AEA 40 3 12 Beispielfunktion f r rekursive Sack 42 13 1 RAM Shellmod
42. AO ee ee BO e a A Ee e e EE EECHER EE EE E Ee EE System Traps a tal ld ae a HEEEN 5 Der Linker cln 5 1 Die Optionen des cln 2 2 2 seu GR Se ee en een ee ee 5 1 1 Ausgaben w hrend der Linkerlaufes 5 1 2 Erzeugung einer map Datei 2 2 on nn 5 1 3 Vorgabe von Programm Namen 5 1 4 Vorgabe der Stackgr sse on onen 5 1 5 Autostartf hige Task e 3 1 6 Taskpriontat 2 2 2 2 Bars Karen dran Mara a ha Bandes IV INHALTS VERZEICHNIS 5 1 7 Residenter Taskworkspace oaoa a eee eee ee 68 5 1 8 Erweiterter Taskk pf x 2 4 4 was ts Gra a anid abode d s 68 5 1 9 Tasks f r PROM vorbereiten 68 5 1 10 Verwendung der PPU 69 5 1 11 Zahl der FILE Strukturen e 69 5 1 12 Vorgabe von Ladeadressen 69 5 1 13 Suchpfade f r Startup und Bibliotheken 69 5 1 14 Debuginformationen exportieren 2 Coon 70 6 Der Linker Ink 71 6 1 Die Optionen des nk 71 6 1 1 Ausgaben w hrend der Linkerlaufes 71 6 1 2 Erzeugung einer map Datei e 71 6 1 3 Suchpfade f r Bibliotheken e 71 6 1 4 Debuginformationen exportieren 2 CC m mn 00000004 72 7 Der Linker ssl 73 7 1 Die Optionen des sel EEN ee 73 7 1 1 Ausgaben w hrend der Linkerlaufes 73 7 1 2 Erzeugung einer map Datei aooaa 73 7 1 3 Vorgabe von Ladeadressen 73 7 1 4 Suchpfade f r Startup und Bibliotheken 74 7 1 5 Debuginformationen exportieren 2 22 one 74 8 Der Library Manager clm
43. Beispiel pure Beschaeftigungstherapie Hier koennen auch sinnvolle Dinge passieren solange keiner am abgeschickten CE rumfummelt El for count 0 count lt 10000 count H Und jetzt legen wir uns hin und schauen nach ob der Treiber mit unserem Lese CE fertig ist y rt_wait_for_ce rce_A Wenn man hier angekommen ist ist der Puffer entweder gefuellt oder ein Fehler aufgetreten 5 if rce_A gt reclen lt 0 FEHLER 180 15 6 Speicherverwaltung Hier stehen jetzt wieder maximal 25 Datenbytes im Puffer In reclen ist die wahre Anzahl der gelesenen Daten eingetragen ptr rce_A gt buffer Pointer auf Puffer for count 0 count lt rce_A gt reclen count printf d Zeichen 081X n count 1 ptr count OxFFUL Jk Genug gespielt und weg mit dem CE rt_release_ce rce_A exit 0 15 6 Speicherverwaltung Der Umgang mit dynamischem Speicher z hlt in C Programmen zum allt glichen Handwerk jedes Programmieres Andere Programmiersprachen z B PEARL bieten diese M glichkeit nicht Als Be gr ndung wird stets der Sicherheitsaspekt angef hrt Wenn ein PEARL Programm geladen und gestar tet werden konnte so heisst es kann es sp ter nicht mehr aus Speicherplatzmangel liegenbleiben w hrend C Programme eben dies nicht gew hrleisten Deshalb seien dynamische Allokationen gef hr
44. C Paketes die Crossentwicklungsplattformen unter WINDOWS 95 NT4 0 und LINUX sowie eine unter RTOS UH laufende Variante Den Abschied von DOS als Entwicklungsumgebung halte ich pers nlich vier Jahre nach Einf hrung von WINDOWS 95 f r durchaus vertretbar 1 2 Literatur zu C Dieses Manual wendet sich immer noch an C Programmierer die die Besonderheiten der CREST C Implementierung unter RTOS UH kennenlernen wollen So krass es auch klingen mag Das hier ist kein Lehrbuch f r C Und ich habe nicht das zeitliche Potential ein gutes Mannjahr in Literatur f r Anf nger zu stecken solange es f r ein paar Mark im Buchhandel B cher kompletter und fehler freier im Doppelzentner zu erwerben gibt Es ist auch in Zukunft eine Frage der Priorit ten dass ich meine Zeit nicht damit verbringe C B cher abzuschreiben und lieber Programme schreibe oder Dinge dokumentiere die es sonst nicht zu kaufen gibt Es wurde besonderer Wert darauf gelegt gerade an den Stellen Erkl rungen zu liefern wo das RTOS UH Handbuch sich eisern ausschweigt Es handelt sich dabei nicht um Geheiminformationen aus der Hexenk che des Instituts f r Regelungstechnik der Universit t Hannover sondern um den Versuch in verst ndlicher Form die F higkeiten und Grenzen dieses Betriebssystems und dessen Programmierung unter C zu erl utern 2 1 3 Allgemeines zu C unter RTOS UH Als grundlegende Einf hrung empfiehlt sich sofern Sie nicht gerade Ihre allererste Programmie
45. CPU v llig anders darstellt als Sie das System sp ter im betriebsbereiten Zustand pr sentiert bekom men Teilweise sieht die CPU beim Aufwachen nur winzige St ckchen von RAM und EPROM und das auch noch auch auf recht seltsamen Adressen Diese Phase wird als Pre Cold bezeichnet weil sie vor dem eigentlichen Kaltstart stattfindet und hier Aktionen durchgef hrt werden die es berhaupt erst erm glichen dass die CPU in die Lage versetzt wird auch noch den n chsten Befehl auszuf hren F r Sie als Anwender gibt es hier keinerlei Ein griffsm glichkeit Es handelt sich im Implementierungsdetails f r die spezielle Hardware Da die daf r durchzuf hrenden Aktionen sehr spezifisch ausfallen erspare ich mir weitere Erl uterungen In manchen F llen ist der Pre Cold Code obsolet weil RTOS UH aus Betriebszust nden heraus ge startet wird die diesen essentiellen Setup der Hardware bereits durchgef hrt haben Wenn z B RTOS UH aus einem anderen Betriebssystem heraus gestartet wird Atari Amiga oder bereits ein Monitor programm auf der Hardware l uft so sind die wesentlichsten Aktionen logischerweise bereits erledigt 195 196 16 2 Kaltstart 16 2 Kaltstart Die Kaltstartphase ist praktisch gesehen der erste Atemzug des hardwareunabh ngigen Teiles des Be triebssystems und wird in folgenden F llen ausgef hrt e Beim Stromeinschalten e Beim Dr cken des Reset Knopfes e Bei der Verwendung des Befehles SYSTEM RESET e Bei fehl
46. Compi lers in die M lltonne wandern und neukodiert werden m ssten Zeit die ich einfach nicht habe Was vormals als tempor re Abhilfe gedacht war bleibt auch bei dieser zweiten Major Release des Compilers die amtliche Handlungsanweisung Folgende COMPILER FATAL Meldungen sind denk bar e Register allocation error Please recompile with a number Ursache Es wurden durch den Compilerfehler zuviele Adressregister vergeben Der interne Feh ler wurde erkannt aber zu sp t um compilerinterne Reparaturmassnahmen zu ergreifen Abhilfe Neu bersetzen des Quelltextes mit der Option a number number legt hierbei die Zahl der Adressregister fest die nicht bei der Optimierung einbezogen werden d rfen Sinnvoll sind hier die Werte O bis 8 0 ist der Standardwert und f hrt in 99 9 aller F lle zum Erfolg e Register allocation error Please recompile with d number Entsprechend bei Daten Registern e Register allocation error Please recompile with f number Entsprechend bei Fliesskomma Resgistern Der erzeugte Code f r die gesamte zu bersetzende Datei wird durch die Verwendung dieser Optionen m glicherweise geringf gig ineffizienter Wenn hochgradig zeitkritische Funktionen in der Datei ent halten sind die diesen Fehlerabbruch gemeldet hat bei denen es zudem um jede Mikrosekunde gehen k nnte was wohl nur Kenner des generierten Motorola Assemblercodes beurteilen k nnen so sollten diese Funkti
47. DATION Bl cke deren Aufbau in Abbildung 13 2 dargestellt ist enthalten das Wissen der Shell ber die aktuell eingestellten Standard Kan le bei Aufruf der Shellextension Interessant sind f r CREST C nur die Eintr ge 1dn drive und file_name Wenn Sie selbst sich an diesen Daten vergehen m chten dann bedenken Sie bitte dass file_ name im RTOS UH blichen Format vorliegt und mittels eines Abschlussbytes mit geseztem achten Bit terminiert wird typedef struct DATION_Block UWORD 10 A UBYTE ldn UBYTE drive UWORD stat UWORD tfu UWORD info FileName file_name DATION_Block Abbildung 13 2 Aufbau eines DATION Blockes Weiterhin sind nun ein Pointer auf die Kommandozeile und deren L nge bekannt Wenn Sie selbst ein Startup File kodieren wollen so sollten Sie nicht der Versuchung erliegen darauf gedankenlos mit C Stringbefehlen einzuschlagen da kein abschliessendes Nullbyte enthalten ist Jetzt braucht die C Task erstmal etwas mehr Speicher Die bergebenen Parameter wurden bislang in dem Speicherbereich untergebracht der beim Parametertransfer angefordert wurde Hier stand als Gr sse der sp tere Stackbereich den RTOS UH intern als PWSP verwaltet Problematisch wird zu diesem Zeitpunkt die nette Geste von RTOS UH dem Shellmodul beim Anle gen des Taskkopfes einen Taskworkspace spendiert zu haben Schade denn CREST C braucht mehr Speicher als eine bliche PEARL Task Da CREST C noch viel mit diesem Taskworks
48. Debugdatei zu exportieren Kapitel 6 Der Linker Ink Beim LNK handelt es sich um ein Werkzeug zur Erzeugung von bin ren Bibliotheken Bei Fehlbedienungen oder Aufruf ohne Parameter gibt der LNK einen kurzen berblick ber die un terst tzten Optionen aus Sie k nnen diese Usage Meldungen im Anhang Ink68k Abschnitt C 5 Ink ppc Abschnitt C 6 nachschlagen Als Aufrufparameter erwartet der LNK minimal die Angabe einer Linkdatei Die Linkdatei muss eine Liste der zusammenzufassenden Objektdateien und Bibliotheken enthalten Als optionaler zweiter Parameter wird der Name der zu generierenden Ausgabedatei erwartet Fehlt dieser so bildet der LNK diesen automatisch aus dem Namen der Linkdatei durch Ersetzung der Datei extension durch die Endung lib 6 1 Die Optionen des Ink 6 1 1 Ausgaben w hrend der Linkerlaufes Die Option V veranlasst den LNK die gerade von ihm durchgef hrten Aktionen auf dem Bildschirm auszugeben 6 1 2 Erzeugung einer map Datei Die Option M generiert eine Mapdatei deren Name sich aus dem Ausgabefilenamen durch die Er setzung der Extension mit map ergibt Die Mapdatei enth lt sowohl die Gr ssen der Sections siehe Abschnitt 3 18 als auch deren relative bzw absolute Lage in der Bibliothek 6 1 3 Suchpfade f r Bibliotheken Der LNK sucht die in der Linkdatei aufgef hrten Dateien sofern keine absoluten Dateinamen ange geben sind relativ zum aktuellen Workingdirectory Kann dort auf
49. Ebene werden alle dauerhaften Variablen in der bs s Section abgelegt denen kein Anfangswert zugewiesen wurde Dauerhafte Objekte werden in der bss Section allokiert wenn kein Initialwert zugewiesen wurde int static int volatile int static volatile int void f void Oo 0 D extern int x liegt im data oder bss Bereich static int yj 3 18 4 Die common Section Die common Section umfasst die dauerhaften Variablen die task bergreifend erreichbar sein sollen Es lassen sich keine Initialwerte an Variablen der common Section zuweisen Nach dem Laden des Programmes bei RAM Code oder dem Hochlaufen von RTOS UH bei EPROM Code enthalten die Objekte dieser Section ein Null Muster Die hier gespeicherten Objekte liegen im RAM Bereich und sind ver nderlich Auf C Ebene werden alle dauerhaften Variablen die mittels der Speicherklasse absolute angelegt wurden in der common Section abgelegt absolute int a static absolute int by void f void extern absolute int cj liegt im common Bereich static absolute int d 3 18 5 Die local Section Die local Section umfasst die dauerhaften Variablen die taskintern erreichbar sein sollen Es lassen sich keine Initialwerte an Variablen der local Section zuweisen Nach dem Laden des Programmes bei RAM Code oder dem Hochlaufen von RTOS UH bei EPROM Code enthalten die Objek te dieser Section ein Null Muster Die hier gespeicherten Obj
50. Ende von main einzubauen Durch die Endlosschleife w ren dann 13 3 C Subtasks 99 auch die Spielkinder unter den Bedienern entsch rft die nur so zum Spass oder aus purer Ver zweiflung alle m glichen und unm glichen Tasks fortzusetzen pflegen wenn eine Anwendung unerwartet h ngen bleibt e Es gilt zu beachten dass alle dauerhaften Variablen von allen nebenl ufigen Prozessen erreicht werden k nnen Nur automatische und registerinterne Variablen sind im ausschliesslichen Besitz der jeweiligen Tasks Objekte vom Typ local sind v llig getrennt von denen der Sohntasks e Die Stack berwachung ist auch f r C Subtasks m glich und oft sogar sehr angebracht e Bei jedem Aufruf einer als Subtask generierten Funktion entsteht eine neue Subtask Sie k nnen nahezu beliebig viele davon im Speicher haben Es kommt nicht zu Mehrfachaktivierungen da grunds tzlich ein neuer Taskkopf vom System generiert und nicht nur der interne Aktivie rungsz hler eines vorhandenen Taskkopfes erh ht wird Eine derartig aufgesetzte Subtask verschwindet nach einem return aus dem Speicher Sie sollten nie mals mit exit oder hnlichen Notausstiegen eine Subtask terminieren Die Funktionen exit und abort wehren sich gegen Aufrufe von Subtasks um zu verhindern dass main durch un zul ssige Aktionen seiner Kinder quasi enthauptet wird abort _impossible_in_subtask_ TERMI exit _impossible_in_subtask_ TERMI Das Beispielprogramm in Abbild
51. Includedateien lt locale h gt und lt signal h gt sind nicht vorhanden Der Status der implementierten ANSI C Bibliotheken ist ansonsten als gut zu bezeichnen Eine Rei he von kostenlosen Bibliotheks Testpaketen ist mit den Funktionen einverstanden was nicht viel zu bedeuten hat aber wenigstens eine gewisse Beruhigung meinerseits sicherstellt An eine offizielle Validierung des Compilers ist aus Kostengr nden wohl weder jetzt noch in Zukunft zu denken Wenn Sie CREST C frisch in H nden halten dann entspricht das Paket weitestgehend meiner eige nen Version Das impliziert allerdings auch dass eine Reihe von undokumentierten Eigenschaften und Funktionen enthalten sind die erst noch gr ndlich ausgetestet werden m ssen bevor sie festgeschrie ben werden Wenn Sie ber Funktionen in den Bibliotheken oder Parameter in den Usage Meldungen stolpern die nicht im Handbuch beschrieben sind dann sollten Sie nicht blindw tig ausprobieren was sich dahinter wohl verbergen mag In der Regel handelt es sich um Dinge die noch nicht wasserdicht sind sich in der Experimentalphase befinden oder nur zum Debuggen des Compilers selbst notwendig sind Es handelt sich keineswegs um den Versuch Ihnen Dinge vorzuenthalten die prinzipiell wichtig sind dem miesen Stil von manchen grossen Softwareh usern m chte ich nicht unbedingt nacheifern Manchmal handelt es sich auch nur um Features die f r den von mir ben tigten Anwendungszweck zwar korrekt f
52. KALTSTART 231 Kaltstart 195 196 Kaltstartcode 92 labs 224 lacos 213 lacosh 218 lasin 214 lasinh 218 latan 214 latan2 215 latanh 218 Laufzeitpriorit t 132 lceil 224 254 lcos 215 lcosh 218 LDBL DIG 212 LDBL_EPSILON 212 LDBL_MANT_DIG 212 LDBL_MAX 212 LDBL_MIN 212 IdexpQ 221 LEAVE 147 LEVEL 108 111 230 lexpO 220 lexp100 220 lexp20 220 IfiniteQ 226 Ifloor 224 Ifmod 221 IfrexpQ 221 LINE A 229 LINE A AOxx 120 Linkdatei 67 71 73 lisinfQ 225 lisnan 225 lldexpO 221 llog 222 llog100 222 llog2 222 Imodf 223 Ink 71 Ink Optionen V 71 Ink68k 71 Inkppc 71 LOAD 8 49 LOAD Relocs 47 local 50 Local Relocations 47 log O 222 log100 222 log2 222 long 26 long double 26 212 lround 224 IsignQ 225 Isin 216 IsinhQ 219 IsqrtQ 223 ltanO 217 ItanhO 219 main 55 91 92 95 98 99 112 main Task 51 98 104 121 MAKE INI 79 INDEX make ini 79 malfunction 117 malloc 98 103 180 MARK 127 MDLE 127 Mehrfachaktivierungen 49 Member Padding 27 28 MEMBER_PADDING 68K 27 MEMBER_PADDING_OFF 27 29 231 MEMBER PADDING OLD 27 29 MEMBER_PADDING ON 27 29 231 MEMBER PADDING PPC 29 MEMORY 188 231 MemSectionHeader 126 MODBIN 167 modf 223 Modifier const 50 55 56 volatile 50 55 MODMCR 167 MODMEO 167 MODMLE 167 MODMNE 167 MODMOU 167 MODMSC 167 MODMWA 167 MODULE
53. Kommentar NO_MEMORY_H NO_FCNTL_H SC Der Ersatztext bei Makrodefinitionen umfasst den gesamten Text der Zeile und wird nicht hinter eventu ell enthaltenen Blanks abgebrochen Lediglich abschliessende Blanks werden geskippt ber die Kom mandozeile h tte der Ersatzstring des Makros in doppelte Hochkommata gesetzt werden m ssen In der Argumentdatei wird jede Zeile quasi als ein Kommandozeilenargument aufgefasst Unzul ssig sind demnach Angaben der Form C 1 R 2 in einer Zeile der Argumentdatei Leerzeilen in Argumentdateien sind zul ssig und werden ignoriert Die Angabe von Kommentaren kann wie bei Linkfiles und Makefiles hinter dem Doppelkreuz erfolgen Die Verwendung der Option innerhalb einer Argumentdatei ist nicht erlaubt Die Argumentdateien k nnen nur Optionen und keine Dateinamen aufnehmen 3 1 2 Einstellung des 68K Zielprozessors Entsprechend dem vorgesehenen Zielsystem sind Optionen verf gbar die die Auswahl des jeweiligen CPU FPU Befehlssatzes steuern Der CCC generiert dann die entsprechenden Assembler Sequenzen f r die ausgew hlte CPU FPU Kombination Dabei sind vier Wahlm glichkeiten verf gbar Die Option 0 ist die Standardeinstellung und erzeugt Code f r die Prozessoren MC68008 MC68000 MC68010 MC68301 etc Die n chste Prozessorgruppe wird unter der Option 2 zusammengefasst und betrifft die CPU s MC68020 bis MC68060 Es werden doppeltindirekte Addressierungen generiert Multiplikationen und Di
54. MEMORY 0x100000 0x200000 Die beiden Parameter dieses Kommandos bestehen aus der ersten zu reservierenden Adresse und der ersten wieder freien Adresse hinter dem einzurichtenden Modul Sie sollten dabei Vorsicht walten lassen Ist die Angabe des Speicherbereiches fehlerhaft so kommt das System gar nicht erst hoch Wenn Sie den entsprechenden Block vor unbeabsichtigtem Entladen bewahren wollen ist es angebracht den Namen des Moduls mit einem JP als einleitendes Zeichen zu versehen Damit sind Sie in guter Gesellschaft da RTOS UH selbst dieses Verfahren verwendet um wichtige Module und Tasks vor unachtsamen Nutzern in Deckung zu bringen Bedenken Sie dabei jedoch dass Suchaktionen mittels der Funktion rt_search_modul an Modulen mit Doppelkreuz scheitern werden Der Name des einzurichtenden Moduls darf maximal sechs Buchstaben umfassen Diese Festlegung ist von mir willk rlich getroffen worden und erleichert im sp teren Umgang mit den erzeugten Modulen den Zugriff auf die Nutzdaten da Ihnen unter dieser Voraussetzung der angeforderte Speicher stets ab der Position start 10 zur Verf gung gestellt werden kann Bei langen Modulnamen die erst nach heftigstem Kampf mit den M glichkeiten der entsprechenden Scheibe erzeugt werden k nnen w rde die Angelegenheit nicht gerade komfortabler f r Sie und mich 15 7 CPU Status wechseln Die Motorola CPU s besitzen zwei unterschiedliche Betriebszust nde Im normalen Modus dem User Mode
55. Module eines Projektes mit der identischen Deklarationen ausgestattet werden Sie sollten dabei auch bedenken dass einige Bibliotheksroutinen rger machen werden die nichts davon wissen dass der Gebrauch bestimmter Register unzul ssig ist Diese Einschr nkung bezieht sich auf call back Bibliotheksroutinen wie qsort die in Nutzerroutinen zur ckspringen und deshalb prinzipbedingt nicht funktionieren k nnen 3 1 20 Fehlerbehandlung Es sind vier Klassen von Meldungen zu unterscheiden e WARNING Warnungen fiihren lediglich zu einer Meldung auf dem Bildschirm und unterbre chen den Ubersetzungsvorgang nicht e ERROR Fehlermeldungen dieser Kategorie f hren zu einem Abbruch der Codegenerierung Der Compiler bearbeitet zwar noch den Rest des Quelltextes versucht aber nicht die folgenden Funktionen zu optimieren oder Code zu generieren Nach Abschluss des bersetzungsvorgangs wird die ob j Datei automatisch gel scht e FATAL Fatale Fehler dieser Art betreffen Betriebszust nde bei denen der Compiler entweder physikalisch nicht in der Lage ist eine sinnvolle Fortf hrung der bersetzung zu betreiben kein Speicherplatz im RAM oder auf der Platte oder er in einem Zustand erwischt wurde wo mir ein erneutes Neuaufsetzen der Compilation als unsinnig erschien e COMPILER FATAL Diese Gruppe von Fehlermeldungen sollten Sie eigentlich nicht so h ufig zu sehen bekommen denn sie deuten darauf hin dass der CCC sich in einem Zus
56. N TEST Werden bei Dateiangaben innerhalb von Makefiles keine absoluten Pfade verwendet so expandiert CMAKE automatisch das aktuelle Workingdirectory vor die betreffenden Dateinamen In diesen wenigen Zeilen sind die drei wesentlichen Komponenten zur Erstellung von korrekten Ma kefiles zu erkennen In der ersten Spalte beginnend wird das Ziel des Makelaufes notiert hier test sr Dahinter befindet sich in der gleichen Zeile durch einen Doppelpunkt abgetrennt eine optionale Liste der Abh ngigkeiten hier test c test h bei deren nderung eine Aktion gestartet werden soll Die Aktion hier Compiler und Linkerlauf besteht aus einer oder mehreren Zeilen von ausf hrbaren Anweisungen die CMAKE aufrufen soll Die Zeilen mit den Aktionen m ssen mit einem oder mehreren Blanks oder Tabs eingeleitet werden d rfen also nicht in der ersten Spalte beginnen CMAKE sucht bei der Bearbeitung eines Makefiles nach dem zuerst notierten Ziel und kontrolliert des sen Existenz und gegebenfalls das letzte nderungsdatum dieser Datei Danach verf hrt CMAKE auf gleiche Art und Weise mit den Abh ngigkeiten Existiert das Ziel nicht oder ist eine von den Abhingig keitsdateien j ngeren Ursprungs so werden die darunter notierten Aktionen von CMAKE eingeleitet um das Ziel neu zu erstellen In diesem Fall werden Compiler und Linker direkt hintereinander aufgerufen um den gew nschten S Record zu generieren Kommt es beim Ausf hren von Aktio
57. PENTR 64 PIT 64 POT 65 PREV 65 PREVQ 65 QDPC 65 QSA 65 RBCLOCK 65 RCLOCK 65 RCLOCKS0O 65 RELCE 65 RELEA 65 REQU 65 RESRB 65 RETN 65 RSTT 65 RUBBL 65 RWSP 65 SBCLOCK 65 SCAN 65 SUSP 65 TERME 65 TERMEQ 65 TERML 65 TERV 65 TIAC 65 TIACSO 65 TIACQ 65 TIACQSO 65 TICON 65 TICONSO 65 TICONQ 65 TICONQSO 65 TIRE 65 TIRESO 65 TOQ 65 TOV 65 TRIGEV 65 TRY 65 INDEX WFEX 65 WSBS 65 182 WSFA 65 182 WSFS 65 182 XIO 65 TRIGGER 149 true 13 tstart obj 47 48 tstarta obj 48 tstartal obj 48 tstartr obj 48 tstartrO obj 47 tstartr2 0bj 47 tstartr3 obj 47 TWSP 17 18 39 44 87 92 95 97 121 123 125 127 132 133 136 138 139 156 Uhr Interrupt 150 Umgebungsvariablen CCC_68K_LIBS 5 69 71 74 CCC_INCLUDE 5 CCC_PPC_LIBS 5 69 71 74 PATH 5 JNLOAD 102 140 JSE_FPU 104 233 235 JSE FUNCTION_NAME 103 233 235 JSE_NAME 233 235 ser Mode 188 ser Stack 189 Jser Mode 107 110 EEE CC E VECTOR 108 229 230 VECTOR addr 119 Vereinigungsdatentyp 32 volatile 50 55 WARMSTART 114 121 202 236 Warmstart 195 202 Warmstartcode 92 Zeilennummer 17 25
58. Pfad d h haben alle Leser ihre LEAVE bzw ein Schreiber seine FREE Operation durchgef hrt so wird der h chstpriore Prozess mit einer RESERVE Operation in den Zustand lauff hig versetzt und erh lt ggf den Prozessor zugeteilt Nach Abarbeitung der dem RESERVE zugeordneten FREE Operation wird der kritische Pfad wieder freigegeben 15 3 3 3 Interne Blockierbedingung Unter CREST C wurden zus tzlich zwei Funktionen implementiert um die Tasksynchronisation etwas flexibler gestalten zu k nnen void rt_wait_for_activation void void rt_unblock_waiting_task Task tid Eine Task die rt_wait_for_activation aufruft verh lt sich beinahe so als sei sie auf ei ne belegte Semaphore aufgelaufen oder habe sich selbst suspendiert Im Unterschied zu den offizi ellen Taskzust nden SUSP und SEMA lauert die Task jedoch nicht auf Fortsetzung oder die Zutei lung einer Semaphore sondern lediglich die die Aufhebung einer internen Blockierbedingung die z B durch eine Aktivierung erfolgen kann Nach aussen hin tritt die Task als eingeplant in Erscheinung Zustand ist SCHD Nur tritt eine Aktivierung auf so setzt die Task die Arbeit hinter der Funktion rt_wait_for_activation fort und nicht mit einem Neustart der Task legt also eher das Ver halten einer Sema blockierten oder selbstsuspendierten Task an den Tag Die Funktion rt_wait_for_activation kontrolliert dabei intern ob weitere Aktivierungen f r die aufrufende Task vorliegen S
59. Prozessoren MPC603 MPC604 unterst tzt werden und auf Compilerebene die 8 2 3 Der Schnell Einstieg Controller Famile MPC8xx wie ein MPC604 ohne FPU behandelt werden kann existiert nur ein Satz von Bibliotheken long Libs debug Libs stackdebug Libs stdpfast lib stdplong lib stdpstack lib stdpdebug lib stdpstackdebug lib fitpfast lib fltplong lib fitpstack lib fitpdebug lib fitpstackdebug lib fpupfast lib fpuplong lib fpupstack lib fpupdebug lib fpupstackdebug lib 2 3 Der Schnell Einstieg Das erste Programm das mit einem neuen C Compiler ausprobiert wird ist in der Regel hello c An Hand dieses Musterbeispiels mit hohen Wiedererkennungswert soll die Funktionalit t von CREST C demonstriert werden Im Ordner he110 befindet sich der zugeh rige Quelltext Die Datei hello c soll compiliert werden Die Ausgabedatei wird im gleichen Ordner angelegt und sollhello obj heissen ccc hello hello c hello hello obj Ich setze ausreichend Abstraktionsverm gen voraus dass Sie statt hello den Zugriffspfad ihres hello c eingeben werden und gegebenenfalls die verwendeten Slashes durch Backslashes ersetzen und die korrekte Variante des Compilers verwenden ccc 8k bzw cccppc Nach kurzem Gr beln sollte sich der Compiler wieder melden und verk nden er habe hello hello obj ohne Fehler erzeugen k nnen Jetzt wird das Objektfile im n chsten Schritt zu einem kompletten Programm zusammenge bunden cln hello
60. RTOS UH nach Anwendervorgaben bez glich des zu verwendenden RAM s Aber das System arbeitet doch schon mit seinem RAM k nnten Sie hier einwenden Rich tig denn einige Bedingungen m ssen prinzipiell erf llt sein damit RTOS UH es bis zu dieser Stelle schafft 1 Im Bereich von 0x00000008 bis 0x000007FF muss RAM vorhanden sein Hier liegen Vektoren die f r die CPU FPU wichtig sind und vom Betriebssystem aufgesetzt werden m ssen Da derar tige Zugriffe von RTOS UH stets im Supervisor Modus ausgef hrt werden darf dieser Bereich auch von der Hardware gegen User Mode Zugriffe gesch tzt sein 2 Im Bereich ab 0x0000800 muss User Mode taugliches RAM zu finden sein Die ben tigte Gr sse h ngt stark von der Art des konfigurierenden Systems ab Mit 8kB d rfte ein Mini RTOS UH bereits korrekt anlaufen bei dem allerdings kaum mehr Anwenderprogramme zu laden sein werden Realistischer d rfte es sein von 16 bis 32kB RAM auszugehen die ein aus gewachsenes RTOS UH hinter der Adresse 0x00000800 f r sich selbst ben tigt Wo und wieviel RAM ansonsten noch f r Applikationsprogramme ben tigt wird ist dagegen kon figurierbar Dabei ist es nicht notwendig dass diese Bereiche physikalisch hinter den RTOS UH Systemvariablen liegen Die einzelnen RAM Kacheln m ssen auch keine einheitliche Gr sse aufwei sen Das System sucht beim Hochlaufen nach Scheiben mit der Kennung 12 SLICE 12 Es k nnen beliebig viele Scheiben in den Scanbereiche
61. RUN in nahezu jeden anderen Zustand berf hrt werden kann ohne dazu den zugeh rigen offiziellen Weg zu gehen blicherweise sollte man als Programmierer diesen Weg meiden 13 5 5 2 Interrupts feuern Events Wenn Sie zum Beispiel eine FFT durchf hren wollen k nnte der Interrupt Handler so geschrieben sein dass er erstmal 256 Werte aufsammelt und erst dann die Task die die Fourier Transformation berechnen soll aufweckt und die Daten durchreicht Dieses Aufwecken einer Task ist unter RTOS UH ber Prozessinterrupts bzw Events geregelt Sie stel len das softwareseitige Gegenst ck zu Hardware Interrupts dar RTOS UH verwaltet dazu einen in ternen Vektor mit 32 Bits Jedes Bit ist einem Prozessinterrupt zugeordnet Wenn ein Interrupt Handler eine Task ansprechen m chte so muss er nur ein Event feuern Jede Task die sich auf dieses Ereignis eingeplant hat wird beim n chsten Dispatcherlauf lauff hig gemacht und k nnte entsprechend ihrer Priori t auch die CPU zugeteilt bekommen um auf den Prozessinterrupt zu reagieren pragma INTERRUPT LEVEL 3 EPROM EVENT 0x00000001 void InterruptHandler void pragma SYSTEMTASK AUTOSTART void MyTask void for cz rt_event_resume 0x00000001 Im Beispiel w rde bei jedem Auftreten eines Level 3 Interrupts die Task MyTask fortgesetzt die das wiederum zum Anlass nimmt sich erneut auf diesen Prozessinterrupt einzuplanen und sich aufs Ohr zu legen 13 6 Exception Han
62. Run bzw Laufzeitpriorit t neu setzen Wird als Aufrufparameter eine Null angegeben so wird die Defaultpriorit t der Task eingesetzt Der R ck gabewert entspricht der zuvor g ltigen Laufzeitpriorit t Sie sollten dabei stets beachten dass negative Priorit ten unter RTOS UH den hochprioren Systemtasks vorbehalten bleiben sollten Prio rt_get_prio int flag Mittels rt_get_prio kann die aufrufende Task wahlweise ihre Laufzeit bzw ihre Defaultprioritat abfragen Wird eine Null bergeben so liefert die Funktion die Defaultpriorit t Jeder andere Wert f hrt zu Ausgabe der Laufzeitpriorit t 15 2 1 2 Taskname Der Taskname ist neben der TID ein weiteres wichtiges Kennzeichen einer Task Alle Tasks in einem Rechner sollten nicht nur ber ihre TID sondern auch ber den Namen eindeutig voneinander unter scheidbar sein Probleme bei Namensgleichheit treten sp testens dann auf wenn eine Task ber ihren Namen gestartet werden soll 15 2 1 3 Speicherbedarf Um m glichst viele Tasks im Rechner halten zu k nnen teilt RTOS UH diesen den f r lokale Va riable erforderlichen Speicherplatz erst beim Starten zu Daher muss die Gr sse des erforderlichen Task Arbeitspeichers des sog Taskworkspace TWSP im Taskkopf eingetragen sein Beim Starten einer Task unter RTOS UH spricht man vom Aktivieren einer Task teilt RTOS UH dieser Task dann Speicherplatz in der erforderlichen Gr sse zu Beendet eine Task ihre Arbeit unter RTOS
63. Section 58 63 data Section 57 62 dpc Datei 16 err Datei 22 local Section 58 63 Ist Datei 19 obj Datei 9 s Datei 19 text 12 text Section 56 2277 138 ERROR Task 192 203 IDLE 203 IDLE Task 197 NORAM 210 asm 18 endasm 18 include 14 pragma ALLOCATE INTERRUPT BUFFER 111 227 LEVEL 227 SIZE 227 COLDSTART 114 121 196 200 227 DISABLE_ BIT_MNEMONICS 20 228 DISABLE_CLEAR_MNEMONICS 20 228 DYNAMIC_STACK 41 228 NEWSTACK 228 RANGE 228 ENABLE BIT_MNEMONICS 20 228 ENABLE_CLEAR_MNEMONICS 20 228 END_SLICE SKIP 206 229 EXCEPTION 117 119 120 229 HEADER 207 229 INCLUDE_ONCE 16 229 INTERRUPT 108 230 INTERRUPT EXIT 230 INTERRUPT PROCEDURE 230 KALTSTART 231 MEMBER_PADDING 68K 27 MEMBER_PADDING OFF 27 29 231 MEMBER_PADDING ON 27 29 231 MEMBER_PADDING PPC 29 MEMORY 188 231 MODULE 207 231 NO_FPU 104 PEARL PROCEDURE 231 RAM RANGES 208 232 SCAN RANGES 198 232 SET VECTOR 232 STARTSLICE SKIP 206 232 STRUCT_PADDING OFF 233 STRUCT_PADDING ON 233 SUBTASK 98 233 SYSTEMTASK 105 114 234 TAG_COPY BYTE 30 234 TAG_COPY LONG 30 234 TAG_COPY SIZE 30 235 TAG_COPY_WORD 30 234 249 250 TAG_PUSH SIZE 235 TASK 101 235 USE_FPU 104 WARMSTART 114 121 202 236 pragma Kommandos Konstante Ausdriicke 13 Makroverarbeitung 13 Numerische Argumente 13 S 84 AEBIBF95 199 siehe Signalmarke 205 _CPLUSPLUS_ 13 25
64. Systemtask 91 TAG_COPY_BYTE 30 234 TAG_COPY_LONG 30 234 TAG_COPY_SIZE 30 235 TAG _COPY_WORD 30 234 TAG_PUSH SIZE 235 tanh 219 TAS 146 TASK 101 127 235 TASK Resident 127 Task Identifier siehe TID TASKHEADSIZE 106 234 Taskkopf siehe TID Taskkopferweiterung 106 107 Taskworkspace siehe TWSP Taskzustand 133 2722 138 CWS 133 134 137 153 155 257 CYAC 133 137 DORM 104 133 134 136 138 139 141 144 EVAC 133 137 EVCO 133 137 VO 133 134 137 162 172 PWS 133 134 137 138 154 RUN 116 133 136 139 141 148 SCHD 137 147 SEMA 133 134 137 139 145 147 SUSP 133 134 136 138 140 141 144 147 151 TIAC 133 137 TICO 133 137 Taskzustands berg nge 138 Aktivieren 138 Ausplanen 144 Aussetzen 140 Einplanen 141 Ereigniseintritt 148 Fortsetzen 141 Synchronisieren 145 Terminieren 139 Text Relocations 47 TIAC 133 137 TICO 133 137 TID 49 51 92 95 97 98 101 102 105 107 112 123 125 126 131 132 135 138 140 158 160 TRAP 229 TRAP nr 119 Traps ACT 64 ACTEV 64 ACTEVQ 64 ACTQ 64 CACHCL 64 CLOCKASC 64 CON 64 CONEV 64 CONEVQ 64 CONQ 64 CSA 64 DATEASC 64 DCDERR 64 DELTST 64 DISAB 64 DVDSC 64 ENAB 64 ENTRB 64 ERROR 64 FETCE 64 258 FREEB 64 GAPST 64 IMBS 64 INTD1 64 IOWA 64 IROFF 64 ITBO 64 ITBS 64 LEAVB 64 LITRA 17 64 LITRAV 64 MD2B60 64 MSGSND 64
65. _CPU32__ 84 CRESTC_ 25 DATE 25 _FILE_ 25 PPU 84 LINE 25 _LINUX_ 84 _M68K__ 84 _MAKEALL_ 84 MC68000__ 84 _MC68020__ 84 _MPPC_ 25 84 _NT__ 84 _RTOSUH_ 25 84 _STDC_ 25 TIME 25 ABORT 111 121 185 abs 224 absolute 50 Abtastbereich 205 acos 213 215 acosh 218 ALLOCATE_INTERRUPT BUFFER 111 227 Argumentdateien 10 asin 214 216 asinh 218 Assemblerdirektiven BSS_DEF 62 CODE_DEF 61 CODE REF 61 COMMON DEE 63 COMMON RFF 63 DATA DFF 62 DATA REF 62 FUNC_REF 61 LOCAL_DEF 63 LOCAL_REF 63 atan 214 217 atan2 215 INDEX atanh 218 ATSK 127 ATSK Resident 127 Ausnahmebehandlung 107 auto 50 AUTOSTART 234 Basisdatentypen bool 26 char 26 double 26 enum 26 float 26 int 26 long 26 long double 26 Pointer 26 short 26 Betreuungstask 153 BLOCK Byte 134 Blockierbedingung 147 Bolts 147 bool 26 C Shellmodul 8 C Shellmodul 49 51 87 91 92 94 95 97 98 125 C Subtask 91 98 C Task 91 95 97 98 180 calloc 180 Cast 32 35 36 Casting 32 35 36 ccc Optionen 0 10 2 10 3 10 A digit 21 B 21 C digit 11 D digit 11 E digit 11 G digit 16 H path 15 J digit 15 L 17 N 20 Q digit 14 R digit 11 S 13 U 16 37 39 42 43 189 V 14 W digit 21 INDEX Y digit 17 Z 21 macnam repl 13 a digit 24 d digit 24 f digit 24 m
66. auf den erweiterten Taskkopf der Task SysTask zur ckgeliefert wird Bedenken Sie bitte dass ein relevanter Unterschied zwischen der Adresse einer Task aus Sicht des C Compilers und der Adresse einer Task aus Sicht von RTOS UH besteht In der Sprachdefinition von C w re die Adresse der Funktion MyTask die Stelle an der der Maschinencode f r den Ein sprung in die betreffende Funktion zu finden ist RTOS UH versteht unter der Adresse einer Task die Stelle im RAM an der der Taskkopf zu finden ist Diese ist aber erst zur Laufzeit bekannt Die Zuwei sung common_ memory Task amp MyTask 1 w re demnach zwar syntaktisch kor rekt w rde allerdings pfel mit Birnen mischen und zu einem Pointer auf eine absolut sinnlose Stelle im Adressraum f hren Abschliessend sollte noch Erw hnung finden dass Systemtasks nicht mit Parametern aufgerufen wer den k nnen und selbstredend auch keine direkte Funktions Antwort liefern k nnen 13 5 Interrupts und Exceptions Die CPU ist in der Lage zwischen zwei unterschiedlichen Betriebsarten zu unterscheiden Norma lerweise laufen Ihre Programme im User Mode Das Betriebssystem selbst arbeitet meist auf einer h heren Ebene dem Supervisor Mode Im Supervisor Mode stehen den abzuarbeitenden Program men spezielle Befehle des Prozessors und erweiterte Zugriffsrechte zu Verf gung die die Arbeit der artig bergeordneter Programme erleichtern oder erst erm glichen siehe auch Abschnitt 15 7 Unter
67. besteht in der Nutzung der Systemtraps des RTOS UH Das Betriebssystem verwaltet den zur Verf gung stehenden Gesamtspeicher als eine doppeltverkettete Liste von Speicher bl cken Jeder Block beginnt mit einem Verwaltungs Header der die Verkettungspointer und die ak tuelle Verwendung des jeweiligen Segmentes beinhaltet Wenn eine Task mittels der Traps WSBS WSFA oder WSFS siehe RTOS UH Manual F I 66 Speicher vom System anfordert liefert RTOS UH entweder eine Fehlermeldung oder einen Zeiger auf den beschafften Speicherbereich Der Pointer zeigt dabei auf den Verwaltungs Header dieses Blockes In der Includedatei lt rtos h gt finden Sie die Angaben ber den Aufbau solcher Speichersegmente und die Prototypen der Systemanschl sse auf Hochsprachenebene typedef struct LinkedWorkspace MemSectionHeader head struct LinkedWorkspace fort struct LinkedWorkspace backt 15 6 Speicherverwaltung 183 Task tido LinkedWorkspace typedef struct MemSectionHeader struct MemSectionHeader forward struct MemSectionHeader backward UserNumber owner A MemSection typ MemSectionHeader LinkedWorkspace rt_alloc_memory_backward size_t size LinkedWorkspace rt_alloc_memory_forward size_t size LinkedWorkspace rt_alloc_memory_fixed void start vo id tend In CREST C sind die Anschliisse an die Speicherbeschaffungs Traps so implementiert worden dass bei Speicherplatzmangel NULL und sons
68. bewegen kann da sie ja im schlafenden Zustand keine Prozessorkapazit t erh lt und somit ihre eigene Aktivierung nicht veranlassen kann Allerdings kann eine einmal laufende Task sich selbst aktivieren In diesem Fall wird die Aktivierung gepuffert d h f r sp ter aufgehoben Will oder soll diese Task sp ter wieder in den Zustand DORM bergehen so stellt RTOS UH diese gepufferte Aktivierung fest und versetzt die Task wieder in den Zustand RUN Die Task wird dann erneut von Beginn an ausgef hrt RTOS UH kann max 3 Aktivie rungen f r jede Task puffern 15 3 1 3 SUSP Ausgesetzt Eine Task im Zustand SUSP engl suspended dt unterbrochen ist zwar im Prinzip laufwillig und hat auch schon ein oder mehrmals Prozessorkapazit t erhalten will aber zur Zeit keine Prozessorkapazit t erhalten Sie hat die Bearbeitung ihrer Aufgabe freiwillig oder von aussen gesteuert f r eine undefinierte Zeitdauer ausgesetzt Bei der Verteilung der Prozessorkapazit t bergeht RTOS UH eine suspendierte Task Der Zustand SUSP kann vom Bediener ber den Befehl SUSPEND Taskname hergestellt werden Die betroffene Task setzt ihre Ausf hrung an der Stelle an der sie gerade ist aus und kann sp ter ber den Befehl CONTINUE Taskname wieder fortgesetzt werden 15 3 Multi Tasking 137 15 3 1 4 SCHD Eingeplant Eine Task ist engl scheduled dt eingeplant Der Zustand ist dem SUSP insofern hnlich als diese Task im Prinzip laufwillig ist jedoch zu
69. darf und niemand dabei nach einem Waffenschein gefragt wird Wenn Sie Maschinensteuerungen ent wickeln dann k nnen Sie mit einem schlampig geschriebenen Programm ebensogut einen Menschen t ten als ob Sie ihm eine Pistole an den Kopf halten und abdriicken Diese vom Konzept her sehr gelungene Sprache ist durch Leute in Verruf gekommen die der Ansicht sind man k nne mal so eben ein Programm schreiben Best tigt durch schnelle Anfangserfolge man glaubt zu schnell die Sprache zu beherrschen obwohl diese Annahme definitiv falsch ist werden viele Anf nger leichtsinnig und verwenden Features die der Compiler zwar als korrekt anerkennt und das ist erschreckend viel ber deren Folgen dann allerdings alle Menschen staunen die davon sp ter unfreiwillig betroffen sind C steht im Ruf eine System Programmierersprache zu sein und erm glicht dem Programmierer nahezu unbegrenzten Zugang zu allen M glichkeiten die Rechner und Betriebssystem bieten Die von vielen Gurus verteufelten Pointer erlauben eine freie Manipulation des gesamten Systems Bewusst eingesetzt lassen sich wunderbare Dinge damit anstellen von denen FORTRAN und PEARL Programmierer nur tr umen k nnen Gerade f r den Anf nger werden die Freiheiten die die Sprache ihm einr umt sehr schnell zum Alptraum und auch f r mich wenn ich feststellen muss dass mal wieder ein Anwen der am Telefon h ngt der meint RTOS UH mittels CREST C vergewaltigen zu m ssen
70. das Schl ssel wort EPROM eine Scheibe SLICE 14 generieren die den Vektor bereits beim Hochlaufen des Sy stems automatisch initialisiert Mittels EVENT 0x00000001 wird Code erzeugt der beim Verlassen der Interruptroutine RTOS UH anweist einen Software Event f r die angegebene Maske zu feuern Das Schl sselwort IROFF teilt dem Compiler mit dass der Handler vom Eintritt in den Interrupt an auf Level 7 laufen soll will heissen alle anderen Interrupts werden gnadenlos ausgesperrt pragma INTERRUPT LEVEL 6 EPROM EVENT 0x80000000 void InterruptHandler2 void Wie Sie diesem Beispiel entnehmen k nnen wurde diesmal statt VECTOR 0x78 in diesem Falle die Kurzschreibweise LEVEL 6 verwendet Die Umsetzung k nnen Sie der Tabelle 13 1 entnehmen Es wird wieder Code f r den Einsatz in einem EPROM System erzeugt ein anderes Event gefeuert und 13 5 Interrupts und Exceptions 109 die Interruptroutine l uft diesmal ab ohne die Interrupts zu sperren pragma INTERRUPT VECTOR 0x124 void InterruptHandler3 void Diesmal handelt es sich um eine Interruptroutine die fiir nachladbaren Code geeignet ist Sie ist zudem nicht dazu gedacht RTOS UH Tasks per Event ber den aufgetretenen Interrupt zu informieren In ihrem Programm m ssen Sie ohne die Angabe von EPROM den Vektor 0x12 4 selbstst ndig versorgen und per Hand auf ihre Routine setzen Die Angabe von VECTOR sollte dennoch korrekt vorgenommen werden denn der Compiler be
71. der Komponenten innerhalb solcher Strukturen oft erheblich Speicherplatz sparen e Strukturen Unions und Arrays werden durch Padd Bytes stets auf eine durch vier teilbare L nge aufgef llt Der Compiler nutzt dieses Wissen um bei Zuweisungen von Struktur an Struktur oder von Union an Union mit Wort oder Langwortbefehlen zu arbeiten 3 4 1 3 Strukturzuweisungen Die bereits angesprochene Einschr nkung Struktur oder Unionzuweisungen nicht von zu ungera den Adressen durchf hren zu k nnen l sst sich bei Bedarf ebenfalls bersteuern Der CCC besitzt pragma Kommandos um auf unterschiedlichste Art mit Strukturen umgehen zu k nnen Norma lerweise findet das Umkopieren von Tags Strukturen und Unions stets langwortweise statt bis auf das eventuell abschliessende Wort Bis zu einer Gr sse von 20 Bytes findet das Umkopieren durch ex plizite MOVE L bzw MOVE w Befehle im Code statt Bei gr sseren Strukturen werden DBF Schleifen generiert um zum Kopieren nicht kilobyteweise Code zu generieren struct dummy int x 10 double y 20 pragma TAG _COPY_BYTE void b struct dummy a b a pragma TAG _COPY_WORD void wi struct dummy a b a b b wortweise kopieren pragma TAG _COPY_LONG void 1 struct dummy a b a bj b langwortweise kopieren b b byteweise kopieren Mittels der pragma Kommandos TAG_COP Y_BYTE TAG_COPY_WORD und TAG_COP Y_LONG kann der CCC angewiesen werden byte wort oder l
72. des CCC er kennen welche Dateien gelesen INCLUDE datei c bzw ignoriert SKIP datei c werden 3 1 9 3 Ausgabe von Datei Abh ngigkeiten Die Option G digit ist bei der Arbeit mit dem CMAKE Tool interessant das im Kapitel 10 be schrieben wird Um die Abh ngigkeiten von Includedateien und C Dateien verwalten zu k nnen ist der CCC in der Lage die includierten Files in einem gesonderten File dessen Name sich aus dem Namen der Eingabedatei und der Extension dpc ergibt abzuspeichern Im Normalfall werden keine Dependency Dateien G 0 erzeugt kein dpc File erzeugen nur Basis und Zielfile zus tzlich include Dateien zus tzlich lt include gt Dateien nur Liste der Includefiles erzeugen Tabelle 3 8 Erzeugung von Dependency Files 3 1 10 Anschalten der Stack berwachung Mit der Option U wird eine Stack berwachung fest in den generierten Maschinencode eingebaut Es erfolgt dabei eine berpr fung ob beim Eintritt in die jeweilige Funktion der aktuelle Stackpointer in den Sicherheitsbereich 256 Bytes vom physikalischen Stackende der verf gbaren Stacks einge drungen ist oder gar den verf gbaren Bereich schon verlassen hat In diesem Fall erfolgt eine sofortige Unterbrechung der verursachenden Task Stack_overflow_ SUSPENDED Bei einer Fortsetzung dieser Task mittels CONTINUE terminiert diese sich unverz glich Sie sollten dabei immer im Hinterkopf haben dass sich zuvor schon ein GAU ereignet hat
73. des erzeugten Programmes untergebracht und PC relativ adressiert Auch die PC relative Adressie rung derartiger Konstanten unterliegt der Beschr nkung auf 32kB Deshalb gibt es auch hier ei ne Einstellm glichkeit mittels der D digit Option Liegt eine Konstante ausserhalb der 32kB Reichweite so muss das auf die Konstante zugreifende Modul mit D 1 compiliert werden um den Linkerlauf fehlerfrei zu berstehen Option Konstantenzugriff verschieblich MOVE L var W PC DO ja ab MC68000 ja MOVE L var L DO bei MC68000 D MOVE L var L PC DO bei MC68020 Tabelle 3 5 Zugriff auf globale Konstanten Besitzer gr sserer Prozessoren k nnen bei Benutzung der 16 Bit Varianten der gerade aufgef hrten Optionen viele unn tze Befehls und Offset Worte im Programmcode einsparen sie sind jedoch im Gegensatz zu MC68000 Programmierern nicht dazu gezwungen Die gleiche Begrenzung auf 32kB 3 1 Die Optionen des ccc 13 gilt auch f r die lokale Speicherplatzanforderung beim Start einer Funktion Da der Compiler hier Uberschreitungen der 32kB Grenze schon zur bersetzungszeit feststellen kann generiert er Fehler meldungen bei einem derartigen Ansinnen eines mit 0 bersetzten Programmes Die berschreitung des globalen Speicherbedarfes kann jedoch meist erst beim Linken der einzelnen Module festgestellt werden Der Linker gibt dann Relokationsfehler aus 3 1 4 Vorzeichen bei Charactern Da CREST C blicherweise davon ausgeht dass de
74. deshalb ist in Hinblick auf Portierungen mit besonderer Vorsicht zu verfahren 3 6 Die Prototypen 33 sc ve ss Us st Ur St Ur FL DB Ex E 1 L 4 4 4 4 We Ei E E Hy Ola cIa aya aia OW RPP RS ey aS eye ye H oJ ay a a a min aelel H 0 010 0 90 09 I0 xwj ww Ww w w w da y a a ey ay KIXI OS XK XK XK Sei bi BEER Tabelle 3 14 Cast Tabelle Abk rzung Bedeutung nsign j igned Se long double Tabelle 3 15 Bedeutung der Abkiirzungen Die Eintr ge FL sind bei Fliesskommaberechnungen mit besonderer Vorsicht zu geniessen Der Werte bereich einer 1 oat Variable deckt nicht den gesamten Wertebereich einer 32 Bit Integervariable ab Bei automatischen Casts k nnen deshalb signifikante Bits verlorengehen Bitfelder verhalten sich identisch zu den korrespondierenden signed bzw unsigned int Basisdatentypen Der Typ enum ist in Hinsicht auf implizites Casting identisch zum Datentyp signed int Um vern nftigen Maschinencode zu erhalten ist es in der Regel auch angebracht Zahlen Konstanten und Variablen entsprechend zu casten In vielen F llen kann ein Compiler nicht sinnvoll entscheiden ob Ihr Quelltext eine genormte Eigenschaft von C ausnutzt oder ob es sich um schlampige Schreibweisen handelt die er gefahrlos optimieren K nnte 3 6 Die Prototypen Gegner der Sprac
75. die angegebene Datei nicht zugegriffen werden so wird f r 68K System die Um gebungsvariable CCC_68K_LIBS ausgewertet F r PPC Systeme lautet der Name der Variable CCC_PPC_LIBS Wo die Umgebungsvariablen vorbesetzt werden k nnen ist in Abschnitt 2 1 erl utert Die Vorgabe der Umgebungsvariable l t sich mittels der Option L path bersteuern 71 12 6 1 Die Optionen des Ink 6 1 4 Debuginformationen exportieren Die Option z weist den LNK an Debuginformationen die in den Objektdateien enthalten sind in die 1ib Datei zu exportieren Kapitel 7 Der Linker ssl Beim SSL handelt es sich um ein Werkzeug zur Erzeugung von Shared Libraries Bei Fehlbedienungen oder Aufruf ohne Parameter gibt der SSL einen kurzen Uberblick iiber die un terst tzten Optionen aus Sie k nnen diese Usage Meldungen im Anhang ssl68k Abschnitt C 7 ssl ppc Abschnitt C 8 nachschlagen Als Aufrufparameter erwartet der SSL minimal die Angabe einer Linkdatei Die Linkdatei muss eine Liste der zusammenzufassenden Objektdateien und Bibliotheken enthalten Als optionaler zweiter Parameter wird der Name der zu generierenden Ausgabedatei erwartet Fehlt dieser so bildet der SSL diesen automatisch aus dem Namen der Linkdatei durch Ersetzung der Datei extension durch die Endung ss1 Diese Datei enth lt einen S Record der sp ter auf dem Zielsystem im EPROM abgelegt werden muss Weiterhin generiert der SSL eine Datei mit der Endung ref die in bin
76. durch das wiederholte Auftreten identischen Quelltexte nicht in syntaktische Probleme verwickelt wird 3 Wenn eine Headerdatei in mehr als einem Modul eines C Programmes eingef gt werden soll so darf sie keine Definitionen von globalen Symbolen enthalten da sonst sp ter der Linker mit einer Fehlermeldung abbricht 3 1 9 1 Kontrollausgaben w hrend der Compilation Die Optionen V und Q dienen lediglich der optischen berpr fung mit welcher Datei der CCC zur Zeit besch ftigt ist Im Normalfall sind diese Optionen obsolet und bremsen nur die Compilation durch 3 1 Die Optionen des ccc 15 unn tige Bildschirmausgaben Option V Anzeige der includierten Dateien und bersetzten Funktionen r Anzeige fehlgeschlagener Zugriffe auf Includedateien Q digit Anzeige des Quelltextes bis zur angegeben Includetiefe Tabelle 3 6 Kontrollausgabe bei der Compilierung Die V Option zeigt die gerade in Arbeit befindlichen Dateien namentlich an und und bringt auch die jeweilige Funktion auf den Schirm N tzlich ist in diesem Zusammenhang die Option r die w hrend des bersetzungslaufes die fehlge schlagenen Versuche des Compilers ausgibt Includedateien zu lokalisieren Die Option Q veranlasst den Compiler die gerade gelesene Quelltextzeile auf dem Schirm auszugeben Mit O hexdig1t l sst sich die Tiefe der auszugebenden Includeschachtelung bestimmen Bei Q 0 wird nur noch der Quelltext der Hauptdatei angezeigt Die Anzeige de
77. festgestellt haben dass Sie z B mehrere C Compiler gleichzeitig laufen lassen k nnen Der Witz besteht darin dass der Code des Programmes nur einmal im Speicher vorliegen muss das System aber eine Reihe unabh ngiger Prozesse generiert die auf diesem Codebereich unabh ngig voneinander arbeiten und dass jeder dieser Prozesse seinen eigenen Datenbereich besitzt Wenn Sie die Notwendigkeit erblicken innerhalb eines C Programmes mehrere nebenl ufige Tasks zu verwenden so kann dies mittels eines pragma Kommandos bewerkstelligt werden Sie kodie ren die zuk nftige C Subtask als normale Funktion innerhalb Ihres Programmpaktes Dabei k nnen selbstverst ndlich auch Argumente bergeben werden Die R ckgabedatentypen sind entweder void signed char unsigned char oder Task Was spielt sich dabei genau ab Sie rufen die zuk nftige C Subtask wie eine normale Funktion auf Die aufrufende Funktion legt die Argumente auf den Stack generiert einen Taskkopf f r die neue C Subtask kopiert eine Reihe von Informationen die der Vater an den Sohn weiterleiten m chte und erkl rt das S hnchen dann f r startklar Ob das Kind gleich losl uft h ngt direkt von der zugewiesenen Priorit t ab Sie haben jetzt einen nebenl ufigen Prozess der mit eigenem Stack und eigenen lokalen Daten arbeitet aber auf die globalen Daten der Vater Task zugreifen kann Beispiele f r die Syntax bei der Verwendung des pragma SUBTASK Kommandos k nnten wie folgt
78. float Parameter und double Parameter werden vor der Argument bergabe auf long double gecastet Parameter vom Typ long oder long dou ble werden nicht gecastet Es kommt also definitiv nicht zu impliziten Genauigkeitsverlusten wenn Sie z B einen Long double Parameter mit printf ausgeben wollen Dadurch ergeben sich bei der Verwendung offener Parameterlisten komische Effekte Bei der Funktion printf sind die Gr ssenangaben vor Integer und Floatingpoint Datentypen redundant sollten aber in Hinblick auf portable Programme nie vergessen werden Wenn Sie selbst Funktionen schreiben die derartige offene Aufrufe handhaben sollen so ber cksichtigen Sie bitte dass alle Integerdatentypen im int Format und die Floatingpoint Datentypen im long double Format auf dem Stack liegen Selbstverst ndlich erstreckt sich die Typen berpr fung auch auf die m glichen Argumente der Argu mente Die Kontrolle erfolgt rekursiv solange bis CREST C berzeugt ist dass Sie wissen was Sie tun Zwei kleine Beispiele sollen das verdeutlichen extern int f e void f 1 Elda 2 I Sr Eb Vora J 28 gt void f 1 1 2 f 1 2 3 Die Verwendung der Funktion in der Funktion e f hrt zu Warnungen Ist jedoch die Definition erst erfolgt oder war der Prototyp von komplett so ist CREST C erst wirklich ver rgert So zu sehen bei der erneuten Anwendung von f in der Funktion g Das zweite Beispiel zeigt die Ve
79. folgt eine Liste mit Informationen die vom Startupcode dazu verwendet werden etwaige Initialdaten im dat a Bereich ihres Programmes beim Start der Task korrekt aufzusetzen Beim Aufruf eines C Shellmoduls generiert RTOS UH zun chst einen Taskkopf der mit den Informa tionen im Kopf des C Shellmoduls korrespondiert Dieser dynamische Taskkopf ist jetzt mit dem Code der Shellextension verkn pft und enth lt zudem eine Reihe von Standardvorbesetzungen Weiterhin legt die Shell einen zugeh rigen Taskworkspace f r die neu entstandene Task an Nun analysiert die Shell die Kommandozeile die Sie hinter dem Namen der Shellextension angege ben haben Dabei werden Sachen herausgefiltert die auf Shellebene eine Bedeutung besitzen wie z B Semikolon und Doppelstriche Der Rest wird in einen Puffer mit maximal 255 Zeichen kopiert Jetzt wird erstmals der Startupcode des C Shellmoduls in die Aktionen einbezogen RTOS UH unter stellt dass es sich stets um ein PEARL Shellmodul handelt und transferiert deshalb die Daten im f r PEARL Prozeduren blichen Verfahren CREST C Programme tarnen sich entsprechend und ver halten sich beim Anlaufen wie PEARL Prozeduren Der Aufbau der bergabeparameter sieht dabei wie folgt aus 1 Adresse DATION Block stdin 2 Adresse DATION Block stdout 3 Adresse DATION Block stderr 4 L nge der Commandline 94 13 1 C Shellmodule 5 Pointer auf die Commandline 6 Pointer auf die Return Zelle Die drei
80. geh rigen Headerdateien Diese Pfade sollten dem Betriebssystem ber zugeh rige Environment Variablen bekannt gemacht wer den um den weiteren Umgang mit den Programmen zu vereinfachen In den folgenden Beispielen repr sentiert der Ausdruck INSTALL den kompletten Pfad der CREST C Installation 6 2 2 Lieferumfang im berblick 2 1 1 WINDOWS 95 98 Folgende Eintr ge sind in der Datei AUTOEXEC BAT vorzunehmen PATH PATH INSTALL cbin SET CCC_INCLUDE INSTALL h SET CCC_68K_LIBS INSTALL Ae ib_68k SET CCC_PPC_LIBS INSTALL clibppe 2 1 2 WINDOWS NT4 0 Die folgenden Einstellungen sind tiber das Control Panel unter System Environment vorzu nehmen Path alter Kram INSTALL cbin CCC_INCLUDE INSTALL h CCC_68K_LIBS INSTALL clib_68k CCC_PPC_LIBS INSTALL clibppc 2 1 3 Linux Folgende Eintr ge sind in der Datei et c profile vorzunehmen export PATH SPATH INSTALL cbin export CCC_INCLUDE INSTALL h export CCC_68K_LIBS INSTALL clib_68k export CCC_PPC_LIBS INSTALL clib_ppc Damit sollten die vorbereitenden Massnahmen bereits abgeschlossen sein 2 2 Lieferumfang im berblick 2 2 1 cbin Der Ordner cbin enth lt die ausf hrbaren Programme des Paketes Unter WINDOWS sind dies Bei Installation f r 68k Zielsysteme e ccc68k exe C Compiler e cln68k exe Programm Linker e Ink68k e
81. glich ist Echtzeit F higkeit Bei Mehrprozessor Rechnern k nnen durchaus mehrere Tasks gleichzeitig aktiv sein bei einem Einprozessor System kann zu einem Zeitpunkt nat rlich nur eine Task exekutiert werden Im folgenden Text wird stets von einem Einprozessor System ausgegangen Die analoge bertragung auf ein Mehrprozessor System ist jedoch relativ einfach 15 2 1 Task Eigenschaften Unter einer Task versteht RTOS UH ein eigenst ndig arbeitendes Programm Um unter RTOS UH als Task anerkannt zu werden muss dieses Programm einige Eigenschaften haben Diese Eigenschaf ten m ssen gem ss den Spielregeln von RTOS UH in einem Verwaltungsblock dem Taskkopf notiert werden Hochsprachen Programmierer brauchen sich um die Generierung dieser Taskk pfe normaler weise keine Gedanken machen dies bernimmt der Compiler Assembler Programmierer m ssen die sen Taskkopf jedoch selbst generieren Nach dem Laden eines Programmes muss dieser Taskkopf im Speicher vorhanden sein oder wird von CREST C dynamisch erzeugt Spricht man unter RTOS UH von der Adresse einer Task so meint man die Adresse des Taskkopfes die sogenannte TID Task Identifier Neben den hier explizit aufgef hrten Informationen sind im Taskkopf noch wesentlich mehr zum Teil nur betriebssysteminterne Daten enthalten auf den genauen Aufbau und die weiteren ent haltenen Daten wird detailliert zu sp terer Zeit eingegangen 132 15 2 Tasks und Tasking 15 2 1 1 Priorit t Di
82. hello lnk hello hello sr N HELLO Dazu muss die Datei hello 1nk entsprechend erstellt worden sein Sie enth lt die Liste s mtlicher Objekt und Libraryfiles die zum Endprodukt geh ren Es soll das Startupfile mit dem Objektcode unseres hello c zusammengebunden werden Fehlende Funktionen soll der Linker aus der Standard bibliothek f r den MC68000 entnehmen Als Beispiel soll ein C Shellmodul entstehen Der Name unter dem die Shellextension sp ter dem System bekannt sein soll wird mit der Option N HELLO angegeben Das Resultat heisst hello sr und kann auf dem Zielsystem wie blich in den Speicher geladen werden LOAD hello sr Mittels k nnen Sie nun feststellen dass ein neuer Bedienbefehl HELLO im System vorhanden ist Jetzt kann das Programm gestartet werden HELLO Sie haben jetzt also einen kompletten Entwicklungszyklus per Hand durchgef hrt Nun K nnen Sie den Zyklus nochmals mittels CMAKE durchspielen cmake hello hello mak Sie werden sehen dass Sie nichts sehen Da Ihr Projekt bereits in aktueller Form vorliegt gelangt CMA KE auch zu der berzeugung es g be nichts zu tun Nach einer beliebigen nderung inhello cund einem erneuten Aufruf von CMAKE wird jedoch der gesamte Zyklus den Sie gerade manuell eingege ben haben vom CMAKE abgespult und Sie erhalten ein neues hello sr Kapitel 3 Der Compiler ccc Bei Fehlbedienungen oder Aufruf ohne Parameter gibt der CCC einen kurzen berblick ber die un ters
83. im Grunde ge nommen der Heimatspielplatz dieses Compilers gewesen Trotzdem habe ich mich in der Mitte der Entwicklungsphase dazu entschlossen mich von der alten Norm endg ltig zu verabschieden Nahezu zwei Jahre lang verstand CREST C keine K amp R Definitionen mehr und in dieser Zeit habe ich mich gezwungenermassen daran gew hnt die ANSI C Norm als Mass aller Dinge zu betrachten Ich m chte behaupten dass mir das nicht geschadet hat Der Zwang s mtliche Quelltexte erst ANSI C konform umzuhacken bevor ich sie CREST C vorwerfen konnte f hrte zu interessanten Einsichten e ANSI C Compiler f hren definitiv nicht zu betriebssichereren Programmen solange man sie nicht mit ANSI C Quellen f ttert e Ein Compiler der auch die alte Norm akzeptiert f hrt bei Portierungen meist zu einem wunder baren Mischmasch da man sich meist nicht der M he unterzieht Abhilfe zu schaffen e Warnings f hren nicht dazu dass Quelltexte berarbeitet werden Wenn der Compiler dem Pro grammierer nicht sofort an die Kehle springt ndert sich in der Regel auch nichts am Quelltext Das Resultat meiner berlegungen sehen Sie nun vor sich CREST C liebt Prototypen Sie sollten sich ihm schnell anschliessen wenn Sie nicht in einem Hagel von BUS ERROR s untergehen m chten CREST C ist zwar im Gegensatz zu den ersten Version unendlich viel nachsichtiger mit schlampig geschriebenen Quelltexten geworden aber wenn Sie nicht genau wissen was Sie tun
84. in dem die Gr sse eines Puffers an gegeben werden kann Wozu ein Puffer werden Sie sich vielleicht beim Vergleich mit anderen Betriebs systemen fragen Im Abschnitt 15 5 2 2 werden die M glichkeiten beim Umgang mit CE s weitergehend erl utert F r die CE Anforderung ist es erstmal nur wichtig sich dar ber klarzuwerden ob man die Daten eines O Vorgangs in eigenen Puffern C Variablen oder dynamisch angefordertem Procedure workspace halten m chte oder den Puffer in einem Rutsch zusammen mit dem CE Verwaltungsblock neu anfordern m chte oder muss Wenn Sie auf einen CE internen Puffer verzichten wollen ist 1en 0 zu bergeben Sie erhalten dann einen Pointer auf den nackten CE Kopf 1en Werte gr sser Eins f hren dazu dass direkt im Anschluss an den CE Kopf ein nicht initialisierter Speicherblock allokiert wird Die Abbildung 15 4 verdeutlicht dass man um Puffer bei CE s nicht herumkommt wenn Daten gelesen oder geschrieben werden sollen Der Eintrag buf fer im CE muss auf einen Speicherbereich zeigen der f r den I O Vorgang verwendet 15 5 VO unter RTOS UH 155 werden soll Wenn Sie ein CE mit internem Puffer anfordern so ist dieser Pointer bereits initialisiert Ansonsten miissen Sie buffer selbst auf einen Speicherbereich vorbesetzen Interner CE Puffer Externer Puffer Abbildung 15 4 CE mit eigenem oder externem Puffer Uber die L ngenangabe wird auch gesteuert ob das CE Kontingent berschritten w
85. kommen dass dieses Bit bei Eingabe CE s nur von zweifelhaftem Nutzen ist Im Eintrag st atus_of_io besteht zudem noch die M glichkeit ein einzelnes Bit STABFL frei zu verwenden das innerhalb von RTOS UH keinerlei Ber cksichtigung findet Und jetzt noch das CE abschicken und vergessen rt_transfer_ce wce_D 15 5 VO unter RTOS UH 171 return 1 15 5 3 1 4 Ein Eingabe CE aufbereiten und wegschicken Bei Eingaben gibt es drei wesentliche M glichkeiten dem Treiber Daten zu entlocken 1 Sie wollen die Daten ab dem Augenblick haben an dem Sie ihre Eingabe ans System schicken lesen vom A Kanal 2 Sie wollen auch Daten lesen die seit dem letzten Leseauftrag eingelaufen sind gt lesen vom B Kanal 3 Sie wollen die Daten haben die aktuell schon empfangen wurden und Sie wollen nicht blockiert werden wenn nicht alle Daten da sind die Sie sich gew nscht h tten lesen vom C Kanal Sie sollten alle Beispiele durchlesen und m glichst begreifen wenn Sie sich ernsthaft vorgenommen haben unter RTOS UH VO Operationen erfolgreich durchzuf hren 15 5 3 1 4 1 Eine Eingabe vom A Port Fangen wir mit einer einfachen Lese Operation vom A Port an Die Schnittstelle sei diesmal A1 int Al_Eingabe char str auto RFILE port_info_A register Ce rce_A register int retval rt_get_filedata amp port_info_A Al A_Port rce_A rt_fetch_ce 1 rce_A gt ldn port_info_A ldn rce_A gt driv
86. konfliktfrei Eingabeaufforderungen ber einen der Kan le Ax Bx oder Cx an die gleiche Schnittstelle gesendet werden Die Ausgabe ber einen D Kanal unterscheidet sich nicht von der Ausgabe ber den A Kanal Um das folgende Beispiel nicht zu trivial werden zu lassen sollen gleichzeitig andere M glichkeiten von RTOS UH Treibern demonstriert werden int D2_Ausgabe char str auto RFILE port_info_D register Ce wce_D if rt_get_filedata amp port_info_D D2 D2_Ausgabe return 0 else Bis hierher noch kein Unterschied Aber jetzt soll ein CE mit internem Puffer angefordert werden der 170 15 5 VO unter RTOS UH den String aufnehmen kann Sinn der bung soll sein den String auszugeben ohne auf die Beendigung der Ausgabe warten zu m ssen wce_D rt_fetch_ce strlen str 1 amp TIL 1 So und das war gleich noch etwas mehr Hier wurde die L nge des Strings ermittelt und auf die n chsth here ungerade Zahl aufgerundet um die Kontingent berwachung auszuschalten Aber daf r geht es jetzt weiter wie schon bekannt wce_D gt 1ldn port_info_D ldn wce_D gt drive port_info_D drive strcpy wce_D gt file_name WRITE_D xFF Jetzt stimmt der Adressat Beim Ubertragungsmodus kommen jetzt aber wieder ein paar kleine Ande rungen um die Sache spannender zu gestalten wce_D gt mod MODMOU Output einstellen IOCRWI Befehl READ WRITE Diesmal wird das CE als pur
87. lauten pragma SUBTASK PRIORITY 20 STACKSIZE 4096 pragma SUBTASK PRIORITY 20 pragma SUBTASK STACKSIZE 20000 PRIO 5 pragma SUBTASK Die default Priorit t eine C Subtask ist 20 und die default Stackgr sse der aufgesetzten Sub task betr gt 4 kB Die Angabe der Stackgr sse erfolgt in Bytes Es sind keine Argumentdeklarationen mit offener Parameterliste soll heissen mit den drei P nktchen erlaubt Wenn Sie wirklich darauf Wert legen sollten besteht nat rlich immer noch die M glichkeit einen derartigen Parametertransfer mittels des von main verwendeten Verfahrens zu kodieren Die Subtask liefert dem Aufrufer auf Wunsch ihren Namen oder den Pointer auf ihren Taskkopf zur ck Wenn der Name von Interesse ist muss lediglich der R ckgabedatentyp als Character Pointer verein bart werden Der Speicherbereich in dem der Name abgelegt wird ist dann mittels mal loc auf der Aufruferseite beschafft worden und kann vom Vater der erzeugten Subtask mittels free freigegeben werden Folgende Punkte sind beim Umgang mit C Subtasks zu beachten e C Subtasks lassen sich nur von C Shellmodulen C Tasks und anderen C Subtasks aus aufset zen e Terminieren Sie die Task main niemals bevor alle C Subtasks beendet sind Sie ziehen da mit den Sohnprozessen den text data und bss Bereich unter dem Hintern weg Die schnellste M glichkeit zur Blockierung von main besteht darin ein schlichtes for rt_suspend am
88. meisten seriellen und parallelen Schnitt stellen langsam im Vergleich zur Prozessorgeschwindigkeit Daher gibt es in RTOS UH f r jede Schnittstelle eine Interrupt Routine die die Ein und Ausgabe von Zeichen unabh ngig von jeder Task durchf hrt Lediglich f r Anfang und Ende des I O Vorgangs arbeiten diese Interruptroutinen mit ihren Systemtasks zusammen F r die Dauer der tats chlichen Ein oder Ausgabe setzen diese Systemtasks ihre Abarbeitung aus sind im Zustand SUSP und werden von den Interrupt Routinen nach Beendi gung der I O wieder fortgesetzt 15 4 1 3 Floppy Interrupt Auch beim Betrieb von Massenspeichern treten l ngere Wartephasen auf Daher existieren auch hier im Regelfall Interrupt Routinen die es erm glichen dass der Prozessor in Wartephasen den laufwilligen Tasks zugeteilt wird Die zugeh rige Systemtask h lt f r diese Zeit ihre Abarbeitung ebenfalls an und wird bei Bedarf von der Interrupt Routine fortgesetzt 15 5 VO unter RTOS UH Wesentlicher Bestandteil eines jeden Betriebssystems ist die Kommunikation mit der Peripherie In einem Single Tasking Betriebssystem ist die Behandlung von I O Vorgangen relativ simpel Hier regt sich niemand auf wenn der Rechner auf Bedienerebene steht nur weil man eben mal DIR gesagt hat In einem Echtzeit Multitasking System sind die Anforderungen an die I O schon erheblich rabiater Einerseits bewerben sich nun mehrere Parteien quasi parallel um die Betriebsmittel und anderersei
89. muss Besteht zum Zeitpunkt der Terminierung einer Task bereits eine Einplanung auf ein weiteres Ereignis so wird ebenfalls der TWSP nicht freigegeben weil das Betriebssystem konomisch denkt und sich sagt dass ein solcher Taskworkspace demn chst wann auch immer das sein mag wieder ben tigt wird und es keinen Sinn macht das Teil erst zu verschrotten und dann neu zu beschaffen 14 2 Taskk pfe bei Shellmodulen W hrend f r jedes Maschinenprogramm das als Task kodiert ist bereits ein Taskkopf vorhanden sein muss ist es f r Shellmodule etwas beschwerlicher Ein Shellmodul hat keinen eigenen Taskkopf Wenn RTOS UH ber die Shell feststellt dass ein Shellmodul angesprochen wird so generiert es erstmal einen eigenst ndigen Taskkopf f r eben diese Anforderung und verkn pft diesen Taskkopf mit dem Maschinencode dessen Position im Shellmodulkopf angegeben ist Anschliessend gibt es eine neue Task im System Nunmehr besteht kein wesentlicher Unterschied mehr zwischen einer Task die bereits mit eigenem Taskkopf kodiert wurde und einer Task deren Taskkopf dynamisch f r ein Shellmodul angefordert wurde Unterschiede werden erst wieder akut wenn die reinrassige statische Task bzw die Task des Shell moduls zu dem Entschluss kommen dass die Arbeit nun getan sei und sich terminiert Eine Task die 126 14 3 Speichersektionen aus einem Shellmodul entstand auch als Subtask oder dynamische Task bezeichnet ist als klei
90. nach M glichkeit keinen Gebrauch machen Weiterhin sei dringend angeraten die Lesbarkeit durch sinnvolle und spre chende typedef s zu erh hen Funktionelle nderungen ergeben sich schliesslich durch derartige Typenvereinbarungen in der Sprache C nicht 3 6 3 Abweichende Funktionsaufrufe Ihren schlechten Ruf hat die Sprache C sich nicht zuletzt deswegen eingehandelt weil sich bei fehler haften Funktionsaufrufen nahezu beliebiger Unfug im Rechner abspielen kann Wenn man einen Stapel UNIX Quelltexte zu portieren hat ist unweigerlich immer wieder festzustellen dass derartige Konven tionen sehr langlebig sind und echte Freaks nicht sonderlich begeistert von dem Gedanken sind sich von einem Compiler vorschreiben zu lassen wie man vern nftige Programme zu schreiben hat Auf erwachsenen Betriebssystemen mag eine solche Einstellung ja noch angehen da diese mittels MMU Einsatz dazu erzogen wurden bin re Amokl ufer ohne Schaden f r andere Prozesse zu erschlagen Unter RTOS UH sind die Folgen in der Regel um Gr ssenordnungen fataler Mit einem reinrassigen ANSI C Compiler haben Sie nahezu keine Chancen ltere K amp R Quelltexte zu l uff higen Programmen zu bersetzen Eine Funktion die mit drei Argumenten definiert wurde sollte eben nicht mit zwei oder vier Parametern aufgerufen werden Soviel zu meiner felsenfesten ber zeugung und nun zur Implementierung CREST C insistiert inzwischen nicht mehr darauf dass derart grober Unf
91. ohne auch nur von rudiment rsten Sprach oder Betriebssystemkenntnissen belastet zu sein Wenn ich in ein un bekanntes Auto einsteige dann schaue ich in der Bedienungsanleitung nach wie die Gangschaltung funktioniert und wie ich das Licht anzuschalten habe eben so als Minimum meines Interesses Vie le Neu C Programmierer sind da anders wenn Sie am Baum kleben beschimpfen Sie die Sprache weil Sie sich nie die M he gemacht haben sich ber die Existenz einer funktionierenden Bremse zu informieren Die Sprache C verlangt viel freiwillige Disziplin vom Anwender Manche Leute nutzen diese M glich keiten von C dickf llig aus und fallen damit regelm ssig auf die Nase Der Erfolg solcher Unter nehmungen ist dann in der Regel belster M ll der besser gleich nach der Fertigstellung in der Tonne verschwinden sollte Unwartbare Programme sind vergeudete Zeit Was Sie bei der Programmerstellung an Minuten sparen wird beim Austesten und Debuggen in Stunden und Tagen auf Sie zur ckkommen Vor ein paar Jahren usserte sich Brian Kernighan zum Thema C sehr treffend Die beste Methode um eine Sprache zu lernen besteht darin einen Compiler dafir zu schreiben Ich habe es so gehalten und bin heute noch manchmal berrascht was man alles mit C anstellen kann wenn man die Spra che und das zugrundeliegende Konzept durchblickt hat Betrachten Sie die Tatsache dass selbst ich als Compilerbauer gelegentlich sehr scharf nachdenken muss um heraus
92. realistisch dass die Informationen im Messagepuffer zum Zeitpunkt ihrer Auswertung von der ERROR Task bereits hoffnungslos veraltet sind Ein beliebtes Beispiel zu diesem Thema stellt der COPY Befehl dar Die Abschlussmeldung CO 15 8 Fehlermeldungen 193 PY xx TERMI wird von der COPY xx Subtask nach der Beendigung ihres Tuns mittels des ERROR Trap s auf die Reise geschickt blicherweise wenn nicht zuviele Meldungen quasi gleich zeitig anfallen oder das Ausgabeger t z B durch Ctrl S blockiert wird schafft es die hochpriore ERROR Task aus dem Taskidentifier im Meldungspuffer noch den Namen der Task zu dekodieren und auszugeben Ist die ERROR Task allerdings kr ftig mit Ausgaben besch ftigt so greift das Mul titasking und der COPY Prozess benutzt die freibleibende CPU Zeit um zwischenzeitlich aus dem System zu verschwinden Kommt die ERROR Task nun endlich doch noch bei dem Eintrag an so stellt Sie fest dass die dort eingetragene TID nicht mehr g ltig ist und gibt als Zeichen ihres guten Willens den Pseudo Tasknamen aus Dieses Verhalten gilt allerdings nur f r den Tasknamen Bei dem optinalen Ausgabetext besteht f r die ERROR Task keinerlei Chance festzustellen ob der Pointer im Messagepuffer noch auf einen sinnvollen Text zeigt Deshalb auch die oft ignorierte Massgabe dass der ERROR Trap nur mit einem Pointer auf einen konstanten Text versorgt werden darf Im folgenden Fall wurde das Beispiel d
93. schreiben deren S Records keine R Symbole mehr enthalten Der Linker CLN gibt die Zahl der Relokationen am Ende des Linkerlaufes aus LOAD Relocs Text Relocations 0 Data Relocations 0 Runtime Relocs Data Relocations 0 Local Relocations 0 Unterschieden wird dabei zwischen LOAD Relocsund Runtime Relocs Die Angaben unterhalb des LOAD Relocs Eintrages beziehen sich auf die Zahl der im S Record enthaltenen R Symbole die zur Adressierung von absoluten Zugriffen auf die text Section ben tigt wurden Text Reloca tions bezieht sich auf Zugriffe die innerhalb der text Section auftreten z B Funktionsaufrufe Data Relocations bezieht sich auf Zugriffe die innerhalb der dat a Section gefunden wurden z B initialisierte Funktionspointer oder Zeiger die auf konstante Tabellen verweisen Werte ungleich Null sind ein klares Indiz f r die Tatsache dass das gelinkte Programm nicht frei verschieblich ist Die Angaben unterhalb des Runtime Relocs Eintrages beziehen sich auf Relokationen die erst nach dem Start des Programmes ausgef hrt werden k nnen da die notwendigen Adressinformationen weder w hrend des Linkerlaufes noch beim Laden des Programmes zur Verf gung stehen CREST C Programme wickeln diese Adressaufl sungen innerhalb des Startup Codes ab Runtime Relocs f hren nicht zu R Symbolen innerhalb der S Records und haben keinerlei Einfluss auf die Verschieb lichkeit von Programmen Die dort aufgef hrten Data
94. sr eine Regel zu jeder Abh ngigkeit zu finden Trifft CMAKE auf eine Regel mit Wildcard so versucht es das Wildcardzeichen durch Substitution des Basis namens der untersuchten Abh ngigkeit zu ersetzen 10 3 Syntax von cmake 83 Bei der Suche nach Regeln f r Abh ngigkeitsdateien wird die Liste der Regeln im Makefile von un ten nach oben durchsucht Die erste Regel die hier berpr ft w rde w re folglich die f r test obj und erst danach die f r obj Sie sollten bei der Verwendung von Wildcards also stets darauf ach ten Spezialf lle die nicht durch Wildcardregeln behandelt werden sollen hinter der Wildcardregel zu notieren 10 3 4 Makros Der Umgang mit Makros erleichert die Erstellung von allgemeing ltigeren Makefiles Um z B ein Pro jekt sowohl f r 68K als auch f r PowerPC Zielsysteme zu compileren w ren ohne die Verwendung von Makros zwei unterschiedliche Makefiles zu erstellen und zu pflegen Am folgenden Beispiel soll die Verwendung von Makros demonstriert werden Projekt f r 68K und PPC CCC ccc68k CLN cln68k EXT 68k CCC cccppc CLN clnppc EXT ppc test sr test c test h S CCC test c test obj S CLN test EXT Ink test sr N TEST Die Definition vom Makros erfolgt ab der ersten Spalte einer Zeile Der zu ersetzende Makrobe zeichner wird mit einem Gleichheitszeichen abgeschlossen Es folgt ein optionaler Ersatztext in der gleichen Zeile Die Anwendung des Makros erfolg
95. ssen werden in der Regel in gesonderten Dateien gesammelt Bei diesen gemeinsamen Informationen handelt es sich in der Regel um eine Zusammenstellung von Makros applikationsspezifische Datentypen Varia blendeklarationen und Funktionsprototypen Der Aufbau und Inhalt dieser Dateien ist weitestgehend eine Erfahrungssache und Geschmacksfrage Im Prinzip kann eine solche Datei einen beliebigen Na men erhalten und beliebigste g ltige C Syntax enthalten also auch Funktionen oder Bruchst cke von Funktionen In der Praxis haben sich jedoch einige Regeln in Bezug auf derartige Dateien weitestgehend durchgesetzt Die Dateiendung lautet normalerweise h wobei diese Extension f r header steht da diese Dateien blicherweise ganz oben also im Kopf eines C Modules mittels der Pr pro zessoranweisung include eingef gt werden Im Sprachgebrauch haben sich diverse Bezeichnungen wie Headerfile und Includedatei festgesetzt Die Aufgabe des Pr prozessors besteht nun unter anderem darin die include Anweisungen korrekt aufzul sen und die verschiedenen Dateien f r den sp teren Compilerlauf zu einer Einheit zu verschmel zen Im Umgang mit Headerdateien treten mehrere interessante und l stige Probleme auf 1 Der Pr prozessor muss die angegebene Includedatei finden 2 Ein mehrmaliges Einf gen der gleichen Includedatei innerhalb einer einzelnen bersetzungs einheit sollte vermieden oder wenigstens so gehandhabt werden dass der Compiler
96. steht Nach dieser langen Vorrede d rfte klar sein dass sich auch eine Abart von Interruptcode erzeu gen l sst die die Interruptroutine ohne Test der DPC Zelle verl sst Mittels des Schl sselwortes NO_DISPATCHER_CALL unterbleibt der Test und der Code des Interrupthandlers terminiert mittels eines RTE pragma INTERRUPT NO_DISPATCHER_CALL void BrutalerAusstieg void 13 5 5 Synchronisation von Grund und Interruptebene Eine weitere Schwierigkeit bei der Erstellung von Interrupt Handlern besteht darin Ereignisse die bereits zu Aktionen auf Interruptebene gef hrt haben der oder den interessierten Tasks der Grundebene mitzuteilen Dabei sollten Sie stets folgendes im Auge behalten e Interrupt Routinen geh ren zu den privilegierten Prozessen im System was ihre Prioritit be trifft Dabei laufen Sie auf Supervisor Mode der CPU und haben somit quasi eine Priorit t die gemeine Tasks mit den handels bliche Methoden des Taskings nie erreichen k nnen e Interrupt Routinen geh ren zu den benachteiligten Prozessen im System was die Nutzung der allermeisten Systemdienste betrifft Es ist schlicht all das untersagt was dazu f hrt oder f hren k nnte dass Ver nderungen an den diversen Speicherverkettungen von RTOS UH vorgenom men werden was nahezu alle Traps betrifft Im Prinzip sind Sie nur auf der sicheren Seite wenn Sie keinerlei Traps von Interruptebene aus aufrufen Das wiederum verlangt eine ganz andere Her
97. teren Versionen von CMAKE verschwinden Sie sollten alte Makefiles deshalb auf die offizielle Schreibweise umstellen 10 3 Syntax von cmake 85 Tabelle 10 3 CMAKE Kommandozeilen Makros 10 3 5 Pr prozessor Beim Parsen der Makefiles wird ein kleiner Pr prozessor eingesetzt der folgenden Befehlssatz versteht e if macro e if macro e else e elif macro e lelif macro e lendif e linclude filename e lerror text e message text 10 3 5 1 Bedingte Ausf hrung des Makefiles Die Kommandos if und elif gestatten es durch Abfrage der Existenz eines Makros Teile des Makefiles bedingt auszufiihren Die Abfrage l sst sich durch Verwendung eines vor dem Makro in vertieren Projekt f r 68K und PPC unter Verwendung von Makros if __M68K__ EXT 68k lelse EXT ppc lendif CCC ccc EXT CLN cln EXT OUTPUT objS EXT S S OUTPUT test sr test c test h S CCC test c OUTPUT test obj CLN testS EXT Ink S OUTPUT test sr N TEST 86 10 3 Syntax von cmake Auf diese Art l sst sich gesteuert ber den Aufruf in der Kommandozeile automatisch das korrekte Projekt erzeugen cmake 0K generiert Code f r den MC68000 cmake P erzeugt das identische Projekt f r einen PowerPC als Zielsystem Die Kommandos else und endif entsprechen in ihrer Funktionalit t den C Pendants 10 3 5 2 Includieren von Dateien Das Kommando include erlaubt es Dateien innerhalb eines Mak
98. tzlich zu den programmtechnischen Massnahmen mit der Stackcheck Option abzudichten Bei ausgetesteten Programmen sollte die U Option allenfalls in kritischen Berei chen aktiviert sein da die st ndigen Funktionsaufrufe doch ganz erhebliche Rechenzeit kosten Je nach Komplexit t der Funktionen k nnen da schon mal 5 bis 30 der Rechenleistung kommentarlos den Bach runtergehen Achtung Benutzen Sie nie die U Option aus Programmcode heraus bei dem A4 nicht korrekt gesetzt ist So besitzen z B weder Interruptroutinen Kalt noch Warmstartscheiben einen Taskworkspace und folglich auch kein g ltiges A4 Der Compiler unterdr ckt zwar selbstst ndig innerhalb solcher Son derfunktionen die Generierung des Stackcheckcodes Dies gilt jedoch nicht f r Funktionen die aus einem derartigen Rumpf heraus aufgerufen werden Findet z B innerhalb der Interruptroutine Inter rupt der Funktionsaufruf TesteBitteDieHardware statt und enth lt eben diese Funktion 40 3 8 Lokale Variablen und Argument bergabe Stackcheckcode dann geht der Rechner nach relativ kurzer Zeit in die ewigen Jagdgr nde ein Der Compiler hat keine Chance derartige Konstellationen abzufangen Hier ist Umsicht auf der Program miererseite verlangt Achten Sie auch peinlich genau darauf dass die Verwendung der mit U bersetzten Bibliotheken t dlich ist wenn Funktionen dieser Libraries von Code aufgerufen werden bei denen A4 nicht gesetzt ist Selbst ein unschuldiger str
99. und rt_event_activate_quick verwendet void rt_event_activate char name Prio prio Event mask void rt_event_activate_quick Task task Prio prio Event mask Zus tzlich zu den Parametern bei rt_activate wird noch eine Event Maske bergeben in der die Events auf 1 gesetzt sind auf die die Task eingeplant werden soll Bestehende Einpla nungen werden gel scht e zeitlich eingeplante Fortsetzung Zeitlich eingeplante Fortsetzungen entsprechen den zeitlich eingeplanten Aktivierungen wo bei weder eine zyklische Einplanung noch die Begrenzung auf einen bestimmten Zeitraum oder bis zu einem bestimmten Zeitpunkt m glich sind Eine zeitlich eingeplante Fortsetzung wird mit den Bedienbefehlen AT Uhrzeit CONTINUE Taskname oder AFTER Zeit dauer CONTINUE Taskname definiert Die C Funktionen rt_timed_continue und rt_timed_continue_quick erlauben analog zu den rt_ timed_act ivat e Funktionen ei ne Fortsetzung einer Task zu oder nach einer bestimmten Zeit oberstes Bit der Zeitangabe void rt_timed_continue char name TimeSchedul zeit 3 void rt_timed_continue_quick Task task TimeSchedul zeit Die folgenden Funktionsaufrufe setzen die Bits in der Zeitangabe automatisch und unterscheiden sich ansonsten nicht von den vorgenannten Basisfunktionen void rt_at_continue char name TimeSchedul zeit void rt_at_continue_quick Task task TimeSchedul zeit p j void rt_after_continue
100. und die Task nur gestoppt wurde weil sie entweder schon schlimme Verw stungen angerichtet hat oder im n chsten Augenblick eine Breitseite in Ihre Variablen oder gar auf die Systemverzeigerungen abgefeuert h tte Es ist immer 3 1 Die Optionen des ccc 17 angebracht nach einem solchen Vorfall alle offenen Dateien zu schliessen und RTOS UH neu zu starten Was es mit dem Stack genau auf sich hat wird im Abschnitt 3 7 explizit beschrieben 3 1 11 Generierung von C Zeilennummern im Assemblercode Die Option L f hrt dazu dass der Compiler zu jedem Label in der Assemblerausgabe die Zeilennum mer des C Quelltextes angibt Diese Option gestaltet die Assembler bzw Listingdateien lesbarer 3 1 12 Generierung von C Zeilennummern im Programmcode RTOS UH bietet die M glichkeit Tasks auf Ebene von Zeilennummern zu tracen Zu diesem Zweck h lt jede Task eine 16 Bit Zelle mit der aktuellen Zeilennummer in ihrem Taskworkspace CREST C bietet dem Anwender zwei unterschiedliche M glichkeiten die Line Zelle mit der jeweiligen Zeilen nummer des C Quelltextes zu versorgen Die erste Methode besteht in der Verwendung des daf r vorgesehenen Systemtraps LITRA Die Sache hat allerdings einen b sen Haken da dieser Trap eine ganze Anzahl von Prozessorregistern ver ndert und somit ein aufwendiges Retten und Restaurieren dieser Register unumg nglich ist Dieser Vorgang kostet deutlich Rechenzeit und kann je nach Anforderung an die Echtzeitf hi
101. ver rgert werden k nnte Sie befinden sich schliesslich in einer Um gebung in der Sie nie so genau wissen wer sonst noch auf den Pointerketten langl uft die Sie gerade verschrotten wollen Durch das Umschalten in den Supervisor Mode erreichen Sie exklusiven Zugriff auf die Speicherverzeigerung Erst wenn die Auskettung erfolgreich abgeschlossen wurde geh rt der ausgekettet Block Ihnen alleine und kann gefahrlos mittels rt_free_memory freigegeben werden Um diese Arbeit zu vereinfa chen k nnen Sie auf die Funktion rt_pwsp_free_memory zur ckgreifen die f r Auskettung und Verschrottung von Speicherbl cken sorgt die mittels der rt pwsp alloc Funktionen und aus schliesslich diese sind gemeint allokiert wurden Eine dringende Warnung Verwechseln Sie nie die Funktionen rt_pwsp_free_memory und rt_free_memory Sie verheizen damit mutwil lig wichtige Speicherketten und die Fehlersuche in einem Programm das den Rechner bei jedem Test ermordert ist aufwendig 15 6 Speicherverwaltung 185 Um es Ihnen zu erm glichen bei Bedarf eigene Allokationsroutinen zu schreiben liegen hier exempla risch die Funktionen rt_pwsp_alloc_memory_forward und rt_pwsp_free_memory im Quelltext vor void rt_pwsp_alloc_memory_forward size_t netto register LinkedWorkspace header header rt_alloc_memory_forward netto sizeof Linked Workspace if header return header else return NULL
102. wie OS 2 und WINDOWS NT die nur von Taktfrequenz und Chiptechnologie leben als echtzeitf hig zu bezeichnen Ein Flugzeugtr ger ist nicht daf r gebaut an Schnellbootrennen teilzunehmen obwohl die PS Ausstattung einer solchen schwimmenden Festung die kleinen Renner ziemlich blass aussehen l sst 15 1 Das Betriebssystem RTOS UH soll als Betriebssystem die Resourcen eines Rechners Speicher Prozessor I O Schnittstellen verwalten und Anwenderprogrammen Dienstleistungen zur einfachen Nutzung dieser Resourcen zur Verf gung stellen Um diese Aufgabe effizient zu erf llen bedient sich RTOS UH dreierlei Hilfsmittel es besteht aus einem Betriebssystemkern dem sogenannten Nukleus der ber Systemaufrufe Traps die Manipulation von Tasks kontrolliert und den Systemspeicher verwaltet aus Interrupt Routinen die grundlegende I O Operationen abwickeln und aus Systemtasks die komple xere Verwaltungsaufgaben erledigen In den folgenden Kapiteln erfolgt zun chst eine grunds tzliche Betrachtung des Taskings unter RTOS UH Der Begriff der Task ist fundamental f r das Verst ndnis des Systemverhaltens 15 1 1 Nomenklatur der C Funktionen CREST C unterst tzt die M glichkeiten des RTOS UH durch die Bereitstellung aller wesentlichen RTOS UH Traps auf Funktionsebene Die Namensgebung der Systemaufrufe folgt nicht den Mne monics der entsprechenden Traps die im RTOS UH Handbuch festgelegt sind Stattdessen wurden sprechende Namen gew hlt die
103. zu verwenden Die Kommandos wir ken global auf alle Strukturen die im weiteren Verlauf der bersetzungseinheit vereinbart werden Das Padding der Gesamtstrukturgr sse wird davon jedoch nicht ber hrt und ist grunds tzlich ein durch vier teilbarer Wert typedef struct Testl char a 0 short b 2 char ca 4 int a 8 char ej 12 Testl sizeof Testl 16 pragma MEMBER_PADDING_OFF typedef struct Test2 char a 0 short b 1 char ue 2 3 int d 4 char e 8 Test2 sizeof Testl 10 pragma MEMBER DADDING ON CREST C legt die Komponenten einer Struktur stets in der Reihenfolge der Definition ab und versucht nicht den Speicherbedarf einer Struktur zu optimieren Die Struktur in Abbildung 3 5 belegt 28 Bytes im Speicher obwohl die Summe der einzelnen Komponenten nur 16 Bytes betr gt Bei der Anpassung eigener Strukturen an vorgegebene Datentypen m ssen Sie folgendes beachten e Alle 8 Bit Daten werden nicht gepadded e Alle 16 Bit Daten werden auf 16 Bit Adressen abgelegt e Alle 32 Bit Daten werden auf 32 Bit Adressen abgelegt e Strukturen liegen immer auf 32 Bit Grenzen Felder liegen immer liegen immer auf 32 Bit Grenzen sofern der Basisdatentyp nicht 8 oder 16 Bit breit ist In diesen Sonderf llen werden die Daten auf 8 bzw 16 Bit Grenzen gelegt 30 3 4 Benutzereigene Datentypen e Wenn Sie nicht an einen bestimmten Aufbau gebunden sind k nnen Sie durch Umstellung
104. zun chst ungew hnlich und oder verwirrend Als L sung f r ein schnelles Echtzeitbetriebssystem sind die gew hlten Ans tze von RTOS UH jedoch meist sehr elegant aber leider teilweise auch hochgradig gew hnungsbed rfig 14 1 Taskkopf und Taskworkspace Wenn man sich anschaut was eine Task unter RTOS UH ausmacht dann stolpert man zun chst ber den Begriff des Taskkopfes W re RTOS UH kein Multi Tasking System so w rde der nackte Motorola Maschinencode ausreichen um ein Programm auf der CPU ablaufen zu lassen Der nackte Chip braucht prinzipiell nur seinen Start PC und etwas korrekten Maschinencode und schon kann man von einem Programm sprechen Soll ein Rechner mehrere Programme verwalten k nnen so muss vom Betriebssystem was ja selbst schon das erste Programm repr sentiert einige Verwaltungsarbeit geleistet werden Die Verwaltungsinformationen werden unter RTOS UH im Taskkopf abgelegt Dort findet die Ver kn pfung von Maschinecode mit einem symbolischen Namen dem Tasknamen statt Ebenso werden hier die Informationen ber Priorit ten Einplanungen Aktivierungen und wesentliche System bedingungen gehalten Die Abbildung 14 1 zeigt den Aufbau eines Taskkopfes Eine Task ben tigt also erstmal eine solche Verwaltungsstruktur Das entspricht in etwa der Geburts urkunde im realen Leben wenn man sich an ein Amt wenden m chte Wer einen Personalausweis beantragen m chte sollte eben auch besser ein Papier ber s
105. zwei Gr nden fehlschlagen Einerseits muss es sich beim Verursacher nicht zwangsweise um eine Task handeln Auch Interruptrou tinen sind potentielle Kanditaten f r Fehler und entsprechende Meldungen In diesem Falle kann kein User zugeordnet werden und die Meldung landet auf der Systemconsole blicherweise eben auf dem Terminal das mit der Schnittstelle A1 oder wie die Betreuungstask f r LDN 0 auch immer heissen mag verdrahtet ist Andererseits besteht bei Ringpuffern auch st ndig die Gefahr dass diese berlaufen Wenn schnel ler Meldungen in den Puffer hineingeschrieben werden als die Ausgabeseite herauslesen kann gehen schlicht Meldungen verloren Womit der Punkt erreicht ist an dem die Leseseite des Ringpuffers betrachtet werden soll Es handelt sich dabei um die bereits angesprochene ERROR Task In der Systemkette werden Sie diese bli cherweise unter dem Namen ERROR finden Im hochgelaufenen Systemzustand liegt diese hochpriore Task permanent in Lauerstellung und wartet geduldig dass ein ERROR Trap ausgel st wird der sie fortsetzt In diesem Falle bastelt sie sich aus den Informationen des Ringpuffers einen String zusammen der mittels eines speziellen Ce s zur Schnittstelle des betreffenden Users geschickt wird Da der eigentliche Ausgabevorgang nur mit einem gewissen Zeitaufwand zu erledigen ist ber serielle Schnittstellen geht da z B bei 9600 Baud pro Zeichen eine Millisekunde ins Land ist es durchaus
106. 0007FE0O Soll heissen an der Adresse 0x00D113AC liegen die Nutzdaten einer 12er Scheibe und der RAM Bereich ist von 0x800 bis Ox 7FDFF spezifiziert wie sich mittels DM leicht verifizieren l sst DM D113AC 6 00D113A6 AEB1 BF95 039D 0000 0800 0007 FEOO 0000 Bei der Implementierung des hier betrachteten Systems wurden folglich bereits 512 Bytes vor RTOS UH in Sicherheit gebracht was z B mittels des Kommandos pragma RAM_RANGES 0x800 0x7FEOO zu erreichen ist Um weiteren Speicher f r eigene Nutzung abzuschneiden reicht es in der Regel aus die Endadresse einer bereits im System vorhandenen RAM Scheibe um die entsprechende Anzahl von Bytes herabzusetzen und eine eigene angepasste Scheibe im Scanbereich unterzubringen Es besteht allerdings auch die M glichkeit gewollt L cher in den linearen Speicher zu stanzen So bewirkt das folgende Kommando dass der Bereich von 0x40000 bis Ox4FFFF der RTOS UH Verwaltung entzogen wird pragma RAM_RANGES 0x00800 0x40000 0x50000 Ox7FEOO 210 17 5 RAM Scheiben generieren Die resultierende Speicherliste hat dann folgendes Aussehen 00002D4E gt 00002D58 MARK 00002D58 gt 00002DBA ATSK Resident IDLE 00002DBA gt 00002E1C ATSK Resident ERROR 00002E1C gt 00002E7E TASK Resident EDFMN 00002E7E gt 00002EE0 TASK Resident VDATN 00002EE0 gt 00002F42 TASK Resident XCMMD 00002F42 gt 00002FA4 TASK Resident NIL 00002FA4 gt 00003006 TASK Resid
107. 1 C Shellmodule f rs RAM Ein mit sstart s gelinktes Programm liefert einen S Record der an beliebiger Stelle mit LOAD in den RAM Speicher geladen werden kann Der Lader bertr gt die im S Record enthaltenen Informa tionen in den RAM Speicher und l st dabei auch etwaige Referenzen die in der Datei an den G bis Z Symbolen zu erkennen sind auf Nach dem Laden ist das C Shellmodul in diversen Speicherketten ordnungsgem ss eingetragen und der oder die Namen der Shellextension sind mit dem Kommando abfragbar Die Abbildung 13 1 zeigt in der oberen linken Ecke den Aufbau eines derartig geladenen C Programmes 13 1 C Shellmodule 93 Lade Position Shellmodulkopf Shellmodulscheibe text Bereich Initial data common Bereic Relocation Infos Taskkopf A Taskworkspace e local Bereich data Bereich bss Bereich Abbildung 13 1 RAM Shellmodul Hinter dem Modulkopf und dem oder den Namen der Extensions beginnt der text Bereich in dem der eigentliche Maschinencode abgelegt ist Hier liegen auch konstante Strings und Tabellen Dahinter folgen die Initialdaten des Programmes F r Sie als C Programmierer bedeutet es dass f r jede dau erhafte Variable der Sie einen Startwert zugewiesen haben hier der Initialwert als Konstante abgelegt wird Es folgt sofern Ihr Programm absolute Variablen definiert hat ein vom Lader gel schter Speicherbereich der common Bereich Es
108. 10 und bei long double Rechnung 10 Die Funktionen liefern in diesem Fall eine Null als Funktionsergebnis und zeigen den Verlust s mtlicher signifikanter Stellen durch das Setzen von err no auf EDOM 218 A 3 Hyperbolische Funktionen A 3 Hyperbolische Funktionen A 3 1 acosh Syntax float facosh float x double acosh double x long double lacosh long double x A 3 2 asinh Syntax float fasinh float x double asinh double x long double lasinh long double x A 3 3 atanh Syntax float fatanh float x double atanh double x long double latanh long double x A 3 4 cosh 12 cosh x 10 Syntax float fcosh float x double cosh double x long double lcosh long double x A 3 Hyperbolische Funktionen A 3 5 sinh 15 sinh x 10 4 3 2 1 0 1 2 3 4 Syntax float fsinh float x double sinh double x long double lsinh long double x A 3 6 tanh 1 0 8 0 6 0 4 0 2 0 0 2 0 4 0 6 0 8 1 1 Aa I ow I bo I m oO E bo wo amp Syntax float ftanh float x double tanh double x long double ltanh long double x 219 220 A 4 Exponential und logarithmische Funktionen AA Exponential und logarithmische Funktionen A 4 1 exp 25 20 15 10 5 0 Se eer 3 2 1 0 1 2 3 Syntax float fexp float SR Rie double exp double x
109. 2 Bit Prozessoren und keineswegs um eine Vorgabe gem ss ANSI Norm Namen sind f r die Strukturmit glieder nicht zwingend vorgeschrieben So f hrt z B die 6 zwischen den Eintr gen c und d zur Bele gung von 6 Bits Ein Zugriff kann dann jedoch auf Grund des fehlenden Namens nicht mehr erfolgen Der Abbildung 3 7 k nnen Sie entnehmen in welcher Form CREST C Bitfelder im Speicher ablegt Eine Null als L ngenangabe f hrt zu einem Padding auf die n chste Byte Grenze Grunds tzlich sollten Sie jedoch das Padding durch explizite Angaben selbst bernehmen da sich unterschiedliche Compiler auf unterschiedlichen Maschinen keineswegs sonderlich einig sind ob auf Byte Wort oder Lang wortgrenzen gepaddet werden soll Abbildung 3 7 Speicherbelegung eines Bitfelds Eine wesentliche Grenze bei der Auslegung von Bitfeldern unter CREST C basiert auf der Unf higkeit des MC68000 Datenworte oder langworte von einer ungerade Adresse zu lesen Bei Bitfeldkompo nenten mit mehr als 17 Bit L nge ist stets darauf zu achten dass ein solcher Wert mit einem Langwort zugriff von der vorausgegangenen Wortgrenze beginnend zu lesen sein muss In der Regel ist die beschriebene Einschr nkung allerdings eher rein akademischer Natur berhaupt ist der praktische Nutzwert von Bitfeldern eher kritisch zu beurteilen Bitfelder sollten dann eingesetzt werden wenn es darum geht Integer Daten mit beschr nktem Wertebereich m glichst spei cherplatzspar
110. 2 Coon nen 110 13 5 3 Kommunikation mit Interrupt Handlern 2 2 22 o 111 13 5 3 1 Interrupt Handler zum Nachladen 111 13 5 3 2 Interrupt Handler in EPROM s 113 13 5 3 3 Interrupt Handler mit absoluten Variablen 114 13 5 4 Das Verlassen einer Interrupt Routine 115 13 5 5 Synchronisation von Grund und Interruptebene 115 13 5 5 1 Interrupts entblockieren Tasks 2 2 2 2 22 20m 116 13 5 5 2 Interrupts feuern Events 116 13 5 6 Fehlerbehandlung auf Interrupt Level 117 13 6 Exception HandlerinC nna Como 117 13 6 1 Exceptions f r EPROM Systeme kodieren 119 13 6 1 1 Kodierung von Traps 00000000004 119 VI INHALTSVERZEICHNIS 13 6 1 2 Kodierung von Line A Funktionen 120 13 7 Kalt und Warmstart Code 121 14 ber Programme Tasks und Shellmodule 123 14 1 Taskkopf und Taskworkspace 123 14 2 Taskk pfe bei Shellmodulen 125 14 3 Speichersekti nen 22 4 4 oe tg 2022 a a ER Die a 126 15 RTOS UH Der Einstieg 129 15 1 Das Betriebssystem 130 15 1 1 Nomenklatur der C Funktionen 130 15 1 1 1 Relative oder absolute Zeitangaben 130 15 1 1 2 Trapinterne Tasksuche 2 2 oo onen 131 15 2 Tasks und Tasking A eu 222 222 ar a ea Dia E d 131 15 2 1 Task Eigenschaften 131 15 26 potter wen ale A 132 15 26 02 Taskname srt A Ber 2 ira ar DE aan 132 15 2
111. 2E10 gt 00002E72 TASK Resident EDFMN 00002E72 gt 00002ED4 TASK Resident VDATN 00002ED4 gt 00002F36 TASK Resident XCMMD 00002F36 gt 00002F98 TASK Resident NIL 00002F98 gt 00002FFA TASK Resident UAR_ 00002FFA gt 0000305C TASK Resident UDU_ 0000305C gt 000030BE TASK Resident UAR_2 000030BE gt 00003120 TASK Resident UDU_2 00003120 gt 00003182 TASK Resident USER1 00003182 gt 000031E4 TASK Resident USER2 000031E4 gt 00003246 TASK Resident USERT 00003246 gt 000032A8 TASK Resident V_DUP 000032A8 gt 00003F0A ATSK Resident VTERM 00003F0A gt 0007FDF6 FREE 0007FDF6 gt 00000000 MARK Dieser Speicherliste stammt von einem leeren 512kB Rechner bei dem offensichtlich 512 Bytes am 17 5 RAM Scheiben generieren 209 oberen Ende des verf gbaren Speichers weggeschnitten wurden f r Profis an der letzten Zeile ables bar wo bei einem normalen System 0007FFD6 gt 00000000 MARK zu erwarten gewesen w re Mittels folgender paar Programmzeilen l sst sich feststellen wie und welche RAM Scheiben vom System erkannt wurden void ZeigeScanRanges void ScanSave temp ULONG per y if ptr rt_scan_first 12 amp temp NULL do PEINERE EE nt PER J F while ptr gt 0 DEEL H 081X 3081X n ptr 0 ptr 1 ptr 2 priante NE while ptr rt_scan_next amp temp NULL Im vorliegenden Fall liefert das Programm die folgende Ausgabe 00D113AC 00000800
112. 3 Die Bitmuster die sich hinter den symbolischen Namen verbergen sind bei Bedarf der Includedatei lt rtos h gt zu entnehmen Nat rlich k nnen die Informationen ber die Task zum Zeitpunkt ihrer Auswertung schon berholt und v llig veraltet sein das ist eben das grosse Elend beim Multitasking Es handelt sich immer nur um einen Schnappschuss des jeweils aktuellen Taskzustandes der sich beim n chsten Timerinterrupt schon wieder ge ndert haben kann 15 3 Multi Tasking 135 LKBWS auf Workspace LKBSE auf Semaphore SEMA Tabelle 15 2 Belegung des BLOCK Bytes zur Aktivierung zur zeitlichen Aktivierung zur zyklischen Aktivierung SCHBWA auf Aktivierung bei Event EVAC SCHBTC zur zeitlichen Fortsetzung TICO SCHBWC auf Fortsetzung bei Event EVCO Tabelle 15 3 Belegung des SCHEDULE Bytes Um die Vorgehensweise von rt_task_status zu verdeutlichen k nnen Sie dem nachfolgenden Quelltext entnehmen was sich dabei intern abspielt und wo RTOS UH die betreffenden Informationen ablegt ULONG rt_task_status char taskname ULONG status Task task_ptr if task_ptr rt_search_task taskname NULL if task_ptr gt fors status 0x00000000UL Irgendwas ist gerade los else status 0x80000000UL Nicht in Aktivitaeten verwickelt status ULONG task_ptr gt block lt lt 8 ULONG task_ptr gt sched else return OxFFFFFFFFUL
113. 3 EPROM Shellmodul 13 2 C Tasks Die Kodierung eines Programmes als C Task hat nach aussen hin ein anderes Verhalten als das der C Shellmodule So lassen sich bei der Aktivierung einer Task keine Ubergabeparamter an die main Funktion transferieren oder ein R ckgabestatus definieren Ein C Programm das als Task ablaufen soll sollte die Funktion main als void main void void main int argc char argv anlegen Die Angabe des R ckgabedatentyps int ist nicht sch dlich hat aber auch keinerlei Auswir kung In der zweiten Variante ist argc grunds tzlich gleich Eins und argv 0 enth lt den Tasknamen Weitere Parameter lassen sich nicht entgegennehmen 13 2 1 C Tasks f r RAM oder EPROM Der interne Aufbau von tstart s unterscheidet sich erheblich von seinem Pendant f r C Shellmodule tstart s ist ein Zwitter Wird ein Programm mit diesem Startup gelinkt so existiert nach dem Laden mit LOAD automatisch ein Taskkopf im Speicher und braucht nicht erst dynamisch erzeugt zu werden In der EPROM Variante existiert entsprechender Code im Startup um RTOS UH zum automatischen Einrichten eines Taskkopfes bereits in der Hochlaufphase zu bewegen Wenn das System aufgewacht ist existiert folglich bereits ein Taskkopf f r das Programm Der Vorteil eines statischen Taskkopfes besteht darin dass Sie durch Vorgabe des Tasktyps residente oder autostartf hige Tasks anlegen k nnen wie in der Beschreibung des CLN bei den Opt
114. 3 1 2 Ein Ausgabe CE aufbereiten und wegschicken Als Beispiel soll zun chst mit einer einfachen bung begonnen werden Uber die Schnittstelle A2 soll ein kleiner ASCII Text ausgegeben werden Die Beispielfunktion sei so angelegt dass sie im Fehlerfall Null und im Erfolgsfall einen Wert ungleich Null liefert Es wird damit begonnen die Parameter der Schnittstelle zu ermitteln was man selbstverst ndlich in ei ner echten Anwendung nicht in der Ausgaberoutine sondern vielmehr einmal vorneweg machen w rde int A2_Ausgabe char str auto RFILE port_info_A register Ce wce_A S if rt_get_filedata amp port_info_A A2 A2_Ausgabe return 0 else Hat diese Aktion zum Erfolg gef hrt dann kann man sich mit der Beschaffung eines CE s besch ftigen Zun chst soll mal ein einfacher Fall durchgespielt werden und das CE soll schlicht den Puffer ausgeben dessen Pointer von draussen reingereicht wurde Dazu ben tigt das CE keinen eigenen Pufferspeicher und kann folglich mit der Puffergr sse Null vom System angefordert werden wce_A rt_fetch_ce 0 Soweit kein Problem denn der Pointer wce_A enth lt immer einen giiltigen Zeiger auf ein CE wenn die Funktion aus dem Betriebssystem zur ckkehrt blicherweise geht das ganz fix aber Sie entsinnen sich der grunds tzlichen Ausf hrungen ber CE s und Kontigent berwachung des CE Speicherplatzes einer Task Wenn Sie sich ganz dumm stellen und in einer Schleife zehnta
115. 51E 0001 1 61111111E 0000 2 38888889E 0000 FP 4 00000000E 0000 1 66666667E 0001 7 16666667E 0000 4 18604651E 0001 FPSR 00000008 n z i nan Kapitel 12 Bibliotheken von CREST C Gerade in Hinsicht auf die Erzeugung kompakter Zielprogramme werden die Bibliotheken des CREST C Paketes mit unterschiedlichen bersetzungsparametern f r die verschiedenen Prozessor reihen ausgeliefert long Libs debug Libs stackdebug Libs stdOfast lib stdOlong lib stdOstack lib stdOdebug lib stdOstackdebug lib fitOfast lib fltOlong lib fltOstack lib fltOdebug lib fltOstackdebug lib ffpOfast lib ffpOlong lib ffpOstack lib ffpOdebug lib ffpOstackdebug lib Tabelle 12 1 Verf gbare 68000er Bibliotheken Tabelle 12 2 Verf gbare CPU32 Bibliotheken Tabelle 12 3 Verf gbare 68020er Bibliotheken long Libs debug Libs stackdebug Libs stdpfast lib stdplong lib stdpstack lib stdpdebug lib stdpstackdebug lib fitpfast lib fltplong lib fitpstack lib fitpdebug lib fitpstackdebug lib fpupfast lib fpuplong lib fpupstack lib fpupdebug lib fpupstackdebug lib Tabelle 12 4 Verf gbare PowerPC Bibliotheken Die ersten drei Buchstaben des Namens geben dar ber Aufschluss ob es sich um reine Integer Bibliothen handelt oder welche Art von Fliesskommaarithmetik von der Bibliothek unterst tzt wird e std Integer Bibliothek ohne Fliesskomma Unterst tzung e fit Fliesskommaemulations Bib
116. 75 9 Der Objekt Inspektor cop 77 10 Das cmake Utility 79 10 1 Die Optionen des cmake o o 79 10 2 Das erste Makefile torio gh ates van ger Dean eh ee ae 80 10 3 Syntax von omake n aE a e A A a E A E A E A E A a Ae 81 10 3 1 Kommentare u 2 2 0 000 a ne rn 81 LS Zeilenfortsetzune 325 4 sy ig a Sr RE et ATS Re 82 10 3 3 Wildcards 2 2 0 2 2 we en 82 10 34 MARTOS 4 54 sa Sek Sen a Sn en ee ee 83 INHALTS VERZEICHNIS V 10 3 4 2 Spezielle Kommandozeilen Makros 84 10 35 PraprozessOr gt Zos or ad ta e a 85 10 3 5 1 Bedingte Ausf hrung des Makefiles 85 10 3 5 2 Includieren von Dateien oo nun 86 10 3 5 3 Ausgeben vom Meldungen o e 86 11 Der Post Mortem Dump pmd 87 12 Bibliotheken von CREST C 8 13 CREST C Programme 91 1391 de TEE EE we Oa ead 92 13 1 1 C Shellmodule f rs RAM 92 13 1 2 C Shellmodule f rs EPROM e 94 1322 E TasKsSse cx na ade an a se 95 13 2 1 C Tasks f r RAM oder EPROM 95 13 3 CESSUDLASKS zu sr wre mer a OS en A WERNE 97 13 3 1 Langlebige Subtasks 101 13 3 2 Umgang mit Subtasks 2 222 Common en 102 13 3 3 Benutzung der FPU bei Sohn Tasks o e 104 13 4 Systemtasks 2 ut 222 A a ur aa AA ae A a 104 13 5 Interrupts und Exceptions 107 13 5 1 Laufzeitcode eines Interrupt Handlers o o o 110 13 5 2 Die Interrupt Data Pointer 22 2
117. ANSI C Funktionen legt CREST C f r jede Subtask einen eigenst ndigen Ringpuffer an in dem alle dynamischen Speichersegmente die w hrend der Lebensdauer einer Task angefordert wurden verzeichnet sind Beim Start der Task ist dieser Ring noch leer Ber cksichtigen Sie bitte bei der Verwendung dieser Funktionen dass Aufrufe nur innerhalb 15 6 Speicherverwaltung 181 von C Tasks und deren Ablegern zul ssig sind In Exception Handlern PEARL Unterprogrammen und allen anderen F llen in denen der Aufrufer keine regul re C Task ist haben diese Funktionen und auch Bibliotheksroutinen die sich darauf abstiitzen nichts verloren da ein Crash sonst unvermeidlich ist Wenn eine Speicheranforderung des Benutzers nicht mittels der freien Segmente im Freispeicherring befriedigt werden kann so holt sich die aufgerufene Funktion Nachschlag vom RTOS UH Dabei hat es sich als praktikabel erwiesen die Mindestgr sse der Allokationen vom RTOS UH auf 1kB festzusetzen Der Aufrufer erh lt einen Block der angeforderten Gr sse und der bersch ssige Speicher wird dem Freispeicherring zugef hrt Bei gr sseren Anforderungen wird exakt die verlangte Gr sse vom System allokiert Die R ckgabe des dynamischen Speichers mittels free f hrt jedoch niemals zu einer R ckgabe des betreffenden Speichers an das Betriebssystem Um es unmissverst ndlich zu formulieren Was Sie einmal mit den ANSI C Allokationsroutinen unter CREST C geholt haben geht erst mit
118. Basisdatentyp nicht 8 Bit breit ist In diesem Sonderfall werden die Daten auf 8 Bit Grenzen gelegt e Strukturen Unions und Arrays werden durch Padd Bytes stets auf gerade L ngen aufgef llt Der Compiler nutzt dieses Wissen um bei Zuweisungen von Struktur an Struktur oder von Union an Union mit Wort oder Langwortbefehlen zu arbeiten Bei der Programmierung des MC68000 bzw der CPU32 m ssen Sie also auf memcpy umsteigen wenn Sie beabsichten Struktu ren Unions von zu ungeraden Adressen zu transferieren Sie sollten sich also ganz schnell angew hnen die Berechnung der Gr ssen benutzereigener Objekte dem Compiler zu berlassen Der sizeof Operator ist die einzige amtliche Methode bei solchen Aktionen portabel zu bleiben F r die Bestimmung des Offsets einer Struktur Komponente gibt es das offsetof Makro in lt stddef h gt 3 4 1 2 Memberpadding PPC F r den PowerPC existieren im Vergleich zur 68K Familie leicht abweichende Regeln bez glich des Paddings innerhalb von Strukturen Innerhalb der PowerPC Familie exitiert ein 32 und ein 64 Bit Zweig Da bislang nur RTOS UH Implementierungen f r Vertreter der 32 Bit Gattung vorliegen 601 603 604 etc beziehen sich alle weiteren Ausf hrungen ausschliesslich auf diese CPU s F r den den auszuf hrenden Code gilt die einfache Regel alles auf 32 Bit Grenzen ablegen weil die CPU sonst ernsthaft maulig ist Bei den Datenzugriffen ist die Lage entspannter Intern rechnen die Power
119. Beim Einsatz von loat Arithmetik liegt die Grenze ab der das Resultat definitiv keinerlei erkennba ren Zusammenhang mehr mit dem Aufrufparameter hat bei 107 entsprechend bei doub1e Arithmetik 10 und bei long double Rechnung 10 Die Funktionen liefern in diesem Fall eine Null als Funktionsergebnis und zeigen den Verlust s mtlicher signifikanter Stellen durch das Setzen von err no auf EDOM A 2 6 sin 1 N 0 5 0 0 5 1 3 2 1 0 1 2 3 Syntax float fsin float x double Sin double x long double lsin long double x Die Funktion sin x berechnet den Sinus des Argumentes x das im Bogenmass anzugeben ist Bei grossen Argumenten verlieren die Resultate an Genauigkeit Wertebereich und Fehler Wird als Parameter x der Wert NaN oder Inf angegeben so wird ein domain error durch das Setzen der Variable errno auf EDOM angezeigt Die Funktion liefert den Parameter x zur ck Theoretisch deckt die Funktion sin x den gesamten Zahlenbereich der Rationalen Zahlen ab Ver ursacht durch die begrenzte Aufl sung der Fliesskommadarstellungen verliert der Parameter x jedoch bereits bei der Reduktion auf den internen Wertebereich von 0 lt x lt 2 x m an Genauigkeit Entspre chend ungenauer werden die Funktionsergebnisse Beim Einsatz von loat Arithmetik liegt die Grenze ab der das Resultat definitiv keinerlei erkennba A 2 Trigonometrische Funktionen 217 ren Zusammenhang mehr mit dem Aufrufparameter hat
120. C angesprochen werden So kann das Laufwerk MO auf dem System dessen Device Tabelle Sie hier vorliegen haben alternativ als LD 3 16 verwaltet werden Bei der Entwicklung von Software f r verschiedene Zielsysteme ist die symbolische Schreib weise der LDN DRIVE Angabe stets vorzuziehen da 1dn und drive von System zu System variieren k nnen und es somit die sauberere Methode darstellt RTOS UH zur Laufzeit die korrekte Zuordnung zu berlassen 164 15 5 I O unter RTOS UH RTOS Devices LDN Drive EE 01 00 EDB 01 01 EDX 01 02 Res Sates 0 9 00 NEIE ie OF 00 Alonso 00 00 BO Sata 027 00 Uisa pace O27 03 Bie cud eee 00 02 Bar ses 02202 ACT Peano 00 06 C22 sacs ae 02 06 Paita 0A 00 A3 04 00 B3 04 02 O 04 06 Dl 0B 00 D2 tc ma 0C 00 Dame DEZ Dt Files 037000 Krees 03 01 MO ee ek Satay 03710 Miia ate 03 11 Abbildung 15 10 Auszug aus einer Device Tabelle Um den Weg ber die direkte Angabe von 1dn und drive nicht zu versch tten sollten Sie bei der Erstellung eigener Ger tenamen von der Verwendung des Device Namens LD tunlichst absehen Bei der Angabe von Pfadnamen sind auch die von UNIX oder DOS bekannten Angaben und zul ssig Der einzelne Punkt stellt einen Selbstverweis auf das aktuelle Directory dar ist also im Grunde genommen redundant Mit l sst sich das jeweils bergeordnete Directory erreichen Die Angabe eines Datei oder Verzeichnisnamens orientiert si
121. CKSIZE 4096 FILES 3 int KurzlebigeTask void Optionale Parameter PRIORITY prio Priorit t der zu generierenden Task PRIO prio dito STACKSIZE size Stackgr sse der Task in Bytes RESIDENT Der Taskworkspace der Task soll resident bleiben USE_FUNCTION_NAME Task erh lt den Namen der nachfolgenden Funktion USE_NAME fkt Der Rtickgabewert der Funktion fkt ist neue Taskname NO_TASKSTART Die Task wird nur erzeugt und nicht aktiviert USE_FPU Die zu generierende Task rettet die FPU Register NO_FPU Die zu generierende Task rettet keine FPU Register NO_ALLOC Die C Speicherringe werden nicht initialisiert NO_FILES Die C File V O wird nicht initialisiert NO_SETUP Es finden keinerlei C Initialisierungen statt FILES Gibt die Zahl der gleichzeitig zug nglichen FILE Pointer an Siehe auch Abschnitt 13 3 234 B 31 TAG_COPY_LONG B 28 SYSTEMTASK Einrichten der nachfolgenden Funktion als Task beim Systemstart pragma SYSTEMTASK PRIO 2 RESIDENT AUTOSTART QUEUE 4 int GrundebeneLdn4 void Optionale Parameter PRIORITY prio Priorit t der zu generierenden Task PRIO prio dito STACKSIZE size Stackgr sse der Task in Bytes RESIDENT Der Taskworkspace der Task soll resident bleiben TASKHEADSIZE size Der Taskkopf der Task wird um size Bytes vergr ssert AUTOSTART Die Task wird autostartf hig QUEUEIdn Die Task wird Betreuungstask f r die betreffende Idn INTERFACE ldn Die Task wi
122. CREST C Programmierung unter RTOS UH OStephan Litsch IEP Am Pferdemarkt 9c 30853 Langenhagen Tel 0511 70832 0 Fax 0511 70832 99 26 Januar 2000 Inhaltsverzeichnis Urheberrecht und Haftung 1 Einleitung 1 1 1 Vorwort zut Releasei2 Aw os ds ae a eR tye heh eo a a Be 1 1 2 Eiter tur ZUG aei Rare a ra ee tee e ere oa 1 1 3 Allgemeines zu C unter RIOS UH 2 2 Der Einstieg 5 2 1 Installations i it ae th a Ae Ei Sk a a he Raina ae Sas 5 EE WINDOWS gt 93 98 cenna soe e sue A A an Blot ae an Bl E 6 2 1 2 WINDOWS NT4 O g eaei s ruaan ek ne a 6 2187 EMUR hee ae A a are GAB day Sa Mare nats ee 6 2 2 Lieferumfang im berblick ca ZER Ae sn a a ag Gee ge a Eas 6 22 EE ae aie ha ne Ad apn de gea e a 6 2 22 CUBOS au ages aad Bra ne 7 2 2 3 C b ppe un ar ee e R 7 2 3 DerSchnell Einstieg 8 3 Der Compiler ccc 9 3 1 Die Optionen desicccn 2 En A N a rss Bad 9 3 1 1 Zus tzliche Argumente e 10 3 1 2 Einstellung des 68K Zielprozessors 10 3 1 3 Prozessorabh ngige Adressierungsarten f r 68K 11 3 1 4 Vorzeichen bei Charactern o 0 0 0 0 000000008 13 3 1 5 bergabe von Makros a RS EER SRA ORR GA 13 3 1 6 Zeilenkomment re s s 2 2 2 2 52 0 3 2 man art dae un 13 3 1 7 Boolscher Datentyp os e ra ie Coon nn 13 3 1 8 Makroverarbeitung in Pragma Kommandos 2 2 2220 13 II 3 2 3 3 3 4 3 5 3 6 3 7 INHALTSVERZEICHNIS 3
123. CREST C Paketes aufgelistet C 1 ccc68k Crest C Compiler CCC 68K Version for Linux x86 Copyright C 1987 1999 by Stephan Litsch Release 2 597 Nov 3 1999 16 57 33 Usage ccc68k infile outfile options macnam repl Define an argumentfree macro file Read argument file A digit Stop compiler 0 never 1 after fatals 2 after fatals and errors 3 after fatals errors and warnings B Generate err File C digit Addressing mode for lt data gt and lt bss gt variables 0 Word access 1 Long access D digit Addressing mode for lt text gt constants 0 Word access L Long access E digit Addressing mode for lt local gt variables 0 Word access 1 Long access G digit Generate dpc File 0 No dependency file 1 list included c files 2 list included c and h files 3 list included c h and lt h gt files H path Set headerfile directory J digit Search includes in upper lower case 0 only upper case 1 only lower case 2 upper and lower case 237 ansi fpu C 1 ccc68k Add line infos to s File Suppress CLR Ax Mnemonics Enable PEARL Interface No PEARL80 PEARL9O PEARL80 PEARL90 Show source Addressing mode for function calls JSR label JSR label PC BSR L label BSR W label Default character is signed Informations about compiler modifications Stack check Verbose messages Ignore warnings Linetracer No Set linecell
124. DEAD zu setzen um garantiert herauszubekommen wenn irgendein Schlingel ber den toren Affen noch Zugriffe versuchen sollte 15 5 VO unter RTOS UH 173 15 5 3 1 4 2 Eine Eingabe vom B Port Der B Port unterscheidet sich in einer wichtigen Eigen schaft vom A Port wenn ein CE zu B Port geschickt wird dann wird nicht erst der interne Empfangs puffer gel scht sondern zun chst die bereits gelesenen Zeichen ins CE umkopiert Der B Port stellt somit am ehesten das dar was unter anderen Betriebssystemen als Eingabeverhalten bekannt ist die gepufferte Eingabe Der A Port kommt zwar im Alphabet zuerst aber f r den Zyklus Einlesen Verarbeiten Einlesen ist er meistens ungeeignet weil der Prozess der Verarbeitung der gelesenen Zeichen niemals in Nullzeit erfolgt und somit bis zum n chsten Aufsetzen eines Lese CE s 0 bis n Zeichen verloren gehen k nnen pragma HEADER SerialExample 1 0 include lt stdlib h gt include lt stdio h gt include lt string h gt include lt ctype h gt define MY_BUFFER_SIZE 1024 define PORT_NR 1 Mit den Ports Al Bl C1 D1 spielen A main RK KKK KK KKK void main void auto RFILE port_info_A port_info_B A auto RFILE port_info_C port_info_D A register Ce wce_A wce_D 7 register Ce rce_A rce_B rce_C gt auto char my_buffer MY_BUFFER_SIZE register cha
125. ER Oly gt FORMAT DOUBLE 00 E KDIR RMDIR RENAME R W BLOCK gt IOC OC IOC IOC IOC IOC IOC IOC IOC IOC IOC IOC IOC IOC IOC IOC IOC IOC IOB Prj Loi N Sa Lei 2 212 2 2 2232 BEE Ek GEI al Ze lt lt to Aber dem CE werden noch zwei weitere Bits mit auf den Weg gegeben Wird der angesprochene Treiber mit einem CE bel stigt das das Bit MODMWA gesetzt hat so bedeutet dies dass RTOS UH die aufru fende Task solange blockiert bis die Operation vom Treiber durchgef hrt wurde was in diesem Falle bedeutet dass der Auftrag Zeichen ber A2 auszugeben abgeschlossen wurde Weiterhin wurde dem Treiber mittels TOCNE gesagt dass eventuell auftretende Fehler bei der Operation nicht in Form von dummen Spr chen auf dem Terminal auszugeben sind sondern nur still und leise im CE zu erfolgen haben Achtung Die Verwendung von IONCE soll auf deutsch heissen NO Error Messages ist unter RTOS UH arg gew hnungsbed rftig Sie k nnen w hlen ob ein Spruch auf dem Bildschirm erscheint oder ob ein entsprechender Eintrag im CE erfolgen soll Das Motto lautet Entweder Oder und nicht Sowohl als auch wie man es eigentlich als Programmierer erwartet h tte Aber da es nunmal so von RTOS UH festgelegt ist betrachten Sie es bitte wohlwollend als Feature und nicht als Bug In diesem Falle soll es uns egal sein ob die Ausgabe klappt oder voll an die Backe geht u
126. GES implementiert um diese Scheiben auch auf Hochsprachenebene generieren zu k nnen Im einfachsten und blichsten Fall beginnt der RAM Bereich eines Rechners bei 0x00000000 und bildet einen linearen Adressraum entsprechend der Ka pazit t und Anzahl der verwendeten Bausteine z B bei 512 kB hinauf bis OxOOO7FFFF Um den kompletten RAM Speicher unter RTOS UH Verwaltung zu stellen gen gt es das folgende Kom mando in den Quelltext aufzunehmen und das resultierende Programm im Scanbereich des Rechners abzulegen pragma RAM_RANGES 0x800 O0x7FFEO Achtung Bevor Sie nun blindw tig und voller Tatendrang eine RAM Scheibe generieren und sich wundern weshalb das System damit nicht mehr hochkommt oder sich v llig anders verh lt als vor dem Eingriff sollten Sie sich stets vor Augen halten dass in einem laufenden RTOS UH bereits grunds tz lich eine RAM Scheibe bei der Implementierung vorgegeben wurde Wenn ihre RAM Scheibe als letzte beim Systemstart gefunden wird so wird die Original Scheibe gnadenlos bersteuert In vielen ausgelieferten RTOS UH Systemen werden die RAM Scheiben aber bereits dazu verwen det um bestimmte Bereiche f r Spezial Betriebssysteme auszublenden Oft gen gt schon ein schneller Blick auf die mittels Ctr1 A S erzeugte Speicherliste um Kuriosit ten zu identifizieren 00002D42 gt 00002DAC MARK 00002D4C gt 00002DAE ATSK Resident IDLE 00002DAE gt 00002E10 ATSK Resident ERROR 0000
127. Initialisieren der Vektortabellen o oo e 203 16 3 3 Bestimmung der CPU FPU o o o e 203 16 3 4 Initialisierung der Exceptionhandler 203 16 3 5 Aufsetzen der Dispatcherkette o o o e 203 16 3 6 Initialisieren der I O Queues 2 22 Co onen 203 16 3 7 Anlegen der residenten Taskworkspaces 203 16 3 8 Initialisierung der Error Puffer 2 2222 oo nme 203 INHALTS VERZEICHNIS 17 16 3 9 Ausf hren von Warmstart Code 16 3 10 Starten des Normalbetriebes 16 4 Normalbetrieb s 32 2 wu mer a en eA RS Der Umgang mit Scheiben 17 1 Sch iben Seannen a2 oe ar Hin aan ie A Bar Rd da ta 17 2 Ausblenden von Scanbereichen 17 3 Headertexte beim Systemstart 17 4 M dulk pf enerieren Af a OR ea 17 5 RAM Scheiben generieren Mathematische Funktionen Al Fliesskommadarstellung e ht Single Precisi n s tran e e a al ae as A 1 2 Double Precision A 1 3 Extended Precision it a 4 ae Bae aoe e at A 2 Trigonometrische Funktionen e AR COS A A E EE EE E a ee A lat A O Ando cna a Oo ee Ba ADICON wad ee a a ac ow A Asda atado ee Re PR Pees ALES ACOSO ts a da ia dla la ALO SMU e pans AN AT MO es re OG N re te ee ee ee A 3 Hyperbolische Funktionen ASAL acoshQ 0 04 a A ek ek a a a AEN EN te ASIMAQ a ta teak we he a ed we ah eed elena an S Ba
128. L 7 m glich LDN s die nicht von Treibern unterst tzt werden enthalten NULL Pointer Zur Abfrage ob und welche Betreuungstask f r eine LDN existiert steht unter CREST C die Funktion rt_LDN_to_Tid zur Verf gung 15 5 VO unter RTOS UH 161 LDN to TID Pointer TID LDN 0 TID LND 1 TID LDN 2 TID LDN n Ox852 L Taskkopf Task LDN 1 Taskkopf Task LDN 2 Taskkopf Task LDN n Abbildung 15 9 Verwaltung der Betreuungstask Adressen Wenn Sie selbst eine Betreuungstask fiir eine Warteschlange kodieren wollen dann gibt es unter CREST C zwei M glichkeiten RTOS UH diese Neuigkeit h flich beizubringen Im Abschnitt 13 4 ist beschrieben wie man f r Eprom Systeme die Konventionen erf llt damit das Betriebssystem beim Kaltstart die entsprechende C Funktion als Betreuungstask eintr gt Zur Laufzeit ist es allerdings eben falls noch m glich nachtr gliche Eintr ge in der LDN to TID Tabelle vorzunehmen CREST C stellt die zwei Funktionen rt_make_drive und rt_delete_drive zur Verf gung mit der sich die aktuell laufende Task als Betreuungstask f r die bergebene LDN eintragen und sp ter auch wieder austragen kann int rt make drive IOqueue ldn int rt_delete_drive IOqueue ldn ber Sinn oder Unsinn der bergebenen LDN m ssen Sie sich allerdings weitestgehend selbst den Kopf zerbrechen Existiert unter der angegebenen Nummer bereits ein Eintrag wird er gnadenlos ber schri
129. Methode ist allerdings so unsicher dass Sie sie nicht weiter in Betracht ziehen sollten Wenn solche Mehrfachaktivierung auftreten oder ein Start auf Grund eines Ereignisses forciert wird auf das die Subtask eingeplant wurde f hrt das zu einem erneuten Start der alten Subtask mit den alten Parametern pragma TASK char Test int a Irgendwas a 17 Task Testl int a Irgendwas a 18 void main void 102 13 3 C Subtasks char namel Test 23 erzeugt z B Test 01 Test 12 erzeugt z B Test 02 Test1 45 erzeugt z B Test 03 Testl 87 erzeugt z B Test 04 char name2 Task tidl Task tid2 rt_activate namel priol wie Test 23 rt_activate name2 prio2 wie Test 12 rt_activate_quick tidl prio2 wie Test 45 rt_activate_quick tid2 prio2 wie Test 87 In dem kleinen Beispiel werden dauerhaftere Taskk pfe erzeugt Der Aufruf in der pragma Zeile lautet dazu lediglich TASK anstelle von SUBTASK Wie bei CREST C blich werden diese C Subtasks erst durch explizite Funktions Aufrufe hier in main erzeugt und gestartet F r das System sind diese Tasks unter den Namen erreichbar die im Beispiel mittels der beiden Pointer na mel und name2 gespeichert werden F r Sie als Entwickler hat das den Nachteil dass Sie nicht in der Lage sind sich ein B schel von Tasks anzulegen mit denen Sie sch
130. NGES 0x00001 0x20001 0x50001 0x70001 Parameter n Zahlenpaare jeweils mit Start und Endadresse Siehe auch Abschnitt 16 2 2 B 23 SET VECTOR Richtet beim Systemstart einen Vektor ein pragma SET_VECTOR 0x80E InterruptTrigger pragma INTERRUPT_EXIT IROFF void InterruptTrigger StoredRegisterSet registers Parameter 1 Adresse an der bei Systemstart ein Pointer gesetzt werden soll 2 Symbol im text Segment das als String angegeben werden muss Keine weitere Beschreibung im Handbuch verf gbar B 24 START_SLICE_SKIP Legt die n chste Funktion als Tester Funktion f r einen Skip Bereich fest und dient als Startposition des zu skippenden Bereiches pragma START_SLICE_SKIP int test void B 25 STRUCT_PADDING_OFF 233 beliebige Treiber etc pragma HEADER Bin drin pragma END_SLICE_SKIP Parameter keine Siehe auch Abschnitt 17 2 B 25 STRUCT_PADDING_OFF Schaltet das regul re Padding der Strukturgr sse auf die n chste Wortgrenze aus Die Strukturgr sse wird auf die n chste Zweierpotenz aufgerundet Parameter keine B 26 STRUCT_PADDING_ON Schaltet das regul re Padding der Strukturgr sse auf Wortgrenzen ein Parameter keine B 27 SUBTASK Einrichten von Prolog und Epilogcode f r die nachfolgende Funktion um beim Funktionsauf eine Task zu generieren Die Task verschwindet nach der Abarbeitung des Funktionscodes aus dem System pragma SUBTASK PRIO 37 STA
131. PAGCOR VSS ZE iso Kaas and S Datura doo eae eats dr Er outa Mew al 235 B 33 TAG PUSH STZR iia war a iw Wa ed hae fb ee ha aw Coe E 235 Bisa TAS Ke ike thee De A ae A Bee Ya ee ae al a addon or apg 235 B 33 WARMSTART at als a naar whe dl athe a G 236 C Usage Meldungen der Tools 237 ES vk weak E ee ne Ka nt are 237 CA ee eh be eS i 239 E 3 61168KE 4 u ad ds da hee EE EE 240 CA CNPP orase ec Fee de shales Aen ee e blige age hat Gale hi Mawatha EN ver 241 OS NK OS 304 sc suda Dt e atthe See A Bok de ee Sh OG a ae 241 CO Inkppe en a Ba ne hp ad ed bobo ead ete eda Bed God as ee doe OA 242 CT SSlO8K ie a sy Eds Rear Gd ON es en ee GE ee a ee Pe RS 242 E ENEE 243 GH elmpkk te pgp be gages A eee AEN AE EN wo A a a ee 243 CIO Edel 243 C II COp68K u 22 a Ae OP EAE eee ae 243 C12 Y 2 a a ee She A ee oh ee ae a OS ee ins 245 G 13 C Make LIA AAA CHa A Rae BEE NA 247 Index XII INHALTS VERZEICHNIS Tabellenverzeichnis 3 1 3 2 3 3 3 4 3 5 3 6 3 7 3 8 3 9 3 10 3 11 3 12 3 13 3 14 3 15 3 16 3 17 3 18 3 19 4 1 4 2 10 1 10 2 10 3 12 1 12 2 CPU FRU Optionen 68K oiea gsi ede ENT Ho Be ee OM eae 11 F nktionsaufrule 2 at 3 A 22 Wa aan ea EE 11 Zugriff auf globale Variablen im data und bss Section o o 12 Zugriff auf task lokale Variablen in der local Section 12 Zugriff auf globale Konstanten o o e 12 Kontrollausgabe bei der Compilierun
132. PC s grunds tzlich mit 32 Bit Registern Lediglich wenige Maschinenbefehle sind berhaupt in der Lage mit anderen Datenformaten umzugehen Dazu geh rt selbstredend ein Satz von Befehlen der den Transfer von Daten vom und in den Hauptspeicher erm glicht Hier sind 8 16 und 32 Bit Transfers m glich Beim Datenzugriff gilt die einfache Regel dass ein Zugriff beliebiger Breite auf 3 4 Benutzereigene Datentypen 29 beliebigen Adressen m glich ist Entspricht die Adresse jedoch keinem Vielfachen des zu lesenden oder zu schreibenden Datums so wird man mit schlechten bis lausigen Zugriffszeiten bestraft Der PPC Compiler legt folglich in Abweichung zu seinem 68K Kollegen alle 32 Bit Variablen tunlichst auf Langwortgrenzen um die Performance nicht in den Keller gleiten zu lassen struct test char a Offset 0 long bj Offset 4 char ce Offset 8 long a Offset 12 char e Offset 16 long f Offset 20 char g Offset 24 Abbildung 3 5 Beispiel fiir PPC Padding in Strukturen Es wurde jedoch eine M glichkeit vorgesehen dieses implizite 32 16 Bit Padding zu bersteuern Mit tels des pragma Kommandos pragma MEMBER_PADDING_OFF wird das Padding von Struk turmitgliedern ausgeschaltet Das Pendant zu diesem Kommando stellt der Befehl pragma MEM BER_PADDING_ON dar der das Default Verhalten der CPU restauriert Auf PPC Compilern ist dazu das Kommando pragma MEMBER_PADDING_PPC quivalent
133. Prozesssteuerung und regelung sieht da deutlich anders aus Hier kommt es nicht auf eine gleichm ssige Verteilung der Rechenzeiten eine gute Ausnutzung des Gesamtsystems oder auf die Befriedigung des Bedieners an Hier gilt es m glichst sofort auf Ereignisse zu reagieren Ein Zeitscheibenverfahren das Ihnen alle drei oder vier Sekunden etwas Rechenzeit zugesteht um den 129 130 15 1 Das Betriebssystem Status einer Turbine zu berpr fen d rfte hier allenfalls ausreichen um einem durchgegangenen L ufer auf dem Weg durchs Hallendach ein freundliches Lebwohl nachzurufen In einem solchen Falle w rde es Sie bestimmt auch nicht vers hnlicher stimmen zu erfahren dass das Betriebssystem sich keiner Schuld bewusst war und Ihre restlichen Kollegen pflichtschuldigst beim Schach oder Tetrisspielen an ihren Terminals bedient hat Bei der Bedienung von Prozessereignissen gilt es f r ein Betriebssystem m glichst sofort zu reagieren Dieses m glichst sofort stellt selbstverst ndlich nur ein Ideal dar da es nat rlich echt Zeit beansprucht einem Haufen dusseliger Chips zu verraten dass es etwas zu tun gibt Der Begriff der Echtzeitf higkeit l sst sich auf viele Arten definieren Mit brutaler Gewalt in Gestalt schneller und kostspieliger Computer lassen sich heute bereits viele Aufgaben mit konventionellen Betriebssystemen l sen f r die fr her hochspezialisierte Echtzeitkerne notwendig waren Dennoch ist es reichlich bertrieben Produkte
134. RRUPT LEVEL 2 void IRQ2 void Optionale Parameter VECTOR nr gibt als Zahlenwert den Vektor direkt vor LEVEL nr gibt als Zahlenwert 1 bis 7 den Vektor als IR Level vor NO_DISPATCHER_CALL Der Interrupthandler terminiert immer mittels RTE IROFF Der Interrupthandler wird komplett auf IR Level 7 ausgef hrt EVENT mask Der Interrupt feuert beim Verlassen des Handlers Events EPROM Es wird eine Scheibe generiert die den Vektor beim Systemstart setzt NO_VECTOR Es wird kein Vektor vom Prolog Code eingesetzt NO_IID Der Prolog Code setzt nicht den Interrupt Identifier RESET_STACK Der Interrupthandler setzt immer auf dem Initialsystemstack auf NO_MALFUNCTION Der Malfunction Mechanismus wird nicht unterst tzt Siehe auch Abschnitt 13 5 B 13 INTERRUPT_EXIT Richtet die n chste Funktion so ein dass sie mit korrektem Epilog Code eines Interrupthandlers termi niert Optionale Parameter IROFF Der Interrupthandler wird komplett auf IR Level 7 ausgef hrt Keine weitere Beschreibung im Handbuch verf gbar B 14 INTERRUPT_PROCEDURE Der Code der nachfolgenden Funktion wird entsprechend den Konventionen einer Interruptroutine ge neriert Es werden zus tzliche Adressregister bei der Codegenerierung verwendet A4 und A5 Parameter keine Keine weitere Beschreibung im Handbuch verf gbar B 15 KALTSTART 231 B 15 KALTSTART identisch COLDSTART B 16 MEMBER_PADDING_OFF Schaltet das regul re Padding
135. RTOS UH Die im letzten Abschnitt beschriebene Funktion rt_error stellt lediglich eine vereinfachte C Schnittstelle zum ERROR Trap von RTOS UH dar Korrekt angewendet ben tigt man eigentlich kei nerlei weitere Informationen ber das interne Systemverhalten Da ich mich nach Freigabe einer fr her en Version dieses Handbuches mittels vieler Codefragmente und Fax Schnipsel davon berzeugen durf te dass diese Funktion von Anwendern ohne Hintergrundinformationen eigentlich nur fehlerhaft oder unsinnig verwendet wird folgt nun eine knappe Zusammenfassung des Systemverhaltens beim Aufruf des ERROR s Der ERROR Trap als Systemaufruf stellt lediglich die erste Stufe bei der Ausgabe von System Meldungen dar Er arbeitet eng mit einer Task zusammen die zu den essentiellen Komponenten von RTOS UH z hlt der ERROR Task Der Aufruf des Traps bewirkt lediglich dass ein kleiner Ring puffer innerhalb der undokumentierten Systemzellen des Betriebssystems mit den relevanten Informa tionen ber die auszugebende Meldung gef llt wird e Das Message Wort im C Aufruf errcod e Der Task Identifier der aufrufenden Task e Der Pointer auf den Text F r jeden User des Systems existiert ein derartiger Ringpuffer mit einer endlichen Anzahl von Ein tr gen In blichen System stehen exakt 6 Eintr ge zur Verf gung Der ERROR Trap ordnet nun die eingelaufene Meldung dem verursachenden User zu und sortiert sie in dessen Meldungsring ein Dies kann aus
136. RTOS UH stehen Systemaufrufe zur Verf gung um normalen Tasks einen Wechsel in den privilegier ten Modus zu erm glichen Allerdings besitzt die CPU auch die F higkeit selbstst ndig den Modus zu wechseln Es gibt drei wesentliche F lle die dabei zu unterscheiden sind e Gewollte Unterbrechungen des laufenden Programms durch entsprechende Anweisungen wie TRAP ILLEGAL und hnliche Befehle die zu Ausnahmebehandlungen f hren k nnen e Abbr che durch Fehler bei der Programmausf hrung Dazu z hlen Division durch Null Zugriff auf verbotene Adressbereiche Schreibzugriffe auf EPROM s unsinniger Code fehlerhafte De kodierung von Daten und viele sch ne Sachen mehr e Unterbrechungen durch externe Ereignisse Tritt ein solcher Fall ein so wird der normale Programmfluss unterbrochen und eine Ausnahmebehand lung eingeleitet Das neudeutsche Wort daf r lautet Exception Die CPU wechselt in den priviligierten Modus und greift ber eine Vektortabelle auf eine Adresse zu an der der Programmablauf fortgesetzt werden soll Der so ermittelte Vektor wird angesprungen und der zugeh rige Code im Supervisor Mode exekutiert Es gibt 256 Vektoren die zu diesem Zwecke verf gbar sind Ein grosser Teil davon ist nur f r administrative Aufgaben des Betriebssystems von Bedeutung wie z B in Tabelle 13 4 an Hand der RTOS UH Traps zu sehen ist oder ist von Motorola f r die Ausnahmebehandlung reserviert So macht es z B wenig Sinn mit dem ILLEGAL INST
137. RUCTION Vektor zu spielen da das Auftreten ei ner solchen Exception in Nutzerprogrammen darauf hindeutet dass in Ihrem Code oder Stack bereits der Super GAU eingetreten ist Zu den Intterrupt Vektoren die f r Anwenderprogramme von Bedeutung sind z hlen z B die in Ta belle 13 1 aufgef hrten Auto Vektoren sowie die Vektoren im Bereich von 100 bis 3FC die als Non Auto Vektoren bezeichnet werden 108 13 5 Interrupts und Exceptions 64 TRZ 153 SS A 7 TRE TRE TRI Tabelle 13 1 Auszug aus der Exception Vektor Tabelle Wenn Sie externe Hardware an Ihren Rechner anschliessen und diese Hardware Interrupts ausl sen kann werden diese Vektoren f r Sie interessant Erreicht ein externes Signal die CPU so pr ft diese zun chst intern ob der Interrupt zur Zeit bearbeitet werden soll Es gibt zu diesem Zwecke sieben unterschiedliche Level die die CPU unterscheiden kann Im Statusregister der CPU ist vermerkt bis zu welchem Level Interrupts ignoriert werden sollen L uft die CPU auf Level 4 dann werden Interrupts der Stufen 1 bis 4 die w hrend der Abarbeitung eines Level 4 Interrupts auftreten erstmal ignoriert und gelangen erst dann zur Ausf hrung wenn alle h herprioren Interrupts abgearbeitet wurden Schl gt jedoch ein Interrupt von Level 5 bis 7 auf dann l sst die CPU unverz glich den Hammer fallen und wendet sich der h herpriorisierten Aufgabe zu Sie versetzt sich in den priviligierten Modus rette
138. Relocations geben die Zahl der absoluten Zugriffe auf Symbole in der data Section an Local Relocations beziehen sich entsprechend auf Zugriffe in der local Section Es gibt eine einfache M glichkeit Maschinencode der nicht frei verschieblich sein kann und muss von den enthaltenen R Symbolen zu befreien Man weist den CLN an das Programm f r eine be stimmte Stelle im RAM oder EPROM zu bersetzen Der CLN bekommt dies ber die Optionen T textaddress und C commonaddress mitgeteilt Das Programm ist dann fest gebunden und muss exakt an diese Position textaddress gebrannt werden und erwartet etwaige absolute Va riablen an der Adresse commonaddress Der Weg zu frei verschieblichem Code sofern es denn berhaupt einen gibt ist deutlich steiniger Zun chst ist der CCC anzuweisen f r s mtliche Funktionsaufrufe relative Adressierungsarten zu ver wenden F r die PowerPC Familie passiert das bereits implizit F r die 68K Familie geschieht das ber die Option R 3 die in Abschnitt 3 1 3 erl utert wird Kommt es danach beim Linken des Program mes zu Fehlermeldungen so ist bei 68000er Zielsystemen Schluss denn es existieren keine relativen Sprunganweisungen f r Distanzen gr sser als 32kB Ein solches Programm ist einfach zu gross um verschieblich kodiert zu werden Bei Prozessoren ab dem 68020 aufw rts k nnen mittels R 2 auch lange Spr nge relativ adressiert werden Ein derart bersetztes Programm sollte im Vergleich zu ein
139. SKIP 229 B 8 END_SLICE_SKIP Beendet den Bereich einer Skip Scheibe Parameter keine Siehe START_SLICE_SKIP BO EXCEPTION Richtet die nachfolgende Funktion als Exceptionhandler ein Die Angabe des f r die Exception zust ndigen Vektors kann wahlweise in einer der drei folgenden Schreibweisen erfolgen pragma EXCEPTION void IrgendeineException void pragma EXCEPTION VECTOR 0x100 void Exception100 void pragma EXCEPTION TRAP 4 void Trap4 void pragma EXCEPTION LINE A A008 void LineA008 void Optionale Parameter VECTOR nr gibt als Zahlenwert den Vektor direkt vor TRAP nr gibt den Vektor als Trap 0 bis 15 vor LINE A nr gibt den Vector in LINE A Schreibweise vor NO_DISPATCHER_CALL Der Exceptionhandler terminiert immer mittels RTE IROFF Der Exceptionhandler wird komplett auf IR Level 7 ausgef hrt Siehe auch Abschnitt 13 6 B 10 HEADER Systemstartmeldung erzeugen pragma HEADER String in doppelten Hochkommas Siehe auch Abschnitt 17 3 B 11 INCLUDE_ONCE Unterdriickt das mehrfache Includieren einer Headerdatei Parameter keine Siehe auch Abschnitt 3 1 9 2 230 B 14 INTERRUPT_PROCEDURE BU INTERRUPT Richtet die nachfolgende Funktion als Interruptroutine ein pragma INTERRUPT void IrgendeineException void pragma INTERRUPT VECTOR 0x100 void Exception100 void pragma INTE
140. SSING C bis F nicht belegt C Auswahl aus folgendem Vorrat Blank PRIO ACTIVE OP CODE BUS ERROR LOADED COMMAND PRIVILEDGED LDN SUSPENDED ADDRESS OVERFLOW IN SYSTEM VO OPERAND F nicht belegt 0 Blank ACT TERMI 3 CONTINUE XIO TRAP 6 FLOPPY LOADER INPUT REC CHECKSUM 9 LABEL MODE TIMING C INDEX FPU 68881 E bis F nicht belegt Abbildung 15 11 Aufbau des Errorcodes Ab dem Nukleus 7 x haben sich die Ausgabetexte des ERROR Traps ver ndert Nunmehr werden die meisten Ausgaben in Kleinbuchstaben get tigt sehr zur Erbauung der Anwender die in ihren Pro grammen die bisherigen Fehlermeldungen ausgewertet haben Programme die bislang Textanalyse der Fehlermeldungen betrieben haben sollten deshalb schnellstens umgestellt werden In Tabelle 15 12 sind die neuen Meldungen aufgelistet 15 8 Fehlermeldungen b Auswahl aus folgendem Vorrat O Blank 3 zero division 6 breakpoint 9 memory C bis F nicht belegt 1 not 4 CHK 7 directory A module c Auswahl aus folgendem Vorrat Blank prio active op code in system F nicht belegt bus error loaded command priviledged VO d Auswahl aus folgendem Vorrat O Blank 3 continue 6 floppy harddisc 9 label C index E bis F nicht belegt activate x10 call loader input mode FPU 68881 191 wrong blocks disc missing device Idn suspended address overflow operand terminate trap rec checks
141. Sie sollten demnach die zu untersuchende Task zun chst suspendieren wenn RTOS UH diese Aktion nicht schon durchgef hrt hat Danach liefert der Aufruf PMD taskname genauere Informationen ber den aktuellen Zustand der Task Je nach Art des zu untersuchenden Programmes gibt PMD unterschiedlich reichhaltige Information auf dem Schirm aus In folgenden Fall wurde ein suspendierter Editor mit dem PMD betrachtet PC 00085FC4 4CDF OVEM L SP D7 A1 Shell Module at 00077AD2 PCrel 0000E4F2 CED Task at OO1FFEE4 TWSP 001FF800 CED OC Line 0000 SR 00000000 ttsmOxnzvc SSP 000007F6 0 1 2 3 4 6 7 DO 0000006A 00000020 00000000 00004055 00000001 00004055 00000001 O3E1B6B8 AO 001FFE12 OO1FFEE4 001FFE12 001C1576 001FF800 001C1442 04005D9C 001E6054 Mittels PMD lassen sich so gesammelt die wichtigsten Informationen tibersichtlich auf dem Schirm darstellen die man sonst mit einer Reihe von RTOS UH Befehlen und Rechenoperationen einzeln ermitteln m sste Die hier untersuchte Task CED OC basiert auf dem C Shellmodul CED das an der Adresse 00077AD2 geladen wurde Der aktuelle PC steht auf Position 00085FC4 Um Ihnen das Rechnen zu ersparen gibt der PMD auch noch die relative PC Position innerhalb des geladenen Moduls aus 0000E4F2 Mit diesem Wert k nnen Sie mittels der von Linker erzeugten MAP Files das File und die Position innerhalb der Datei bestimmen in der sich der PC gerade aufh lt Bei Pr
142. T C stehen die Funktionen rt_event_continue und rt_event_continue_quick zur Verf gung void rt_event_continue char name Event mask void rt_event_continue_quick Task task Event mask Die Task wird zur Fortsetzung auf die in der Eventmaske gesetzten Bits eingeplant Bestehende Einplanungen werden gel scht Will eine Task sich selbst gleichzeitig aussetzen und zur Fortsetzung bei einem Event einplanen so kann dazu die C Funktion rt_event_resume verwendet werden die eine Kombination der Funktionen rt_event_continue_quick und rt_suspend darstellt void rt_event_resume Event mask 15 3 2 7 Ausplanen Ausplanen ist die zum Einplanen entgegengesetzte Operation Ausplanungen k nnen f r eine Task nur pauschal vorgenommen werden d h eine Differenzierung nach der Art der Einplanung ist nicht m glich Durch eine Ausplanung werden alle f r eine Task vorgenommenen Einplanungen gel scht der Zustand der Task nach der Ausplanung ergibt sich aus dem Taskzustand bei der Einplanung Die h ufigsten berg nge sind SCHD gt DORM falls eine Task nur zur Aktivierung eingeplant war Eine Task die auf eine Fortsetzung eingeplant war und sich folglich nicht im Status DORM befand bleibt nach einer Ausplanung weiterhin im Zustand SUSP Eine Task kann auch ihre eigenen Einplanungen l schen Die Ausplanung wird durch den Bedienbefehl PREVENT Taskname Unter CREST C stehen die Funktionen rt_prevent_task und rt_prev
143. TE strepy rce_A gt file_name READ_A_CONDITIONAL xFF rce_A gt reclen 25 Hier Laenge eintragen rt_transfer_ce rce A CE an den Treiber schicken J K Wenn man hier angekommen ist ist der Puffer entweder Y gefuellt oder ein Fehler aufgetreten Ge if rce_A gt reclen lt 0 FEHLER 15 5 VO unter RTOS UH 179 else TR s Hier stehen jetzt maximal 25 Datenbytes im Puffer 3 In reclen steht die wahre Anzahl der gelesenen Daten xf ptr rce_A gt buffer Pointer auf Puffer for count 0 count lt rce_A gt reclen count printf d Zeichen 081X n count 1 ptr count OxFFUL Und mit diesem CE nochmal weiterspielen Die Abbruchbedingungen S sollen so bleiben und es sollen wieder 25 Zeichen gelesen werden Ke Aber diesmal soll so gelesen werden dass nach dem Abschicken des Leseauftrags noch ein paar Dinge berechnet werden sollen so eine E CPU ist eben viel schneller als eine popelige Schnittstelle rce_A gt reclen 25 Hier Laenge eintragen rce_A gt mod amp MODMWA Nicht warten rt_transfer_ce rce_A CE an den Treiber schicken j ll Jetzt ist das CE unterwegs und wird vom Treiber betreut das Teil gehoert also nicht mehr diesem Programm und jeder Zugriff auf das CE und den Buffer des CE s ist streng untersagt Als
144. TF Editor File Tabelle 14 1 MemSection Typen 128 14 3 Speichersektionen Kapitel 15 RTOS UH Der Einstieg Es f llt den meisten Einsteigern schwer einen sinnvollen Zugang zum Betriebssystem RTOS UH zu finden Das System ist schnell und effizient aber nicht sonderlich nett zu seinen Programmierern Wer als blutiger Anf nger das RTOS UH Manual in die Hand nimmt hat harte Zeiten vor sich und so lange ist es noch nicht her dass ich selbst voller Verzweifelung und Abscheu versucht habe die entscheidenden Kapitel zu finden die die Erleuchtung bringen sollten Es gibt sie nicht Das RTOS UH Manual ist als Nachschlagewerk und nicht als Lehrbuch konzipiert und erf llt diese Aufgabe auch recht gut Als Einsteiger in dieses Betriebssystem ist aber erstmal die H rde eines gewissen Grundverst ndnisses zu berwinden Das beginnt schon mit der verwendeten Nomenklatur Das Stichwortverzeichnis des RTOS UH Manuals ist bestimmt nicht so schlecht wie es oft dargestellt wird aber das Manko besteht darin dass man zu Beginn nicht den geringsten Schimmer hat was sich hinter den Begriffen verbirgt die dort aufgef hrt sind und zudem praktisch keine Zusammenh nge erf hrt Zun chst ein paar Worte zur Echtzeitf higkeit des RTOS UH Umsteiger von Single User Single Tasking Betriebssystemen kennen das Problem wohl kaum Pl tzlich toben auf einem Rechner mehre re Programme gleichzeitig durch den Prozessor Das ist auf Grossrechnern sc
145. UH spricht man vom Terminieren einer Task so wird dieser TWSP wieder zu freiem Speicher und kann vom Betriebssystem anderweitig zugeteilt werden Nur PEARL beschneidet den Wertebereich auf 1 bis 255 Unter CREST C sind Sie als Systemprogrammierer frei in der Wahl der Priorit t von Tasks Alleine die Trap Anschl sse kontrollieren dass Sie keine Tasks mit negativen Priorit ten anwerfen k nnen 15 3 Multi Tasking 133 15 2 1 4 Residente Tasks Erkl rt sich eine Task als resident so wird Ihr der TWSP nur bei der allerersten Aktivierung vom Be triebssystem neu zugeteilt Sie beh lt diesen Speicherbereich auch wenn sie terminiert ist Dieses Ver fahren hat den Vorteil dass bei h ufig aktivierten Tasks nicht jedesmal neu Speicher zugeteilt werden muss Zeitgewinn und erm glicht andererseits einer Task sich statische Variablen zu halten d h Va riablen deren Wert ber eine Terminierung bis zur n chsten Aktivierung erhalten bleibt 15 2 1 5 Autostart F higkeit Gerade f r stand alone Systeme wichtig erkl rt sich eine Task als Autostart Task so wird sie direkt nach dem Start des Betriebssystems von diesem aktiviert Alle Tasks die diese Eigenschaft nicht be sitzen werden nicht automatisch aktiviert Sie k nnen nur von anderen Tasks oder ber Bedienbefehle gestartet werden Unter RTOS UH gibt es keine andere M glichkeit f r Tasks aus eigenem Antrieb lauff hig zu werden 15 3 Multi Tasking Das Konzept von RTOS UH be
146. UH basiert auf dem Prinzip s mtliche Tasks eines Projektes gleichzeitig im Speicher zu hal ten Nur so ist es m glich akzeptable Taskwechselzeiten zu erzielen die unter Einbeziehung langsamer Peripherie in die Taskwechselzeiten nicht zu gew hrleisten w ren In der Regel ist es absolut indiskuta bel mal eben ein paar Kilobytes von der Diskette oder Festplatte nachzuladen um auf einen Interrupt oder eine Einplanung zu reagieren Wenn es gilt Reaktionszeiten von unterhalb einer Millisekunde zu erzielen erscheinen schon die Spurwechselzeiten einer modernen Festplatte von 9 bis 20 Millisekunden geradezu astronomisch hoch selbst wenn man die Zeit zum Laden der Daten und den Overhead zur Verwaltung des Paging vernachl ssigt Da sich unter RTOS UH alle Programmdaten physikalisch im Speicher befinden m ssen sind die Taskwechselzeiten weitestgehend deterministisch Die Motorola Prozessoren ab dem MC68030 be sitzen eine interne MMU ab dem MC68020 bereits extern verf gbar und zu Zeiten des MC68000 bereits mit Waschbrettern voll IC s in damaligen Workstations realisiert RTOS UH ignoriert diese Tatsache und deshalb ist das Speichermodell sehr simpel zu erkl ren es gibt einen gemeinsamen linea 3 13 Syntaxerweiterungen unter CREST C 49 ren Adressraum den sich alle Tasks br derlich zu teilen haben Wenn eine einzige Task unkumpelig ist und in Bereichen rumschreibt die ihr nicht geh ren dann himmelt es eben in der Regel das komplette S
147. _transfer_ce wce_A rt_release_ce wce A FH moeglich ueber Al Bl physikalische Verbindung Hier ein Sendepuffer von Ausgabetext A TZ F F o X ei wce_D rt_fetch_ce 128 1 den Groesse stem bis aufs letzte Schreib CE fuer D uplex Port aufsetzen dessen Laenge im CE vermerken CE an den Treiber schicken Die Funktion kehrt zurueck wenn das CE verarbeitet wurde soll heissen wenn der Treiber alle Zeichen abgeschickt hat xt Puffer schreiben und Und das CE wieder verschrotten Danach ist der Pointer wce_A nicht mehr zu verwenden oder C1 Daten zu lesen und gleichzeitig ueber D1 Daten zu senden ueber ein 128 Bytes und ein kleiner Bleibt liegen bis das C Damit ist es z B E da ist Durch die Angabe der ung erfolgt KEINE CE Konti wachung Achtung Damit bei Fehlern das Sy Byte zumuellen ra ngentueber kann man sich Wieder auf Output einstellen wce_D gt 1ldn port_info_D ldn wce_D gt drive port_info_D drive wce_D gt mode MODMOU IOCRWI gung des Schreibvorgangs Befehl READ WRITE Aber diesmal ohne MODMWA auf die Beendi also nicht warten und ohne IOCNE also Fehler meldungen aufs Terminal schreiben strcpy wce_D gt file_name WRITE_D xFF strcpy wce_D gt buff
148. a ALLOCATE_INTERRUPT_BUFFER LEVEL 4 SIZE sizeof DataSpace define DPC WORD 0x800L define IDP4 void 0x83EL define I_O char OxFFFF6803UL pragma INTERRUPT LEVEL 4 EPRO void Level4 void DataSpace bptr IDP4 bptr gt writer_ptr Ers Jetzt Betreuungstask wieder anwerfen bptr gt tid gt block amp BLKBSU DP Cx oF void main void DataSpace bptr IDP4 char bptr gt tid rt_my_TID A bptr gt reader_ptr amp bptr gt buffer 0 bptr gt writer_ptr amp bptr gt buffer 0 Interrupt jetzt scharfmachen for 55 Warten auf Freigabe durch Interrupt Handler rt_suspend c bptr gt reader_ptr Abbildung 13 11 Kommunikation ber systemeigene IDP Puffer Beachten Sie bitte dass zur bersetzung des Beispiels die Compileroption q aktiv sein muss siehe Abschnitt 3 1 8 um die Expressionauswertung f r die SIZE Angabe des anzufordernden Interrupt 114 13 5 Interrupts und Exceptions puffers zu forcieren Die Initialisierung der Datenstruktur auf die der IDP4 verweist wird selbstverst ndlich nicht von RTOS UH vorgenommen Achten Sie bitte stets darauf dass es durchaus Sinn macht diese Aktionen durchzuf hren bevor der betreffende Interrupt freigegeben bzw der Vektor auf den Interrupt Handler eingeklinkt wird Verwenden Sie zum Aufsetzen der IDP Puffer nie Kalt
149. achfolgende Funktion eben auf den Exception Handler im Vektor addr einzutragen pragma EXCEPTION VECTOR 0x08 IROFF void EXCEPTION_BusError StoredRegisterSet registers ExceptionStackFrame stackframe Vector 0x08 BUS ERROR stackframe BusAddress registers stackframe Meldung BUS ERROR TRAP ausgeben CommonErrorHandler registers stackframe 0x8015 Tabelle 13 3 Beispiel eines Exception Handlers in C Das Beispiel zeigt wie das pragma EXCEPTION Kommando verwendet werden kann um den BUS ERROR Vektor 0x08 durch eine eigene C Funktion zu ersetzen 13 6 1 1 Kodierung von Traps CREST C stellt mittels des Schl sselwortes TRAP eine M glichkeit bereit eigene Traps zu kodieren was angesichts der Tatsache dass RTOS UH diese Vektoren selbst benutzt siehe Tabelle 13 4 nur der Vollst ndigkeit halber implementiert wurde Die Schreibweise TRAP nr tr gt an der Position 0x80 4 nr den Pointer auf den Exception Handler ein nr muss ein Wert zwischen 0 und 15 sein pragma EXCEPTION TRAP 0 IROFF void TRAP_ActivateTask_Quick StoredRegisterSet registers 120 13 6 Exception Handler in C Tabelle 13 4 Belegung der RTOS UH Traps Vector 0x80 TRAP 0 ES D1 Prioritaet der Task Al Adresse der Task Die Task deren TID in Al uebergeben wurde wird mit der 2 Prioritaet Dl gestartet El reg
150. ages Z Add debug informations to library 0 Link 68000 Code 2 Link 68020 Code gt Link CPU32 Code fpu Link Code for FPU C 8 sslppc 243 C S sslppce Crest Shared Library Linker SSL PPC Version for Linux x86 Copyright C 1987 1999 by Stephan Litsch Release 2 597 Nov 4 1999 12 28 00 Usage sslppc linkfile outfile options file Read option file macro replace Define argumentfree macro L path Set library directory M Dump loader map P digit Enable PEARL interface 0 No 1 PEARL80 2 PEARL9O T address Set lt text gt section address V Verbose messages Z Add debug informations to library fpu Link Code for FPU CH clm68k Crest Library Manager CLM 68K Version for Linux x86 Copyright C 1987 1999 by Stephan Litsch Release 2 597 Nov 4 1999 12 25 28 Usage clm library options file Read argument file M Dump loader map V Verbose all infos C 10 clmppc Crest Library Manager CLM PPC Version for Linux x86 Copyright C 1987 1999 by Stephan Litsch Release 2 597 Nov 4 1999 12 28 00 Usage clm library options file Read argument file M Dump loader map V Verbose all infos CU cop68k Crest Object Inspector COP 68K Version for Linux x86 Copyright C 1987 1999 by Stephan Litsch 244 Release 2 597 Nov 4 1999 Usage cop crest binaryfile options file O R B P S Y E t D a M L R B FP S L R R B P S L D R B H P S 34 E t D a G F
151. alten nach Zeile 6 zwar identische Werte aber halt irgendwas aus dem Wertebereich eines int s 2147483648 bis 2147483647 mit dementsprechend geringer Wahrscheinlichkeit dass die von Ihnen erhofften Zahlen zuf llig getroffen wurden Gem ss Murphy stehen allerdings w hrend aller Testl ufe immer die richtigen Werte in den nichtinitialisierten Variablen Die Tatsache dass solche Bugs immer erst beim Kunden und unter Zeitdruck auffallen ist gel ufige Praxis Fl chtige Variablen werden keiner Speichersection zugeordnet sondern befinden sich entweder in Prozessor Registern oder auf dem Stack Sie werden automatisch beim Eintritt in eine Funktion dy namisch angelegt bzw im Fall von Registern zugeteilt und verlieren ihre G ltigkeit beim Verlassen der Funktion 3 16 G ltigkeitsbereich von Variablen Unter C gibt es im Prinzip drei unterschiedliche H rtegrade um die Namen von Objekten nach aussen hin zu verstecken Zun chst sollten Sie sich stets vor Augen f hren dass jedes Objekt dessen Na me ausserhalb einer Funktion definiert wurde dazu z hlen auch die Funktionen selbst unter C erstmal global ber das gesamte Projekt hinweg namentlich erreicht werden kann Uber das Schl ssel wort static l sst sich eine Begrenzung des G ltigkeitsbereiches erzielen Eine Variable ausserhalb einer Funktion wird durch static im G ltigkeitsbereich auf die Datei bzw bersetzungseinheit beschr nkt in der die Definition stattgefunden h
152. andten sind durch eingeschr nkte Adressierungsarten sind Vergleich zu ihren Nachfolgern im Nachteil Er ist z B nicht in der Lage Adressregister und PC relative Adres sierungen oder relative Spr nge von mehr als 32kB auszuf hren Das bedeutet f r den CCC bei der Option 0 dass e ab 32kB Sprungdistanz absolute Spr nge verwendet werden m ssen e der Umfang globaler Variablen ohne Sonderaufwand auf 32kB beschr nkt ist e als konstant abgelegte Daten nie weiter als 32kB vom Ort ihrer Referenzierung abgelegt werden d rfen e lokale Variablen innerhalb einer Funktion 32kB nicht berschreiten k nnen Die Nachfolgechips bieten neue M glichkeiten Die Optionen C digit D digit E digit und R digit sind dazu gedacht um Einfluss auf die Adressierungsarten der gew hlten Ziel CPU zu nehmen R steuert die Generierung von Unterprogrammaufrufen Der MC68000 besitzt keine M glichkeit Unterprogrammaufrufe mit Sprungdistanzen gr sser 32kB mittels relativer Adressierung auszuf hren Erstmal ist das kein grosser Verlust aber in Hinsicht auf die Erstellung von verschieblichem Code schmerzt diese Tatsache dann doch N here Informationen ber verschieblichen Code k nnen dem Abschnitt 3 11 entnommen werden Die neueren Prozessoren sind gl cklicherweise in der Lage dieses Problem sauber zu l sen und so l sst sich verschieblicher Code produzieren bei dem die 32kB Grenze nicht mehr begrenzend wirkt R ist mit vier Parametern zul ss
153. angehensweise wenn man sich dennoch gen tigt sieht das Tasking in der normalen RTOS UH Welt interruptgesteuert zu beeinflussen 116 13 5 Interrupts und Exceptions Wenn zeitkritische Operationen abgeschlossen wurden sollten Sie umgehend den Interrupt Level wie der verlassen und etwaige zeitaufwendige Nachbehandlungen bzw die eigentliche Behandlung der Da ten einer Grundebenentask berlassen Beachten Sie bei der Kodierung von Interrupt Handlern die wesentliche Tatsache dass ein Multitaskingsystem nur Sinn macht wenn das Tasking nicht blockiert ist Die Abarbeitung von Interrupts blockiert das Tasking In den folgenden Abschnitten sollen zwei unterschiedliche Methoden vorgestellt werden um von Inter ruptebene Einfluss auf das Tasking nehmen zu k nnen 13 5 5 1 Interrupts entblockieren Tasks Wenn die Aufgabenstellung sich darauf beschrankt dass eine einzige oder zumindest tiberschauba re Anzahl von Tasks auf einen Interrupt Prozess reagieren soll so besteht in Assembler oder C die M glichkeit eine sehr schnelle M glichkeit zu realisieren Im Abschnitt 15 2 ist das offizielle Tasking unter RTOS UH beschrieben der zugeh rigen Tabelle 15 1 sind die gel ufigen Taskzust nde und Zustands berg nge aufgef hrt Die nun beschriebene Me thode werden Sie dort jedoch weder beschrieben noch dargestellt finden Sie basiert auf der Tatsache dass jede Task unter RTOS UH mittels diverser Flags im Taskkopf vom Zustand laufwillig oder
154. angwortweise zu Kopieren Damit l sst sich auch von zu ungeraden Adressen kopieren bei TAG_COP Y_BYTE beziehungsweise direkt von auf Periphe rie lesen schreiben die nur byte oder wortweise Zugriffe erlaubt Default Einstellung bleibt weiterhin TAG_COPY_LONG soll heissen die schnellste und k rzeste Methode Auch der Schwellenwert bei dem der CCC beim Kopieren auf Schleifengenerierung umstellt l sst sich mittels einer pragma Anweisung steuern Die Angabe pragma TAG_COPY_SIZE 100 bewirkt dass je nach eingestellter Kopierbreite bei Strukturen kleiner gleich 100 Byte Gr sse mit ein zelnen MOVE Anweisungen gearbeitet wird Erst ab einer Groesse von 102 Bytes werden Schleifen erzeugt Default Einstellung f r TAG_COPY_SIZE im CCC ist 20 Bytes Je nach Cache Gr sse des Zielprozessors kann es Sinn machen in Hinblick auf maximale Geschwindigkeit m glichst viel Code linear hintereinander abzuspulen beim MC68000 der keinen Cache besitzt die optimale Methode oder darauf zu bauen dass das betreffende Codest ckchen schon im Cache landen wird wenn es kurz genug ist wovon man in der Regel beim MC68030 und dessen Nachfolgern guten Gewissens ausgehen kann 3 4 2 Bitfelder Da Bitfelder zu den Datentypen geh ren die sich erfolgreich einer strikten Normung durch die ANSI C Gewaltigen entzogen haben sei hiermit kurz auf die Implementierung unter CREST C eingegan gen Der Grund f r die fehlende Normung wird klar wenn man bedenkt das
155. arbeiten gegen ber Semaphoren wesentlich differenzierter Sie k nnen zwischen nur lesenden Tasks und Tasks die ggf auch Daten modifizieren unterscheiden Lesende Prozesse k nnen durch die Operation ENTER Boltvariable den Beginn und mit der Operation LEAVE Boltvariabledas Ende ihres Zugriffs auf den kritischen Datenbereich signalisieren Schreibende Prozesse d h Tasks die Daten modifizieren benutzen stattdessen die Operation RESERVE beim Eintritt und FREE beim Verlassen des kritischen Pfades Analog stehen dazu die folgenden C Funktionen zur Verf gung void rt_reserve_bolt Bolt bolt void rt_free_bolt Bolt bolt void rt_enter_bolt Bolt bolt void rt_leave_bolt Bolt bolt Ziel dieser unterschiedlichen Operationen ist es lesende Prozesse nicht zu behindern wenn kein Schrei ber die Daten benutzen will Solange kein Schreiber eine RESERVE Operation durchgef hrt hat dienen die ENTER und LEAVE Operationen nur dazu die Benutzung der Daten zu markieren Erst bei Abar beitung einer RESERVE Operation greift der mit den Bolts verkn pfte Synchronisationsmechanismus Ist zu dieser Zeit ein lesender Prozess im kritischen Pfad so wird die Ausf hrung des das RESERVE ausf hrende Schreibers ausgesetzt bis der oder die Leser den kritischen Pfad verlassen haben Gleich zeitig wird der Eintritt in den kritischen Pfad f r Leser und weitere Schreiber gesperrt Sind keine Leser oder Schreiber mehr im kritischen
156. asks in der Ausf hrung aussetzen F r eine einzelne Task ist auch das Aus setzen verbunden mit der Definition einer Fortsetzbedingung m glich siehe Einplanen mit Aussetzen 15 3 Multi Tasking 141 Aussetzen wird veranlasst durch den Bedienbefehl SUSPEND Taskname Kurzform SU Taskname Die CREST C Funktion rt_suspend bewirkt eine Selbstsuspendierung der aufrufenden Task void rt_suspend void Die folgenden Funktion dienen zur Suspendierung fremder Tasks ber deren Namen bzw ber deren EED void rt_suspend_external char name void rt_suspend_external_quick Task task 15 3 2 5 Fortsetzen Fortsetzen ist die zum Aussetzen entgegengesetzte Operation Eine Task wird aus dem Zustand SUSP in den Zustand RUN gebracht d h sie wird ab sofort wieder bei der Zuteilung der Prozessorkapazit t ber cksichtigt Die Task nimmt ihre T tigkeit an genau der Stelle an der sie ausgesetzt wurde wieder auf F r die Task selbst ist bis auf eine nderung der Uhrzeit kein Unterschied zu ununterbrochener Ausf hrung merkbar Die Fortsetzung kann sowohl vom Bediener als auch von einer anderen Task veranlasst werden Klar d rfte sein dass eine ausgesetzte Task keine M glichkeit hat sich selbst wieder fortzusetzen es sei denn sie beginnt das Aussetzen mit einer Einplanung zur Fortsetzung siehe Einplanen Die Fortsetzung kann mittels des Bedienbefehls CONTINUE Taskname oder kurz C Taskname veranlasst werden Auf C Ebene steh
157. ass Bildschirmausgaben verschiedenpriorisierter Tasks sich nicht in das gewohnte Denkschema des zeitlichen Nacheinanders einreihen lassen In den Warteschlangen geht es eben absolut undemokratisch zu Ein CE mit hoher Priorit t dr ngelt sich in der Warteschlange soweit vor bis es auf ein CE mit identischer oder h herer Priorit t st sst Wenn zwei Tasks unterschiedlicher Priorit t pausenlos CE s zu einer Warteschlange schicken so werden Sie nie die Bearbeitung eines CE s der niederprioren Task beobachten mal ein langsames Ausgabeger t voraus gesetzt das bereits mit den CE s einer Task ausgelastet ist Dieser Effekt f hrt bei der Interpretation von Taskausgaben oft zu verzweifeltem Staunen ber die kausalen Widerspr che der Ausgabemeldungen V O Queue Pointer 1 O Queue LDN 0 VO Queue LDN 1 V O Queue LDN 2 Ox85E L Abbildung 15 8 Beispiel einer Warteschlange Jetzt steht unser CE also in der I O Queue und die Funktion rt_transfer_ce geht daran dem Empf nger Bescheid zu sagen dass ein Paket fiir ihn da ist Dazu gibt es unter RTOS UH ein Feld von Taskpointern in denen sich jede beliebige Task einklinken kann die die Betreuung einer bestimmten LDN zu bernehmen beabsichtigt Der Abbildung 15 9 k nnen Sie den prinzipiellen Aufbau entnehmen Den Pointer auf den Start dieses LDN t o TID Feldes finden Sie an der Position 852 L Der Zugriff auf die Betreuungstask mit LDN 7 w re also mit Task 0x852
158. assen Lediglich eine einzige Datei meist die in der main enthalten ist muss vor dem Aufruf der Includedatei die Zeile define Extern enthalten und schon entfallen viele Stunden unn tzen Debuggens CREST C ist im Gegensatz zu anderen Compilern recht kumpelig in Bezug auf Initialisierungen hinter extern Vereinbarungen Etwa die H lfte der mir bekannten Compiler insi stiert beim Auftreten des Gleichheitszeichens wie z B bei var2 1 darauf dass das Schl sselwort extern wohl eher nicht ernst gemeint sein kann Die Folge besteht dann darin dass man f r jede Datei die eine solche Konstruktion benutzt hat beim Linken einen Fehler f r eine doppelt aufgetre tene Definition eingeschenkt bekommt Die andere H lfte der C Compiler CREST C geh rt dazu beschliesst in solchen F llen dass dann wohl eher die Initialexpression berfl ssig ist und betrachtet die Variable als Referenz 3 17 Zugriffs Modifizierer Die Schl sselworte const und volatile sind erst mit dem ANSI C Standard in den Sprachum fang eingegliedert worden Sie bieten dem Anwender die M glichkeit die Zugriffsrechte auf Objekte einzugrenzen und den Compiler zu einer bestimmten Form der Objekt Verwaltung zu zwingen Als const definierte Objekte k nnen nach der Initialisierung nicht mehr ver ndert werden Dauerhafte Objekte k nnen so im EPROM untergebracht werden und belegen keine RAM Kapazit t des Rech ners Gerade Tabellen die w hrend der Programmverlaufs unver
159. at int a 1 static int b 2 void f void static int c 3 Die Variable b im vorausgegangenen Beispiel ist nur innerhalb derUbersetzungseinheit bekannt in der dieser Code auftritt und zwar selbstverst ndlich erst ab dem Ort der Definition Die dritte Abstufung des G ltigkeitsbereiches kann dadurch erreicht werden dass st at ic Variablen innerhalb von Funkti onsr mpfen untergebracht werden Die Lebensdauer ndert sich dadurch nicht Eine st at ic Variable innerhalb eines Funktionsrumpfes ist und bleibt dauerhaft ber die Lebenszeit der Task Sie l sst sich jedoch nicht ausserhalb der Funktion namentlich ansprechen 3 17 Zugriffs Modifizierer 55 Im Beispiel kann demnach die Variable a von anderen Dateien aus mittels extern int a referen ziert werden Auch hier sollte nochmals darauf hingewiesen werden dass es die Sprache C nicht st rt wenn der Datentyp der Referenz nicht mit dem der Definition in einer anderen Datei korrespondiert Ihr Programm wird dann zwar nicht mehr statbil laufen aber es handelt sich dann auf der Compi lerseite nur um Unwissenheit und auf Ihrer Seite um echte Dummheit Es hat sich in der C Welt die Angewohnheit durchgesetzt eine Includedatei mit s mtlichen Variablenvereinbarungen zu erstellen ifndef Extern define Extern extern endif Extern int varl 7 Extern int var2 1 Durch eine derartige Konstruktion ist gew hrleistet dass Definitionen und Referenzen immer zusam menp
160. bei untersucht die aufrufen de Task zun chst ob die Task auf die gewartet werden soll tats chlich in der Dispatcherkette des Betriebssystems eingetragen ist ReportCode rt_wait_for_exit Task task Ist dies nicht der Fall so kehrt die Funktion sofort zur ck und liefert dem Aufrufer den Status der Ope ration als Langwort zur ck Die Antwort wird als Reportcode bezeichnet und ist zudem im Taskkopf der aufrufenden Task gespeichert Ein Reportcode mit dem Wert SFFFFFFFF entspricht einem Fehl schlag der Funktion und bedeutet dass RTOS UH die spezifierte Task nicht in der Dispatcherkette lokalisieren und folglich keine weiteren Operationen einleiten konnte Wurde die angegebene Task hingegen gefunden so wird die aufrufende Task mit Status SEMA blockiert und erst wieder lauff hig wenn die andere Task sich selbst terminiert oder extern terminiert wird Steht die angesprochene Task im Zustand waiting for activation im Dispatcherring so wird diese Blockierung aufgehoben In jedem Falle liefert rt_wait_for_exit entsprechende R ckgabewerte an die aufrufende Task Eine Antwort von 00000000 deutet auf ein ereignisloses Leben und einen erwartungsgem ssen Tod der zu berwachenden Task hin Um die berwachende Task auch ber Sonderkonditionen der berwachten Task zu informieren sind vom System her weitere Bitmuster reserviert Ein Reportcode von 00000001 bedeutet dass die berwachte Task von der Seite abgeschossen wurde sich al
161. bschalten der Ausgabe einiger WARNING s Die WARNING s sind in der aktuellen Implementierung grob nach ihrer Wichtigkeit gestaffelt Deuten die meisten W 6 Ausgaben auf Unsauberheiten und kleinere S nden hin so steigt die Wahrscheinlichkeit dass ein Pro gramm das nur mit W 0 ohne Meldungen compiliert werden konnte Ihnen zur Laufzeit ins Gesicht springt doch ganz erheblich _W 6 Alie Warnings ausgeben W 3 Fehlende Argumeniprototypen ignorieren gt Fehlende Funktionsprotoiypen ignorieren Wei Wesentliche Warnings ausgeben WO Alle Warning unterdr cken Tabelle 3 11 Unterdr ckung von Compiler Warnings 3 1 Die Optionen des ccc 23 3 1 21 Bekannte Compilerfehler Hier m ssen bedauerlicherweise zwei bekannte Fehler des CCC dokumentiert werden 3 1 21 1 Fehler bei der Syntaxanalyse von Symbolen Der CCC besitzt aus historischen Gr nden einen etwas unzul nglichen Parser in Bezug auf die korrekte Erkennung von Deklarationen und Expressions dieser stammt noch aus seiner K amp R Vergangenheit als die namespaces von Typen und Variablen noch nicht getrennt waren Ein paar Beispiele wo sich das zu einem Problem entwickeln kann 1 Der ccc bricht auf der Position mit der Fehlermeldung ab nun sei ein Name oder eine Deklaration zu erwarten Grund nach dem sich ffnenden Compound versucht er zun chst Deklarationen zu be arbeiten und findet tats chlich einen Bezeichner s de
162. bssystem mit den dort blichen Namenskonventionen vorgegangen die Sie der Tabelle 10 1 entnehmen k nnen Reihenfolge UNIX WINDOWSNT RTOS UH HAKE INT_ 7XX make ini Tabelle 10 1 Namensgebung bei CMAKE Initialfiles Die Option V dient dazu einige Ausgabemeldungen von CMAKE zu aktivieren So zeigt das CMAKE z B die Namen der automatisch gelesenen Dateien und deren Includedateien an 79 80 10 2 Das erste Makefile Mit der Option A l sst sich CMAKE dazu zwingen alle Ziel Dateien unabh ngig von deren Aktualit t erneut zu erstellen Mittels der Option I wird CMAKE angewiesen die Verarbeitung des Makefiles unabh ngig von Feh lermeldungen bei der Ausf hrung von Aktionen fortzusetzen Die Option T erlaubt es CMAKE in den Tracemodus zu versetzen Die auszuf hrenden Aktionen wer den angezeigt aber nicht ausgef hrt Mittels der Option macro replace lassen sich CMAKE Makros ber die Kommandozeile vor geben Eine explizite Beschreibung der Makros entnehmen Sie bitte dem Abschnitt 10 3 4 Die weiteren Optionen dienen zur Definition von Kommandozeilen Makros und sind im Abschnitt 10 3 4 2 n her beschrieben 10 2 Das erste Makefile An Hand eines Beispiels soll die grundlegende Notation dargestellt werden Ein Projekt test be stehend aus den Dateien test c und test h soll mittels eines Makefiles den ladbaren S Record test sr erstellen test sr test c test h ccc68k test c test obj cln68k test lnk test sr
163. bung f r die CREST C Bibliotheken existiert Derartige Tasks haben immer dort ihre Berechtigung wenn es darum geht Systemdienste einzurichten die ohne die recht komplexen Dienste der CREST C Bibliotheken auskommen Nehmen wir auch hier ein Beispiel Sie wollen externe Hardware an ihr System anschliessen die mit Interrupts auf sich auf merksam macht Zu diesem Zwecke richten Sie einen Interrupt Handler ein wie es im Abschnitt 13 5 beschrieben wird Um nicht endlos in der Interruptroutine zu bleiben ist es angebracht auf Interrupt Ebene nur die notwendigsten Aufgaben abzuhandeln um das Tasking nicht unn tig zu blockieren Zu den notwendigen Aufgaben eines Interrupt Handlers geh rt normalerweise nur die Beruhigung der Interrupt Quelle und das Abnehmen oder Abliefern von Daten Weitere Aktionen sollten nach M glich keit von geeigneten Tasks bernommen werden Und hier kommen die Systemtasks ins Spiel Der Sinn von Betreuungstasks liegt z B darin Daten die auf Interrupt Ebene entgegengenommen wurden in geeigneter Form aufzubereiten oder Daten aufbereitet einem Interrupt Prozess zur Verf gung zu stel len Gerade bei solchen meist zeitkritschen Angelegenheiten f llt es meist nicht unangenehm auf dass man printf und die meisten anderen Bibliotheksfunktionen nicht benutzen darf weil sowieso schon der kleinste Ausgabebefehl ber eine Schnittstelle auf ein Terminal das Tasking so durcheinan derbringen w rde dass meist nur d
164. c n aad ALI alanh 5 a sow ee a a ET ASA LR NEE EE E AID RE WOM E dl A A dh Re Re te aa En Ee ARO tanh a aa a er aad ede ee a and ac ea A 4 Exponential und logarithmische Funktionen E WE LA A A AAA da o A AVA 2 ERP is das eh era es th ch HH Oe ed ti e EE A e A43 EXPIDO BEER X INHALTSVERZEICHNIS AAA tmo0dQ u 2 ee EN ann 221 AS ERDO a adri ee 221 AA O 7 leen re re A ae SIRES ee RE 221 AA NOS Oi Ae A A hele che Me an A te cee id Aes ace Gh 222 AAS Joer ee ee ed a ne Bae ee 222 A49 108109 aka a A ek WEED RE OS ELLA 222 AMO MOL na teva ate ee DEE near ae dae a 223 AS Potenzfunktionen t ke aaka a D aA a a R a A a Ae 223 AS DOW te apace leh Aan ay ah en a Gow SE a ae eos E 223 ALS E eg ese ee ee a a ao EE EE 223 A 6 Sonstige Funktionen 224 AH COT EE 224 E GE E sre hy sae ke oe BI Bera Aap oe de ark ger ee ayant Bee le 224 ADO TOOL spss we oe ne eS ie eas GB A 224 A 64 round 224 AOD USTOTIC EE ue e EC 225 A 6 6 Testroutinen fiir Fliesskommazahlen 2 2 22 Emm nennen 225 B Zusammenstellung der Pragma Kommandos 227 Bl gt ALGOCATE INTERRUPLBUFFER dae ee een 227 B2 2COEBSTART An e a ea a ee 227 B 3 DESABLE BL T MNEMONLTOS e ee ee be A 228 BA DISABLE_CLEAR MNEMONICS 2 0 00 E Aane aa ee 228 Bi DYNAMIC STACK porna ads a a ee Gt he nee ae 228 B 6 ENABLE BT TAMNEMON TCS A an Wan er Ale e ets 228 B 7 ENABLE_CLEARMNEMONICS
165. cation Element 153 const 50 55 56 cop 77 cop68k 77 copppc 77 cosh 218 CWS 133 134 137 153 155 CWSP 127 CYAC 133 137 Data Relocations 47 DATION Block 93 DBL_DIG 212 DBL_EPSILON 212 DBL_MANT DIG 212 DBL_MAX 212 DBL_MIN 212 DD 158 Defaultpriorit t 132 DISABLE 149 DISABLE_BIT_MNEMONICS 20 228 DISABLE_CLEAR_MNEMONICS 20 228 Dispatcher 104 109 111 113 116 118 120 136 139 188 DISPATCHER Byte 134 Dispatcher Kette 139 Dispatcher Kette 139 DORM 104 133 134 136 138 139 141 144 double 26 212 Double Precision 212 DPC 109 111 113 115 120 DYNAMIC_STACK 41 228 Dynamische Task 125 EDTF 127 INDEX Einbau Makros 25 _CPLUSPLUS_ 25 _CRESTC__ 25 _DATE_ 25 _FILE__ 25 _LINE_ 25 M68K_ 25 _MPPC_ 25 _RTOSUHL 25 STDC 25 TIME 25 ENABLE 149 ENABLE_BIT_MNEMONICS 20 228 ENABLE_CLEAR_MNEMONICS 20 228 END_SLICE_SKIP 206 229 ENTER 147 enum 26 EPROM 108 230 ERROR 106 234 Error Task siehe ERROR Task ERROR Trap 190 192 Errorcodes 190 Errordatei 22 EVAC 133 137 EVCO 133 137 EVENT 230 Event 116 143 144 149 EXCEPTION 117 119 120 229 Exception 107 Exception Handler 92 EXCLU 167 exp 220 exp100 220 exp2 220 Extended Precision 212 Extern 55 extern 50 55 fabs 224 facos 213 facosh 218 false 13 fasin 214 fasinh 218 fatan 214 fatan2 215 fatanh 218 fcei
166. cation Elements gehtes nun darum das CE so aufzuf llen dass der I O Auftrag auch in geeigneter Form von RTOS UH bearbeitet werden kann Der Abbildung 15 5 ist nochmals der Aufbau eines CE s dargestellt Die fettgedruckten Namen der Strukturmitglieder sind als Spielwiese f r den normalsterblichen Programmierer freigegeben Der obere Teil des CE s besteht aus internen Verwaltungsinformationen die RTOS UH dringend ben tigt Die Eintr ge von head bis backs sind f r Sie absolut tabu Willk rliche nderungen in diesem Bereich f hren sehr schnell zum Crash 156 15 5 I O unter RTOS UH head forward head backward Abbildung 15 5 Darstellung eines CE s Interessant wird es im unteren Bereich der Struktur Hier wird dariiber entschieden wer das CE bear beiten soll Ldn drive unter welchem Namen der Auftrag verschickt wird filename wo die Daten liegen buf fer und wieviel Bytes von diesem CE verarbeitet werden k nnen reclen Nun fehlt nur noch die Angabe ber die Art des Auftrags mode status_of_io und schon kann das CE verschickt werden Wenn Sie zudem den O Vorgang mit einer anderen Priorit t als der ihrer Task starten wollen k nnen Sie den Default Wert von prio ndern Und nun noch mal langsam zum Mitschreiben Ein CE ist eigentlich nur ein einfaches Daten P ck chen das man allerdings penibel beschriften muss um nicht unwissentlich eine Packetbombe in die Welt hinauszuschicken Wenn ein CE mit rt_fetch_ce
167. ch an der DOS Schreibweise besteht also aus maximal 8 Zeichen f r den Basisnamen und einem optionalen Punkt als Einleitung f r eine maximal drei Zeichen lange Dateiendung Entsprechend w re die Schreibweise des oben angef hrten Beispiels auch wie folgt noch syntaktisch korrekt h0 c cc h dummy p test c liefert n0 c cc h p test c Es ist dabei zu beriicksichtigen dass w hrend der Auswertung derartiger Pfadangaben kein physika lischer Zugriff auf die entsprechenden Verzeichnisse stattfindet Da nach der Expansion des Beispiels kein Zugriff auf das Directory dummy stattfindet kann der Zugriff auf test c auch dann erfolgreich sein wenn das Verzeichnis dummy nicht existiert Ein Wechsel auf das bergeordnete Verzeichnis wird nicht ausgefiihrt wenn bereits die Wurzel des Devices erreicht wurde h0 probe c cc h dummy p test c liefert ebenfalls n0 c cc h p test c Nach der Expansion der Pfadangabe ohne Ger tenamen darf die resultierende Zeichenkette die L nge von 23 Zeichen nicht berschreiten respektive der unter 8F 2 W aufzufindenden maximalen Pfadl nge des Systems 15 5 3 Praktische Anwendung von CE s Wenn Sie nunmehr die Grundlagen der CE s verstanden haben soll nun an Hand von ein paar gebr uch lichen Beispielen aufgezeigt werden wie man in der Praxis damit umzugehen hat 15 5 VO unter RTOS UH 165 15 5 3 1 Serielle Schnittstellen Unter RTOS UH geh rt der Umgang mit seriellen Schn
168. char name TimeSchedul iv oe 144 15 3 Multi Tasking void rt_after_continue_quick Task task TimeSchedule iv y Will eine Task selbst ihre Ausf hrung f r eine bestimmte Zeitdauer aussetzen so kann dies mit tels der C Funktion rt_t imed_resume erreicht werden Auch hier gilt die Nomenklatur f r die Angabe von absoluten und relativen Zeiten void rt_timed_resume TimeSchedule zeit Im Sinne der besseren Bedienbarkeit steht auch hier eine at und eine after Form als Funkti onsaufruf in der Bibliothek zur Verf gung void rt_resume_at TimeSchedul zeit void rt_resume_after TimeSchedul zeit Die Task berf hrt sich hierbei selbst in den Zustand SCHD und verzichtet bis zum Erreichen des gew nschten Zeitpunktes oder nach dem Verstreichen der gew nschten Zeitdauer auf die Zuteilung von Prozessorkapazit t e auf Event eingeplante Fortsetzung Die auf einen Interrupt eingeplante Fortsetzung ist analog der auf einen Interrupt eingeplanten Aktivierung zu verstehen F r eine Task wird definiert dass sie beim Eintreten eines Events fortgesetzt werden soll Voraussetzung ist nattirlich dass diese Task bis zum Eintreten des In terrupts ausgesetzt ist andernfalls erfolgt beim Eintreten des Events die Fehlermeldung Tas kname NOT SUSPENDED da die Fortsetzung einer nicht ausgesetzten Task unm glich ist Die Einplanung wird ber den Bedienbefehl WHEN Eventkennzeichnung CONTINUE Taskname definiert Unter CRES
169. cherheit zu bekommen Ich pers nlich bevorzuge allerdings Sicherheitszuschl ge von 1 2 bis 3 je nach ermittelter Stackgr sse und der Panik die der Gedanke an den Absturz einer Anwendung bei mir ausl st Mittels dieser wenigen Regeln bekommt man recht schnell stabile Programme zustande Der Verzicht auf eine berpr fung des ben tigten Stacks bei Programmen die in Produktionsrechnern eingesetzt werden sollen ist in jedem Fall fahrl ssiges Verhalten 3 10 Interner Registergebrauch von CREST C F r eigene Assemblerprogramme ist es zun chst wichtig die Verhaltensweise des aufrufenden Com pilers und des zugrundeliegenden Betriebssystems zu verstehen Hier sei zun chst das Verhalten f r 68k Maschinen erl utert CREST C verwendet zur Parameter bergabe an Funktionen grunds tzlich den Stack Der Stack ist ein Speicherbereich dessen jeweils aktuelle Position mittels des Stackpointers SP verwaltet wird Der Stackpointer wandert bei zunehmender Belegung von hohen zu niedrigen Adressen Die aufru fende Funktion belegt den Stack mit den Argumenten f hrt den Funktionsaufruf durch und hat den selbstst ndig f r die Korrektur des Stackpointers Sorge zu tragen Zur Verwaltung der Sections belegt CREST C zwei Adressregister fest mit deren Startadressen Die globalen Variablen in der data und bss Section erreichen Sie ber das Adressregister A5 Auch dieses Register sollten Sie nie mutwillig modifizieren und sp testens bei der R ckkeh
170. chinenspezifischen Grenzen be findet zu exekutieren Dennoch gelten auch hier Regeln an die sich der Compiler halten muss oder sollte F r Sie als Programmierer ist es nur dann wichtig diese Regeln zu kennen wenn es darum geht innerhalb von Programmen mit externen Datenstrukturen umgehen zu m ssen Die Abbildung der Da tenstrukturen auf den realen Speicher ist nicht genormt und h ngt von den Vorgaben der Maschine ab f r die der Compiler Code erzeugen soll Unter dem Begriff des Padding versteht man das automatische Auff llen von Datenstrukturen mit Leerbytes um die Anwenderdaten auf Adresslagen zu zwingen die die Maschine auf der die Daten verarbeitet werden sollen vorschreibt So ist z B die CPU MC68000 nicht in der Lage 16 bzw 32 Bit Daten auf ungeraden Adressen zu lesen oder zu schreiben Ein 68K Compiler tr gt dem dadurch Rechnung indem er alle Wort und Langwort Daten automatisch auf der n chsten geraden Adresse ablegt F r den Anwender der etwas wie long a 3 in sein Programm geschrieben hat verh lt sich dieses automatische Padding v llig transparent Wo und wie der Compiler den Platz f r die 32 Bit Variable a allokiert ist ausschliesslich Sache des bersetzers Interessant wird die Angelegenheit erst bei Datenstrukturen die Hardware Kommunikations Protokolle oder Datens tze beschreiben sollen die einen vorgegebenen Aufbau besitzen Es ist oft zu unhandlich eine Struktur als sequentielle Abfolge von Bas
171. chners in verschiedenartige Speichersektionen Dieser Vor gang findet dynamisch statt und passt sich den jeweiligen Anforderungen des Nutzers und der Tasks im System an der Vorteil des dynamischen Verhaltens des Betriebssystems was die Zahl der Speicher bereiche angeht wird dadurch erkauft dass das Laufzeitverhalten bei manchen Operationen nur noch sehr begrenzt als deterministisch zu bezeichnen ist RTOS UH verwaltet den RAM Speicher des Rechners als eine doppeltverkettete Liste von Sektionen Es gibt keine MMU die irgendwelche virtuellen Adressen zur Verf gung stellt Eine jede Speichersekti on beginnt grunds tzlich mit einem Verwaltungskopf dem MemSectionHeader dessen Aufbau Sie Abbildung 14 3 entnehmen k nnen Beispiele f r deren Verwendung sind z B die bereits vorgestellten Strukturen von Taskkopf siehe Abbildung 14 1 und Taskworkspace siehe Abbildung 14 2 typedef struct MemSectionHeader struct MemSectionHeader forward struct MemSectionHeader backward UserNumber owner MemSection typ R MemSectionHeader Abbildung 14 3 Aufbau eines MemSectionHeader s Mittels forward und backward wird die bereits erw hnte Verkettung der Sektionen verwaltet Sie als Programmierer sollten sehr vorsichtig sein wenn Sie mit derartigen Ketten spielen In C ist das Spie len selbst kein Problem das Problem beginnt erst dann wenn Sie nicht begriffen haben was Sie da tun und RTOS UH mal so eben mit Fehlermeldungen nach Ihn
172. chschnittliches Basissystem enth lt in der Regel um die 100 Scheiben was also grob einer Tabellengr sse von einem halben Kilobyte entspricht Da der Scheiben mechanismus aber auch auf Anwenderebene einsetzbar ist und nicht nur die vom System reservierten Scheibennummern hier abgelegt werden sind die in Abschnitt 16 3 8 angesprochenen Restriktionen strikt zu beachten 16 2 3 Ausf hren von Kaltstart Code Wie Sie unschwer an der f hrenden Position dieses Abschnittes erkennen k nnen erfolgt die Ausf hrung des benutzerdefinierten Kaltstart Codes fast ganz zu Beginn der Systemkonfiguration oder anders ausgedr ckt es existiert noch kein RTOS UH Die Systemvariablen sind gr ssten teils uninitialisiert die Systemtraps noch nicht angeschlossen und Exception Handler sind auch noch nicht aktiv Selbstredend existiert auch noch kein Tasking oder gar Tasks Was man innerhalb einer solchen Kaltstartscheibe kodieren kann ist nackter Maschinencode Dem Abschnitt 13 7 sind zus tz liche Erkl rungen zu entnehmen wie und was man in CREST C unternehmen muss um derartigen Kaltstartcode erzeugen zu lassen In der Regel enthalten ausgelieferte RTOS UH Systeme bereits mehrere Kaltstartscheiben die dazu dienen die Hardware eines Rechners zu initialisieren Es sind jedoch auch eine Menge anderer Ein satzm glichkeiten denkbar Ein paar Beispiele e Das Herunterkopieren des Betriebssystems oder von Anwenderprogrammen ins RAM Da sich in der Regel de
173. cmp hat auf Interruptebene schon das Potential den Rechner zu himmeln wenn er aus den Test Bibliotheken hinzugelinkt wurde Kommen wir nun zum Parameter Transfer an Funktionen Argumente werden grunds tzlich ber den Stack an die aufgerufene Funktion bergeben F r reine C Programmierer ist der Parameter Transfer kein Thema Normalerweise werden die Parameter schliesslich namentlich von der Funktion angespro chen und es kann dem Programmierer egal sein wo diese Werte physikalisch herkommen Bei offenen Parameterlisten wie sie z B bei printf Verwendung finden gibt es nach ANSI C Norm endlich eine saubere M glichkeit an die bergabewerte heranzukommen In der Includedatei lt stdarg h gt sind die folgenden Makros vereinbart die eine portable Programmierung erm glichen typedef void va_list define va_start ap parmN ap char parmN sizeof parmN define va end ap define va_arg ap type type ap Abbildung 3 11 Auszug aus lt stdarg h gt Mit va_start holen Sie sich den Pointer auf das erste Element der Parameter die sich hinter den drei Punkten verstecken Jeder Aufruf von va_arg stellt Ihnen anschliessend den n chsten Wert auf dem Stack zur Verf gung Sie m ssen darauf achten dass bei der Verwendung dieser Routinen auf der Aufruferseite die Argumente entsprechend der ANSI C Norm gecastet werden Funktionen mit offener Parameterliste legen alle Integer Datentypen als 32 Bit int
174. code pragma COLDSTART void Kaltstart void Parameter keine Siehe auch Abschnitt 13 7 227 228 B 7 ENABLE_CLEAR_MNEMONICS BA DISABLE_BIT_MNEMONICS Unterdriickt bei der Codegenerierung die Verwendung von Einzelbit Befehlen Bei Zugriff auf externen Speicherbereich werden keine BSET BCLR BTST und BCHG Mnemonics mehr verwendet Parameter keine Siehe auch Abschnitt 3 1 18 2 BA DISABLE_CLEAR_MNEMONICS Unterdr ckt bei der Codegenerierung die Verwendung des CLR Mnemonics bei Speicherzugriffen Parameter keine Siehe auch Abschnitt 3 1 18 1 B 5 DYNAMIC_STACK Einrichten von Prolog und Epilogcode fiir die nachfolgende Funktion um bei Bedarf den Stack zur Laufzeit zu vergr ssern pragma DYNAMIC_STACK NEWSTACK size RANGE range void RecursiveFunction void Parameter NEWSTACK size gibt die zus tzliche Stackgr sse in Bytes an RANGE range gibt den Sicherheitsabstand zum Stackende in Bytes an kleiner 32kB Siehe auch Abschnitt 3 9 Bo ENABLE_BIT_MNEMONICS Hebt die Wirkung von DISABLE_BIT_MNEMONICS auf und erlaubt dem Compiler die Verwendung von BSET BCLR BTST und BCHG Mnemonics Parameter keine Siehe auch Abschnitt 3 1 18 2 B 7 ENABLE_CLEAR_MNEMONICS Hebt die Wirkung von DISABLE_CLEAR_MNEMONICS auf und erlaubt dem Compiler die Verwendung des CLR Mnemonics Parameter keine Siehe auch Abschnitt 3 1 18 1 B 8 END_SLICE_
175. dabei nur welcher Aufwand wirtschaftlich noch vertretbar ist Die Ent wicklung auf Maschinenebene verursacht erheblich h here Kosten als die Entwicklung in C Dieser Punkt d rfte unstrittig sein wird aber immer wieder gerne von den sogenannten Entscheidungs trdgern ignoriert Bei der Auswahl der Programmiersprache scheiden sich dann endg ltig die Geister PEARL wurde so konzipiert dass selbst unerfahrene Programmierer einigermassen schnell zu vertretba ren Ergebnissen gelangen k nnen Bei PEARL wurde besonderer Wert auf minimale Anforderungen an den Entwicklungsrechner gelegt und auch an den Entwickler Es ist ein grosser Vorteil von RTOS UH dass man selbst auf Embedded Controllern und ich meine nicht die VME Bus Schlachtschiffe mit MPC604 noch Software entwickeln kann Bereits mit kleinen Entwicklungsrechnern lassen sich mittels PEARL grosse modulare Echtzeitanwendungen schreiben compilieren und testen Bei CREST C h ngt der Brotkorb schon deutlich h her Die Einarbeitungszeit ist erheblich l nger da die M glichkeiten weit ber den Sprachumfang von PEARL hinausgehen C ist eine Sprache die sich an ernsthafte Programmierer wendet und sei keinem Freizeitprogrammierer empfohlen der oh ne Handbuch den Unterschied zwischen Pr und Postinkrement nicht im Ged chtnis behalten kann 1 3 Allgemeines zu C unter RTOS UH 3 Der Unterschied zu einer Schrotflinte besteht lediglich darin dass jeder sich einen C Compiler kaufen
176. den gr ssten Datentyp Er belegt 96 Bit im Speicher und ist unter CREST C als Datentyp long double anzusprechen Die interne Darstellung enth lt 64 Bit Mantisse 15 Bit Exponent und ein Vorzeichenbit Zus tzlich sind 16 Bit in der internen Darstellung vorhanden die keinerlei Nutzinformationen sondern stets ein Nullmuster beinhalten Eine Mantisse vom Daten typ long double bietet eine maximale Aufl sung von etwas mehr als 19 Dezimalstellen exakt In 2 In 10 x 64 Die gr sste darstellbare Zahl betr gt 1 189731495357231764E 4932L die kleinste darstellbare Zahl entsprechend 1 681051571556046753E 4932L Die kleinstm gliche Ann herung an die Zahl 1 betr gt 5 421010862427522170E 0020L Die entsprechenden Kon stanten sind in der Includedatei lt float h gt als Makros abgelegt define LDBL_MANT_DIG 64 define LDBL_DIG 19 define LDBL_EPSILON 5 421010862427522170E 0020L define LDBL_ MIN 1 681051571556046753E 4932L define LDBL_MAX 1 189731495357231764E 4932L A 2 Trigonometrische Funktionen 213 A 2 Trigonometrische Funktionen A 2 1 acos Sa acos x 2 5 1 5 0 5 0 1 0 5 0 0 5 1 Syntax float facos float double acos doub x x long double lacos long double x 3 le le Die Funktion acos x berechnet den Arcus Cosinus im Bogenmass des Argumentes x Wertebereich und Fehler Wird als Parameter x der Wert NaN oder Inf angeg
177. der Terminierung der anfordernden Task wieder in den Besitz des Betriebssystems ber Die aktuelle Gr sse des Speicherrings l sst sich mittels der Funktion rt_allocated bytes ber wachen die die Zahl der allokierten Bytes der aufrufenden Task liefert In Hinblick auf Betriebssicherheit wurde die Speicherverwaltung so konzipiert dass die blichsten Fehlbedienungen wie Freigabe von NULL Pointern und Doppelfreigabe von Bl cken nicht zu den allseitig geliebten Systemabsch ssen f hren k nnen Auch free Aufrufe mit Pointern auf nicht allokierte Bl cke f hren nicht unbedingt zu Speichersalat Die free Routine bricht bei derartigen F llen ab ohne wirre Spuren im System zu hinterlassen die ber hmten Ausnahmen best tigen allerdings wie blich die Regel Wenn also Ihr Programm Sie mit der Meldung free _argument_is_NULL beschimpft dann haben Sie gerade versucht einen NULL Pointer in den Speicherring zur ckzugeben Die lapidare Meldung free _argument_is_not_linked ist eine Runde dramatischer Sie deu tet auf totalen Schwachsinn als Argument der Funktion free hin Hier sind einige unangenehme F lle denkbar Sie sollten zun chst berpr fen ob der bergebene Pointer berhaupt einen sinnvollen Wert enth lt Ist grober Unfug ausgeschlossen kann es sich um den Versuch einer erneuten Freiga be eines bereits freigegeben Blockes handeln Beim Umgang mit mehreren Subtasks kann auch der Fall aufgetreten sein dass e
178. der Zeilennummern orientiert sich an den erkannten expression s bzw statement s im Quelltext 18 3 1 Die Optionen des ccc ce El ay Short ay Dy Cy rdp E Ey GG sg SS BE ay void test void 4 ay 5 gt a b c d 6 e f g a KY 2 ck ere ly iy qe 3 GE LO AE b ax c 10 gt Abbildung 3 2 Beispielprogramm f r die Y Option F r jede expression wird exakt eine Zeilennummer gespeichert auch wenn diese ber mehrere Zei len hinwegreicht Bei der mitgef hrten Nummer handelt es sich um die Zeile in der die expression begonnen hat Die Zeilenmarkierung wird im Code immer vor dem Maschinencode eingebaut der zu der entsprechenden expression erzeugt wird Die Abbildung 3 3 zeigt den erzeugten Code bei Verwendung der Y Option Achtung Benutzen Sie nie die Y Option aus Programmcode heraus bei dem A4 nicht korrekt gesetzt ist So besitzen z B weder Interruptroutinen Kalt noch Warmstartscheiben einen Taskworkspace und folglich auch kein g ltiges A4 Der Compiler unterdr ckt zwar selbstst ndig innerhalb solcher Son derfunktionen die Generierung des Linetracer Codes Dies gilt jedoch nicht f r Funktionen die aus einem derartigen Rumpf heraus aufgerufen werden Findet z B innerhalb der Interruptroutine Inter rupt der Funktionsaufruf TesteBitteDieHardware statt und enth lt eben diese Funktion Linetracer Code dann geht der Rechner nach relativ kurzer Zeit in die ewigen Jagdgr
179. dler in C 117 13 5 6 Fehlerbehandlung auf Interrupt Level Dem RTOS UH Handbuch k nnen Sie entnehmen dass es zum Abfangen von Fehlern auf Interrupt Level eine sogenannte malfunction gibt Auch dahinter versteckt sich nichts sonderlich Geheim nisvolles Tritt ein BUS ERROR oder eine hnlich peinliche Begebenheit auf Interrupt Level auf so versucht das System noch einige Rettungsmassnahmen durchzuf hren um nicht absolut hilflos im Walde zu stehen Dazu dient die Angabe eines Pointers auf den Code der den Schiffbruch vermei den soll Bei CREST C besteht die malfunction lediglich aus dem blichen Epilog Code des Interrupt Handlers Es werden im Fehlerfall die alten Register restauriert der Stack wieder auf den Ursprungswert gesetzt und dann der Handler geordnet verlassen Doch vorsicht denn diese Methode funktioniert nur wenn der Interrupt Handler in einem St ck kodiert wurde In unserem Falle heisst das Funktionsaufrufe auf Interruptebene legen den R ckfall Mechanismus im Fehlerfall lahm und f hren zum Systemabsturz RTOS UH findet im Fehlerfalle die mal function nicht mehr wenn der Stack durch Funktions aufrufe modifiziert wurde Wenn Sie sicher sind dass keine Fehler in der Interrupt Routine auftreten k nnen steht es Ihnen selbstverst ndlich frei beliebig Unterprogramme zu verwenden Sollte darin dennoch ein Fehler auftreten kommt es unweigerlich zum GAU f r das Betriebssystem 13 6 Exception Handler in C Das Thema E
180. dpc File 0 No dependency file 1 list included c files 2 list included c and h files 3 list included c h and lt h gt files H path Choose headerfile directory J digit Search includes in upper lower case 0 only upper case 1 only lower case 2 upper and lower case L Add line infos to s File P digit Enable PEARL Interface 0 No 2 PEARL9O Q digit Show source R digit Addressing mode for function calls 0 bl label 1 bla label 2 blrl S Default character is signed E Informations about compiler modifications U Stack check V Verbose messages W digit Ignore warnings Y digit Linetracer 0 No Ok Set linecell 240 C 3 cln68k 2 Use system trap Z Accept global register variables e Dump internal expression trees h Use of global variables forbidden n Suppress optimization of bit operations 0 Dump all optimizations to opl File p Show all floatingpoint casts as warnings q Preprocess pragma s 8 Generate s File u Add stack infos to obj File FX Generate 1st File y No undef warnings AZ Add debug infos to obj File Enable some C9X features ansi Force ANSI casting fpu Generate Code for FPU CA cln68k Crest S Record Linker CLN 68K Version for Linux x86 Copyright C 1987 1999 by Stephan Litsch Release 2 597 Nov 4 1999 12 25 28 Usage cln68k linkfile outputfile options file Read option file
181. e port_info_A drive strcpy rce_A gt file_name READ_A xFF Bis hierher diirfte es sich inzwischen um eine vertraute Ubung handeln Die Uberpriifung ob rt_get_filedata die Schnittstelle A1 als fehlerhaft einstufen k nnte sei diesmal als rundant be trachtet Diesmal wurde ein CE ohne eigenen Puffer und ohne Kontigent berwachung angefordert weil beabsichtigt ist den in der Funktion bergebenen Puffer str direkt zu f llen Achtung ein belieb ter Anf ngerfehler besteht darin zwar einen Pointer zu bergeben aber keinen Pointer auf ausrei chend grossen Speicher oder gar gar mit undefinierten Pointern zu arbeiten Es kommt reichlich un komisch ein Eingabe CE dazu zu missbrauchen eine nicht n her definierte Speicherstelle zu patchen oder Feld berl ufe vom Nukleus realisieren zu lassen Jetzt wird der Modus des CE s gesetzt rce_A gt mod MODMWA Auf Beendigung des I O Vorgangs warten TOCNE Fehlermeldungen in das CE schreiben IOCRWI Befehl READ WRITE rce_A gt reclen 5 Hier die Laenge eintragen rce_A gt buffer str Und mit unserem Argument arbeiten 172 15 5 IVO unter RTOS UH Das Bit IOCRWI f r Lesen Schreiben ist immer noch identisch Das Fehlen des Bits MODMOU selek tiert als Richtung der Operation den Input Der Wunsch Fehlermeldungen im CE zu erhalten durch IOCNE angegeben ist bei Leseoperationen durchaus sehr sinnvoll Im Beispiel soll nach dem Ab sch
182. e Peripherie zu war ten Sie machen berall dort Sinn wo angestossene O Vorg nge so langsam sind dass Prozessor Restkapazit t zu verteilen ist 15 4 1 1 Timer Interrupt Eine besondere Rolle spielt der Timer Interrupt F r die Systemuhr wird ein periodischer Interrupt be nutzt der in den meistens RTOS UH Systemen jede Millisekunde ausgel st wird um die Systemzeit selbstst ndig zu verwalten Die hierzugeh rende Interrupt Routine pr ft bei jedem Uhr Interrupt auch Clock Tick genannt ob ein Zeitpunkt vorliegt zu dem eine Einplanung existiert Ist dies der Fall so werden die erforderlichen Massnahmen zur Taskzustands nderung durchgef hrt und der Taskumschal ter gestartet um den Prozessor der nun h chstpriorisierten Task zuzuteilen Selbstverst ndlich ist es auch m glich eigene Timer zu programmieren um z B periodische Inter rupts mit h herer Frequenz als dem blichen Zeitatom von RTOS UH 1kHz zu erzeugen Bei der Erzeugung von hochfrequenten periodischen Interrupts sollten Sie jedoch stets im Auge behalten dass dadurch die f r Anwendertasks freie Prozessorleistung herabgesetzt wird Das kann auf langsamen 15 5 VO unter RTOS UH 151 Maschinen dazu f hren dass das System sich nur noch mit der Verwaltung von Unterbrechungen besch ftigt und der normale Betrieb stark eingeschr nkt oder v llig paralysiert wird 15 4 1 2 Schnittstellen Interrupt Wie schon oben erw hnt ist die Ausgabe von Zeichen ber die
183. e des Compilers der Deklarationen behandelt um einen Programm teil handelt den ich vorsichtig als nicht trivial bezeichnen w rde ist mit einer schnellen Behe bung dieses Fehlers z Z nicht zu rechnen Als Abhilfe ist angeraten die Namen von Datentypen und Variablen m glichst unterschiedlich zu w hlen oder mittels der beiden gerade beschriebenen Verfahren dem CCC bei Zweideutigkeiten in der Syntax auf den rechten Weg zu helfen 3 1 21 2 Fehlerhafte Registerverteilung Durch einen konzeptionellen Fehler im CCC kann es unter bestimmten Konstellationen bei der Codege nerierung dazu kommen dass der Compiler mehr Variablen automatisch als implizite Registervariablen behandelt als die CPU oder FPU berhaupt besitzt Um Panikreaktionen vorzubeugen wenn Sie diese Fehlermeldung nicht sehen dann sind auch keine Fehler dieser Art aufgetreten Der CCC generiert auf Grund dieser Macke definitiv keinen fehlerhaften Zielcode sondern bricht mit einer Fehlermeldung ab Entgegen der ersten Prognose dieser Fehler sei mit einer schnellen berarbeitung des Programmtei les im CCC zu beheben der sich mit der Verteilung von Prozessor Registern an die einzelnen Varia blen Ihrer Programme besch ftigt k nnen Sie der Existenz dieses Abschnitts entnehmen dass ich im history File der 1 756 Release als dieser Fehler erstmals bekannt wurde zu optimistisch war Die realistische Einsch tzung ergab vielmehr dass rund 200 Kilobytes an Quelltexten des
184. e f r den PowerPC wird durch Cross Assemblierung dieser Quelltexte erreicht Die Syntax des RTOS UH Assemblercodes basiert auf den Mnemonics f r 68K CPU s Erst bei der Cross Assemblierung erfolgt die Umsetzung in reinen PowerPC Code RTOS UH bildet die bekannten 68K Registernamen auf die GPR s General Purpose Register des PowerPC ab Diese Register sind im Gegensatz zur 68K Architektur universell einsetz bar Die Aufteilung in Daten und Adressregister existiert beim PowerPC nicht mehr Die im vorausge gangenen Abschnitt getroffenen Aussagen bez glich der 68K Maschinen sind unter Verwendung der folgenden Umsetzungstabelle auch f r den PowerPC g ltig 46 3 11 Verschieblicher Code PPC Register 68K Register Sonder Bedeutung 0 Integer und Pointer Riickgaben K K 2 3 4 5 K K K K DI D D D D D7 AO Al A2 A3 A4 Zeiger auf die local Section A3 i A Zeiger auf die dat a Section 6 Zeiger auf den Callingstack E Tempor res Register RTOS UH Tempor res Register RTOS UH Tempor res Register RTOS UH CREST C Tempor res Register RTOS UH CREST C Tempor res Register RTOS UH CREST C Tempor res Register RTOS UH CREST C Es existieren jedoch zwei bedeutsame Abweichungen 3 2 Tempor res Register RTOS UH ro r9 rar 122 r23 24 25 26 EI 28 29 30 L ei G G Gl GO 1 Der cccppc verwendet r0 sowohl f r Integer und Pointer R c
185. e so gegen Schreibzugriffe gesch tzt ist und nicht auf den Pointer b selbst int const a const int const int const void f void a void 0 FALSCH tha FALSCH az 1 void 0x802 void 0x812 void 0x822 a OC Il kb 15 FALSCH c void 0 FALSCH Fre FALSCH c 1 FALSCH 3 18 2 Die data Section Die data Section umfasst die dauerhaften Variablen die innerhalb Ihrer C Programme einen An fangswert zugewiesen bekommen sollen Die hier gespeicherten Objekte liegen im RAM Bereich und sind ver nderlich Auf C Ebene werden alle dauerhaften Variablen in der data Section abgelegt denen ein Anfangswert zugewiesen wurde dazu z hlen auch dauerhafte Variablen die explizit und unn tzerweise mit einem Null Muster initialisiert wurden Dauerhafte Objekte werden in der dat a Section allokiert wenn ein Initialwert zugewiesen wurde int a 0 static int bz A volatile int c 0 static volatile int d 4 void f void extern int x liegt im data oder bss Bereich static int y 3 58 3 18 Sections unter CREST C 3 18 3 Die bss Section Die bss Section umfasst die dauerhaften Variablen die innerhalb Ihrer C Programme keinen explizi ten Anfangswert zugewiesen bekommen haben und folglich implizit mit einem Null Muster initialisiert werden Die hier gespeicherten Objekte liegen im RAM Bereich und sind ver nderlich Auf C
186. e wichtigste Eigenschaft einer Task ist f r RTOS UH ihre Dringlichkeit die Priorit t RTOS UH verteilt die Prozessorkapazit t unter den lauff higen Tasks gem ss deren individueller Priorit t Prio rit ten werden als Ganzzahl im Bereich 32768 32767 angegeben 1 in der Reihenfolge sinkender Priorit t Eine Task mit der Priorit t 1 ist also dringlicher als eine Task mit der Priorit t 5 Im Gegensatz zu den Zahlenwerten sagt man auch die Task mit der Priorit t 1 habe eine h here Priorit t als die Task mit der Priorit t 5 Negative Werte sind zumindest von der Intention her dem Betriebssystem selbst vorbehalten Jedesmal wenn es f r RTOS UH eine Veranlassung gibt den Prozessor einer Task zuzuteilen d h eine Task auszuf hren inspiziert RTOS UH eine Liste der vorhandenen Tasks die Dispatcher Kette und teilt den Prozessor der laufwilligen Task mit der h chsten Priorit t zu F r den Fall dass einmal keine Task laufwillig sein sollte enth lt RTOS UH eine Leerlauf Task die Task mit dem Namen IDLE die die niedrigstm gliche Priorit t besitzt und stets laufwillig ist Diese Task erf llt keinerlei Aufgaben ist aber f r die Funktion des Betriebssystems sehr wichtig Die folgenden zwei Bibliotheksfunktionen dienen dazu die Priorit t von Tasks zur Laufzeit zu ndern bzw abzufragen Die Prototypen befinden sich in lt rtos h gt Prio rt_set_prio Prio new_prio Mittels rt_set_prio kann die aufrufende Task ihre
187. eben so wird ein domain error durch das Setzen der Variable errno auf EDOM angezeigt Die Funktion liefert den Parameter x zurtick Liegt das Argument x ausserhalb des Wertebereiches von 1 bis 1 so liefert die Funktion eine Null als Funktionsergebnis und setzt die Variable errno auf EDOM 214 A 2 Trigonometrische Funktionen A 2 2 asin 1 0 5 0 0 5 1 Syntax float fasin float x double asin double x long double lasin long double x Die Funktion asin x berechnet den Arcus Sinus im Bogenmass des Argumentes x Wertebereich und Fehler Wird als Parameter x der Wert NaN oder Inf angegeben so wird ein domain error durch das Setzen der Variable errno auf EDOM angezeigt Die Funktion liefert den Parameter x zur ck Liegt das Argument x ausserhalb des Wertebereiches von 1 bis 1 so liefert die Funktion eine Null als Funktionsergebnis und setzt die Variable errno auf EDOM A 2 3 atan 0 5 A2 Trigonometrische Funktionen 215 Syntax float fatan float x double atan double x long double latan long double x Die Funktion atan x berechnet den Arcus Tangens im Bogenmass des Argumentes x Wertebereich und Fehler Wird als Parameter x der Wert NaN oder Inf angegeben so wird ein domain error durch das Setzen der Variable errno auf EDOM angezeigt Die Funktion liefert den Parameter x zur ck A 2 4 atan2 Syntax float fatan2 float Y float double atan2 d
188. eben bzw gel scht War die bergebene LDN v lliger Unfug so liefert die Funktion eine Null als R ckgabewert Zur ck zu unserem CE Irgendwann kommt die passende Betreuungstask ans Laufen und kann nach schauen wer etwas von ihr will Dazu befragt sie die zugeh rige O Queue mit der Funktion rt_take_of_queue Ce rt_take_of_queue IOqueue ldn Wenn ein NULL Pointer geliefert wird so ist die O Queue aktuell leer Ansonsten erhalten Sie einen Pointer auf das priorit tsm ssig h chste CE in der betreffenden Warteschlange und k nnen es nun bear beiten Der nachfolgende Quelltext zeigt die wesentlichen Bestandteile die zum Aufbau einer Betreu ungstask notwendig sind Im Beispiel wird f r die bergebene LDN eine Betreuungstask eingerichtet die lediglich Lese und Schreiboperationen unterst tzt und jedes eingelaufene CE ohne Fehlermeldung gleich wieder zur ckgibt Dank des Subtask Konzepts von CREST C k nnen Sie derartige Treiber mehrmals starten und damit ohne Explosion der Codegr sse z B mehrere unterschiedliche LDN s mit dem identischen Treibercode unabh ngig voneinander verwalten pragma SUBTASK PRIO 1 void Betreuungstask_zur_Laufzeit register IOqueue ldn register Ce work_ce S register void sys_stack Eigenschaften der Betreuungstask definieren rt_set_device_descriptor ldn IOFMIN IOFMOU 162 15 5 I O unter RTOS UH Bei RTOS als Betreuungstask eintragen rt_make_drive
189. ebereich und Fehler Wird als Parameter x der Wert NaN oder Inf angegeben so wird ein domain error durch das Setzen der Variable errno auf EDOM angezeigt Die Funktion liefert den Parameter x zur ck A 6 2 fabs Syntax float ffabs float x double fabs double x long double lfabs long double x Die Funktion fabs x liefert den Absolutwert des Arguments x Wertebereich und Fehler Wird als Parameter x der Wert NaN oder Inf angegeben so wird ein domain error durch das Setzen der Variable errno auf EDOM angezeigt Bei NaN wird der Parameter x zur ckgeliefert Bei Inf lautet das Resultat Inf A 6 3 Hoor Syntax float ffloor float x double floor double x long double lfloor long double x Die Funktion floor x rundet das bergebene Argument x in Richtung auf den n chstniedrigeren Integerwert ab und liefert das Resultat als Fliesskommazahl zur ck Wertebereich und Fehler Wird als Parameter x der Wert NaN oder Inf angegeben so wird ein domain error durch das Setzen der Variable errno auf EDOM angezeigt Die Funktion liefert den Parameter x zur ck A 6 4 round Syntax float fround float x double round double x long double lround long double x A 6 Sonstige Funktionen 225 Die Funktion round x rundet das tibergebene Argument x in Richtung auf den n chstliegenden In tegerwert und liefert das Resultat als Fliesskommazahl zur ck End
190. efiles einzulesen Der Dateiname ist dabei in doppelten Hochkommata anzugeben Es existieren keinerlei Standardsuchpfade Bei Ver wendung relativer Pfadangaben versucht CMAKE zun chst die einzuf gende Datei im dem Verzeichnis zu ffnen in dem auch die aktuell includierende Datei liegt Gelingt dies nicht so wird ein Zugriff im aktuellen Workingdirectory versucht Beispiel einer includierenden Datei linclude test def 10 3 5 3 Ausgeben vom Meldungen Die Kommandos message text und error text erm glichen es informative Meldungen bzw Fehlermeldungen in einem Makefile zu generieren In beiden F llen wird der nachfolgende Text bis zum Zeilenende ausgegeben Beispiel von Fehler Meldungen message Ich bin eine informative Meldung lerror Und ich bin ein echter Fehler Kapitel 11 Der Post Mortem Dump pmd Wer viel programmiert programmiert viel Mist Wenn ein C Programm mal wieder mit einem h mi schen BUS ERROR die Beine durchstreckt reicht ein Blick in die Register und die Assemblerlistings meist aus um den Fehler zu lokalisieren und zu beheben Der Post Mortem Dump funktioniert wie der Name erraten l sst sinnvoll nur mit toten Program men Laufende Programme sollten Sie damit nicht untersuchen Es besteht jedoch nicht die Gefahr dass der PMD bei solchen Aktionen Unfug im System anrichtet Leider ist die Aussage ber die Regi sterinhalte einer laufenden Task furchtbar redundant
191. ehmen zu k nnen wurden zwei pragma Kommandos implementiert pragma DISABLE_CLEAR_MNEMONICS pragma ENABLE_CLEAR_MNEMONICS Mittels pragma DISABLE_CLEAR_MNEMONICS wird f r jede nachfolgende Funktion innerhalb der Datei bei der beschriebenen Klasse von Zugriffen der CLR Befehl unterdr ckt pragma ENA BLE_CLEAR_MNEMONICS stellt das bliche Verhalten des Compilers f r den Rest der Datei wieder her und bersteuert auch die Compileroption N 3 1 18 2 68K Bitzugriffe auf O Bereiche Die Motorola 68K CPU s besitzen die F higkeit Operationen die sich auf Einzelbits auswirken mit speziellen Befehlen auszuf hren So ist z B das Anschalten eines einzelnen Bits innerhalb einer 16 Bit Speicherzelle sowohl mittels der CPU Anweisung ANDI W als auch mittels des speziellen Befehl BSET Da der Befehl BSET allerdings nicht in der Lage ist mit 16 Bit Werten zu hantieren sondern nur auf 8 Bit Werte im Speicher bzw auf 32 Bit Werte innerhalb von Datenregistern arbeiten kann sind Zugriffe auf Hardwareadressen die explizit nur Wort oder Langzugriffe erm glichen zum Un tergang verdammt Die Option n wurde im Compiler implementiert um unerw nschte Optimierungen von Bitoperationen verhindern Es entstehen keine BTST BSET BCLR oder BCHG Befehle mehr im Assembleroutput Die Unterdr ckung dieser Optimierung ist erforderlich wenn der wort oder langwortweise Zugriff auf den Speicher zwingend erforderlich ist da die optimierten Befeh
192. ein Existenz als Staatsb rger vorweisen k nnen ansonsten k nnten Echte Beamte darauf insistieren dass man eigentlich nicht existiert Das Betriebssystem arbeitet beim Umgang mit Tasks grunds tzlich mittels der Taskk pfe Oder anders ausgedr ckt Ein Anwenderprogramm unter RTOS UH hat immer die Form einer Task Zum wirklichen Leben gen gt ein nackter Taskkopf aber noch nicht Man kann eine Task zwar iden tifizieren und ansprechen aber zum Anlaufen ben tigt sie weitere Sch tzenhilfe vom Betriebssystem Wird eine Task aktiviert so sind im Vergleich zur bereits existierenden aber schlafenden Task weitere Verwaltungsinformationen notwendig Auch hier greift das Beispiel mit dem Amtsschimmel wenn Sie als B rger Ihre vier W nde verlassen wollen dann ben tigt jeder Beamte auf den Sie nunmehr stossen ein Papierchen f r Eintr ge und 123 124 14 1 Taskkopf und Taskworkspace struct Task MemSectionHeader head 3 MemSectionName name Prio default_prio WorkSpaceLen workspace p Task EOS Task backs 5 Prio run_prio A void start_pc Block block Schedule sched Taskworkspace wto R ActCnt activation_count E CeCnt Ch count E TimeSchedule time_continue H TimeSchedule time_activate a TimeSchedule time_interval A TimeSchedule time_last Breakpoint brkadr A Prio schd_prio ConfFlag newstart_flag ConfFlag fpu_flag 7 StatusReg initial_SR 7 void message_link void signal_link S Ce t_ce_for
193. eisungen innerhalb des Assemblercodes m glich Um kein Missverst ndniss aufkommen zu lassen es handelt sich bei diesem Feature nicht um einen Inline Assembler Die Ver wendung der Kommandos ist nur ausserhalb von C Funktionen erlaubt und kann folglich nur verwendet werden um komplette Funktionen in Assembler zu kodieren Einsch be innerhalb des C Quelltextes sind weder m glich noch geplant 3 1 14 Ausgabe einer Assemblerdatei Der CCC erm glicht mittels der Option s die Ausgabe des erzeugten Assemblercodes Der Name die ser Datei ergibt sich aus dem Namen der C Datei durch Ersetzung der Extension mit der Endung s Wenn die Option s selektiert wurde so erscheint der Name der Ausgabedatei in der Abschlussmel dung des CCC 3 1 15 Ausgabe eines Assemblerlistings Der CCC erm glicht mittels der Option x die Ausgabe eines Listfiles Der Name dieser Datei ergibt sich aus dem Namen der C Datei durch Ersetzung der Extension mit der Endung 1st Wenn die Option x selektiert wurde so erscheint der Name der Ausgabedatei in der Abschlussmeldung des CCC 3 1 16 Unterdr ckung von BRA Optimierungen Der Assembler bernimmt einige Aufgaben des CCC wenn es um die Verbesserung des Zielcodes geht Da der Codegenerator des CCc bei der Ausgabe lediglich Textverarbeitung betreibt bleibt es dem nach geschalteten internen Assembler berlassen alle relativen Spr nge innerhalb einer Eingabedatei auf m glichst kurze Adressierungsarten zur ckzuf
194. ekte liegen im RAM Bereich und sind ver nderlich Auf C Ebene werden alle dauerhaften Variablen die mittels der Speicherklasse local angelegt wurden in der local Section abgelegt local int a static local int by void f void extern local int c liegt im local Bereich static local int d 3 18 Sections unter CREST C 59 60 3 18 Sections unter CREST C Kapitel 4 Der interne Assembler Der Assembler liegt als integraler Bestandteil des CCC vor Der ehemals eigenst ndige Assembler wur de bei den Umstellungen auf die Release 2 000 aus dem CREST C Paket entfernt oder besser ausgedr ckt komplett in den Compiler integriert Sie sollten keine zu hohen Erwartungen an den Assembler stellen Er versteht und assembliert die Syntax die der Compiler generiert mehr nicht Es lag nicht in meiner Absicht einen Makro Assembler zu schreiben Sie sollten den Einbau Assembler als das betrachten was er ist die letzte Phase des Compilers Die Notation des 68K Assemblers entspricht der von Motorola vorgestellten Syntax f r MC68020 Prozessoren und deren Nachfolger Die alte MC68000 Syntax wird nicht unterst tzt Die wesentlichste Differenz zum RTOS UH Assembler besteht im v llig differierenden Ausgabefor mat W hrend der RTOS UH Assembler direkt ladbare S Records generiert erzeugt der Assembler bin re Objektfiles die erst noch zu S Records gelinkt werden m ssen 4 1 Die text Sectio
195. ekursionen auftreten sind durch einen Blick in die Linker Map eben leicht auszumachen Solche Funktionen k nnen und m ssen gesondert behandelt werden Mittels des pragma Kommandos DYNAMIC_STACK l sst sich f r ausgew hlte Funktionen Code ge nerieren der selbstt tig kontrolliert ob der aktuelle Stack verbraucht wurde und es gilt sich Nachschlag anzufordern Sie haben dabei keinerlei besondere Vorkehrungen auf Code Ebene zu treffen Sie teilen dem Compiler lediglich mit wie gross der Stack sein soll mit dem beim berlauf weitergearbeitet werden soll und wie gross der Sicherheitsabstand ist bei dem sich das Programm einen neuen Stapel besorgen muss Die Syntax des Kommandos lautet wie folgt pragma DYNAMIC_STACK NEWSTACK 16384L RANGE 20481 pragma DYNAMIC_STACK NEWSTACK 0x6400 pragma DYNAMIC_STACK RANGE 512 pragma DYNAMIC_STACK Die default Werte f r NEWSTACK 16384 und RANGE 2048 sind sehr reichhaltig ausgefallen Es mag zwar trivial klingen aber selbstverst ndlich k nnen Sie nur Funktionen mit dynamischen Stack check versehen die keine offenen Parameterlisten besitzen das sind die Dinger mit den P nktchen Dem Compiler muss die Zahl der Parameter bekannt sein die eine derartige Funktion erwartet Auch CREST C benutzt diese Option intern Es gab eine Zeit in der die Absch tzung des Stackbedarfs bei dem Compiler eine echte Geduldsprobe darstellte Ein durchschnittliches Programm brauchte etwa ein halbes Megabyte u
196. en Gebrauch von Software Hardware oder Benutzung dieses Manuskriptes zur ckzuf hren sind wird ausdr cklich ausgeschlossen auch f r den Fall fehlerhafter Software oder irrt mlicher Angaben Das Einverst ndnis des K ufers oder Nutzers f r den Haftungsausschluss gilt mit dem Kauf und der Nutzung der Software und dieser Unterlagen als erteilt Kapitel 1 Einleitung 1 1 Vorwort zur Release 2 Zun chst muss ich mit einer grossen Entschuldigung beginnen die Arbeit an anderen Projekten hat sich bel auf die Aktualit t der gedruckten Dokumentation zum CREST C Projekt ausgewirkt Ausser der HISTORY Datei existierte auch zwei Jahre nach den ersten Beta Auslieferungen praktisch keinerlei g ltige Dokumentation zu den Produkten dieser Generation Ich habe aus dem Feedback der letzten f nf Werke aus meiner Hand zweierlei gelernt mehr als 300 Seiten wirken abschreckend und werden schon aus Prinzip nicht mehr gelesen Als Resultat dieser Erkenntnis sind einige Kapitel ersatzlos gestrichen oder gnadenlos ausged nnt worden um trotz lesbar barer Schriftgr sse das angepeilte Seitenlimit nicht zu berschreiten Als weitere Neuerung ist eine Online Version der Dokumentation in Form von HTML Seiten hinzuge kommen um bei nderungen nicht stets neues Papier drucken zu m ssen Weiterhin ist das Handbuch in einer DVI PostScript und PDF Version verf gbar Mit der Release 2 xxx existieren zudem nur noch drei offizielle Ausf hrungen des CREST
197. en Stack kopiert werden soll Keine weitere Beschreibung im Handbuch verf gbar B 34 TASK Einrichten von Prolog und Epilogcode f r die nachfolgende Funktion um beim Funktionsauf eine Task zu generieren Die Task bleibt auch nach Beendigung des Codes der Funktion dauerhaft im System pragma TASK PRIO 37 STACKSIZE 4096 FILES 3 int LanglebigeTask void Optionale Parameter PRIORITY prio Priorit t der zu generierenden Task PRIO prio dito STACKSIZE size Stackgr sse der Task in Bytes RESIDENT Der Taskworkspace der Task soll resident bleiben USE_FUNCTION NAME Task erh lt den Namen der nachfolgenden Funktion USE_NAME fkr Der R ckgabewert der Funktion fkt ist neue Taskname NO_TASKSTART Die Task wird nur erzeugt und nicht aktiviert USE_FPU Die zu generierende Task rettet die FPU Register NO_FPU Die zu generierende Task rettet keine FPU Register NO_ALLOC Die C Speicherringe werden nicht initialisiert NO_FILES Die C File V O wird nicht initialisiert NO_SETUP Es finden keinerlei C Initialisierungen statt FILES Gibt die Zahl der gleichzeitig zug nglichen FILE Pointer an Siehe auch Abschnitt 13 3 1 236 BAS WARMSTART Einrichten einer Funktion als Warmstartcode pragma WARMSTART void Warmstart void Parameter keine Siehe auch Abschnitt 13 7 B 35 WARMSTART Anhang C Usage Meldungen der Tools Auf den folgenden Seiten sind die Usage Meldungen der Tools der
198. en an Hand von Signal marken SAEB1BF95 zu fahnden CREST C stellt dazu die zwei Funktionen rt_scan_first und rt_scan_next zur Verf gung typedef struct ScanSave ULONG _D7 _Al _A6 ScanSave void rt_scan_first ULONG slice ScanSave last void rt_scan_next ScanSave last Beim Aufruf von rt_scan_first muss die Scheibennummer und ein Pointer auf einen kleinen Zwischenpuffer angegeben werden Im Erfolgsfall erh lt man einen Zeiger der hinter den Scheiben kopf auf die jeweiligen Nutzdaten zeigt Im nachfolgenden Beispiel wird dieses Vorgehen an Hand eines kleinen Scheiben Scanners demonstriert der das System nach Headertexten durchsucht und die se zeilenweise ausgibt void ZeigeHeader void ScanSave temp signed char ptr if ptr rt_scan_first 16 amp temp NULL do 205 206 17 2 Ausblenden von Scanbereichen while ptr gt 0 printf Sc ptr printf n while ptr rt_scan_next amp temp NULL 17 2 Ausblenden von Scanbereichen Bei der Verwendung von Ger tetreibern ist es in vielen F llen sehr n tzlich nur diejenigen Treiber bei der Systemkonfiguration vom RTOS UH einbinden zu lassen f r die auch reale Hardware im Rechner verf gbar ist Wenn Sie z B maximal f nf A D Karten in einem Rechner vorgesehen haben die durch Betreuungstasks verwaltet werden dann hagelt es BUS ERROR s wenn eine dieser Karten gerade nicht im Geh
199. en die Funktionen rt_continue und rt_continue_quick zur Verf gung Wenn die Task suspendiert ist wird sie fortgesetzt Anderfalls erh lt man eine Fehlermeldung void rt_continue char name void rt_continue_quick Task task 15 3 2 6 Einplanen Einplanungen sind das Herz von RTOS UH Die F higkeit Aktivierung und Fortsetzung von Tasks von dem Eintreten unterschiedlichster Ereignisse abh ngig zu machen ist ein wesentliches Merkmal des Betriebssystems und erm glichen die Erstellung von Programmpaketen die zum einen sehr schnell und zum anderen sehr flexibel auf ussere Situationen reagieren k nnen Einplanungen lassen sich zum einen nach der Art des Ereignisses Zeit oder Events und zum anderen nach der Art der eingeplanten Operation Aktivierung oder Fortsetzung unterscheiden Allen Einplanungen gemeinsam ist die nderung des Taskzustands von DORM RUN oder SUSP in den Zustand SCHD Die Einplanungen k nnen vom Bediener oder von einer Task vorgenommen werden auch ein selbstst ndiges Einplanen einer Task ist m glich nat rlich nicht wenn sich diese Task im Zustand DORM befindet e zeitlich eingeplante Aktivierung Eine zeitlich eingeplante Aktivierung f hrt zum Start einer Task zu einem angegebenen Zeitpunkt oder nach einer angegebenen Zeitdauer Weiterhin kann festgelegt werden dass diese Aktivierung in bestimmten Zeitabst nden zu wiederholen ist und diese zyklische Einplanung kann auf eine bestimmte Zeitdau
200. en kann dass es nicht zur Uberschreitung der maximalen Na mensl nge kommt tut es allerdings auch die folgende Variante strcpy ce gt file_name ORDNER RTOS NAME xFF Wohin das CE gelangt haben wir jetzt gekl rt Jetzt besch ftigen wir uns etwas eingehender damit was man mit den Communication Elementen eigentlich anstellen kann Bevor man losgeht und willk rlich Kommandos generiert ist es ganz n tzlich zun chst abzukl ren welche Befehle eine Be treuungstask berhaupt versteht und unterst tzt Unter RTOS UH besteht mittels des Bedienbefehls SD Set Device Parameter undDD Dis play Device Parameter die M glichkeit die Eigenschaften von Ger tetreibern abzufragen 15 5 VO unter RTOS UH 159 Auf C Ebene korresponieren dazu die zwei Funktionen rt_set_device_descriptor und rt_get_device_descriptor rt_get_device_descriptor liefert den Device Parameter der angesprochenen ldn Die Funktion berpr ft nicht ob die angegebene 1dn berhaupt existiert Wenn nicht wird ein zuf lliger Speicherinhalt zur ckgeliefert Device rt_get_device_descriptor IOqueue ldn Der Device Parameter einer 1dn kann auch gesetzt werden Es findet keine berpr fung statt ob die angegebene 1dn existiert Ver nderungen sollten also nur vorgenommen werden wenn dies sicherge stellt ist ansonsten ist die Wahrscheinlichkeit eines Systemabsturzes eher gross void rt_set_device_descriptor IOqueue ldn Device mask
201. en sind Semaphore unter RTOS UH mehrwertig implemen tiert d h je nach Vorbesetzung der Semaphore k nnen mehrere REQUEST Operationen ohne Blockie rung durchgef hrt werden Damit ist dann auch die Synchronisation zweier als Erzeuger und Verbrau cher t tiger Tasks m glich F hrt der Verbraucher vor Verwendung der erzeugten Daten die z B in einem Ringpuffer abgelegt werden k nnen eine REOUEST Operation durch und f hrt der Erzeuger stets nach Bereitstellung eines Datensatzes eine RELEASE Operation durch so ist die Synchronisation beider gew hrleistet Von CREST C aus stehen drei Funktionen zur Verf gung um Semaphoren zu bearbeiten In C exi stiert keine Basisdatentyp SEMA Stattdessen liegt eine Typenvereinbarung Sema in der Includedatei lt rtos h gt vor Bei Semaphoren handelt es sich aus Sicht des C Compilers um normale Objekte vom Typ signed short Damit lassen sich Initialisierungen mit Startwerten wie normale Variablen zuweisungen handhaben Die Anforderung und Freigabe einer Semaphore muss jedoch durch Aufruf von Systemtraps erfolgen Die REQUEST Operation wird mittels der Funktion rt_request_sema durchgef hrt Die angegebene Semaphore wird um Eins erniedrigt Ist der neue Wert gr sser oder gleich Null l uft die aufrufende Task normal weiter Ein negativer Wert wird auf 1 korrigiert und die Task wird blockiert SEMA void rt_request_sema Sema sema Die RELEASE Operation wird durch die Funktion rt_release_sema
202. en wirft oder gar gen Himmel schwebt Unsinnige Ver nderungen in der Kette f hren garantiert zum schnellen Ableben des Betriebssystems Wenn Ihr Rechner z B beim S oder L Kommando ein paar Zeilen ausgibt und dann mit BUS ERROR nach Ihnen wirft dann hat es mit hoher Wahrscheinlichkeit diese Kette des Systems erwischt Mit etwas Gl ck kann man eine solche angemackelte Kette noch mit ein paar gezielten SM Operationen reparieren aber meist f hrt selbst ein derartiger handwerklicher Eingriff nicht zu Erfolg zumindest solange Sie nicht ganz genau wissen was da wirklich im System abgeht Im Eintrag owner im MemSectionHeader enth lt die Usernummer des jeweiligen Eigent mers 14 3 Speichersektionen 127 einer Speichersektion Der Bediener an der Hauptkonsole meist USER1 hat hier die Nummer 0 Wenn Sie ber andere Schnittstellen in den Rechner hineinschauen und Speicherbl cke anfordern so enthalten diese im owner Eintrag die Kennung des jeweiligen USER s Der Eintrag t yp gibt an um welche Art von Speichersektion es sich bei dem jeweiligen Block handelt Beim S Kommando werden die zul ssigen Bitmuster in lesbare Namen umgesetzt In Tabelle 14 1 ist eine Zusammenstellung der dokumentierten Sektionstypen aufgef hrt TAS Normale Task ATSK Task autostartf hig TASK Resident Task resident ATSK Resident Task autostartf hig resident Kr CWSP Communication Workspace Module Shellmodul un FU prombares Modul ED
203. end zu verwalten und die Laufzeit des Programmes im Vergleich zum Speicherbedarf f r die Daten eine untergeordnete Rolle spielt Der Zugriff auf Bitfeldelemente ist in Hinsicht auf den er zeugten Code und die damit verbundene hohe Laufzeit ungleich un konomischer als der Zugriff auf 32 3 5 Vereinigungsdatentypen Basisdatentypen Ab dem MC68020 stehen zwar spezielle Bitfeldbefehle in der CPU Hardware zur Verf gung aber selbst diese Befehle sind mit Verlaub gesagt noch lausig langsam Auch Zugriffe auf externe Bausteine mittels Bitfeldselektoren sind mit Vorsicht zu betrachten wenn die Hardware spezielle Zugriffsbreiten 8 16 oder 32 Bit verlangt Da der CCC seine Bitfeldzugrif fe m glichst schnell durchzuf hren trachtet werden prozessorabh ngig sowie nach Breite und Lage des Bitfeldmitglieds im Speicher unterschiedlichste Befehle und Zugriffsbreiten generiert Beim Zu griff auf Mimosen Hardware sollten Sie demnach besser auf die Syntax von Bitfeldern verzichten und den gew nschten Wert mittels normaler Bitbefehle bearbeiten was in Hinsicht auf die Laufzeit der Programme in neun von zehn F llen sowieso die bessere L sung darstellt 3 5 Vereinigungsdatentypen Nach der ANSI C Norm wird ein Ausdruck grunds tzlich auf Basis des Vereinigungsdatentyps be wertet Unter dem Vereinigungstyp versteht man bei zwei Operanden mit unterschiedlichem Datentyp den Datentyp der in der Lage ist den Wertebereich beider beteiligter Da
204. ent UAR_1 00003006 gt 00003068 TASK Resident UDU_1 00003068 gt 000030CA TASK Resident UAR_2 000030CA gt 0000312C TASK Resident UDU_2 0000312C gt 0000318E TASK Resident USER1 0000318E gt 000031F0 TASK Resident USER2 000031F0 gt 00003252 TASK Resident USERT 00003252 gt 000032B4 TASK Resident V_DUP 000032B4 gt 00003F16 ATSK Resident VTERM OOO03F16 gt 0003FFFO FREE 0003FFF0 gt 00050000 MDLE NORAM 00050000 gt 0007FDF6 FREE 0007FDF6 gt 00000000 MARK F r derart ausgeblendete Bereiche richtet RTOS UH ein Modul mit dem Namen NORAM ein in dem wie der Name schon aussagt kein RAM verwaltet wird Dieser Speicher ist programmtechnisch von Applikationen ber Pointer erreich und verwaltbar liegt aber ausserhalb der Verantwortung des Betriebssystems Auf Grund des Doppelkreuzes im Namen sind derartige NORAM Module nicht mehr entladbar und die darin enthaltenen Daten berstehen problemlos jeden Reset und sogar wenn es sich um batteriegepuffertes RAM handelt einen Stromausfall Anhang A Mathematische Funktionen Die Erstellung guter mathematischer Funktionen ist harte Arbeit Auch heute noch ist es in kommerzi ellen Compilern nahezu tiblich auf grobe Fehler bei der Implementierung von Fliesskommafunktionen zu stossen Auch der CREST C Compiler war und ist davon leider trotz aller Bem hungen sicherlich nicht frei Der CREST C bietet die M glichkeit zum Einsatz der Arithmetikprozessoren MC68881 MC68882
205. ent_task_quick zur Verf gung Alle beste henden Einplanungen der Task werden gel scht Der aktuelle Laufzustand ndert sich dadurch nicht 15 3 Multi Tasking 145 void rt_prevent_task char name void rt_prevent_task_quick Task task 15 3 3 Synchronisationsoperationen In einem Multi Tasking Betriebssystem tritt h ufig der Fall ein dass mehrere Tasks auf den gleichen Datenbestand zugreifen m ssen ndert eine Task diesen Datenbestand so muss gew hrleistet sein dass die anderen Tasks die den Datenbestand nur auslesen stets konsistente Daten erhalten Diese Forderung kann nur allein ber die Priorit tenwahl nicht erf llt werden e Hat die ndernde Task die h chste Priorit t so kann sie zwar stets alle nderungen ungest rt vornehmen unterbricht aber m glicherweise eine auslesende Task mitten im Lesevorgang was bei der auslesenden Task zu inkonsistenten Daten f hrt e Hat die ndernde Task die niedrigste Priorit t so kann sie mitten w hrend einer Daten nderung unterbrochen werden wodurch eine auslesende Task wiederum inkonsistente Daten erh lt Zur L sung dieses Problems stellt RTOS UH Synchronisationsvariable sog Semaphore ital f r Am peln und Bolts engl f r Riegel zur Verf gung 15 3 3 1 Semaphore Semaphore lassen sich in ihrer Funktion gut durch die Analogie zu Ampeln erkl ren Als Beispiel sei eine Engstelle in der Fahrbahn gegeben die durch beidseitige Ampeln gegen das Einfahren v
206. er D Text Namen und Laenge wie gehabt wce_D gt reclen strlen D T wce_D gt status_of_io STABR xt E Der Treiber soll das CE verschrot nach Gebrauch 15 5 VO unter RTOS UH ten und nicht an den Aufrufer zurueckliefern 175 rt_transfer_ce wce_D CE an den Treiber schicken Die Funktion kehrt sofort zurueck wenn das CE vom Betriebssystem angenommen wurde K Waehrend diese Stelle hier erreicht ist arbeitet RTOS im Hintergrund weiter und gibt das CE irgendwann auch ueber die Schnittstelle aus Das Anwenderprogramm kann Si waehrend dieser Zeit anderen Aufgaben nachgehen GC KE Lese CE fuer A Port aufsetzen Hier mit einem Puffer von 5 Byte rce_A rt_fetch_ce 6 Achtung 5 waere falsch weil das unterste Bit nur zu Ein stellung der Kontingentueber wachung dient rce_A gt ldn rce_A gt drive port_info_A ldn port_info_A drive rce_A gt mode MODMWA Auf Beendigung des I O Vorgangs warten IOCNE Fehlermeldungen im CE liefern IOCRWI Befehl READ WRITE strcpy rce_A gt file_name READ_A xFF rce_A gt reclen 5 Hier di chte Laeng intragen rt_transfer_ce rce_A CE an den Treiber schicken Der Treiber loescht alle bis dahin eingelaufenen Zeichen in seinem Puffer A Betrieb und fuell
207. er Terminierung der aufrufenden Task zus tzlich deren Taskkopf aus dem System entfernt Dies stellt den blichen Abschied von Tasks dar die aus C Shellmodulen generiert wurden und deren Taskk pfe nach Terminierung ohne aufgelaufene Neuaktivierungen oder Einplanungen berfl ssig sind void rt_terminate_and_vanish void Die kompletteste Form der Task Terminierung besteht im Bedienbefehl UNLOAD Tasknane Die an gegebene Task wird ausgeplant terminiert und der Taskkopf aus dem System entfernt Es handelt sich um eine Kombination mehrerer RTOS UH Traps um Tasks in beliebigem Zustand aus dem System zu entfernen Die C Funktionen rt_unload_task und rt_unload_task_quick bewirken die ser Verhalten f r eine externe Task Ein Selbst Entladen der aufrufenden Task ist jedoch nicht m glich void rt_unload_task char name void rt_unload_task_quick Task task 15 3 2 4 Aussetzen Durch Aussetzen geht eine Task vom Zustand RUN in den Zustand SUSP ber Die Ausf hrung der Task wird f r eine beliebige Zeit ausgesetzt die Task sozusagen in ihrem gegenw rtigen Zustand eingefroren Eine ausgesetzte Task wird bei der Zuteilung von Prozessorkapazit t bergangen Alle lokalen Varia blen bleiben erhalten jeder zugeteilte Speicher ebenfalls Von der Task angestossene I O Operationen werden ausgef hrt Aussetzen kann sowohl vom Bediener als auch von Tasks veranlasst werden Tasks k nnen sowohl sich selbst als auch fremde T
208. er mittels R 0 bersetzten Variante deutlich kleinere Angaben in der LOAD Reloc Statistik des CLN aufweisen Der n chste Schritt besteht aus Anpassungen im Linkfile da die Standard Startup Dateien tstart objund sstart obj nicht frei verschieblich sind 48 3 12 Variablen und Konstanten unter CREST C sstart ob EE EE sstartr3 ob tstart obj tstartr0 obj tstartr2 ob3 tstartr3 ob3 Tabelle 3 16 Verschieblichkeit von 68K Startupfiles Zun chst m ssen Sie die Startupdatei sstart obj durch deren verschiebliches Pendant sstar trx obj ersetzen bzw bei Verwendung von tstart obj stattdessen die Datei tstartrx obj einsetzen Das x im Namen gibt die Prozessorkennung an adbar n tstartr obj ja Estarta ob tstartal obj Tabelle 3 17 Verschieblichkeit von PPC Startupfiles Bei PowerPC Programmen ist t start obj durch tstartr obj zu ersetzen Beachten Sie bitte dass alle Startup s mit dem Prefix tstartr sich nicht mehr zum Laden des Pro grammes mittels LOAD Befehl eignen und der CLN eine entsprechende Warnung ausgibt Im n chsten Schritt ist eine geeignete Bibliothek zu w hlen Eine Auflistung der verf gbaren Biblio theken ist im Abschnitt 12 zu finden F r Zielsysteme mit 68000er Kern ist die Verwendung einer fast Bibliothek zwingend erforderlich F r alle anderen Prozessortypen kann wahlweise eine fast oder eine Long Variante verwendet werden 3 12 Variablen und Konstanten unter CREST C RTOS
209. er Ctr1l A im System nachzuschauen was da passiert ist k nnen Sie ebenfalls begraben weil zur Aktivierung des Users der dann das Sternchen ausgibt und auf Eingaben wartet leider die viel zu fr h von uns gegangene ERROR Task zust ndig gewesen w re Kapitel 16 Systemkonfiguration Wenn ein Computer mit RTOS UH EPROM s eingeschaltet wird so wird der Start PC auf dem zentralsten Teil des Betriebssystems stehen dem Nukleus Der Nukleus bernimmt nun die Aufgabe den Rest des Betriebssystems im Adressbereich des Rechners zu finden und zu einer funktionellen Einheit zu verbinden Im Prinzip existieren vier wesentliche Betriebszust nde von RTOS UH 1 Pre Cold 2 Kaltstart 3 Warmstart 4 Normalbetrieb Die folgende Abschnitte beschreiben den groben Ablauf der Systemkonfiguration Sollten manche Din ge etwa nebul s klingen dann sollten Sie stets bedenken dass Gottes Tierreich gross ist und viele Eigenschaften von Hardware zu speziell und undurchsichtig sind um hier abgehandelt zu werden 16 1 Pre Cold Der Zeitpunkt Power On an dem der Rechner auf dem RTOS UH laufen soll seinen Strom be kommt Die CPU beginnt auf dem Start PC loszulaufen Je nach Art der CPU und der umgebenden Hardware des Gesamtcomputers kann es nun erstmal not wendig sein die Hardware zu konfigurieren gemeint sind damit so essentielle Resourcen wie RAM und EPROM Diese Hochlaufphase ist oft noch eine echte Ursuppe in der sich der Rechner f r die
210. er Priorit t l uft so kann es zu dem unerw nschten Zustand kommen dass die gerade erzeugten Kinder dem erzeugenden Programm die Prozessor Zeit vollst ndig entziehen Der Aufruf SUBTASK PRIO 70 100 erzeugt z B 100 Subtasks und main wird schon in der Generierungsphase fast vollst ndig lahmgelegt 13 3 1 Langlebige Subtasks Wenn ein eigenst ndiger Prozess mit dem langlebigen Verhalten einer PEARL Task dynamisch ben tigt wird so Kann unter CREST C dieser Prozess zur Laufzeit erschaffen werden Das kann Nachteile haben da es z B nicht m glich ist autostartf hige Shellmodule zu kodieren die selbstst ndig aus dem EPROM hochkommen Der Grund daf r liegt im bereits erw hnten und leider nicht vorhandenen Taskkopf der Shellmodule Wenn Sie unter CREST C eine nebenl ufige Task ben tigen dann handelt es sich in der Regel um eine recht fl chtige Angelegenheit Die Task wird erzeugt wenn man sie braucht und verschwindet automatisch wenn sie ihre Aufgabe erf llt hat F r jeden Aufruf der als Funktion getarnten Subtask muss ein neuer Prozess aufgesetzt werden und das kostet bekanntlich Zeit Wie bereits erl utert ist es aber durchaus m glich eine Subtask etwas langlebiger zu installieren Dazu ist nur eine einfache Einplanung der Subtask notwendig Auch Aktivierungen die w hrend der normalen Lebensdauer einer solchen Subtask auflaufen verhindern das automatische Entladen des Taskkopfes nach Abschluss des Subtask Codes diese
211. er das sein mag von vitaler Bedeutung f r den Interrupt Handler jedoch v llig wertlos ist Das einzige Register auf das Sie sich verlassen k nnen ist der Stackpointer A7 Da Sie sich im Supervisor Mode befinden handelt es sich dabei dummerweise um den unter RTOS UH recht winzig ausgefallenen Supervisor Stack der im Bereich von 0x600 bis 0x7FE liegt Die einzige Methode Daten abzulegen ist also dieser Stack eine absolute Position innerhalb des RAM Bereichs Ihres Rechners oder der Zugriff auf absolute Variablen Das oberste Prinzip muss in jedem Falle sein den Stack nach M glichkeit wenig zu belasten Der Auf ruf einer Funktion die erstmal kr ftig rekursiv absteigt und damit alles was unterhalb des Stacks liegt ordentlich aufmischt verbietet sich aus diesem Grunde von selbst Weiterhin ist der Gebrauch dauer hafter C Variablen nicht m glich denn woher soll der Interrupt Handler wissen wo diese Dinger zu suchen w ren so ganz ohne g ltige Registerinhalte ist das m chtig schwierig Das Adressregister A5 das in normalen CREST C Nutzerprogrammen f r derartige Zugriffe verwendet wird siehe Abschnitt 3 7 enth lt hier garantiert keine sinnvollen Werte und wird bei der Codegenerierung eines Interrupt Handlers nicht anders behaltet als die anderen Adressregister Ebenso ist der Aufruf von Funktionen die direkt oder indirekt von der Existenz eines korrekten A5 ausgehen t dlich Sie werden erraten ha ben dass auch Local Va
212. er die Option S size wird der CLN angewiesen die Startupdatei so zu ver ndern dass der ge bundenen Task oder dem Shellmodul size KiloBytes an Stack zur Verf gung gestellt werden Ohne Verwendung dieser Option werden 16kB Stack eingerichtet 5 1 5 Autostartfahige Task Unter Verwendung der Startupdatei t start obj ist es m glich mittels der Option E die resultie rende Task autostartf hig zu machen 5 1 6 Taskprioritat Unter Verwendung der Startupdatei tstart obj ist es m glich mittels der Option Q prio die resultierende Task mit der angegebenen Priorit t prio anzulegen 5 1 7 Residenter Taskworkspace Unter Verwendung der Startupdatei tstart obj ist es m glich mittels der Option U die resultie rende Task mit residentem Taskworkspace auszustatten 5 1 8 Erweiterter Taskkopf Unter Verwendung der Startupdatei tstart obj ist es m glich mittels der Option H size die resultierende Task mit residentem Taskworkspace auszustatten Der Wert von si ze darf 0x1 FFE Bytes nicht tiberschreiten 5 1 9 Tasks f r PROM vorbereiten Sollen C Programme die mittels tstart obj gelinkt wurden sp ter mit dem Bedienbefehl PROM bearbeitet werden so ist es zwingend erforderlich die Option O zu verwenden 5 1 Die Optionen des cln 69 5 1 10 Verwendung der FPU Programme die die Fliesskommaeinheit verwenden m ssen zwingend mittels der Option fpu gelinkt werden da ansonsten eine notwendige Modifikation der verwende
213. er eingegrenzt werden RTOS UH verwaltet Uhrzeit und Zeitdauer mit der Aufl sung von 1 ms die l ngste verarbeitbare Zeitdauer sind ca 24 Tage 142 15 3 Multi Tasking Die Einplanung auf einen Zeitpunkt erfolgt mit dem Bedienbefehl AT Uhrzeit ACTIVATE Taskname die Einplanung ber eine Zeitdauer mit dem Befehl AFTER Zeitdauer ACTI VATE Taskname Unter CREST C stehen die zwei Funktionen rt_timed_activate und rt_timed_activate_quick zur Verf gung void rt_timed_activate char name P Prio prio gt TimeSchedule startzeit TimeSchedule intervall TimeSchedul ndzeit void rt_timed_activate_quick Task task e Prio prio 7 TimeSchedule startzeit TimeSchedule intervall TimeSchedul ndzeit y Zus tzlich zu den Parametern bei rt_act ivate werden noch eine Startzeit Intervallzeit und Endzeit angegeben Die Task kann zu oder nach einer bestimmten Zeit oberstes Bit der Zeitan gabe gestartet werden Eine sofortige Aktivierung soll heissen beim n chsten Clock Tick erreicht man durch Angabe von 0x80000000UL Soll die Einplanung zyklisch wiederholt werden ist eine Intervallzeit einzutragen die sonst 0 sein sollte negative sind auch zul ssig aber nicht zu empfehlen Um die Einplanung zu einem bestimmten Zeitpunkt oder nach einer bestimmten Zeitdauer oberstes Bit der Zeitangabe zu beenden ist die Endzeit anzugeben Wird die Endzeit mit Ox7FxxxxxxUL angegeben nur das erste Byte ist hier releva
214. er von CREST C akzeptiert wird besteht aus dem Funktionsnamen und sei nem R ckgabewert Fehlt dieser und kommt es zu einer Verwendung der Funktion vor ihrer Definition so gibt der Compiler eine Warnung aus Um es mal so auszudr cken starten k nnen Sie derartige Pro 3 6 Die Prototypen 35 gramme schon aber Sie sollten sich diese Experimente besser verkneifen Der Aufruf einer Funktion die mit dem de fault Datentyp int als R ckgabe rechnet erwartet ein Funktionsergebnis im Daten register DO nachzulesen im Abschnitt tiber den Registergebrauch des CCC 3 10 Sieht die Definition der Funktion anders aus als die jeweiligen Referenzen dann sind Crashs zur Laufzeit vorprogrammiert 3 6 2 Prototypen f r Argumente Sch ner ist es nat rlich dem Compiler auch die Argumentprototypen zu liefern Gerade dort kracht es schliesslich mit Vorliebe wenn falsche Argumente auf den Stack geschoben werden bei denen der Zu griff oder die sp tere Verwendung den Rechner ins Nirvana bef rdert Fehlt ein solcher Argumentproto typ so generiert CREST C eine WARNING Meldung und bittet Sie um Abhilfe Fruchtet dies nicht so werden die Werte eben entsprechend den ANSI C Konventionen gecastet Sie werden ja sehen was Sie sich damit einhandeln Parameter die Sie an Funktionen ohne Prototyp oder mit offener Parameter liste bergeben werden von CREST C automatisch gecastet char und short Parameter werden auf int gezogen und auf den Stack geschoben
215. erden darf Unge rade Werte f r das Argument len bersteuern die Kontingent berpr fung bei der Anforderung eines CE s Vorsicht das unterste Bit im Parameter len wird von rt_fetch_ce nur als Flag interpretiert Wenn Sie z B einen Puffer f r 1 Byte anfordern wollen und dabei sicherstellen m ssen dass RTOS UH nicht die CWS Vollbremsung einleitet so muss der Aufruf mit 1en 3 erfolgen Um ein Byte mit Kontigent berpr fung anzufordern muss len 2 eingetragen werden Die Regeln f r Puffergr ssen lauten 1 Sie k nnen niemals ungerade Pufferl ngen anfordern Wenn Sie unbedingt eine ungerade Puffer gr sse ben tigen m ssen Sie grunds tzlich auf den n chsten geraden Wert aufrunden und f r unbedingte Anforderungen sogar noch ein weiteres Byte draufschlagen 2 Wenn Sie CE s ohne Kontingent berpr fung anfordern wollen m ssen Sie das unterste Bitin der L ngenangabe anknipsen 3 Auch CE s ohne Kontigent berpr fung werden dem Kontingent der anfordernden Task zugerech net Nach erfolgter Kontingent berschreitung f hrt bereits das kleinste CE das Sie mit Kontin gent berwachung anfordern zur CWS Blockierung der Task 4 Bei CE s die sp ter zur I O verwendet werden sollen machen L ngenangaben nur im Bereich von 0x0000 bis Ox7FFF Sinn da nur die unteren 15 Bit des Eintrags reclen als Recordl nge des CE Puffers interpretiert werden 15 5 2 2 Verschicken eines CE s Nach der Beschaffung eines Communi
216. ere Funktion rt_used_stack liefert basiert ausschliesslich auf den Zahlen die von den Modulen geliefert wurden die explizit mit der U Option bersetzt wur den Damit ist dann auch der T ter klar der gerade den Rechner abgeschossen hat printf hat sich ber den eigenen Stackbedarf nicht ge ussert und lustig ber die Grenzen hinweggemalt die als Sicherheitsabstand des dynamischen Stack vorgegeben haben Also was tun Nehmen Sie es einfach als eine Wahrheit die vom Himmel f llt dass kein ordnungs gem sser Aufruf einer Bibliotheksfunktion mehr als 2kB Stack verschlingt oder benutzen Sie zu Test zwecken die Bibliotheksfunktionen st dx 1ib und fitx lib die mit aktiver U Option ausgeliefert wer den blicherweise reicht ein Minimalwert von 2kB aus um eine Task ohne lokale Variablen ablaufen zu lassen pragma DYNAMIC_STACK NEWSTACK 16384L RANGE 0x800 Beim Verzicht auf den printf Aufruf ist auch ein Sicherheitsabstand von etwas ber 256 Bytes hinreichend Als Anhaltspunkt sollten Ihnen folgende Regeln dienen e Nie weniger als 256 Bytes als RANGE Value angeben solange das Programm mit U Option compiliert wurde e Nie den exakten Differenzwert von rt_used_stack Angaben als RANGE Value angeben 44 3 10 Interner Registergebrauch von CREST C Die geringste Modifikation am Programm kann dann sp ter zum berlauf f hren e Minimal 512 Bytes auf den mittels rt_used_stack ermittelten Wert addieren um etwas Si
217. erschrottet hinterher den Taskkopf 13 3 2 Umgang mit Subtasks Bei der Generierung einer Subtask in CREST C ber die pragma Anweisungen TASK oder SUB TASK werden blicherweise die Namen der Sohnprozesse aus dem jeweiligen C Funktionsnamen und dem auch von der Shell verwendeten Z hler zusammengesetzt Eine Subtask Test w re dann ber den Namen Test xy erreichbar Die Zahl der eindeutig durch den Namen zu identifizierenden Tasks die aus einer Funktion generiert werden k nnen ist demnach auf 256 begrenzt Diese Angabe ist allerdings optimistisch da sie keinen direkten Einfluss auf den internen Z hler haben der f r die Extension hin ter dem Funktionsnamen verantwortlich zeichnet Im ung nstigsten Fall ist es sogar denkbar dass Sie f nf Subtasks erzeugen die alle mit identischen Namen aufgesetzt werden weil der zyklische Z hler durch Aktionen anderer Tasks inzwischen seine Runde beendet hat und wieder auf dem alten Wert angekommen ist Der namentliche Umgang mit einer dynamisch erzeugten Task ist demnach wenigstens potentiell etwas mit Vorsicht zu geniessen Wenn Sie mehr als eine Subtask gleichzeitig aus einer C Funktion abspalten wollen besteht der sichere Weg sich als Vaterprozess die TID der Sohntask mitteilen zu lassen Dazu muss lediglich der R ckgabetyp der Subtask als Task ist in lt rtos h gt vereinbart 13 3 C Subtasks 103 angegeben werden Wenn Sie zus tzlich den Namen der Sohntask ben tigen so kann dies u
218. erst wieder lauff hig wenn CE s der Task abgearbeitet wurden und die Kontingentgrenze wieder unterschritten wird An der Adresse 896 W liegt der Wert der die CE Kontingentangabe in Bytes enth lt die f r ihr RTOS UH g ltig ist Erstmal klingt das ziemlich gemeingef hrlich aber es macht in einem Betriebssystem das ohne MMU arbeitet und deshalb mit dem physikalisch vorhandenen RAM haushalten muss durchaus Sinn den Benutzer von sinnlosem Speicherhamstern abzuhalten Derartige Blockierungen k nnen gemeinerweise auch ohne b se Absicht auftreten Wenn Sie mit einer niedrigprioren Task ohne Wartebedingung st ndig einen Text auf ein angeschlossenes Terminal schicken und das Ger t sich permanent mit XOFF dagegen wehrt w rde ohne Kontigentbegrenzung nach einiger Zeit der Rechner mit CE s gef llt sein und auch hochpriore Tasks die dann noch Speicher anfordern w rden h tten in diesem Fall ein echtes Problem Anderseits ist es nat rlich auch unerw nscht dass eine Task gnadenlos gestoppt wird nur weil sie etwas mehr CE Speicher ben tigt als RTOS UH f r angemessen h lt Deshalb gibt es eine Chance sich am Kontingent vorbeizumogeln Die Beschaffung von CE Speicher hat stets mittels der Funktion rt_fetch_ce zu erfolgen Sie sollten niemals dem zun chst verlockenden Gedanken erliegen sich mal eben eine Struktur st ruct Ce vom Compiler hinlegen zu lassen Das b se Erwachen kommt sehr schnell bei der Verwendung eines solchen Blocke
219. es Ausgabe CE auf die Reise geschickt Das Fehlen der Bits MODMWA und IOCNE bewirkt zweierlei 1 Ohne MODMWA Bit h lt das Betriebssystem die Task die das CE absendet beim Empfang des CE s nicht an Die Task l uft schlicht weiter wenn es ihre Priorit t erlaubt W hrendessen kann RTOS UH das CE an den Treiber weiterreichen und der sich mit dem Teil vergn gen 2 Das Fehlen des TOCNE Bits bewirkt dass Fehler bei der Behandlung des CE s sich in Bildschir mausgaben ussern Sie kennen das Bing Something is wrong with your program Auch das Aufsetzen des Puffers erfolgt nun anders Hier muss nicht der Pointer des CE s auf einen externen Puffer gesetzt sondern vielmehr der externe Puffer in den CE Puffer kopiert werden memcpy wce_D gt buffer str strlen str wce_D gt reclen strlen str Das war s aber nun wirklich oder wenigstens beinahe wce_D gt status_of_io STABRE Da wir uns schon entschlossen haben auf die Beendigung der Ausgabe nicht zu warten und das CE mangels TOCNE Bit auch keine Fehlermeldungen zu liefern bereit ist k nnen wir den Treiber auch damit beauftragen das CE nach Beendigung der Ausgabe selbst zu verschrotten und uns nicht mit dieser Aufgabe zu bel stigen Das STABRE Bit bewirkt exakt dieses Verhalten Bedeutung Send and forget Tabelle 15 10 Bitmuster f r das st atus Byte eines CE s Wenn Sie jetzt scharf nachdenken werden Sie zweifelsohne selbst darauf
220. es vorausgegangenen Abschnitts so verst mmelt dass es einem blichen Anwenderprogramm gleichkommt Es wird mit einer lokalen Variable als Textpuffer gearbeitet und mit Hochgeschwindigkeit ein Sack voll Error Meldungen produziert void main void ErrMessag message b c d char stri 32 7 for b 0 b lt 0xB b for c 0 c lt 0xE c for d 0 d lt 0xD d message b lt lt ErrMessage 8 c lt lt ErrMessage 4 d sprintf str MESSAGE TEST 041X xFF message rt_error str message so NIEMALS Dabei gehen dann definitiv zwei Dinge gravierend schief Erstens kann man beruhigt davon ausge hen dass ein blicher RTOS UH Rechner heute in der Lage ist das Zusammenbauen des Message Wortes und des Ausgabetextes schneller zu bewerkstelligen als eine serielle Schnittstelle den betref fenden Text ausgeben kann Das bedeutet es gehen Meldungen verloren weil der interne Ringpuffer berl uft Wurden derartige rt_error Aufrufe quasi als schnell aufeinanderfolgende Debugaus gaben missbraucht kommt es dann zu verwirrten R ckfragen weshalb die auf dem Schirm zu beob achteten Ausgaben nicht mit dem erwarteten Programmfluss bereinstimmen Nun man kann schlicht und final festhalten dass der ERROR Trap f r diesen Anwendungszweck absolut ungeeignet ist Schlimmer als verlorene Ausgaben ist jedoch die Tatsache dass in dem vorgeste
221. et das Argument x exakt mit 0 5 so wird der n chstliegende gerade Integerwert ausgew hlt Wertebereich und Fehler Wird als Parameter x der Wert NaN oder Inf angegeben so wird ein domain error durch das Setzen der Variable errno auf EDOM angezeigt Die Funktion liefert den Parameter x zur ck A 6 5 sign Syntax float fsign float SA double sign double x long double lsign long double x Die Funktion sign x liefert Vorzeichen des tibergebenen Argumentes x als Fliesskommazahl zurtick 10 lt 0 y 0 0 x 0 10 z gt 0 Wertebereich und Fehler Wird als Parameter x der Wert NaN oder Inf angegeben so wird ein domain error durch das Setzen der Variable errno auf EDOM angezeigt Die Funktion liefert den Parameter x zur ck A 6 6 Testroutinen f r Fliesskommazahlen Die folgenden Funktionen dienen zur Abfrage ob Fliesskommavariablen ung ltige Bitmuster enthal ten Die Prototypen befinden sich in lt math h gt Es handelt sich allerdings nicht um ANSI C Funktionen Diese Routinen sollten immer dort aufgerufen werden wo die M glichkeit besteht dass die Ergebnisse einer Fliesskommarechnung in den nicht mehr darstellbaren Bereich abgleiten 1 Kontrolle ob eine Zahl NaN Not a Number ist R ckgabewert NaN DS NaN 0 int fisnan float x int isnan double x int lisnan long double x 2 Kontrolle ob eine Zahl Inf Infinite ist R ckgabewert Ef nicht E
222. etzbar sind endif if defined __RTOSUH__ Teile die nur unter RTOS UH sinnvoll laufen endif abfragen Sie erhalten so die einfache M glichkeit compiler und betriebssystemspezifische Pro grammteile bedingt zu bersetzen Zur Unterscheidung der Prozessorserie f r die CREST C Code generiert legt der CCC jeweils eines der beiden Makros __M68K__ bzw _ MPPC_ an Beide enthalten keinen Ersatztext und lassen sich mittels if defined __M68K__ Teile die 68K spezifischen Code enthalten endif if defined __MPPC__ Teile die PowerPC spezifischen Code enthalten endif Bei der Verwendung der Compileroption wird zudem das Makro__CPLUSPLUS_ vordefiniert um etwaige Kompatibilit tsprobleme zwischen ANSI C und C abfangen zu k nnen Weitere Makros die ber CPU Optionen automatisch definiert werden sind im Abschnitt 3 1 2 be schrieben 26 3 4 Benutzereigene Datentypen 3 3 Basisdatentypen CREST C kennt alle von ANSI C aufgef hrten Basisdatentypen Die bin re Darstellung im Speicher sieht wie folgt aus char 8 msienen shore 76 signed Pint 2 signed Gong 2 signed Dome AA doubl Tong double 360 Er ae Seet a dS GC ES enum bolo SI Tabelle 3 13 Bin re Darstellung der Basisdatentypen Beachten Sie dabei folgende Randbedingungen e Bei dem Datentyp bool handelt es sich nicht um einen unter ANSI C genormten Datentyp Vielmehr liegt hier ei
223. f 28 30 Skip Slices 206 SMDL 127 Software Event 143 144 149 Speicherklassen absolute 50 auto 50 extern 50 local 50 pearl 50 register 50 static 50 Speichersektionen 126 ATSK 127 ATSK Resident 127 CWSP 127 EDTF 127 FREE 127 MARK 127 MDLE 127 PMDL 127 PWSP 127 SMDL 127 TASK 127 TASK Resident 127 TWSP 127 sqrt 223 SR 118 ssl 73 ssl Optionen L path 71 M 71 73 T address 73 V 73 z 72 74 ssl68k 73 sslppc 73 sstart obj 47 48 sstarta obj 48 sstartal obj 48 sstartrO obj 47 sstartr2 obj 47 sstartr3 obj 47 STABEL 170 STABRE 170 INDEX Stack 16 35 37 38 40 41 43 51 54 94 95 97 110 117 118 121 189 Stack berwachung 16 99 Stackanforderung 39 Stackframe 117 Stackgr sse 38 39 41 43 94 98 105 106 Stackoverflow 16 37 43 110 189 Stackpointer 16 37 51 110 118 STACKSIZE 105 106 233 235 Stapel berlauf 37 START_SLICE SKIP 206 232 Startupdateien 68K 47 Startupdateien PPC 48 static 50 Statusregister 118 STRUCT_PADDING_OFF 233 STRUCT_PADDING_ON 233 SUBTASK 98 233 Subtask 125 Supervisor Mode 151 184 188 Supervisor Stack 189 Supervisor Mode 107 110 112 121 Supervisor Stack 110 118 121 Supervisor Stackpointer 118 SUSP 133 134 136 138 140 141 144 147 151 Synchronisieren 145 Bolts 147 Interne Blockierung 147 Semaphoren 145 SYSTEM_ABORT 202 SYSTEM_RESET 121 196 SYSTEMTASK 105 114 234
224. ff auf x und y hat Die Kinder haben beide je zwei lokale Variable Bei den Variablen a0 und bO handelt es sich um automatische Variablen die auf dem Stack der jeweils laufenden Subtask abgelegt sind bzw nach Gutd nken des Compilers auch in Registern gehalten werden k nnten Bei den statischen Variablen al und b1 handelt es sich jedoch um dauerhafte Objekte die zwar nur innerhalb der beiden Tasks bekannt sind aber im globalen Datenbereich des Vaterprozesses angesiedelt sind Setzen wir den Vaterprozess X 00 fort so entstehen zwei weitere Ableger die z B A 03 und B 04 heissen k nnten Auch diese Sohnprozesse sind in der Lage mit dem Vaterprozess Daten ber die bereits erl uterten globalen Variablen zu tauschen Die beiden neuen Kinder sind aber zudem f hig sich ber die funktions statischen Variablen mit ihren Zwillingen zu unterhalten So k nnte die Variable al dazu dienen Daten zwischen den Tasks A 01 und A 03 auszutauschen ohne dass die Tasks X 00 B 02 und B 04 jemals Zugang zu diesen Speicherzellen h tten Sie als Programmierer sind dabei selbstverst ndlich daf r verantwortlich den Zugriff auf diese gemeinsamen Variablen zwischen Vater und S hnen so zu synchronisieren dass die Konsistenz gewahrt bleibt Wenn zwei konkurrierende Prozesse auf gleichen Datenbestinden arbeiten so ist die Absicherung mittels Semaphoren zwingend notwendig Wenn Sie sich an diesen gutgemeinten Ratschlag halten besteht f r Sie die Hoffnung determ
225. folglich als common_section W oder common_section L adressierbar 4 5 Die l1ocal Section Die globale Definition eines Symboles aus der 1ocal Section erfolgt mittels der Anweisung LO CAL_DEF name Dadurch wird das Symbol name f r den Linker auch ausserhalb der gerade bearbei teten Ubersetzungseinheit global bekannt Innerhalb der 1oca1 Section sind folgende Assembleran weisungen zul ssig e Die Definition von Labels e Die Definition von implizit Null initialisierten Bereichen mittels der Blockanweisung DS x Eine Referenz auf die Local Section einer fremden Ubersetzungseinheit kann mittels der Anwei sung LOCAL_REF name erzeugt werden Die Objekte der loca 1 Section lassen sich ausschliesslich relativ zum Adressregister A4 ansprechen Die Variable Local section w re auf Assemblerebene folglich als local_section W A4 oder local_section L A4 adressierbar 64 4 6 System Traps 4 6 System Traps Die System Traps von RTOS UH stehen als Einbaukommandos im Assembler zur Verf gung Die verwendete Nomenklatur und der generierte Code sind den Tabellen 4 1 und 4 2 zu entnehmen In Hinsicht auf deren Bedeutung und Anwendung sei auf das RTOS UH Manual verwiesen Hex 68K Hex PPC 0x3BC0442844000002 ACTEV 0x3BC0443444000002 ACTEVO OxA056 0x3BC044AC44000002 ACTO 0x4E40 0x3BC0408044000002 CACHCL OxA05C 0x3BC044B844000002 CLOCKASC 0xA068 0x3BC044D044000002 COON 0x4E42 0x3BC0408844000002
226. g 15 Suche nach Include Dateien o oo 15 Erzeugung von Dependency Files 2 2 Emm nn 16 Besetzen der Line Zelle o e 17 Steuerung von Fehlermeldungen 22 Unterdr ckung von Compiler Warnings 22 ANSI Einbau M kt s 100 ee God i aed een ae ea oe ew R 25 Bin re Darstellung der Basisdatentypen 26 Cast Tabelle 2 2 8 2 02 22 Ee el a es Gg Se A 33 Bedeutung der Abk rzungen e 33 Verschieblichkeit von 68K Startupfiles 0000 48 Verschieblichkeit von PPC Startupfiles 22 CC mn 48 Schl sselworte zur Angabe der Speicherklassen 50 Schl sselworte zur Modifikation der Speicherklassen 2 2 2 222 2 0 50 Notation der System Traps Tei 64 Notation der System Traps Tei 2 oo e 65 Namensgebung bei CMAKE Initialflles ooa aa 79 CMAKE Einbau Makros 2 2 a 84 CMAKE Kommandozeilen Makros 2 2 2 2 cn mann 85 Verf gbare 68000er Bibliotheken 89 Verf gbare CPU32 Bibliotheken 89 XIV 12 3 12 4 12 5 13 1 13 2 13 3 13 4 13 5 13 6 14 1 15 1 15 2 15 3 15 4 15 5 15 6 15 7 15 8 15 9 TABELLENVERZEICHNIS Verf gbare 68020er Bibliotheken 89 Verf gbare PowerPC Bibliotheken o oaa 89 Ubersetzungsparameter der Bibliotheken o ooo ee ee ee 90 Auszug aus der Bxvceptton Nektor Tabelle 108 Adressen der Interrupt Data Pointer 2 2 nun nen 111 Beispiel eines Exception Handlers mc 119 Belegung der RTOS UH Traps 2 22
227. g in Grossbuchstaben durchgef hrt Erst danach wird nach der Datei in kleiner Schreibweise gesucht Die Option J digit ist f r nachfolgende Compilerversionen abgekiindigt 3 1 9 2 Einmaliges Includieren Bei der Erstellung von Quelltexten tritt oftmals das Problem auf dass bestimmte Headerdateien zwin gend Vereinbarungen aus anderen Headerdateien ben tigen also selbst include Anweisungen ent halten Um Rekursionen oder mehrfaches Includieren von Headerfiles zu vermeiden wird in der Regel innerhalb der Includedateien eine Konstruktion der folgenden Art verwendet ifndef __NAME_DER_DATEI_H__ define __NAME_DER_DATEI_H__ 16 3 1 Die Optionen des ccc Inhalt der Datei tendif Diese Konstruktion besitzt jedoch den Nachteil dass der Compiler diese Datei trotzdem ffnen und parsen muss wenn diese zum wiederholten Male includiert werden soll Der CCC besitzt deshalb die M glichkeit mittels des Kommandos pragma INCLUDE_ONCE beim ersten Einlesen einer Inclu dedatei diese entsprechend zu markieren Findet der Compiler diese Steueranweisung innerhalb einer Includedatei so erweitert er intern eine Includeliste um deren kompletten Namen dabei werden auch enthaltene Links aufgel st ifdef __CRESTC__ pragma INCLUDE_ONCE endif Taucht der Dateiname abermals innerhalb einer include Anweisung auf so wird dieser Lesebefehl nicht nochmals ausgef hrt Bei aktiver Compileroption V l sst sich an Hand der Ausgaben
228. gen puffert bis die Task sich terminiert hat oder extern terminiert wird F r jede PEARL Task steht exakt ein Verwaltungsblock der Taskkopf zur Verf gung in dem der Zustand der Task vermerkt ist Gerade im Bereich von Steuer und Regelungsaufgaben ist die L sung sehr praktisch da so sichergestellt ist dass eine Task ihre Aufgaben abgeschlossen hat bevor sie erneut gestartet werden kann Die Alternative besteht darin wiedereintrittsfesten Code zu generieren der seinen eigenen Variablen speicher verwaltet Unter RTOS UH wird dieses Konzept der Entkopplung von Programmcode und Variablen mittels Shellmodulen verwirklich die unabh ngige Subtasks aufsetzen Das grundlegende Prinzip basiert auf der Tatsache dass der Code hier keinen festen Taskkopf enth lt Stattdessen wird dort ein Shellmodulkopf im Code abgelegt der nur den Hinweis enth lt dass ein Taskkopf dynamisch beim Start einer derart unfertigen Task angelegt werden muss 3 13 Syntaxerweiterungen unter CREST C ANSI C bietet keinerlei sprachliche Unterst tzung f r Betriebssysteme bei denen gleichzeitig die Mittel f r Zugriff auf Variablen mit absoluten und mit relativen Adressen gew nscht ist Die sinnvollste Methode bei der Implementierung des Compilers bestand darin den flexibleren Weg zu w hlen und alle CREST C Programme als Subtasks mit relativer Adressierung der Variablen zu implementieren Eine dauerhafte Variable einer C Task die aus einem Shellkommando erzeugt
229. geschlagenen Versuchen einen korrekten Warmstart durchzuf hren In diesem Betriebszustand konfiguriert sich RTOS UH sucht findet und initialisiert Hardware die diesen Vorgang nur einmal ben tigt oder zul sst RTOS UH l sst bereits in diesem Zustand Eingriffe von Seiten des System Programmieres zu der nicht im Besitz der Betriebssystemquellen ist System dienste sind noch nicht verf gbar Der Anwender kann jedoch Maschinencode der ohne Systemun terst tzung lauff hig ist zur Ausf hrung bringen Entsprechender Code kann mittels des Kommandos pragma COLDSTART dem Betriebssystem hinzugef gt werden In der Kaltstartphase l uft RTOS UH auf Supervisor Mode unter Interruptsperre auf Level 7 Sie sollten nicht versuchen diesen Zustand in einer Kaltstartscheibe zu ver ndern 16 2 1 Initialisieren der Systemvariablen RTOS UH kommt wie fast jedes andere Programm auch nicht um die Tatsache herum Variablen benutzen zu m ssen Diese Variablen liegen auf fest vereinbarten Adressen und beginnen auf der Posi tion Ox7FE im RAM Eine gewisse Anzahl dieser Variablen ist im RTOS UH Manual dokumentiert F r den Grossteil der Systemvariablen beh lt sich Professor Gerth jedoch vor auf eine Dokumentation zu verzichten eine Einstellung die ich durchaus verstehen kann weil es mir a ebenfalls gegen den Strich geht wenn jeder Anwender an allem Dingen rumfummeln kann und b ich auch gelegentlich oder oft an undokumentierten Features
230. gkeit indiskutabel sein Line Zelle Tabelle 3 9 Besetzen der Line Zelle Die zweite Methode kann verwendet werden wenn Sie nicht beabsichtigen auf Zeilennummern zu tra cen In diesem Fall tr gt der CCC ohne Verwendung des Systemaufrufes die Zeilennummer selbstst ndig ein Folgendes ist zu beachten e Sie k nnen nur auf Zeilennummern tracen f r die der CCC auch LITRA Traps in die Assemb lerausgabe geschrieben hat Das klingt zun chst trivial ist es im praktischen Umgang aber nicht da der CCC keineswegs f r jede Zeilennummer eine Markierung setzt e Aus Sicht des RTOS UH ist ein erzeugtes CREST C Programm ein einziges Modul Wenn mehrere Dateien zusammengelinkt werden die mit Y bersetzt wurden kann und wird es zu mehrdeutigen Zeilennummern aus den unterschiedlichen Quelltextdateien kommen Es bietet sich deshalb an nur jeweils eine verd chtige Datei mit Y zu compilieren e Die Line Zelle wird vom DL Kommando der Shell etwas arg seltsam ausgegeben Um lesba re dezimale Angaben zu erhalten muss die Zeilennummer in BCD Darstellung angegeben werden d h dass die Zeilennummer 137 als 0137 in der Linezelle eingetragen ist Damit beschr nkt sich der Wertebereich auf maximal 9999 Zeilen An folgendem Beispielprogramm in Abbildung 3 2 wird das Verhalten des CCC bei der Vergabe von Zeilennummern demonstriert Die Pfeile hinter den Zeilennummern markieren die vom CCC erzeugten Line Markierungen Die Ver gabe
231. h ihrer Vereinbarung grunds tzlich global bis zum Ende der Datei bekannt e Die Verdeckungsregeln sind bei Prototypen nicht g ltig Die Angabe eines Prototypen innerhalb einer Funktion darf nie im Widerspruch zu bereits getroffenen Vereinbarungen stehen die dem 3 7 Der Stack 37 Compiler bis dahin bekannt geworden ist Die zuletzt getroffene Vereinbarung ist stets f r den Rest des Moduls und nicht nur f r den gerade aktiven Compound Level g ltig e Die bersteuerung eines Prototypen durch allgemeinere Prototypen oder speziellere Vereinba rungen ist zul ssig e Wurde die Funktionsdefinition gelesen ist keine weitere Ver nderung durch abweichende Proto typen mehr m glich Der Grund f r diese Regelung sollte eigentlich einleuchten Nach Einf hrung der ANSI C Norm gibt es mittels der Prototypen und der klaren Regelung von Funktionen mit offenen Parameterlisten endlich die M glichkeit den Schmuddelkram vergangener Tage zu vermeiden Eine bersteuerung von Proto typen macht schlicht keinen Sinn und f hrt z B bei Ver nderung der R ckgabedatentypen mit nahezu absoluter Sicherheit zum Exitus des bersetzten Programmes zur Laufzeit Ich liebe zwar die Freihei ten die mir die Sprache C bietet lehne aber gerade in diesem Punkt die Freiz gigkeit strikt ab da diese Regelung allenfalls Katastrophen beg nstigt und keinerlei Vorteile mehr bietet 3 7 Der Stack Die fl chtigen Daten werden wie die C Syntax bereits aussagt a
232. he C kritisierten in erster Linie den laxen Umgang der C Compiler beim Aufruf von Funktionen Gl cklicherweise hat sich mit der ANSI C Norm hier viel ge ndert Das Zauberwort heisst Prototyp Beim Compilieren alter UNIX Sourcen ist es immer wieder erschreckend welcher Schrott da sein Unwesen getrieben haben mag Der Umgang mit den Parametern ist selbst bei unkritischer Betrachtung einfach grausam Gut f r variable Parameterlisten gab es fr her keinen allgemeing ltigen Leitfaden f r Programmierer Die Ergebnisse sind entsprechend Da werden Integer 34 3 6 Die Prototypen Datentypen locker mit Pointern kombiniert die belsten Zugriffe auf Stacks und in lokale Parameterli sten veranstaltet und hinterher l uft der Kram dann auch noch oder wenigstens meistens oder nur manchmal oder eben berhaupt nicht Die Sch pfer der ANSI C Norm haben hier Abhilfe geschaffen Leider ist auch hier wieder nur ei ne Halbheit genormt worden schliesslich will man ja keinem Besitzer alter Sourcen wehtun Die K amp R Quasi Norm bleibt noch g ltig Zwar wurde eine neue Syntax f r die Definition von Funktions parametern geschaffen PASCAL und C lassen herzlich gr ssen aber die alten Quelltexte sollen selbstverst ndlich noch korrekt bersetzt werden Und gerade diesen Punkt halte ich nicht f r selbstverst ndlich CREST C wurde als K amp R Compiler geboren und wurde auf ANSI C Standard aufgebohrt Der K amp R Standard ist also
233. hen beim Kontextwechsel nicht durch unn tze FPU Zugriffe auszubremsen Das Schl sselwort NO_FPU dient dazu eine Sohn Task so aufzusetzen dass grunds tzlich keine FPU Register gerettet werden Umgekehrt wird mittels USE_FPU der Compiler dazu angehalten bei Sohn Tasks unabh ngig vom Verhalten der Vater Task alle FPU Register zu retten Bei derartigen Aktionen ist darauf zu achten dass das Schl sselwort USE_FPU nur dann zu Aktionen f hrt wenn das CCC Flag fpu aktiv war Ansonsten w rde sowieso kein FPU Code vom Compiler erzeugt und ein Retten von FPU Registern w re entsprechend sinnlos 13 4 Systemtasks Unter RTOS UH besteht auch die einfache M glichkeit Tasks mit Sonderfunktionalit ten zu instal lieren die bereits beim Hochlaufen des Systems eingebunden und gegebenenfalls automatisch gest artet werden k nnen Ahnlich wie beim Kalt oder Warmstartcode werden solche Tasks nur dann vom System erkannt wenn sie im Scanbereich des Systems abgelegt wurden siehe Kapitel 17 1 Verwechseln Sie bitte diese Form der Tasks nicht mit denen die mittels des Kommandos pragma 13 4 Systemtasks 105 TASK von CREST C generiert werden k nnen Auch Programme die unter Zuhilfenahme des Star tups tstart obj gelinkt werden erscheinen zwar als TASK oder ATSK in der Speicherliste sind aber g nzlich unterschiedlich zu den Systemtasks Bei Systemtasks handelt es sich quasi um die Ur form von RTOS UH Tasks bei denen keinerlei Laufzeitumge
234. hl von Zeichen gefuellt oder K es ist ein Fehler aufgetreten e if rce_B gt reclen lt 0 FEHLER else X Hier stehen die Daten im Puffer ptr rce_B gt buffer Pointer auf Puffer for count 0 count lt rce_B gt reclen count printf d Zeichen 081X n count 1 ptr count OxFFUL rt_release_ce rce_B Und das CE wieder verschrotten b Lese CE fuer C Port aufsetzen e Hier mit einem externen Puffer von 1024 Byte rce_C rt_fetch_ce 1 Das CE IMMER beschaffen rce_C gt ldn rce_C gt drive port_info_C ldn port_info_C drive rce_C gt mode MODMWA Auf Beendigung des I O Vorgangs warten MODBIN Schnittstelle im binaeren Betrieb fahren IOCNE Fehlermeldungen im CE liefern IOCRWI Befehl READ WRITE strcpy rce_C gt file_nam READ_C xFF rce_C gt reclen MY_BUFFER_SIZE rce_C gt buffer my_buffer Hier den eigenen Puffer einklinken rt_transfer_ce CE EB an den Treiber schicken Der Treiber rce_C r 15 5 VO unter RTOS UH 177 wy if liefert zunaechst aus seinem internen Puffer Zeichen bis der interne Puffer leergelesen ist Zeichen die waehrend dieser Operation noch hereinkommen werden ebenfalls an das CE weitergegeben Wenn man hier angekommen ist ist der Puffe
235. hlagbohrer zum Deckenstreichen verwenden Jeder w rde einen solchen 4 1 3 Allgemeines zu C unter RTOS UH Versuch als Schildb rgerstreich abtun In der Programmierer Szene geht es in diesem Punkt schon et was emotionaler zu Da wird fleissig der Bohrer in den Farbk bel getunkt und bei jedem Pinselstrich mit Inbrunst der arme Bohrhammer verflucht C besitzt im Vergleich zu PEARL in einer Echtzeitumgebung einen gravierenden Nachteil es existiert keinerlei Normung der Echtzeitfeatures Unter RTOS UH kommt f r CREST C noch ein Manko hinzu das Betriebssystem ist quasi als Laufzeitumgebung f r UH PEARL Programme entwickelt und optimiert worden Dieser Nachteil d rfte durch die inzwischen recht umfangreiche und vollst ndige RTOS UH Funktionsbibliothek von CREST C hinreichend kompensiert sein Durch die Integrati on diverser pragma Kommandos ist die Systemunterst tzung von CREST C letztlich sogar viel umfassender Die ANSI C Norm in Bezug auf die Sprache C wurde weitestgehend implementiert Es existieren folgende Abweichungen e Trigraph Ersatzzeichen werden vom Pr prozessor nicht unterst tzt e Der Gebrauch von MC68xxx Registernamen als Bezeichner f r C Objekte ist durch die Dumm heit des eingebauten Assemblers leider nicht m glich Was die ANSI C Bibliotheken betrifft sieht es nicht gar so rosig aus C ist eine Sprache die f r und unter UNIX aufgewachsen ist und RTOS UH ist nun mal kein UNIX Funktionen aus den Bereichen der
236. hlermeldungen Bei Erfolg bleibt der alte Eintrag in reclen schlicht erhalten Gut irgendwann entsprechend der Priorit t des CE s und der Belastung der Schnittstelle und des Rech ners allgemein ist der Auftrag positiv oder negativ ausgef hrt Der Treiber ist in diesem Falle Kumpel und setzt den Aufrufer wieder fort Wenn es Sie interessiert ob die Ausgabe von Erfolg gekr nt war sollten Sie in reclen nachschauen ob dort ein Wert kleiner oder gleich Null steht was eine Niederlage bedeutet Hier soll das mal egal sein weil Beispiel immer nur das zeigen was man im realen Betrieb tunlichst unterlassen sollte Die Ausgabe ist also abgeschlossen und nun haben wir noch so ein l stiges CE am Hals das uns nicht mehr interessiert Also schnell weg damit und dem Aufrufer den zweifelhaften Erfolg melden rt_release_ce wce_A return 1 15 5 3 1 3 Ein Output CE an die Duplex Schnittstelle schicken Das erste Beispiel war bewusst trivial behalten und sollte nur die M glichkeit demonstrieren A SCT Daten ber eine serielle Schnitt stelle auszugeben Oft besteht aber die Notwendigkeit ber eine physikalische Schnittstelle sowohl Daten zu senden als auch zu empfangen und das m glichst auch noch gleichzeitig Zu diesem Zwecke wurde unter RTOS UH die M glichkeit geschaffen Duplex Verbindungen aufzubauen Die Ausgabe einer Duplex verbindung ber die Schnittstelle x hat ber das Ger t Dx zu erfolgen Gleichzei tig k nnen
237. hon ewig kein weltbewe gendes Thema mehr und auch PC Anwender kommen langsam in den Genuss dieser M glichkeiten Auch unter Betriebssystemen wie LINUX OS 2 und WINDOWS NT besteht die M glichkeit mehre re Prozesse Jobs oder Tasks quasi parallel auf demselben Prozessor oder gar mehreren Prozessoren ablaufen zu lassen Das Betriebssysten schaltet mit mehr oder weniger ausgekl gelten Algorithmen zwi schen diesen Jobs hin und her sodass jeder Prozess f r eine bestimmte Dauer Rechenzeit zugewiesen bekommt und damit irgendwann seine Arbeit fertigstellen kann Gerade in diesem Punkt unterschei det sich RTOS UH von derartigen Betriebssystemen In F llen in denen irgendwann vielleicht den Zeitpunkt darstellt an dem Sie oder Ihre Kunden bereits die dritte Harfenstunde auf Wolke 17 genommen haben scheint es sinnvoll sich etwas mit den Vorgaben bei der Entwicklung der Betriebs systeme zu besch ftigen Echtzeitbetriebssysteme unterscheiden sich von normalen Grossrechnerbetriebssystemen in erster Li nie durch die unterschiedliche Bewertung der Wichtigkeit verschiedener Aufgaben In Rechenzentren kommt es darauf an die zur Verf gung stehende CPU Zeit m glichst demokratisch an die Benutzer zu verteilen Auf PC s geht es meist nur darum einen einzelnen Benutzer gl cklich zu machen was sich zumeist in einer hohen Priorit t der Benutzerf hrung niederschl gt um genervte M usebesitzer nicht zusehr zu ver rgern Die reale Welt der
238. ht nutzt w re grober Unfug Soviel zur Theorie und nun zur Implementierung Der CREST C Compiler wird mittels eines pragma Kommandos dazu veranlasst speziellen Code f r die jeweils nachfolgende Funktion zu generieren Um allen M glich keiten des RTOS UH gerecht zu werden gibt es hier eine ganze Reihe von M glichkeiten einen ge eigneten Taskkopf f r die gew nschte Art von Systemtask erzeugen zu lassen Die Einleitung ist stets identisch pragma SYSTEMTASK Werden keine weiteren Angaben gemacht so erzeugt der CCC standardm ssig einen Taskkopf f r eine normale Task mit Priori t 20 und einem Stack von 4kB Gr sse Priorit t und Stackgr sse lassen sich nach bekanntem Muster mittels der Schl sselworte PRIO bzw PRIORITY und STACKSIZE ber steuern Die Angabe der Stackgr sse hat in Bytes zu erfolgen anders als in der CLN Option S size bei der die Angaben in Kilobytes zu erfolgen haben 106 13 4 Systemtasks pragma SYSTEMTASK PRIORITY 20 STACKSIZE 4096 pragma SYSTEMTASK PRIORITY 20 pragma SYSTEMTASK STACKSIZE 20000 PRIO 3 Im Gegensatz zu normalen C Subtasks sind hier auch negative Priorit ten zul ssig Sie sollten aller dings niemals Systemtasks generieren die h her priorisiert sind als die ERROR Task Ihres Systems damit diese unter allen Umst nden lauff hig bleibt Durch die zus tzliche Angabe der Schl sselworte RESIDENT und oder AUTOSTART lassen sich resi dente autostartf hige oder res
239. ht werden dass der f r dieses Kommando von CREST C generierte Code im Bereich des zweiten Langwortpaares liegt und das erste Lang wortp rchen auf Null gesetzt werden Sie kommen also nicht umhin das Originalbetriebssystem zu patchen oder sich eine angepasste Variante bei IEP zu ordern letzteres d rfte f r halbwegs aktuelle Systeme per Download ber Modem innerhalb weniger Minuten realisierbar sein Der Pointer auf die aktuell aktive Scan Tabelle des laufenden Systems wird von RTOS UH als Lang wort auf der Systemvariable an Adresse 0x934 eingetragen Die Position des laufenden Nukleus findet sich auf Adresse 0x930 Nukleus Pointer Scantable Pointer 0x930 0x934 NUKLEUS 1 Nukleus 0x20 Nukleus 0x24 Nukleus 0x28 Nukleus 0x2C Oo Nukleus 0x30 l l Scantable n 8 Scantable n 8 4 HJ Scantable n 1 8 Scantable 0x00 Scantable 0x04 Scantable 0x08 Scantable 0x0C Abbildung 16 1 Scanbereiche Bei der Angabe eigener Scan Bereiche sollten tunlichst sinnvolle Adressen verwendet werden Tritt bei Scheibentests auf den angegebenen Scan Bereichen ein BUS ERROR auf so l uft das System nicht weiter Zu den sinnvollen Bereichen z hlt das RAM eines RTOS UH Rechners in der Regel eben nicht Sie sollten sich auf das berscannen von nichtfl chtigen Bereichen beschr nken und dabei m glichst si cherstellen dass wirklich nur beabsichtigte Systemkomponenten vom Scanner erfasst werden Irgend we
240. hten nun darauf zugreifen so K nnen Sie mit der C Funktion rt_search modul die Adresse des Modulkopfes bestimmen Dabei ist jedoch zu beachten dass RTOS UH sich darauf versteift Module deren Namen mit einem Doppelkreuz beginnen nicht finden zu wollen Es handelt sich dabei um eine Art Abwehrhaltung des Betriebssystems um zu ver hindern dass Nutzer an systemeigenen Tasks und Modulen herumspielen k nnen und deshalb so tut als w ren sie nicht in der Speicherverwaltung eingetragen MemSectionHeader rt_search_modul char modulename Bei Misserfolg liefert rt_search_modul den Pointer NULL Um an die Nutzdaten ei nes derartig aufgefundenen Moduls heranzukommen k nnten Sie sich z B eine Funktion wie search_memory_modul schreiben die direkt den Pointer auf die Nutzdaten des Moduls liefert void rt_search_named_memory char name register MemSectionHeader header if header rt_search_modul name NULL return UnlinkedWorkspace header gt user_data else return NULL Alternativ steht die eben beschriebene Funktion rt_search named memory auch direkt in den CREST C Bibliotheken zur Verf gung Ihr R ckgabewert ist identisch mit dem Zeiger den Sie mittels der Allokationsroutinen bekommen h tten ist also auch f r Speicherfreigaben mittels rt_named free memory tauglich Da die M glichkeiten beim Umgang mit derartigen Speichermodulen zu vielseitig sind um sie mi
241. i Unterst tzung durch die CREST C Laufzeitumgebung e Interrupt und Exception Handler CREST C erlaubt die Generierung von hardwarenahen Funktionen die direkt auf asynchrone Ereignisse reagieren k nnen Die betreffenden Funktionen unterst tzen dabei die unter RTOS UH g ltigen Konventionen Eine CREST C Laufzeitumgebung existiert innerhalb dieser Co debereiche nicht e Kalt und Warmstartcode Hierbei handelt es sich um Funktionen die in der Startphase des Betriebssystems automatisch ausgef hrt werden Es steht weder die volle Funktionalit t von RTOS UH noch eine CREST C Laufzeitumgebung zur Verf gung 13 1 C Shellmodule Ein in C kodiertes Shellmodul verh lt sich f r den Bediener entsprechend zu den meisten Einbau kommandos wie z B COPY C Shellmodule erlauben die bergabe von Parametern an die main Funktion des Programmes und ebenso die bermittlung eines R ckgabewertes an den Aufrufer Die Funktion main k nnte demnach in der gewohnten Form int main void int main int argc char argv erfolgen Der R ckgabewert auf Shellebene beschr nkt sich dabei lediglich auf die Meldungen Shell modul ordnungsgem ss oder mit Fehlern terminiert Bei der Funktion exit ist demnach als Argu ment EXIT_FAILURE anzugeben wenn das Shellmodul mit fehlerhaftem Status abgebrochen werden soll Dagegen bewirkt EXIT_SUCCESS dass das Shellmodul als ordnungsgem ss terminiert betrachtet wird 13 1
242. icken des Leseauftrages auf dessen Beendigung gewartet werden gesteuert ber MODMWA Im Beispiel sollen 5 Zeichen gelesen werden Jetzt kann das CE auf die Reise geschickt werden rt_transfer_ce rce_A Das CE landet beim Treiber fiir die Schnittstelle A1 und die aufrufende Task wird einstweilen blockiert Wenn der Treiber das CE aus seiner CE Kette holt und feststellt dass es sich um eine An forderung an die Betriebsart A Port handelt so wird zun chst der gesamte interne Empfangspuffer der Schnittstelle A1 gel scht alle bislang empfangenen Zeichen sind dann futsch Anschliessend wer den die n chsten 5 einlaufenden Zeichen brav an die Stelle geschrieben auf die unser CE mit dem Parameter buffer verweist Solange nicht auch das f nfte Zeichen empfangen wurde verharrt die aufrufende Task brav im Zustand 1 0 Gesetzt den Fall dass tats chlich 5 Zeichen empfangen wur den oder vom Treiber eine Fehlerbedingung erkannt wurde so kehrt das CE zum Aufrufer zur ck Die erste Aktion sollte stets darin bestehen die Fehlerzelle in reclen abzufragen Wenn Sie das un terlassen lesen Sie mit Gewissheit im realen Betrieb eines sch nen Tages Schrott gerade weil den hundert simulierten Tests nie die Notwendigkeit bestanden haben mag auf Fehler zu reagiern Be trachten Sie es als erwiesene Tatsache dass der Verzicht auf die Abpr fung von Fehlerkonditionen bei l O Operationen mit absolut t dlicher Sicherheit zum GAU ihrer Algor
243. id main void DataSpace bptr char e R if bptr malloc sizeof DataSpace NULL ezit 00 3 bptr gt tid rt_my_TID 5 bptr gt reader_ptr amp bptr gt buffer 0 bptr gt writer_ptr amp bptr gt buffer 0 IDP4 bptr IRA Level4 Interrupt jetzt scharfmachen for 55 Warten auf Freigabe durch den Interrupthandler rt_suspend c bptr gt reader_ptr Abbildung 13 10 Kommunikation tiber dynamischen Speicher Das Beispiel ist nur dazu gedacht die Vorgehensweise zum Einklinken von Interrupts und Betreuungs tasks zur Laufzeit zu demonstrieren Es ist nicht lauff hig und die Synchronisation zwischen Interrupt und Grundebene mittels rt_suspend zu realisieren ist wohl ebenfalls nur als abschreckendes Bei spiel gedacht Etwas mehr Aufwand ist schon noch erforderlich um einen Ringpuffer sauber zu ver walten und keine Interrupts zu verschlafen Zuerst kommt die Beschaffung eines Speicherblockes der die Daten des Interrupt Handlers aufneh men soll Geschickterweise verwaltet man den Speicher in Form einer Struktur um auf die Elemente namentlich zugreifen zu k nnen Dann kommt eine Initialsequenz um den Block auf seine sp tere Aufgabe vorzubereiten In der Verwaltungsstruktur sei die TID der Grundebene ein Lese ein Schreibzeiger und ein Daten block vorgesehen Damit l sst sich bereits ein Ringpuffer verwalten der selbstverst ndlich gross genug sein so
244. ident autostartf hige Systemtasks erzeugen Der Name der Systemtask wird bei Verwendung des Schl sselwortes RESIDENT vom Compiler automatisch um ein Doppelkreuz erweitert um unbeabsichtigtes Entladen zu vermeiden Weiterhin l sst sich unter Verwendung der Schl sselworte QUEUE INTERFACE oder ERROR spezifi zieren ob die Tasks f r eine besondere Verwendung ausgelegt sein soll pragma SYSTEMTASK PRIO 20 ERROR Da es maximal eine ERROR Task im System geben darf ist die M glichkeit eine zus tzliche Task dieser Artin CREST C zu schreiben eher von akademischer Bedeutung und soll hier auch nicht n her erl utert werden pragma SYSTEMTASK PRIO 4 RESIDENT INTERFACE 21 STACKSIZE 0x300 Eine INTERFACE Task K nnte etwa so vereinbart werden liefe auf Priorit t 4 w re resident und f r LDN 21 verantwortlich Eine Stackgr sse von 300 Bytes w re f r eine solche Task durchaus hinreichend Vertreter dieser INTERFACE Tasks in ihrem System w ren die USERxx die die Shell aufwecken wenn Sie auf Ihrem Terminal ein Ctrl A gedr ckt haben Ein typisches Beispiel f r eine OUEUE Task w ren die Betreungstasks f r die Schnittstellen ihres Sy stems Eine QUEUE Task f r LDN 21 k nnte dann folgendermassen vereinbart werden pragma SYSTEMTASK PRIO 5 RESIDENT QUEUE 21 STACKSIZE 1024 A TASKHEADSIZE 0x0200 Ebenso wie bei Kalt und Warmstartscheiben Interrupt und Exception Handlern spielen Sie bei der Kodierung von Systemtasks
245. ie allererste Debugausgabe einen echten Fehler beschreiben w rde der Rest der Ausgaben w re dann meist eine direkte Folge der ersten Ausgabe und des dadurch zerst rten Timings Als Arbeitstiere sind die aus C Sicht reichlich dummen Systemtasks jedoch absolut ideal Zur di rekten Kommunikation mit Peripheriebausteinen Pufferverwaltung und hnlich triviale Dinge reichen die normalen Sprachmittel von C in 99 aller F lle aus ohne das dynamische Speicherallokationen oder komplexe O Operationen ber ANSI C Funktionen jemals ben tigt werden Tasks die Betreu ungsaufgaben f r Interrupt Routinen bernehmen sollen klein und schnell sein weil sie lediglich als verl ngerter Arm der Interruptroutinen anzusehen sind Der Vorteil dieser Aufteilung ist darin zu sehen dass die CPU bei der Abarbeitung von Systemtasks offen f r Interrupts oder h herpriorisierte Tasks ist W rden auch die Verwaltungsaufgaben eines hochprioren Interrupts auf Interruptlevel der CPU abge handelt so w re die Wahrscheinlichkeit recht hoch dass Interruptquellen mit niedrigerer Priorit t sich mit ihren Anforderungen nicht durchsetzen K nnten Durch die Ausgliederung von Code der Interrupt auf die Taskebene ist auch eine deutlich flexiblere Ausnutzung des Priorit tenkonzepts von RTOS UH zu erreichen Hier ohne jeglichen Sinn den kompletten Startupcode f r C Tasks zu exekutieren um eine Task zu ge nerieren die die dadurch verf gbaren Features nic
246. ie das abschliessende OxFF bzw ein anderes Byte mit gesetztem h chsten Bit an den eigentlichen Namen anzuh ngen RTOS UH hat nunmal eine andere Vorstellung davon wie ein Terminator Zeichen aus zusehen hat Das 0x00 das der strcpy zus tzlich anh ngt w re alleine nicht ausreichend um den Namen RTOS UH konform zu terminieren Der Dummy Name sollte deshalb 23 Zeichen einschlies slich des RTOS UH Terminators nicht berschreiten um bei der Verwendung von strcpy nicht nachfolgende Speicherketten zu vernichten ein netter Fehler den man wochenlang mit wachsender Begeisterung zu suchen pflegt Wenn Sie keinen CE Namen einsetzen dann ist das auch egal Bei der Beschaffung des CE s wird bereits der Dummy Name eingetragen Jetzt geht es an die Beschreibung was das CE denn letztlich tun soll Bei seriellen Schnittstellen ist das relativ simpel Man kann lesen oder schreiben Dazu ist der Parameter mode im CE entsprechend zu besetzen Die zugeh rigen Makros sind den Tabellen 15 7 15 8 und 15 9 bzw der Includedatei lt rtos h gt zu entnehmen Das mode Wort besitzt eine Dreiteilung in Bezug auf die Funktionalit t der Bits mn EO SC NE MODM O Tabelle 15 7 Steuerbedingungen im mode Byte eines CE s Die acht oberen Bits des mode Wortes bestimmen das I O Verhalten des Ger tetreibers der ein sol ches CE empf ngt Die wichtigsten Bits sind hierbei MODMOU legt die 1 O Richtung fest
247. ierung die Traps PIT und POT explizit beschrieben so lassen sich diese mittels der rt_peripheral_ Funktionen ansprechen Mittels rt_peripheral_input wird ein lesender Zugriff auf eine Peripherie Adresse durch 15 5 VO unter RTOS UH 153 gef hrt Der R ckgabewert ist implementierungsabh ngig ULONG rt_peripheral_input void p_addr Entsprechend wird bei rt_peripheral_output das Datum data nach der jeweiligen Imple mentierungsvorschrift auf p_addr ausgegeben void rt_peripheral_output void p_addr ULONG data 15 5 2 Von CE s Queues und Betreuungstasks Zun chst eine kleine Vorbemerkung zum Thema Aktualtit t Was in dieser Dokumentation ber das Verhalten von RTOS UH beim Umgang mit CE s festgehalten ist entspricht dem Stand des Nukleus 6 x Ab der Version 7 0 hat sich intern im RTOS UH eine Menge ge ndert Mein Entschluss jetzt auf Internas einzugehen die im Prinzip schon berholt sind beruht auf der schlichten Tatsache dass tausende dieser alten 6 x Kerne heute stabil im Einsatz sind Die nderungen die sich durch den neuen Nukleus ergeben wirken sich auf Hochsprachenprogrammierer nur unwesent lich aus CREST C l uft seit Anfang 1992 auf dem damals brandneuen Kernel der Uni Hannover In der aktuellen Version wurden die neuen Trapanschl sse bernommen und auch dokumentiert Sie lassen sich jedoch erst mit dem neuen Kern ab NUK 7 x nutzen 15 5 2 1 Anforderung eines CE s Unter RTOS UH findet e
248. ig Funktionsaufruf verschieblich RO SR function TSR oncion WPC BSR L function ab MC68020 Kern BSR W function Tabelle 3 2 Funktionsaufrufe Programme fiir CPU s mit 68000er Kern d rfen also nie mit der Option R 2 compiliert werden Standardm ssig ist die Option R 0 eingestellt aber wenn die Gesamtgr sse des Codes unterhalb der magischen 32kB Grenze liegt so l sst sich das Projekt auch mit der Option R 1 oder R 3 12 3 1 Die Optionen des ccc bersetzen Dabei spart die CPU bei jedem Sprung das Lesen eines Maschinenwortes aus dem RAM der Code wird k rzer und schneller Variablenzugriff verschieblich MOVEL DO var WAS W A5 MOVE L D0 var L A5 ab MC68020 Kern Tabelle 3 3 Zugriff auf globale Variablen im data und bss Section Die Optionen C digit D digit und E digit tragen ebenfalls den eingeschr nkten F hig keiten des MC68000 Rechnung Der vom CCC generierte Code ist blicherweise und wenn nicht explizit anders verlangt wiedereintrittsfest Um das zu erreichen werden die globalen und lokalen Variablen eines erzeugten C Programmes nicht auf festen Adressen abgelegt das erg be ein bles Gehaue um Variablen und sicherlich nicht das erw nschte Ergebnis Vielmehr findet die Adressierung dieser Speicherstellen ber Adressregister statt deren Inhalt sich von C Subtask zu C Subtask un terscheidet Lediglich die Offsets relativ zum Basisregister sind f r alle erzeugten C Sub
249. im mer genugend Stack zur Verf gung stellen um derartige Absch sse zu vermeiden 190 15 8 Fehlermeldungen 15 3 Fehlermeldungen Unter RTOS UH kann mittels der Funktion rt_error eine wortweise zusammengesetzte Mel dung auf das Terminal des verantwortlichen Nutzers geschrieben werden errmsg muss auf konstan ten Text zeigen der mit SFF endet Ber cksichtigen Sie dass bei einem Blank eigentlich sogar alles kleiner oder gleich 0x20 im Text die Ausgabe abgebrochen wird Sollten Sie sich schon einmal ber die Underlines anstelle von Blanks in den Fehlermeldungen von Filemanagern oder anderen Treibern gewundert haben das ist der Grund Da dieses Verhalten RTOS UH intern als Feature genutzt wird macht es wohl wenig Sinn sich dar ber zu beschweren Mit errcod wird festgelegt was an Standardtexten zus tzlich ausgegeben wird errcod muss man sich dabei als ein aus vier Nibbles halben Bytes zusammengesetztes Wort ABCD vorstellen Die Be legung von errcod ist der Tabelle 15 11 zu entnehmen Von der Verwendung der als nicht belegt gekennzeichneten Zahlenkombination ist dabei tunlichst abzusehen da es sonst zu unsinnigen Ausga ben kommt void rt_error char errmsg ErrMessage errcod A enth lt folgende funktionelle Bits 2 unterdriicke Text von errmsg 8 suspendiere die aufrufende Task B Auswahl aus folgendem Vorrat 0 Blank 1 NOT WRONG 3 ZERO DIV 4 CHK BLOCKS 6 BREAKPOINT 7 DIRECTORY DISC 9 MEMORY A MODULE MI
250. in nach Murphy treten die dann auch alle auf Deshalb sollten Sie schon ber gewisse Grundlagen in Assemblerprogrammierung verf gen und die entsprechenden Handb cher f r ihre CPU neben sich liegen haben um auch nur den Hauch einer Chance zu besitzen Blutigen Anf ngern sei vom Weiterlesen abgeraten denn hier geht es hautnah an die CPU und tief in den Kern des RTOS UH pragma EXCEPTION IROFF void Trace void registers void stackframe Mittels dieses Programmrumpfes entsteht Code f r einen Exception Handler Das Schl sselwort IROFF gibt zudem an dass der Handler komplett auf Level 7 laufen soll und nicht von Interrupts unterbrochen werden kann Der Startupcode f r solche Exception Handler begeistert zwar nicht durch 118 13 6 Exception Handler in C seine Laufzeit Effizienz gibt Ihnen jedoch die M glichkeit auf Hochsprachenebene an alle wichti gen Register und Speicherinhalte zu gelangen Der Compiler generiert Code der beim Auftreten einer Exception eine Kopie der aktuellen CPU Register auf dem Stack anfertigt Anschliessend wird eine Funktion aufgerufen in der Sie pers nlich entscheiden k nnen was im Falle der Exception zu gesche hen hat CODE EVEN Trace ORI W 0700 SR MOVE L SP SP MOVEM L DO A6 SP Register retten PEA 64 W SP Pointer auf ESF PEA 4 W SP Pointer auf Registersatz BSR IRTEE ADDO W 8 SP Super Stack korrigieren MOVEM L SP DO A6 Register res
251. ind keine Aktivierungen gepuffert so legt sich die Task in den Zustand SCHED bleibt also eingeplant Eine andere Task kann die schlummernde Task nun mittels rt_unblock_waiting_task aufwecken Das folgende Beispiel demonstriert die M glichkeiten die diese spezielle Form der Selbstblockierung bietet Verarbeitungstask for 148 15 3 Multi Tasking while HabDatenBekommen VerarbeiteDaten rt_timed_activate_quick rt_my_TID Prio 0 Ox80000000L 5 Start nach 5 ms OL kein Intervall OT TS keine Endezeit rt_wait_for_activation EineDerAnlieferungsTasks GibIhmDaten rt_unblock_waiting_task tid_der_Verarbeitungstask Die Verarbeitungstask plant sich nach Ablauf von f nf Millisekunden f r eine Eigenaktivierung ein und legt sich mit der neuen Funktion schlafen bis 1 eine Aktivierung von draussen erfolgt wie z B von der Task EineDerAnlieferungs Tasks 2 f nf Millisekunden abgelaufen sind und die Eigenaktivierung greift Diese Methode ist deutlich flexibler in der Anwendung als Timeout berwachungen innerhalb der Task mittels rt_resume_after zu kodieren oder externe Watchdog Tasks mit dieser Aufgabe zu betreuen Grunds tzlich sollte die Funktion rt_unblock_waiting_task zur Aktivierung einer mit tels rt_wait_for_activation eingeschl ferten Task Verwendung finden Zwar funktio nieren die normalen Funktionen zur Aktivierung von Task
252. ine Abkopplung einer Task die von langsamer Peripherie lesen m chte und dem eigentlichen physikalischen Lesevorgang statt Eine Task die O Vorg nge ausf hren m chte muss sich zu diesem Zwecke zun chst vom Betriebssystem eine Datenstruktur anfordern die zur Versendung derartiger Kommunikations Auftr ge dient Den Aufbau eines als Communication Element oder kurz CE bezeichneten Paketes k nnen Sie Abbildung 15 3 oder der Includedatei lt rtos h gt entnehmen struct Ce MemSectionHeader head H MemSectionHeader fort e MemSectionHeader backt Task tid_of_owner Ce fors y Ce backs A Prio prio Fi char buffer TOlen reclen G TOstatus status_of_io ITOqueue ldn G TOmode mode 5 IOdrive drive A FileName file_name S Abbildung 15 3 C Struktur zur Verwaltung eines CE s Bevor Sie sich ein CE vom Betriebssystem beschaffen m ssen Sie sich dar ber klar werden dass es sich bei einer solchen Aktion um die Beschaffung dynamischen Speichers handelt RTOS UH holt f r die anfordernde Task einen Block aus dem Freispeicher Um zu verhindern dass eine Task sich unkon trolliert mit dynamischem Speicher vollsaugt und das ganze System pl tzlich aus Speicherplatzmangel 154 15 5 VO unter RTOS UH liegenbleibt f hrt RTOS UH dar ber Buch wieviel CE Speicher jede Task aktuell im Besitz hat Wird das Kontingent einer Task berschritten so stoppt das Betriebssystem den Gierschlund Die Task bleibt mit dem Status CWS liegen und wird
253. ine Task Speicher einer anderen Task freizugeben versucht was v llig unzul ssig ist Wenn die Meldung auch dann noch herauskommt nachdem Sie diese Checkliste abgear beitet haben d rfen Sie nun beruhigt in Panik verfallen denn in dem Fall ist es sicher dass ihre Task oder irgendeine andere Task im Rechner sich damit vergn gt fremden Speicher vollzumalen ber schreitungen der angeforderten Bl cke mit schreibenden Operationen sind gl nzend dazu geeignet die laufende Task oder gar das RTOS UH selbst in die ewigen Jagdgr nde zu schicken Besondere Vorsicht ist bei fehlerhaften Pointern geboten die in gesch tzte oder unzul ssige Berei che zeigen Derlei Zugriffe kann free selbstverst ndlich im nicht priviligierten CPU Modus nicht mehr abfangen und statt eines netten Hinweises der Bibliotheksroutine rennen Sie nun in die BUS ERROR Keule des Betriebssystems Die Verwendung der ANSI C Funktionen h lt Ihre Programme kompatibel geh rt aber in Bezug auf die Geschwindigkeit nicht gerade zu den Spitzenreitern der Bibliotheksfunktionen Bei Terminierung der Task gehen alle bis dahin allokierten Speicherbereiche wieder in den Besitz des Betriebssystem ber Da sich auch die genormten Speicheranforderungen auf den bekannten Systemtraps zur Beschaffung von Procedureworkspace abst tzen r umt RTOS UH diese Bereiche automatisch ab und gibt sie als Freispeicher ans System zur ck Sie sollten also der Versuch wiederstehen S
254. iniert betrachtet und bei Bedarf selbst Testbefehle f r das Funktionsergebnis generiert die das Statusregister der CPU in einen definierten Zustand versetzen 20 3 1 Die Optionen des ccc 3 1 18 Unterdr ckung von 68K Optimierungen Die Resultate der Optimierungsmassnahmen von Compilern decken sich keineswegs immer mit den Absichten des Programmierers Gerade beim Zugriff auf Peripheriebausteine ergibt sich oftmals eine gewisse Diskrepanz zwischen optimiertem und funktionsfihigen Code 3 1 18 1 Der CLR Befehl bei 68K CPU s Die N Option wurde implementiert um einer gew hnungsbed rftigen Eigenschaft mancher Motorola 68K CPU s zu begegnen Der CLR Befehl eignet sich auf Grund kompakteren Maschinen codes besser zum L schen vom Speicher als ein korrespondierender MOVE Befehl mit Null Der Co degenerator des CCC verwendet deshalb standardm ssig den CLR Befehl bei Schreiboperationen mit Nullmustern Seltsamerweise f hrt der CLR Befehl vor der Schreiboperation einen Lesezyklus aus Aus diesem Grunde eignet er sich nicht f r dem Zugriff auf I O Bereiche die als write only Register ausgelegt sind oder bei denen Leseoperationen interne Status nderungen ausl sen Mittels der Compileroption N wird der CCC angewiesen bei Zugriffen ber Pointer oder auf absolute Speicherpositionen das CLR Kommando zu vermeiden Die Option gilt wie blich f r die gesamte Datei Um auch lokal innerhalb der Datei Einfluss auf das Verhalten des Compilers n
255. inistische Programme zu entwickeln andernfalls eben nicht Im Beispiel habe ich diesen Vorgang eingespart Aber Sie wissen ja Beispiele zeigen immer nur wie man es besser nicht machen sollte Bislang haben sind demnach f nf Prozesse im Speicher die alle Zugriff auf die globalen Variablen des Vater Prozesses X 00 haben Jede dieser Tasks besitzt ihren eigenen Stack ihren eigenen Stackpointer und arbeitet mit einem eigenen Satz an lokalen Variablen 52 3 15 Lebensdauer von Variablen Und jetzt fangen wir an die Sache un bersichtlich zu gestalten und werfen ein weiteres Mal unser C Shellmodul X an Wie kaum anders zu erwarten entsteht nun eine neue Vatertask die der Einfachheit halber als X 10 bekannt sein soll nur um das Zahlenwirrwarr nicht auf die Spitze zu treiben Nach einmaliger Fortsetzung dieser neuen Task besitzt nun auch diese vier S hne A 11 A 13 B 12 und B 14 Jetzt bitte nicht verzweifeln denn viel komplexer wird die Angelegenheit nicht mehr Bislang haben wir ja schon gekl rt dass e V ter mit ihren S hnen ber die globalen Variablen verhandeln k nnen e Gleichnamige S hne des gleichen Vaters untereinander ber die jeweilig gemeinsamen funktions statischen Variablen Daten tauschen oder sich der globalen Variablen des Vaters be dienen k nnen e S hne mit ihrem Vater ber die globalen Variablen reden Bleibt einzig das Problem zu kl ren wie es m glich ist dass die beiden Vaterprozesse X 01 u
256. ionen E und U erl utert Weiterhin l sst sich auch eine Defaultpriorit t der Task vorgeben was bei C Shellmodulen leider auch nicht m glich ist Die Angabe einer Priorit t sollte grunds tzlich nie im Startupfile vorgenommen werden sondern mittels des CLN und der Option T prio erfolgen 96 13 2 C Tasks DEE 0 0 RTOS MODUL Header DC W 01 TYP TASK DCL _MoName Pointer auf Tasknamen DC W 0 Relativ Kennung fuer Tasknamen DC W _Prio Prio der Task DEE _SumSegSize _LocaleSize _DataSize _BssSize DC L 0 0 DC W _Prio Prio der Task DC L _main START PC DE E 0 0 0 0 0 0 0 0 DEE 0 0 0 0 0 0 0 0 Abbildung 13 4 Taskkopf fiirs RAM und oder EPROM Die Beschaffung der Speicherbl cke f r CREST C f llt hier deutlich leichter als bei C Shellmodulen da die Gr sse des TWSP direkt im Taskkopf anzugeben ist und der CLN die erforderliche Gr sse bereits beim Linken eintragen kann und nicht erst Laufzeitcode abgespult werden muss um RTOS UH davon zu berzeugen dass PEARL und das Wissen um dessen Konventionen reichlich berfl ssig sind Die entsprechenden Labelnamen im Startup sollten beibehalten bleiben weil der CLN beim Linken diese Symbole zwingend ben tigt um die errechneten Daten f r das zu bindende Programm korrekt an den diversen Positionen im Startupcode aufzusetzen Lade Position Modulkopf Taskkopf text Bereich common Bereic Relocation Infos Abbi
257. isdatentypen zu betrachten und deshalb lohnt sich zumeist der Aufwand eine Datenstruktur f r die Zielmaschine und den zugeh rigen Compiler zu stricken deren Speicherrepr sentation den Vorgaben entspricht 3 4 1 1 Memberpadding 68K Die MC68000 CPU und CPU32 Familie w nscht bei Wort und Langwortzugriffen im Speicher die Daten auf geraden Adressen Ab MC68020 ist das kein Zwang mehr verhilft dem armen Prozessor aber zu deutlich verbessertem Datendurchsatz CREST C legt automatisch alle Daten auf die wort oder langwortweise zugegriffen werden muss oder sollte auf der n chsten geraden Adresse ab f hrt also wortweises 16 bittiges Padding durch Bei der Definition von Strukturen sollten Sie das stets im Hinterkopf behalten struct test char a Offset 0 long b Offset 2 char c Offset 6 long ad Offset 8 char ea ff Offset lt 12 long f Offset 14 char g Offset 18 Abbildung 3 4 Beispiel fiir 68K Padding in Strukturen Es wurde jedoch eine M glichkeit vorgesehen dieses implizite 16 Bit Padding zu bersteuern Mit tels des pragma Kommandos pragma MEMBER_PADDING_OFF wird das Padding von Struktur mitgliedern ausgeschaltet Beim Einsatz dieses Kommandos sollten Sie Vorsicht walten lassen weil nunmehr auch die Definition von Strukturen m glich ist die auf MC68000er Prozessoren zu bler Verwirrung und fehlerhaften Datenzugriffen f hren Das Pendant zu diesem Kommando stellt der Be fehl
258. ister Task task Task registers gt _Al register Prio prio Prio registers gt _D1 ActivateTask task prio Tabelle 13 5 Beispiel eines Traps in C 13 6 1 2 Kodierung von Line A Funktionen Die Option LINE A AOxx bietet die M glichkeit eigene Line A Routinen zu schreiben LINE A AOxx tr gt an der Position 0x400 xx 2 den Pointer auf die betreffende Funktion ein Der RTOS UH eigene Line A Handler springt dann Ihre selbstgeschriebene Line A Funktion entsprechend dem vorgefundenen Operationcode der die Line A Exception ausgel st hat an xx muss ein gerader Wert zwischen 0x00 und OxFE sein Die Indizes von 0x00 bis 0x7E sind f r das Betriebssystem reserviert F r eigene Line A Funktionen stehen die 64 Eintr ge von 0x80 bis OxFE zur freien Verf gung pragma EXCEPTION LINE A 0xA028 IROFF void TRAP_Suspend void LINE A A028 u wird auf Vektor 0x400 0x28 2 0x450 eingeklinkt 13 7 Kalt und Warmstart Code 121 Ka ES Die gerade laufende Task wird suspendiert SYSVAR TID gt block BLKBSU Suspend Bit setzen SYSVAR DPC Tabelle 13 6 Beispiel einer Line A Funktion in C 13 7 Kalt und Warmstart Code Bekanntlich konfiguriert sich das RTOS UH beim Hochlaufen mittels eines Scheiben Konzepts selbstst ndig Beim Systemstart durchl uft das Betriebssystem eine Reihe von Initial Routinen und durchsucht dabei bestimmte Bereiche nach Modulen aus de
259. ithmen im laufenden Betrieb f hren wird if rce_A gt reclen lt 0 FEHLER retval 0 Was Sie im Fehlerfall anzustellen gedenken bleibt Ihre Sache Aber tun sollten Sie definitiv etwas was der Situation angemessen ist In diesem Falle besteht die Reaktion schlicht darin der aufrufenden Funktion mittels des R ckgabewerts 0 mitzuteilen dass da gerade etwas schiefgegangen ist und der runtergereichte Puffer nicht mit 5 Zeichen gef llt werden konnte else Puffer wurde korrekt gefuellt retval 1 rt_release_ce rce_A Und das CE wieder verschrotten return retval In jedem Fall sollten Sie vor dem Verlassen der Funktion das angeforderte CE wieder freigeben m glichst erst nachdem Fehlerstatus und Nutzdaten ausgelesen wurden weil die Programme sonst da zu neigen stochastische Resultate zu erbringen oder gar abzust rzen Aber warum erz hle ich das Sie werden diesen Fehler mit absoluter Sicherheit begehen irgendwann und irgendwo und dann beginnt zwangsl ufig der Kampf mit dem priorit tengesteuerten Multitasking um die Stelle ausfindig zu ma chen an der die Bombe gelegt wurde Eine Abhilfe schafft die Methode jeden CE Zeiger definitiv nach einem rt_release_ce ung ltig zu machen soll heissen auf eine Stelle verweisen zu las sen die garantiert einen BUS ERROR ausl st wenn ein Zugriff erfolgt In diesem Falle w re rce A nach dem Release z B auf rce_A OxAFFE
260. ition geh ren entspricht 01 void f void 02 03 int a Diese Variablen werden bei 04 int b 1 jedem Programmaufruf neu 05 auto int c b initialisiert 06 register int d a u 07 Pon N 08 inte ER 09 int a PR 10 11 Im Beispiel sehen Sie die Definition von fl chtigen kurzlebigen automatischen oder wie immer man sie auch bezeichnen will Variablen Innerhalb von Funktionen k nnen die Speicherklassen auto und register verwendet werden Entsprechend der ANSI C Norm werden alle Variablen innerhalb einer Funktion implizit der Speicherklasse aut o zugeschlagen wenn man sich als Programmierer nicht die M he gemacht hat eine Speicherklasse anzugeben Nach der urspr nglichen Sprachdefinition von K amp R bedeutete die Verwendung des Schl sselwortes register f r den Compiler den Hinweis oder gar Zwang das betreffende Objekt in einem schnel len Prozessor Register unterzubringen Registerzugriffe verlaufen in der Regel um Faktoren schneller ab als der Zugriff auf den langsamen Hauptspeicher Mit zunehmenden Qualit t der Compiler sank diese Bedeutung des Schl sselwortes register da die Rechenknechte normalerweise einen besse ren berblick besitzen wo und wann sich die Verwendung von Prozessor Registern f r bestimmte Objekte lohnt Auch die Entwicklung der Hardware mit gr sseren Cache Speichern und zunehmend 54 3 16 Giiltigkeitsbereich von Variablen inte
261. ittels CPU getrennt werden kann Einzig der Interrupt Mechanismus der CPU funktioniert noch d h dass Hardware Interrupts noch durchkommen solange sie eine h here Priorit t haben als der aktuell im Statusregister SR der CPU vermerkte Wert void rt_supervisor_mode StatusReg sr Da sich auch das Statusregister beim Aufruf dieser Funktion angeben l sst ist Vorsicht beim Aufruf unumg nglich Wenn Sie das Statusregi ster auf Interrupt Level 7 schalten rt_supervisor_mode 0x2700 kommen keine Interrupts mehr durch solange Sie nicht Kumpel sind und wieder auf den User Mode zur ckschalten Interrupts die in dieser Phase auflaufen k nnen verschlafen werden da sie von der CPU nicht mehr als unbeding te Aufforderung zum Kontextwechsel aufgefasst werden und erst nach Abarbeitung der h herprioren Interrupts zur Ausf hrung gelangen Sie k nnen so unteilbare Sequenzen programmieren und auch ungest rt im RTOS UH selbst rumfrie seln Wenn Sie dieses Spiel allerdings zu oft und zu lange spielen werden Sie erschreckt feststellen dass Ihre Systemuhr pl tzlich nachgeht funktioniert eben durch Timer Interrupts Daten bertragun gen von Schnittstellen w hrend der Ausf hrung Ihrer Supervisor Sequenzen zusammenbrechen funk tioniert mittels Schnittstellen Interrupts und viele h ssliche Scherze mehr Um wieder in den User Mode zu wechseln dient die Funktion rt_user_mode Diese erwartet als Parameter den von rt_supervisor_mode geliefer
262. ittstellen aller Art zum Programmiereralltag wie das t gliche Brot Serielle Schnittstellen sind wie alle Hardware lebende Wesen und sie sind b se Im System sind Sie blicherweise als A1 B2 C3 etc anzusprechen wobei die Zahl quasi die Kanalnummer angibt und der f hrende Buchstabe die Betriebsart in der der Treiber die Schnittstelle zu verwalten hat 15 5 3 1 1 1dnund drive bestimmen Die erste Aktion besteht immer darin aus dem symboli schen Namen eines Ger tes das Idn drive P rchen zu ermitteln das zum Zugriff auf den Treiber ben tigt wird CREST C stellt zu diesem Zwecke eine Funktion zur Verf gung die die Klartextinfor mationen in die interne Darstellung umwandelt Diese liegt in der Includedatei lt rtos h gt als Prototyp zusammen mit der ben tigten Datenstruktur vor typedef struct RFILE IOqueue ldn E IOmode mode R IOdrive drive 7 FileName file_name RFILE int rt_get_filedata RFILE rfile char name Mit folgendem C Code lassen sich z B die Informationen ber die Schnittstelle A3 erhalten Die Funktion rt_get_filedata liefert als R ckgabe einen von Null unterschiedlichen Wert wenn die Dekodierung des bergebenen Namens name geklappt hat In diesem Falle ist die bergebene Struktur rfile in den Eintr gen 1dn und drive mit den Werten versorgt worden die auf diesem System f r das betreffende Mnemonic des Ger tes g ltig sind Im Struktureintrag file name ist der berarbeitete
263. kapazit t zugeteilt Sobald die I O Operation abgeschlossen ist berf hrt RTOS UH diese Task wieder in den Zustand RUN 15 3 1 6 PWS Blockiert durch Speicheranforderung Eine Task wartet auf die Zuteilung von Speicher i a Procedureworkspace PWSP Sie hat vom Be triebssystem Speicher in einer Gr sse verlangt die zur Zeit nicht zur Verf gung steht Da RTOS UH den Speicher dynamisch verwaltet kann jedoch jederzeit wieder ausreichend freier Speicher entstehen RTOS UH befriedigt dann diese Speicheranforderung bei mehreren wartenden Tasks in der Reihen folge der Priorit t und berf hrt die Task automatisch wieder in den Zustand RUN 15 3 1 7 Cws Blockiert durch CE Anforderung Eine Task wartet auf die Zuteilung von Speicherbereich f r O Operationen Dies ist ein Sonderfall des Status PWS der nicht daher r hrt dass im System nicht mehr gen gend freier Speicher vorhanden ist sondern aus dem berschreiten des Speicherkontingents f r O Operationen resultiert RTOS UH begrenzt den f r jede einzelne Task bei jeder einzelnen Aktivierung f r O Operationen bereitgestellten Speicherplatz auf zur Zeit 3kB um zu verhindern dass eine einzelne Task durch zahlreiche Ausgaben den Systemspeicher berm ssig verkleinert 15 3 1 8 SEMA Blockiert durch SEMA Anforderung Eine Task wartet auf die Zuteilung einer Semaphore oder einer Bolt Variable Dieser Taskzustand wird immer dann erreicht wenn zwei Tasks konkurrierend a
264. kgabe erfolgen soll e die zu rettenden Register Um es an einem Beispiel zu demonstrieren Die Funktion f habe drei Ubergabeparameter drei lo kale int Variablen und nutze ein Array von Charactern Zudem ist ersichtlich dass die Funktion sich rekursiv selbst aufruft Die minimale Belastung des Stacks bei einem Aufruf von ergibt sich aus der Summe des Speicher platzbedarfes von Argumenten dynamischen Variablen R cksprungadresse zur aufrufenden Funktion und dem unvermeidlichen Verwaltungskram den ein Funktionsaufruf leider nach sich zieht In diesem 3 8 Lokale Variablen und Argument bergabe 39 void f int x int y int z char testfeld 1000 int ay Oo S if abbruchbedingung ELE Ek Ek iz Abbildung 3 9 Beispielfunktion zur Speicherplatzabschatzung Falle erg ben sich demnach Stackbelastung 3 4 Byte Argumente Byte char Feld Byte lokale Variablen Byte Ruecksprungadresse 1028 Byte d E o o o Bods PON Abbildung 3 10 Absch tzung des lokalen Speicherbedarfs einer Funktion In dem Fragezeichen sind die tempor ren Zellen zusammengefasst die der Compiler nur intern nutzt und die nach aussen nicht in Erscheinung treten Weiterhin versteckt sich dort der Speicherplatzbedarf f r die Register die die Funktion ver ndert und die beim Verlassen wieder restauriert werden m ssen Wenn Sie sichergestellt haben dass die Funktion nie tiefer als in die zehn
265. kgaben 2 Im Gegensatz zur 68K Implementierung betrachtet RTOS UH bei Systemaufrufen eine gewisse Anzahl von Registern grunds tzlich als Scratch Register die nicht gerettet und restauriert wer den Der cccppc verf hrt bei der Codegenerierung hnlich und betrachtet die Register r28 bis r31 als tempor re Zellen 3 11 Verschieblicher Code Unter verschieblichem Code versteht man ein Programm dessen S Record keine speziellen Anwei sungen mehr enth lt um den darin kodierten Bin rcode an beliebiger Stelle ins EPROM brennen zu k nnen Ein derartiges Programm k nnte eine bin re Kopie von sich selbst erstellen und die Kopie exekutieren Ein Beispiel daf r ist RTOS UH selbst Es muss klar festgestellt werden dass Verschieb lichkeit keine Voraussetzung f r lauff higen Maschinencode darstellt 3 11 Verschieblicher Code 47 RTOS UH verwendet den Buchstaben R innerhalb von S Records um das nachfolgend abgelegte Langwort um die Ladeadresse des Moduls zu korrigieren S Records die ein R Symbol enthalten sind nicht mehr frei verschieblich Notwendig werden derartige Konstrukte immer dann wenn der Ma schinencode absolute Adressen absolute Spr nge Pointer auf die text Section enth lt Bei der Verwendung des LOAD Kommandos werden R Symbole Text Relokationen automatisch aufgel st Da viele Tools mit den RTOS UH spezifischen Erweiterungen der Motorola S Records nicht um gehen k nnen ist es stellenweise w nschenswert Programme zu
266. ks Sicherlich ist eine solche Situation unsch n aber zumindest gelingt es in den meisten F llen den sonst unvermeidlichen Crash abzufangen Die Testsequenz droppt Ihre Task bei Stackoverflow setzt den Stackpointer wieder auf den Wert den er beim Start der Task hatte und spult ein wenig Epilog Code ab So werden z B noch alle offenen Dateien geschlossen um das Filesystem vor Schaden zu bewahren Wenn Sie allerdings mit dem Stack so sparsam umgegangen sind dass selbst bei diesen trivialen Aktionen erneut ein Overflow auftritt so haben Sie endg ltig verspielt und es wohl auch nicht besser verdient Als Anhaltswert f r eine sinnvolle Stackgr sse sollten Sie etwa 2 bis 8kB im Hinterkopf behalten Durch Rekursion oder Verwendung grosser aut o Felder innerhalb der Funktionen k nnen sich jedoch rasch deutlich h here Werte ergeben 3 8 Lokale Variablen und Argument bergabe Bei der Auslegung der Gr sse des Stacks ist ein wesentlicher Punkt zu ber cksichtigen Der Stack dient auch zur Speicherung lokaler Variablen Diese lokalen Zellen werden beim Durchlaufen Ihres Programmes stets dynamisch angefordert Jeder Funktionaufruf belastet den Stack durch e die an die Funktion zu transferierenden Argumente die dynamischen Variablen der Funktion e die tempor ren Zellen die der Compiler zur Bearbeitung des Codes ben tigt e die R cksprungadresse aus der Funktion e einen m glichen Pointer auf die Zelle in der die Funktions R c
267. l 224 fcos 215 fcosh 218 fexpO 220 fexp100 220 INDEX fexp2 220 ffiniteQ 226 ffloor 224 ffmod 221 ffrexpO 221 FILES 233 235 finiteQ 226 fisinfO 225 fisnan 225 fidexpQ 221 float 26 211 flog 222 flog100 222 flog2 222 floor 224 FLT_DIG 211 FLT_EPSILON 211 FLT_MANT_DIG 211 FLT_MAX 211 FLT_MIN 211 fmod 221 fmodf 223 FREE 127 147 free 98 103 180 181 frexp 221 fround 224 fsign 225 fsin 216 fsinhQ 219 fsqrtQ 223 ftan 217 ftanh 219 Funktionsr ckgabewerte 41 AO 41 DO 41 FPO 41 Giiltigkeitsbereich 54 Hardware Interrupt 143 144 149 HEADER 207 229 VO 133 134 137 162 172 Idle Task 203 Idle Task 197 IDP 111 IEEE 211 IEEE 754 211 IID 109 INCLUDE_ONCE 16 229 int 26 INTERFACE 106 234 Interne Blockierung 147 253 INTERRUPT 108 230 Interrupt 116 143 144 149 Interrupt Routinen 150 Interrupt Data Pointer siehe IDP Interrupt Handler 92 INTERRUPT EXIT 230 INTERRUPT PROCEDURE 230 IOBLCK 167 IOCAP 167 IOCCH 167 IOCCLO 167 IOCCMD 167 IOCDI 167 IOCEF 167 IOCER 167 IOCEL 167 IOCFOD 167 IOCFOS 167 IOCFRE 167 IOCLNK 167 IOCMDI 167 IOCNE 167 IOCRDI 167 IOCREN 167 IOCREW 167 IOCRTN 167 IOCRW 167 IOCRWI 167 IOCRWN 167 IOCRWS 167 IOCSAV 167 IOCSEK 167 IOCSYN 167 IOCTOU 167 IROFF 108 117 229 230 isinfO 225 isnan 225
268. lche Tabellen mit dort gespeicherten Anwenderdaten sind in der Regel unkritisch weil die Schei benkennung mit 32 signifikanten Bits SAEB1BF95 nicht gerade zu den typischen Speicherinhalten z hlt Gef hrlich ist jedoch die Angabe von falsch gew hlten RAM Bereichen weil dort die M glich keit besteht ber gef hrliche Artefakte zu stolpern Wenn eine g ltige Signalmarke die noch aus den 200 16 2 Kaltstart Zeiten vor dem letzten Reset stammt nun als giiltige Scheibe akzeptiert wird kann beliebiger Unfug angerichtet werden Bereiche zu scannen die nicht mit sinnvollen Werten besetzt sind ist eine digitale Abart des russischen Rouletts wieviele Kammern dabei scharf geladen sind wird unfairerweise vorher nicht verraten Beim Vorgang des Scheibenscannens handelt es sich um einen schlichten Vergleich tiber den ange gebenen Speicherbereich ob eine Signalmarke SAEB1BF95 auftaucht Um diesen Vorgang zu be schleunigen existiert in den meisten RTOS UH Implementierungen der sogenannte Quick Scanner der diese Aufgabe in der Kaltstartphase einmal vorneweg ausf hrt und dabei eine Tabelle aus Scheiben adressen aufbaut Diese Tabelle liegt gleich zu Beginn der dynamischen Systemvariablen und belegt pro aufgefundener Scheibe ein Langwort eben den Pointer der hinter die Signalmarke und auf die ko dierte Scheibennummer verweist Der zus tzliche Speicherplatzverbrauch h lt sich durch diese Tabelle meist in vern nftigen Grenzen Ein dur
269. ldn for 57 Warteschleife bis zum Eintreffen eines CE s for if work_ce rt_take_of_queue ldn NULL Betreuungstask geht jetzt schlafen rt_wait_for_activation else break Eintragen der aktuellen User Nummer aus dem CE um Fehlermeldungen richtig zuordnen zu koennen if work_ce gt tid_of_ owner rt_my_TID gt head owner work_ce gt head owner ORK RR KKK KK A Hier koennen dann beliebige Dinge mit den Daten des CE s angestellt werden S tt Und hier wird das CE wieder freigegeben rt_release_ce work_ce 15 5 2 4 Warten auf Beendigung eines I O Vorgangs Die Funktion rt_wait_for_ce berpr ft ob sich das angegebene CE noch in einer Warteschlange oder Bearbeitung einer Betreuungstask befindet Ist dies der Fall wird die aufrufende Task blockiert 1 0 Sie l uft weiter wenn das CE freigegeben wurde d h wenn die Betreuungstask die Bearbei tung des I O Vorgangs abgeschlossen hat void rt_wait_for_ce Ce akt_ce Die Verwendung dieser Funktion empfiehlt sich wenn ein CE ohne Wait Bit MODMWA abgeschickt wurde und nun weiter verwendet werden soll 15 5 2 5 Freigeben eines CE s Um ein CE das nicht l nger ben tigt wird an das Betriebssystem zur ckzugeben existiert die Funkti on rt_release_ce Das bezeichnete CE soll wieder in freien Speicher verwandelt werden Zeigt akt_ce nich
270. ldung 13 5 C Task im RAM Wird der Code ins EPROM gebrannt so durchsucht das Betriebssystem seinen Scan Bereich beim Hochlaufen nach Scheiben vom Typ 1 Da Taskk pfe im RAM liegen m ssen wird f r jede gefundenen Scheibe dieser Art aus den im EPROM aufgefundenen Informationen ein Taskkopf generiert Den Aufbau einer solchen SLICE 1 k nnen Sie der Abbildung 13 6 entnehmen Danach besteht aus Nutzersicht keinerlei Unterschied mehr zwischen einer Task die aus dem EPROM oder dem RAM aufgewacht ist Eine Darstellung der Lage der Speichersektionen k nnen Sie der Ab bildung 13 7 entnehmen 13 3 C Subtasks 97 SLICE 1 DC W 0100 TYP TASK DC L _MoName Pointer auf Tasknamen DC W 0 Relativ Kennung fuer Modulnamen DC W _Prio prio of task DE Ab _SumSegSize _LocaleSize _DataSize _BssSize IDG _main Start PC DC L 0 Abbildung 13 6 Taskkopf f rs EPROM Wesentlich ist dabei die Lage der common Section die von der Vorgabe der CLN Option A address abh ngig ist W hrend beim Startup tstart s die common Section bereits beim Laden hinter der text Section des Programmes vorgehalten wird patcht der CLN bei der Verwen dung der A Option den Startupcode so um dass eine SLICE 13 im EPROM Code entsteht So mit richtet RTOS UH beim Hochlaufen automatisch ein Modul mit gel schtem Datenbereich f r die common Section ein Task Slice EPROM Position Taskkopf text Bereich Initial data Relocation Infos
271. le nur byteweise auf den Speicher langen und so in der Regel das beabsichtigte Ziel verfehlen Entsprechend der Funktionsweise der pragma Kommandos ENABLE CLEAR MNEMONICS bzw DISABLE_CLEAR_MNEMONICS wurden zur Unterst tzung dieser Funktionalit t die Anweisungen pragma DISABLE_BIT_MNEMONICS pragma ENABLE_BIT_MNEMONICS 3 1 Die Optionen des ccc 21 implementiert Folge dieser Option ist geringf gig ineffizienterer Code der jedoch den deutlichen Vorteil besitzt die im Quelltext angegebenen Zugriffsbreiten auf externen Speicher nicht mehr zu ver ndern 3 1 19 Globale Registervariablen Die ANSI C Norm untersagt den Gebrauch des Schl sselwortes register ausserhalb von Funktio nen Mittels der Z Option wird der CCC in die Lage versetzt globale Registervariablen zu verwenden Die Option wurde nur geschaffen um bei kleinen Programmen die Geschwindigkeit zu erh hen Gene rell ist von der Verwendung dieser Option dringend abzuraten Bei fehlerhafter Verwendung globaler Registervariablen st rzt das System mit Sicherheit ab Der CCC interpretiert das Schl sselwort register ausserhalb von Funktionen als den Wunsch des Programmieres den G ltigkeitsbereich auf die Hauptdatei zu beschr nken in der die Definition auftrat Externe Referenzen auf derartige globale Register sind nicht m glich Wenn in mehreren Modulen globale Registervariablen verwendet werden sollen wovon dringend abgeraten wird so m ssen alle
272. len und Stack toben beide im gleichen Speicherblock herum Die globalen Variablen belegen einen fest vorgegebenen Speicherbereich im oberen Teil mit kleineren Adressen dieses Blockes Der Stack w chst mit jedem Unterprogrammaufruf ein St ck in Richtung auf die globalen Variablen zu Es soll Ihrer Phantasie berlassen bleiben was wohl passiert wenn der Stack durch Ihre globalen Daten hindurchwandert Die globalen Variablen wirken dabei zwar als eine Art Sicherheits puffer den der Stack zuerst durchwandern muss bevor er Datenbest nde anderer Tasks vernichtet oder gar die interne Speicherverzeigerung von RTOS UH breitmacht und den Rechner in die ewigen Jagd gr nde schickt In der Regel l uft so nur die Task die sich die eigenen Datenbest nde zerst rt hat voll gegen die Wand und erh lt Ihnen wenigstens die Freundschaft der anderen Benutzer an Ihrem Rechner Um derart unsch ne Effekte zu vermeiden gibt es im Compiler eine Option um die grausamen Folgen eines Stackoverflow sdes zu erzeugenden Programmes zu verringern Mittels der Compileroption U wird der CCC angewiesen bei der Generierung jeder Funktion des Moduls einen Unterprogramm aufruf einzustreuen Diese Funktion testet dann ab ob unser Stackpointer den globalen Variablen schon gef hrlich nahe gekommen ist oder gar schon in fremden Revieren wildert 38 3 8 Lokale Variablen und Argument bergabe A5 Globale Variablen Stack SP Abbildung 3 8 Lage des CREST C Stac
273. ler f hren zu einer FATAL Meldung und sofortigem Abbruch WARNING Meldungen f hren nicht zum Abbruch des Compilers und beeinflussen auch nicht seinen R ckgabestatus an den Aufrufer Trotzdem sollte man gelegentlich einen Gedanken daran verschwen den ob es nicht besser w re die Quelltexte zu berarbeiten Normalerweise rauschen WARNING s ohne Halt ber den Schirm Hier greift die A Option Als Vorbesetzung startet der Compiler mit A 2 Im Batch Betrieb oder bei Verwendung von CMAKE kann ein solchermassen erzwungener Bedienerein griff h chst unerw nscht sein denn bis zu einer Best tigung h ngt der Compiler gnadenlos auf Ihrem Terminal und lauert auf Eingaben Mittels A 0 gibt der bersetzer Ruhe und l sst alle Meldungen ber den Schirm rollen ohne den Bediener weiter mit Eingabeaufforderungen zu bel stigen Bei A 3 wartet er dagegen auch nach WARNING Meldungen auf die Best tigung des Bedieners Tabelle 3 10 Steuerung von Fehlermeldungen Um die aufgelaufenen Fehlermeldungen nach Abschluss des Compilerlaufes analysieren zu k nnen wurde die B Option eingef hrt Sie erzeugt eine Errordatei deren Name sich aus dem Namen der Ein gabedatei und der Extension err ergibt Alle auflaufenden Fehlermeldungen und Warnungen werden in dieser Datei gesammelt Wird der Compilerlauf ohne Fehler und Warnings beendet so wird keine Errordatei erzeugt und eine etwaige alte Errordatei automatisch gel scht Die w digit Option dient zum A
274. lf 0 int fisinf float x 5 int isinf double x int lisinf long double x 226 A 6 Sonstige Funktionen 3 Kontrolle ob eine Zahl NaN oder Inf ist finite Riickgabewert NaN oder Inf nicht NaN oder Inf BE int ffinite float x int finite double x int lfinite long double x Anhang B Zusammenstellung der Pragma Kommandos In der nachfolgenden Auflistung sind die dem CCC bekannten pragma Kommandos aufgef hrt Bei der Bearbeitung von dieser Kommandos ist auf die korrekte Schreibweise der Kommandobezeich nungen zu achten da der Compiler unbekannte Kammandos kommentarlos ignoriert Ein Check auf zul ssige Syntax findet gem ss ANSI C erst dann statt wenn sich ein Compiler sich f r ein spezielles pragma Kommando als zust ndig empfindet Normalerweise werden Makros in Kommandozeilen nicht durch den Pr prozessor aufgel st es fin det auch keinerlei Evaluierung von Expressions statt In Abschnitt 3 1 8 ist erl utert wie mittels der Compileroption q der Makroprozessor auch f r Kommandozeilen aktiviert werden kann BI ALLOCATE_INTERRUPT_BUFFER Anfordern eines Interruptpuffers beim Systemstart pragma ALLOCATE_INTERRUPT_BUFFER LEVEL level SIZE size Parameter LEVEL level gibt den Interruptlevel 1 bis 7 an SIZE size gibt die Gr sse des einzurichtenden Puffers an kleiner 32kB Siehe auch Abschnitt 13 5 2 B 2 COLDSTART Einrichten einer Funktion als Kaltstart
275. lich und nicht in sicherheitsrelevanten Bereichen einzusetzen Und irgendwie haben die Leute damit auch recht Dynamische Speicheranforderungen haben in Programmteilen nichts zu suchen die immer lauff hig sein m ssen Alle Funktionen die in diesem Kapitel abgehandelt werden besitzen die einge baute Option des Fehlschlags Die Lauff higkeit einer Steuerung oder Regelung von der Verf gbarkeit freien Systemspeichers abh ngig zu machen ist schlechter Programmierstil Diese Tatsache muss Ihnen klar sein bevor Sie anfangen ihre Tasks zu kodieren Es liegt in ihrer Verantwortung wann es sinnvoll und vertretbar ist dynamischen Speicher zu verwenden CREST C bietet zwei Methoden an mit denen sich der Programmierer dynamisch zur Laufzeit der Task Speicher beschaffen kann Es stehen alle genormten Funktionen gem ss ANSI C zur Verf gung Weiterhin k nnen unter Verzicht auf portable Programmierung auch direkt vom Betriebssystem Speicherbl cke angefordert werden 15 6 1 Genormte Speicheranforderungen Die ANSI C Norm stellt drei Funktionen zur Verf gung die zur Anforderung dynamischem Speichers dienen Die Prototypen sind in der Includedatei lt stdlib h gt aufgef hrt Die Funktionen selbst sind Bestandteil der Standardbibliothek void malloc size_t size void calloc size_t count size_t size void realloc void ptr size_t size void free void ptr Zur Verwaltung der Speicherallokationen mittels der
276. liothek ohne FPU Unterst tzung e ffp Fliesskommaemulations Bibliothek ohne FPUL Unterst tzung und FastFloatingPoint Implementierung f r den Datentyp float 89 90 KAPITEL 12 BIBLIOTHEKEN VON CREST C e fpu Fliesskomma Bibliothek mit FPU Unterst tzung Das vierte Zeichen des Namens beinhaltet die Prozessorreihe e 0 MC68000 e 2 MC68020 e 3 CPU32 e p PowerPC Der Anhang des Namens informiert tiber den unterschiedlichen Aufbau der Bibliothen wie der Tabelle 12 5 zu entnehmen ist R 0121 D 1 0 SR 012 D 1 stackdebug R 0 2 D 1 U z Tabelle 12 5 bersetzungsparameter der Bibliotheken Die fast Varianten sind f r Programme geeignet deren Codebereich 32kB nicht berschreitet Sie stellt die kompakteste Bibliotheks Variante dar In den fast Bibliotheken sind nur 16Bit Spr nge enthalten F r gr sserer Projekte stehen die 1ong Versionen zur Verf gung die externe Funktionen durch 32Bit Sprungbefehle adressieren Selbst bei grossen Projekten die nur wenige Bibliotheksrouti nen verwenden ist es oftmals m glich erfolgreich mit den fast Varianten zu linken einen Versuch ist es immer wert Die stack und stackdebug Varianten sind 1ong Bibliotheken mit aktiver Stack berwachung Die Endung debug zeigt zudem an dass in diesen Bibliotheken alle Informationen zur Verwendung des Debuggers enthalten sind Kapitel 13 CREST C Programme CREST C erm glicht die Generierung unterschiedlicher A
277. lligenteren Algorithmen um Zugriffe auf den langsamen Hauptspeicher zu vermeiden verwischt zunehmend die urspr ngliche Bedeutung dieses Schliisselwortes CREST C k mmert sich bei der Re gisterverteilung nicht um den liebevoll ausformulierten Wunsch des Benutzers eine Variable einem Re gister zuzuordnen und verwendet stattdessen eigene Regeln ber H ufigkeit des Auftretens und Art der Benutzung Trotzdem sollten Sie das Schl sselwort register immer dann verwenden wenn Sie sich davor sch tzen wollen dass innerhalb des Quelltextes die Adresse eines bestimmten Objektes gebildet werden kann Sie k nnen so sicherstellen das ein Objekt egal ob es real in einem Register existiert oder im Hauptspeicher nicht durch einen un berlegten Pointerzugriff modifiziert wird Durch expli zite Angabe der Speicherklasse aut o kann dem Compiler die Wahlfreiheit genommen werden Explizit als auto ausgewiesene Variablen werden von CREST C grunds tzlich nie in Registern untergebracht und immer auf dem Stack abgelegt Fl chtige Variablen m ssen explizit bei jedem Eintritt in eine Funktion initialisiert werden Die Wer te sind ansonsten undefiniert Die beiden Zeilen 4 und 5 des Beispiels stellen demnach korrekten Code dar Beide Variablen b und c enthalten hinter Zeile 5 dem Wert Eins Dagegen kostet Sie die Kombination der Zeilen 3 und 6 mit an Sicherheit grenzender Wahrscheinlichkeit ein paar Stunden Arbeit extra denn die Variablen a und d enth
278. llte um eventuelle berl ufe zu verhindern wenn sich der Datenproduzent nicht abschalten l sst Anschliessend wird der Puffer auf IDP 4 eingeklinkt Das Umh ngen des Interrupt Vektors IR4 kann auf verschiedenen Rechnern den Wechsel in den Supervisor Mode notwendig machen Danach spielt main den Konsumenten und wartet darauf bis der Interrupt Handler wieder ein Zeichen liefern kann In Hinsicht auf die Verwaltung des Datenblockes geht es im Beispiel etwas grausam zu Der Interrupt Handler schert sich nicht um die Abmessungen des Puffers und die Betreuungstask ebenso 13 5 Interrupts und Exceptions 113 wenig Aber schliesslich geht es nur ums Prinzip Auch ber die Mechanismen die zur Synchronisation zwischen Interrupt und Grundebene verwendet werden sei hier zun chst nichts ausgesagt 13 5 3 2 Interrupt Handler in EPROM s Im letzten Kapitel wurde demonstriert wie man die Interrupt Data Pointer des RTOS UH zur Lauf zeit f r seine Zwecke missbrauchen kann Sauberer geht es nat rlich wenn man die IDP s nicht ge waltt tig verbiegt sondern diese Aufgabe RTOS UH beim Hochlaufen berl sst Das vorherige Bei spiel vereinfacht sich f r ein EPROM System deutlich Die Speicherbeschaffung und das Eintragen des Vektors wird bereits bei der Konfiguration des Betriebssystems erledigt typedef struct Task Erd char reader_ptr 7 char writer_ptr gt char buffer 256 DataSpace pragm
279. llten Negativbeispiel auch Datenm ll bei den Ausgaben erzeugt wird soll heissen das ausgebenene Hexmuster hat nur in den seltensten F llen etwas mit dem vordefinierten Fehlertext zu tun der dahinter erscheint Die Begr ndung ist simpel alle im Ringpuffer verzeichneten Pointer auf den Ausgabetext verweisen auf den identischen Speicherplatz Und der wird bei jedem Schleifendurchlauf brav neu belegt Wenn das main Programm es dann auch noch schafft nach Durchlaufen der Schleifen zu terminie ren bevor die ERROR Task dazu kommt die letzten Meldungen auszugeben verweist der gespeicher te Textpointer sogar auf einen Speicherbereich mit unbekanntem Besitzer Eine sehr unbefriedigende Lage mit dem Potential sehr interessanter Effekte Die Funktionalit t der ERROR Task wurde hier noch ganz rudiment r wiedergegeben In der Praxis ist diese Task eine Art eierlegende Wollmilchsau im Betriebssystem die noch ein paar Aufgaben mehr 194 15 8 Fehlermeldungen zu verwalten hat Wenn Sie ausprobieren m chten wie nachtragend RTOS UH reagiert wenn man seine ERROR Task ver rgert dann reicht der Aufruf des ERROR Traps mit einem illegalen Pointer der die ERROR z B auf einen BUS ERROR laufen l sst Die Anwendertask die den rger verursacht hat wird davon nicht betroffen aber die ERROR Task wird beim Zugriff ber den Pointer versenkt Das System schafft es nicht einmal mehr die BUS ERROR Meldung auszugeben und den Gedanken b
280. los unbrauchbar wenn das Anwenderprogramm sich bereits im Supervisor Mode befindet Der Aufruf rt write_ und rt_read_ Funktionen f hrt in solchem Falle n mlich zum ungewollten R cksturz in den Usermode was dann schnell ins Chaos m ndet Wenn Sie sich bereits im Supervisor Mode befinden so sind die folgenden Funktionen zwingend er forderlich um BUS ERROR berwachte Zugriffe durchzuf hren int rt_super_read_memory_byte void address UBYTE value int rt_super_read_memory_word void address UWORD value int rt_super_read_memory_long void address ULONG value int rt_super_write_memory_byte void address UBYTE value int rt_super_write_memory_word void address UWORD value int rt_super_write_memory_long void address ULONG value Sie sind von der Funktionsweise identisch mit den korrespondierenden Funktionen ohne das_ super K rzel im Namen 15 5 1 2 Peripherie Ein Ausgabe Diese Traps erlauben spezielle VO Operationen Der Zugriff ist implementationsabh ngig Auf vielen RTOS UH Systemen sind die zugeh rigen Traps nicht angeschlossen und der Aufruf f hrt zu einer WRONG OPCODE Meldung des Betriebssystems Diese Funktionen rt_peripheral_input und rt_peripheral_output sind beim Um gang mit C normalerweise unn tig solange die Zugriffe sich auf MOVE B MOVE W oder MO VE L beschr nken die der CCC bei Pointerzugriffen generiert Sind jedoch auf Ihrer RTOS UH Implement
281. lst ndig belegt sein Das Verschicken von Nachrichten an existente Postf cher ohne registrierte Kunden f hrt ebenfalls zur Meldung WRONG LDN XIO 158 15 5 I O unter RTOS UH Zur Abfrage ob und welche Betreuungstask f r eine LDN existiert steht unter CREST C die Funktion rt_LDN_to_Tid zur Verf gung Task rt_LDN_to_Tid IOqueue ldn Die Funktion liefert die TID der Betreuungstask einer I O Queue sofern sowohl die LDN g ltig ist und eine Betreuungstask existiert Sonst wird ein NULL Pointer zur ckgegeben Manchmal ist es auch von Interesse aus einer bekannten LDN das zugeh rige Userinterface zu er mitteln Mittels der Funktion rt_LDN_to_USER_Tid l sst sich die TID des korrespondierenden Kommandointerfaces bestimmen Task rt_LDN_to_USER_Tid IOqueue ldn Die Funktion liefert die TID des Users einer I O Queue sofern sowohl die LDN g ltig ist als auch ein Userinterface f r diese LDN existiert oder NULL Damit w re also der Eintrag 1dn im CE ersch pfend beschrieben Der Wert von drive kommt thema tisch aus der gleichen Ecke Die LDN spezifiziert blicherweise eine Betreuungstask f r ein bestimmtes Betriebsmittel ber drive werden spezielle Informationen f r die Betreuungstask auf den Weg ge bracht Bei seriellen Schnittstellen kann das z B die Angabe der Betriebsart sein Al B1 C1 und bei Festplatten die anzusprechende Partition HO Hl etc Mit diesen beiden Werten versehen w rde
282. m nicht berbraucht sind e Bei der Verwendung des Befehles SYSTEM_ABORT F r CREST C Programmierer die das C Laufzeitsystem nutzen ist der Abort allerdings reichlich unn tz man k nnte fast sagen katastrophal Rechner auf denen solche CREST C Programme exe kutiert werden sollten stets durch einen Reset von ihrem Leiden erl st werden wenn gravierende Pro bleme auftreten Ein Abort hinterl sst nur noch Fragmente von C Tasks die allenfalls zur Erforschung der Umst nde dienen k nnen die zum Crash gef hrt haben Ein erneuter Start dieser Taskriimpfe f hrt nie zu erw nschten Erfolg Eine durch einen Abort abgebrochene C Task verliert durch den Warmstart wichtige Resourcen so sind z B die allokierten Datenbereiche und der Stack nun wieder als Freispei cher im System eingetragen Es sei Ihrer Fantasie berlassen was passiert wenn eine C Task erneut gestartet wird die guten Glaubens mit Speicher rumhantiert der ihr offiziell nicht mehr geh rt In der Warmstartphase werden alle Initialisierungen durchgef hrt die zu einem erneuten Aufsetzen ei nes abgest rzten Betriebssystems sinnvoll erscheinen Verklemmte Hardeware Dauerl ufer im Tasking abgeschossene Bedieninterfaces die Liste der Fehler ist schlicht endlos die einen Abort sinnvoll er scheinen lassen kann Auch hier kann der Anwender Maschinencode der ohne die meisten Systemunterst tzung lauff hig ist zur Ausf hrung bringen Entsprechender Code kann mittel
283. men der aus dem Prefix und dem Task bzw Shellmodulnamen gebildet wird Die Option R name erlaubt es einen eigenen maximal 6 Zeichen langen Namen f r das RAM Modul vorzu geben Wenn mehrere unabh ngige Projekte einen gemeinsamen RAM Bereich nutzen wollen der mittels absoluter Variablen verwaltet werden soll so ist es bei Verwendung der Option C address zwingend notwendig die Einrichtung des Variablen Moduls nur bei einer der beteiligten Tasks zuzu lassen Die Option B unterdr ckt die Erzeugung einer Scheibe zur Einrichtung des Moduls Mittels der Option h l sst sich der CLN anweisen den Gebrauch von absoluten Variablen in Pro jekten zu kontrollieren und mit einer Fehlermeldung abzulehnen 5 1 13 Suchpfade f r Startup und Bibliotheken Der CLN sucht die in der Linkdatei aufgef hrten Dateien sofern keine absoluten Dateinamen ange geben sind relativ zum aktuellen Workingdirectory Kann dort auf die angegebene Datei nicht zugegriffen werden so wird f r 68K System die Um gebungsvariable CCC_68K_LIBS ausgewertet F r PPC Systeme lautet der Name der Variable CCC_PPC_LIBS Wo die Umgebungsvariablen vorbesetzt werden k nnen ist in Abschnitt 2 1 erl utert Die Vorgabe der Umgebungsvariable l t sich mittels der Option L path bersteuern 70 5 1 Die Optionen des cln 5 1 14 Debuginformationen exportieren Die Option z weist den CLN an Debuginformationen die in den Objektdateien enthalten sind in eine bin re
284. men der Linkdatei durch Ersetzung der Da teiextension durch die Endungen sr bzw epr Die Endung epr wird verwendet wenn in der Kommandozeile die Option T address angegeben wird und soll darauf hinweisen dass es sich bei der generierten Datei nicht um einen normal ladbaren S Record handelt 5 1 Die Optionen des cln 5 1 1 Ausgaben w hrend der Linkerlaufes Die Option V veranlasst den CLN die gerade von ihm durchgef hrten Aktionen auf dem Bildschirm auszugeben 67 68 5 1 Die Optionen des cln 5 1 2 Erzeugung einer map Datei Die Option M generiert eine Mapdatei deren Name sich aus dem Ausgabefilenamen durch die Er setzung der Extension mit map ergibt Die Mapdatei enth lt sowohl die Gr ssen der Sections siehe Abschnitt 3 18 als auch deren relative bzw absolute Lage auf dem Zielsystem Weiterhin sind dort bei gleichzeitiger Verwendung der Option z Informationen ber den Stackbedarf der einzelnen Funktio nen und Tasks aufgelistet 5 1 3 Vorgabe von Programm Namen Der Name einer Task oder eines Shellmodules l sst sich vom CLN mittels der Option N name beein flussen Dies setzt allerdings zwingend voraus dass das Projekt eine der mitgelieferten Startupdateien tstart obj oder sstart obj bzw deren Ableger in der Linkdatei enth lt Als Defaultname ist innerhalb der Startupdateien der Name X vorgegeben Es wird angeraten die Namen von Shellmodulen in Gross Schreibweise anzugeben 5 1 4 Vorgabe der Stackgr sse b
285. n Der Assembler erwacht mit der Vorgabe Objektcode f r die text Section zu generieren Wenn Sie nur CPU oder FPU Befehle kodieren wollen so ist das Umschalten auf eine andere Section demnach redundant Befinden Sie bei der Abarbeitung eines Assemblerfiles in einer anderen Section so k nnen Sie mittels der Anweisung CODE indie text Section wechseln Innerhalb der text Section sind folgende Assembleranweisungen zul ssig e Die Definition von Labels e Die Kodierung von CPU und FPU Befehlen e Die Initialisierung von Konstanten mittels DC x e Die Initialisierung von konstanten Bereichen mittels der Blockanweisung DCB x Die globale Definition eines Symboles aus der text Section erfolgt mittels der Anweisung CO DE_DEF name Dadurch wird das Symbol name f r den Linker auch ausserhalb der gerade bearbeite ten bersetzungseinheit global bekannt Eine Referenz auf ein Objekt in der text Section einer fremden bersetzungseinheit kann mit tels der Anweisung CODE_REF name erzeugt werden Referenzen auf Funktionen m ssen mittels FUNC_REF erzeugt werden 61 62 4 3 Die bss Section Die Objekte der text Section lassen sich ausschliesslich PC relativ oder absolut ansprechen Die Variable code_section w re auf Assemblerebene folglich als code_section W PC oder code_section L PC adressierbar Entsprechend sind Funktionen nur absolut als JSR func oder PC relativ als JSR func W PC bzw JSR func L PC anzusprechen Ebens
286. n tigt diese Information um den R ckfallmechanismus f r diesen In terrupt im Code vorzusehen Apropos Vektoren und Vektornummern der CCC berpr ft ihre Angabe daraufhin ob es sich bei der Vektornummer um eine durch Vier teilbare Zahl handelt da die Vektor tabelle der CPU auf Langwortgrenzen ausgerichtet ist sind andere Angaben zumeist von wenig Erfolg gekr nt Wenn Ihnen dennoch die Meldung ERROR Not a vectornumber must be a multiple of 4 begegnet dann hat der Compiler aufgepasst und gerade die Generierung von heimt ckischem Code verhindert durch den RTOS UH beim Systemstart bel auf die Nase gefallen w re pragma INTERRUPT NO_VECTOR void InterruptHandler3 void UWORD Ox7FE UWORD hier die Vektornummer In wenigen Fallen macht es auch Sinn ganz auf die automatische Generierung des Sicherheits und Riickfallmechanismus des Compilers zu verzichten wenn Sie z B erst zur Laufzeit des Programmes die Information aus der Hardware auslesen miissen welcher Vektor eigentlich versorgt werden muss In diesem Falle macht es selbstverst ndlich keinen Sinn den Compiler einen Dummy Vektor eintragen zu lassen den Sie dann berschreiben m ssten Mittels des Schl sselwortes NQ VECTOR wird der Code um die Systemspeicherstelle IID 7FE W mit der Vektornummer der laufenden Interruptroutine zu versorgen unterdr ckt Der erste Code den ihre Interruptroutine abzuspulen hat muss darin bestehen diese Zelle zu ve
287. n zul ssig e Die Definition von Labels e Die Definition von Null initialisierten Bereichen mittels der Blockanweisung DS x Eine Referenz auf die bss Section einer fremden Ubersetzungseinheit kann mittels der Anweisung DATA_REF name erzeugt werden In diesem Falle geht der CLN davon aus dass das betreffende Symbol sich in der data oder bss Section befindet und l st die Referenzen entsprechend der aufgefundenen Definition des Symbols auf Die Objekte der bss Section lassen sich ausschliesslich relativ zum Adressregister A5 ansprechen Die Variable bss_section w re auf Assemblerebene folglich als bss_section W A5 oder bss_section L A5 adressierbar 4 4 Die common Section 63 4 4 Die common Section Die globale Definition eines Symboles aus der common Section erfolgt mittels der Anweisung COMMON_DEF name Dadurch wird das Symbol name f r den Linker auch ausserhalb der gerade bearbeiteten bersetzungseinheit global bekannt Innerhalb der common Section sind folgende As sembleranweisungen zul ssig e Die Definition von Labels e Die Definition von implizit Null initialisierten Bereichen mittels der Blockanweisung DS x Eine Referenz auf die common Section einer fremden bersetzungseinheit kann mittels der Anwei sung COMMON_REF name erzeugt werden Die Objekte der common Section lassen sich ausschliesslich mittels absoluter Adressierung anspre chen Die Variable common_section w re auf Assemblerebene
288. n Liste von Abh ngigkeiten schnell unlesbar werden CMAKE erm glicht zu diesem Zweck die Fortsetzung von Zeilen mittels des von C bekannten Backs lashes mit direkt darauf folgendem Zeilenumbruch Demonstration von Fortsetzungszeilen test sr test c test h testl c testl h ccc68k test c test obj ccc68k testl c testl obj cln68k test lnk test sr N TEST 10 3 3 Wildcards In einem Projekt mit vielen Dateien w chst die Zahl der Regeln schnell an Unterscheiden sich die Regeln dabei nur durch die verwendeten Dateinamen so lassen sich diese mittels Wildcards kompakter notieren Als Beispiel sei das Projekt aus Abschnitt 10 2 um die Dateien test2 cbistest9 c sowie die Includedateien test2 h bis test 9 h erweitert Jede der neuen C Dateien soll dabei sowohl test h als auch die Headerdatei mit dem identischen Basisnamen includieren Zudem soll test c in diesem Fall von allen existierenden Headerdateien abh ngig sein Arbeiten mit Wildcards test sr test obj testl obj test2 obj test3 obj test4 obj test5 obj test6 obj test7 obj test8 obj test9 obj cln68k test lnk test sr N TEST Fobi GC Test h wah CCCO8k Fad 7 067 test obj test c test h testl obj test2 obj test3 obj test4 obj test5 obj test6 obj test7 obj test8 obj test9 obj ccc68k test c test obj In CMAKE wird das Multiplikationszeichen als Wildcardzeichen eingesetzt CMAKE versucht bei der Auswertung der Abh ngigkeiten von test
289. n Tasknamen bergeben Dann sucht er in der Speicher verwaltung ob eine solche Task bekannt ist Diese Suche kostet natiirlich Zeit um so mehr je voller der Speicher ist Allerdings erh lt man f r die eingezahlte Zeit die Sicherheit keinen Unfug im Betriebssystem anrichten zu k nnen Wird die Task nicht gefunden erh lt man eine Fehler meldung und der Aufrufer wird suspendiert Namen die mit einem Doppelkreuz beginnen werden vom Betriebssystem nicht gefunden e Es wird ein Pointer bergeben der direkt auf die Task Taskkopf zeigt Hier findet keine wei tere berpr fung statt Ist an der angegebenen Stelle keine Task vorhanden wird eine beliebige Speicherstelle manipuliert was im Regelfall zum Abschuss des Betriebssystems f hrt Haben Sie z B die Task von Hand entladen und vergessen dass andere Tasks noch etwas von der entladenen Task wollen so sind Sie f r die Folgen selbst verantwortlich Alle Traps die im Namen ein_quick enthalten suchen Tasks nach der zweiten Methode und bed rfen besonderer Vorsicht 15 2 Tasks und Tasking Grundlegend f r RTOS UH ist der Begriff Task der ein eigenst ndig ablauff higes Programm kenn zeichnet Unter RTOS UH k nnen diese Tasks verschiedene Eigenschaften haben und sich in ver schiedenen Zust nden befinden Das Betriebssystem verteilt die verf gbare Rechenkapazit t auf die einzelnen Tasks Multi Tasking und zwar derart dass der Wechsel von einer Task zur anderen jeder zeit m
290. n angegeben werden die letzte gefundene Scheibe ist f r die Konfiguration relevant In der Scheibe sind paarweise Start und Endadressen der einzubindenen RAM Sektionen aufgef hrt die unter RTOS UH Verwaltung gestellt werden sollen Dabei sind fol gende Restriktionen zu beachten e Die Startadressen m ssen grunds tzlich gerade sein e Alle Endadressen mit Ausnahme der des letzten Bereiches m ssen auf Langwortgrenzen liegen e Wird eine ungerade Endadresse vorgegeben so scannt der Nukleus in IkB grossen Schritten bis zum Eintritt eines BUS ERROR auf das Vorhandensein von RAM Die letzte Adresse e Oberhalb der jeweiligen Endadresse m ssen 0x20 Bytes RAM f r den Nur Lese Zugriff verf gbar sein e Die Adressbereiche m ssen in berlappungsfreier und aufsteigender Reihenfolge notiert werden Wie derartige Scheiben mittels CREST C zu erzeugen sind und was sonst noch alles zu beachten ist k nnen Sie dem Abschnitt 17 5 entnehmen der sich mehr mit den praktischen Gesichtspunkten dieser 202 16 3 Warmstart Scheiben auseinandersetzt 16 2 11 Aufbau der RTOS UH Speicherverwaltung 16 2 12 Einrichten von Modulvariablen Bereichen 16 2 13 Suchen nach Systemtasks 16 3 Warmstart Dieser Bereich des Betriebssystem wird in folgenden F llen ausgef hrt e Grunds tzlich nach Beendigung der Kaltstartphase e Beim Dr cken des Abort Knopfes wenn die entsprechende Behandlungsroutine zu der Erkennt nis gelangt dass die Systemvariable
291. nd X 10 miteinander kommunizieren k nnen Mittels der Speicherklasse absolute kann man nun auch Daten zwischen den beiden unabh ngigen main Tasks transferieren Dazu dient ein Speicherbereich der nicht den Vaterprozessen sondern vielmehr direkt dem C Shellmodul zugeordnet ist Jetzt ist das C Shellmodul bez glich der Variable absolute_variable nicht mehr wiedereintrittsfest da nun die Grundbedingung von v lliger Trennung der Datenbereiche nicht mehr gegeben ist Im Beispiel war bislang nur die Rede von C Subtasks innerhalb eines C Shellmoduls Im Abschnitt 13 5 3 3 wird auch deutlich dass selbst innerhalb eines einzigen C Shellmoduls durchaus die M glich keit besteht vollst ndig vom Vaterprozess abgekoppelte Prozesse zu erzeugen Auch hier kann es von grosser Wichtigkeit sein prozess bergreifend auf gemeinsame Datenbest nde zugreifen zu k nnen 3 15 Lebensdauer von Variablen C unterscheidet Objekte zun chst nach deren Lebensdauer Jedes Objekt das ausserhalb einer Funktion vereinbart wird existiert vom Start der Task bis zu deren Terminierung Alle dauerhaften Variablen er halten beim Start einer Task ein Null Muster zugewiesen wenn nicht explizit ein Initialwert angegeben wurde Dauerhafte Variablen im Sinne von ANSI C sind z B folgendermassen definierte Objekte int aj Diese Variablen werden beim Programmstart static int b einmalig vorneweg mit Nullmu stern initialisiert void f void 3 15 Leben
292. nd deshalb ist dieses Bit schlicht gesetzt um auch den Nutzer am Terminal von schlechten Nachrichten zu verschonen Jetzt kommt die n chste bung um das CE nicht zum Selbstzweck verkommen zu lassen Nutzdaten sind eine feine Angelegenheit und das CE davon zu informieren wo es diese Werte herbekommt und wieviele es denn sein m gen ist Ihre n chste Aufgabe wce_A gt buffer str Puf fer auf den String setzen wce_A gt reclen strlen str und dessen Laeng intragen Bei ASCIH Daten ist das kein Problem Die L nge kann mit einem schlichten strlen ermittelt werden Der Pufferzeiger des CE s wird zudem schlicht auf den Eingabestring gesetzt Das war s dann 15 5 VO unter RTOS UH 169 auch schon Jetzt kann das CE auf die Reise geschickt werden rt_transfer_ce wce_A Jetzt bekommt das Betriebssystem das CE durchgereicht stellt fest dass das MODMWA Bit gesetzt ist und blockiert die aufrufende Task Anschliessend wird versucht einen Treiber ausfindig zu machen der sich um das CE zu k mmern hat Ist die LDN an die das CE geschickt wurde nicht betreut gibt es eine Fehlermeldung die aufrufende Task wird fortgesetzt und bekommt die Niederlage mitgeteilt Ansonsten bekommt der Treiber f r die angebene LDN das CE bergeben treibert so ein wenig vor sich hin und teilt wegen des gesetzten IOCNE Bits seine Meinung ber die Qualit t des CE s in dem Eintrag reclen mit Werte kleiner oder gleich Null sind Fe
293. nd etwas komplexere Probleme konnten auch schon mal zwei oder drei MB s verbra ten Inzwischen hat sich diese Situation deutlich entspannt Mit zunehmend besserem Code sackte der 42 3 9 Dynamische Stackverwaltung Stackbedarf zum Compilieren eines durchschnittlichen Programmes auf zwei bis drei Kilobytes Da mit liegt der CREST C Compiler beim Stackbedarf durchaus im Bereich von bersetzern die ihren Job mit Parametertransfer ber Register erledigen Um auch Ausnahmesituationen halbswegs sicher zu handhaben wurden die C Compiler bis zu Release 1 306 mit einem Stack von 150kB bersetzt wodurch aber in der Regel knappe 150kB pro gestartetem Compiler im Rechner verschwendet wurden Wenn Sie sich nicht in Assemblerprogrammierung auskennen sei hier zun chst kurz und oberfl chlich beschrieben worauf Sie bei der Auslegung dynamischer Stacks zu achten haben Stellen Sie sich vor dass Sie ein Programm schreiben wollen bei dem folgende Funktion auftaucht include lt stdlib h gt include lt stdio h gt pragma DYNAMIC_STACK NEWSTACK 16384L RANGE 2048L void f int x char testfeld 100 printf X 6d STACK 51ld n x rt_used_stack if x gt 0 FIRE Dd else testfeld 0 void main void 1000 10000 Abbildung 3 12 Beispielfunktion fiir rekursive Stacks Im Kapitel tiber die Stackbelastung durch lokale Variablen und Argumente siehe Abschnitt 3 8 wurde
294. nde ein Der Compiler hat wenig Chancen Konstellationen dieser Art abzufangen Hier ist Umsicht auf der Pro grammiererseite verlangt Ben nu MOVE W 0007 line cell_ W A4 Y 2 MOVEM L D1 D6 D7 A1 SP LITRA DC W 7 MOVEM L SP D1 D6 D7 A1 Abbildung 3 3 Erzeugter Code bei Y Option f r Zeile 7 Die Line Zelle l sst sich auch in eigenen Programmen setzen Derartige Aktionen machen dort Sinn wo man z B den Benutzer mit kleinen Informationen ber den Fortschritt oder Status eines Programmes bei Laune halten m chte Die Funktionen rt_set_LINENO und rt_get_LINENO erwarten 16 Bit Eingabewerte Wenn Sie die Zeilennummer in BCD Kodierung bergeben ist die Ausgabe sp ter dezimal ablesbar soll heissen rt_set_LINENO 0x1234 liefert sp ter die Ausgabe 1234 void rt_set_LINENO LineNo line LineNo rt_get_LINENO void 3 1 13 Assemblercode in C Quelltexten In Hinsicht auf etwas mehr Bedienerfreundlichkeit bei der Erstellung von kleinen Einsch ben in As semblersprache wurde der CCC um die Kommandos asm und endasm erweitert Das Kommando asm bewirkt dass der CCC alle nachfolgenden Zeilen bis zu abschliessenden enda sm direkt in sei 3 1 Die Optionen des ccc 19 nen Assembleroutput bernimmt Da der C Pr prozessor auch innerhalb dieser Einsch be noch aktiv ist zumindest was die Interpretation von Kommandozeilen betrifft sind so bedingte Assemblie rung und include Anw
295. nden Task nun berleben das war schliesslich Sinn der Aktion m ssen diese sp ter explizit gel scht werden wenn der Speicher nicht mehr ben tigt wird 186 15 6 Speicherverwaltung Dazu tibergeben Sie den Pointer den die Allokationsroutinen geliefert haben an die Funktion rt_named_free_memory Sie sind daf r verantwortlich dass das Modul noch unver ndert an dieser Stelle vorhanden ist Im Fehlerfalle diirfen Sie sich schon mal nett von Ihrem Rechner verab schieden da RTOS UH Unfug mit seinen Systemspeicherketten recht intollerant gegentibersteht Erneut die Warnung Verwechseln Sie nie die Funktionen rt_named free memory rt_pwsp_free_memory und rt_free_memory Die letztgenannte Funktion ist der An schluss eines Systemtraps und erwartet den Pointer auf den MemSectionHeader des Speicher blocks der freigegeben werden soll rt_pwsp_free_memory erwartet einen eingeketten PWSP Block und schl gt ebenfalls lang hin wenn Sie die Funktion auf ein Modul loslassen Die Funktion rt_named_free_memory dient nur der Freigabe von Bl cken die Sie mit den zugeh rigen Allo kationsroutinen beschafft haben F r Programme die ber gemeinsame Speicherbl cke hinweg Daten austauschen m ssen gibt es im Verwaltungsblock dieser Module einen weiteren Eintrag der von den rt_named_alloc Routinen korrekt gesetzt wird Wenn Sie also wissen dass eine andere Task ein namentlich bekanntes Modul im Speicher abgelegt hat und m c
296. ndert bleiben sollen geh ren schlicht einmalig ins EPROM statt jeder Task eine eigene Kopie in der dat a Section zuzuteilen Als konstant vereinbarte Objekte werden von CREST C in die text Section des Programmes ge legt Hier liegt auch der ausf hrbare Maschinencode Beachten Sie bei der Verwendung von konstanten Strings dass derartige Objekte implizit als const behandelt werden und nicht mehr wie unter K amp R C noch blich als potentiell ver nderlich gehandhabt werden Zugriffe der Art Konstanter String 3 S f hren bei geladenen Programmen quasi zu selbstmodifizierendem Code denn der Zugriff langt mitten in die text Section und kann dort beliebigen rger anrichten Vorzugsweise wird unter CREST C der Einstieg in die nachfolgende Funktion dezent kaputtgeschrieben und dann gibt es auch im RAM WRONG OPCODE s oder hnlich anheimelnde Effekte Im EPROM bekommen Sie f r derartige Schandtaten von der CPU einen kurzen und b ndigen BUS ERROR eingeschenkt Um klarzumachen was Sie niemals machen d rfen sollten Sie sich die folgenden Beispiele gut einpr gen und tunlichst derartige Aktionen unterlassen 56 3 18 Sections unter CREST C strcat Gib ihm die Kante yo og strepy und noch eine Breitseite sscanf Ss str Der Modifizierer volatile stellt in dieser Hinsicht eher das absolute Gegenteil dar Es verbietet dem Compiler bei seinen Optimierungen einen bestimmten Wert eines Objektes als bekannt vo
297. ne C Erweiterung vor e Der Datentyp long double ist f r den PowerPC lediglich mit 64 Bit Aufl sung implementiert und entspricht dem Datentyp double 3 4 Benutzereigene Datentypen Es gibt in C vier wesentliche Arten sich benutzereigene Datentypen zu schaffen e Felder e Strukturen e Unions e Bitfelder Alle diese Datentypen stellen eine nahezu beliebige Zusammenfassung von Basisdatentypen und benut zereigenen Datentypen dar Die Regeln die es hier einzuhalten gilt sind in jedem guten C Lehrbuch nachzulesen In den folgenden Abschnitten sollen demnach nur Besonderheiten bei der Implementie rung in CREST C angesprochen werden 3 4 1 Padding innerhalb von Strukturen Die meisten CPU s besitzen ein paar unsch nen Eigenarten was den Zugriff auf Code und Daten be trifft So m ssen bei den meisten 16 bittigen CPU s die Maschinenbefehler auf 16 Bit Grenzen liegen Bei 32 Bit Maschinen in einigen F llen auf 32 Bit Grenzen und so fort H lt man bzw der Compiler sich nicht an diese Regeln so ist im positivsten Falle mit leichten bis gravierenden Laufzeiteinbussen zu rechnen In der Regel f hrt die falsche Ablage von Code zu b sen Fehlermeldungen des Betriebssy stems das die Abneigung der CPU wenigstens noch dokumentiert 3 4 Benutzereigene Datentypen 27 Beim Zugriff auf Datenbereiche sind die Beschr nkungen in der Regel nicht gar so restriktiv wie bei dem Versuch Code der misaligned ist sich also nicht auf den mas
298. ne Shared Library zu generieren die f rs RAM bersetzt wurde Bei S Records die immer und grunds tzlich im EPROM verschwinden sind Modulk pfe lediglich Speicherplatzver schwendung und erf llen keinerlei Zweck Als Beispiel soll ein kleines Unterprogramm dienen dass von PEARL aus aufgerufen werden kann und einen bergebenen Integerwert um Eins inkrementiert und als Funktionsergebnis zur ckliefert 1 Das C Programm inc c besteht lediglich aus dem Modulkopf und der Funktion selbst include lt stdio h gt pragma MODULE INC Fixed15 Inc Fixed15 value return value tl 2 Das Makefile inc mak bersetzt den einzelnen Quelltext und erzeugt einen ladbaren S Record inc sr inc obj cln inc 1lnk inc sr 0 M inc obj inc c ccc inc c inc obj 0 H INCLPATH 3 Das Linkfile inc 1nk ist ebenfalls nur ein Einzeiler da in diesem trivialen Falle nun wirklich 208 17 5 RAM Scheiben generieren keine Funktionen aus Bibliotheken ben tigt werden inc obj 4 Der erzeugte S Record inc sr ist nun normal ladbar und stellt sich in der Speicherkette als MDLE INC dar 17 5 RAM Scheiben generieren Wie dem Abschnitt 16 2 10 zu entnehmen war dienen die RAM Scheiben zur Konfiguration des unter RTOS UH Verwaltung befindlichen RAM s oder um es klar auszudr cken RAM das hier nicht aufgef hrt ist wird von RTOS UH weder verwendet initialisiert noch kaputtgeschrieben In CREST C wurde die Anweisung pragma RAM_RAN
299. nen sich das komplette System zusammen setzen soll Bei einem Kaltstart z B nach dem Einschalten oder dem Kommando SYSTEM RESET wird dabei nach Scheiben mit den Kennungen 15 und 18 gesucht Dabei steht die Scheibe 18 f r Routinen die nach jedem Kaltstart automatisch ausgef hrt werden m ssen Es werden zun chst alle 18er Scheiben in der Reihenfolge exekutiert in der sie von RTOS UH gefunden wurden Ist diese Schritt abgeschlossen so wird dieser Vorgang mit 15er Scheiben wiederholt Die Warmstartscheiben werden wie der Name schon erahnen l sst auch nach jedem ABORT exekutiert Hinter diesen beiden Scheiben steckt eigentlich nichts geheimnisvolles Es bedeutet nur dass das Sy stem nach Codebereichen forscht die ohne Bedienerkommandos automatisch ausgef hrt werden sol len Da Sie sich zudem noch im Supervisor Mode befinden wenn die Routinen abgearbeitet werden ist Vorsicht geboten Es gilt noch eine weitere Einschr nkung die sich auf den Gebrauch der RTOS UH Systemdienste bezieht Im Grunde genommen ist das Betriebssystem zu diesem Zeitpunkt noch in der Wachstumsphase und noch nicht besonders willig Ihnen zu Diensten zu sein Sie sollten deshalb davon Abstand nehmen in der Hochlaufphase Systemkommandos zu verwenden Das gilt selbstverst ndlich auch f r CREST C Bibliotheksroutinen die sich auf dem System abst tzen Zugriffe auf Variablen die A4 oder A5 relativ angesprochen werden sind unzul ssig Es gibt weder eine zugeordne
300. nen zu Fehlern so bricht CMAKE standardm ssig mit einer Fehlermeldung ab Um die weitere Funktionalit t von CMAKE zu demonstrieren wird das Beispiel nun etwas erweitert indem dem Projekt nun noch die Dateien test1 cundtestl h hinzugef gt werden sollen wobei testl hnurvon test1 c includiert werden soll test1 c jedoch zus tzlich test h includiert test sr test c test h testl c testl h ccc68k test c test obj ccc68k testl c testl obj cln68k test lnk test sr N TEST 10 3 Syntax von cmake 81 Sie sehen dass es ungeschickt ist das Makefile in dieser Form zu notieren da bei Anderungen in test1 h nun auch test c stets unn tigerweise neucompiliert w rde Es bietet sich deshalb an die Abh ngigkeiten folgendermassen aufzuspalten test sr test obj testl obj cln68k test lnk test sr N TEST test obj test c test h ccc68k test c test obj testl obj testl c test h testl h ccc68k testl c testl obj Eine nderung von test1 h f hrt nunmehr lediglich zur Compilierung vom test1 c und zum er neuten Linken des Projektes Sie sehen dass die Erstellung des Projektes jetzt von Existenz und nde rungszeitpunkt der Objektdateien abh ngt statt wie bisher von den Quelltextdateien F r die Abliingig keiten wird n mlich ebenfalls kontrolliert ob die entsprechenden Dateien 1 existieren und 2 aktuell sind Sind die Abh ngigkeitsdateien nicht vorhanden so muss im Makefile eine Regel zu deren Erstellung no tiert sein Eine s
301. nktion generieren wollen spricht in Hinblick auf die Eindeutigkeit der Namensgebung nichts dagegen dieser Sohntask schlicht den Funktionsnamen zu geben Dies kann durch die Angabe des Schl sselwortes USE_FUNCT ION NAME hinter den pragma Kommandos TASK oder SUBTASK erreicht werden pragma TASK USE_FUNCTION_NAME void Test_A int a pragma TASK USE_FUNCTION_NAME void Test_B int a In diesem Beispiel wiirden zwei Tasks Test_A und Test_B entstehen Um zu verhindern dass eine dauerhafte Task unmittelbar nach der Generierung durch den Funktions aufruf startet wurde das Schl sselwort NO_TASKSTART impementiert pragma TASK NO_TASKSTART USE_FUNCTION_NAME void SchlafWeiter void pragma TASK USE_FUNCTION_NAME void WachAuf void void main void Erzeugt die Task SchlafWeiter Aktiviert die Task rt_activate SchlafWeiter 1 Erzeugt und aktiviert die Task WachAuf Aktiviert die Task zum 2 Mal rt_activate WachAuf 1 104 13 4 Systemtasks rt_suspend Der Funktionsaufruf SchlafWeiter inmain erzeugt dann zwar den betreffenden Sohnprozess sofort dieser geht jedoch direkt nach dem Anlaufen in den Zustand DORM ber und verharrt so bis zu einer expliziten Aktivierung 13 3 3 Benutzung der FPU bei Sohn Tasks Jede Task hat unter RTOS UH das Recht und die Pflicht sich selbst um die Register zu k mmern die bei einem Kontextwechsel durch den Dispa
302. nn ob sie g ltig sind oder die entsprechende Karte gerade nicht im Rechner steckt Derartige Zugriffe mit der Gefahr eines BUS ERROR s sind nur im Supervisor Mode abzufan gen Speicherbereiche die nicht im Supervisor Mode erreicht werden k nnen wie z B entsprechend gejumperte VME Bus Karten lassen sich folglich nicht mittels dieser Funktionen testen da in sol chen F llen grunds tzlich beim Zugriff ein BUS ERROR erzeugt wird int rt_read_memory_byte void address UBYTE value int rt_read_memory_word void address UWORD value int rt_read_memory_long void address ULONG value int rt_write_memory_byte void address UBYTE value int rt_write_memory_word void address UWORD value int rt_write_memory_long void address ULONG value In den CREST C Bibliotheken stehen sechs Funktionen zur Verf gung die vor dem Zugriff in den pri vilegierten Modus wechseln einen m glichen BUS ERROR wegfangen und hinterher ber den R ck gabewert berichten ob der Zugriff geklappt hat R ckgabewert 1 oder mit BUS ERROR bestraft wurde R ckgabewert 0 Der Zugriff auf den Speicher erfolgt ber MOVE x Befehle Das gelese ne Datum ist bei den rt_read_memory Funktionen ber den Parameter value verf gbar Die rt_write_memory Funktionen schreiben das Datum value auf die Speicheradresse address Und weil die Welt halt hart und grausam ist sind die gerade beschriebenen Routinen nat rlich rest
303. nscht so kann die zy klische Einplanung mit der Einplanung auf einen Zeitpunkt oder ber eine Zeitdauer kombiniert werden z B AFTER Zeitdauer ALL Zeitdauer DURING Zeitdauer ACTIVATE Taskname oder AT Uhrzeit ALL Zeitdauer UNTIL Uhrzeit ACTIVATE Tas kname e auf Event eingeplante Aktivierung Sehr wichtig f r ein Echtzeit Betriebssystem ist die F higkeit schnell auf externe Ereignisse reagieren zu k nnen Externe Ereignisse sind Ereignisse die asynchron zum Programmablauf auftreten und dem Prozessor von der Peripherie signalisiert werden sogenannte Unterbrechun gen im regul ren Programmablauf oder Interrupts Die entsprechenden Interrupt Handler haben die Aufgabe die Hardware Interrupts in entsprechende Software Events oder auch als Prozes sinterrupt bezeichnet umzusetzen RTOS UH kann die Aktivierung von Tasks vom Auftreten dieser Events abh ngig machen d h tritt ein Hardware Interrupt auf so wird der entsprechende Interrupt Handler sich um die Hard ware k mmern und anschliessend das zugeh rige Software Event ausl sen Daraufhin wird die hierauf eingeplante Task aktiviert Hat diese Task eine hohe Priorit t so wird ihr sofort der Pro zessor zugeteilt und Tasks niedriger Priorit t k nnen die Behandlung dieser Unterbrechungssi tuation nicht behindern Die Einplanung auf einen Event erfolgt mit dem Befehl WHEN Eventkennzeichnung AC TIVATE Taskname In CREST C werden dazu die zwei Funktionen rt_event_activate
304. nt so laufen die Einplanungen endlos Bestehende Einplanungen werden gel scht Um die Angabe von blichen Befehlen zu vereinfachen wurden einfachere Formen zyklischer Aktivierungen in der Bibliothek aufgenommen die automatisch absolute Zeitpunkte voraussetzen at Formen void rt_at_activate char taskname PELO prio o TimeSchedule startzeit void rt_at_activate_quick Task task 7 Prio prio S TimeSchedule startzeit Ebenso stehen Funktion bereit die mit relativen Zeitangaben umgehen aft er Formen void rt_after_activate char taskname Prio prio G TimeSchedule startdauer void rt_after_activate_quick Task task Prio prio y TimeSchedule startdauer e zyklische Einplanung Eine zyklische Einplanung erfolgt mit dem Bedienbefehl ALL Zeitdauer ACTIVATE Taskname und kann in der Form ALL Zeitdauer DURING Zeitdauer ACTIVA TE Taskname auf eine bestimmte Zeitspanne eingegrenzt werden Statt der Eingrenzung auf eine bestimmte Zeitdauer kann auch eine Uhrzeit f r die letzte Aktivierung in der 15 3 Multi Tasking 143 Form ALL Zeitdauer UNTIL Uhrzeit ACTIVATE Taskname gegeben werden Die entsprechenden CREST C Anschl sse sind Sonderf lle der bereits erl uterten Funktionen rt_timed_activate und rt_timed_activate_quick Zyklische Einplanungen in der einfachen Form haben eine sofortige Aktivierung zur Folge d h die erste der zyklischen Aktivierungen findet sofort statt Ist dies nicht erw
305. nter Verwen dung der Funktion rt_get_taskname geschehen Sie liefert f r eine g ltige TID den zugeh rigen Funktionsnamen Der Speicherbereich auf den der Pointer zeigt wurde mitmalloc beschafft und kann folglich mittels free wieder freigegeben werden char rt_get_taskname Task tid Ein Zugriff ber die TID ist immer eindeutig kann aber auch furchtbar in die Hose gehen wenn die Task die ehemals diese TID besass sich schon aus dem System verabschiedet hat und der Vaterprozess nun tiber eine ungtiltige TID im Speicher rumstochert Es gibt keinen eindeutigen Weg im Umgang mit C Subtasks den man unter RTOS UH als absolut narrensicher bezeichnen k nnte e ber Namen sollten Sie nur zugreifen wenn Sie sichergestellt haben dass im System keine Na menskonflikte auftreten was vom Betriebssystem selbst nicht kontrolliert wird Sie erwischen dann stets die erste Task die unter diesem Namen in der Systemkette angetroffen wird e ber eine TID sollten Sie nur zugreifen wenn Sie sicher sind dass sich hinter diesem Zeiger auch noch Ihre gew nschte Task verbirgt Wenn Sie b swillig eine Task ber die Shell entladen sollten Sie sich auch nicht dar ber wundern was beim n chsten Programmzugriff eines anderen Prozesses mittels der nunmehr ung ltigen TID alles passieren mag In Hinsicht auf die Namensgebung von Subtasks ist die automatische Vergabe von Namensextensions oft l stig Wenn Sie exakt eine Task aus einer C Fu
306. o kommt es etwas fr her zum Crash Wenn Sie mit Bestimmtheit wissen dass grunds tzlich einmal mit dem H chstwert 10000 aufge rufen wird dann brauchen Sie auch keinen dynamischen Stack Setzen Sie bei Linken die Stackgr sse auf etwa 1 2 MB laden das erzeugte Programm und gut ist es Zur Not d rfen Sie dann halt noch ein paar RAM s nachst pseln aber um den Speicherbedarf kommen Sie nun wirklich nicht herum 3 9 Dynamische Stackverwaltung 43 In der Regel sieht es aber so aus dass man zur bersetzungszeit nicht weiss ob bei 10000 eine Grenze vorliegt oder in wievielen F llen der angenommene H chstwert gar deutlich ber oder unterschritten wird Zeigt die Erfahrung im Umgang mit einem solchen Programm dass der durchschnittliche Auf rufwert der rekursiven Funktion nicht bei einem klar definierten Maximalwert angesiedelt ist dann ist es Schwachsinn den Stackbedarf f r einen gesch tzten Maximalwert vorzuhalten Hier und erst an einem solchem Punkt greift der dynamische Stack Wenn Sie das Beispielprogramm bersetzt und gestartet haben werden Sie feststellen dass f r jeden Aufruf der Funktion f die bereits erw hnten 120 Bytes verbraucht werden Differenz jeweils zweier Ausgaben Also wird der ermittelte Wert als RANGE Angabe eingesetzt das Programm neu compiliert und gestartet pragma DYNAMIC_STACK NEWSTACK 16384L RANGE 120 Prima wieder was gelernt Der Rechner schimpft ber einen Stackoverflow das bede
307. o sind im plizite relative Adressierungsarten wie BSR B func BSR W func oder BSR L func zul ssig 4 2 Die data Section Die globale Definition eines Symboles aus der dat a Section erfolgt mittels der Anweisung DA TA_DEF name Dadurch wird das Symbol name f r den Linker auch ausserhalb der gerade bearbei teten Ubersetzungseinheit global bekannt Innerhalb der dat a Section sind folgende Assembleran weisungen zul ssig e Die Definition von Labels e Die Initialisierung von Konstanten mittels DC x e Die Initialisierung von konstanten Bereichen mittels der Blockanweisung DCB x Eine Referenz auf die dat a Section einer fremden Ubersetzungseinheit kann mittels der Anweisung XREF name erzeugt werden In diesem Falle geht der CLN davon aus dass das betreffende Symbol sich in der dat a oder bss Section befindet und l st die Referenzen entsprechend der aufgefun denen Definition des Symbols auf Die Objekte der dat a Section lassen sich ausschliesslich relativ zum Adressregister A5 ansprechen Die Variable data section w re auf Assemblerebene folglich als data_section W A5 oder data_section L A5 adressierbar 4 3 Die bss Section Die globale Definition eines Symboles aus der bss Section erfolgt mittels der Anweisung BSS_DEF name Dadurch wird das Symbol name f r den Linker auch ausserhalb der gerade bearbeiteten ber setzungseinheit global bekannt Innerhalb der bss Section sind folgende Assembleranweisunge
308. ogrammen die den Zeilencounter der Task setzen gibt der Eintrag Line ber dessen Inhalt Auskunft Wie Sie er kennen geh rt der CED nicht zu den Programmen bei dem dieser Eintrag Sinn machen w rde Zuletzt wird an der aktuellen PC Position der Code der n chsten zu exekutierenden Zeile disassembliert Um die Dekodierung des aktuellen Statusregisterinhaltes zu erleichtern wird dieses sowohl in Hex als auch in Klartext Darstellung angezeigt Hier sind s mtliche Bits inaktiv Ist in der Zeichenkette ttsmOxnzvc ein Zeichen als Grossbuchstabe eingetragen so bedeutet dies dass das entsprechende Bit in der Maske gesetzt ist Die Zahl in der Mitte des Strings gibt den IR Level des Prozessors an Der Prozessor l uft also auf IR Level 0 im Usermode wie man es bei einem Editor wohl auch erwarten kann 87 88 KAPITEL 11 DER POST MORTEM DUMP PMD Bei Programmen die mit FPU Unterst tzung laufen werden auch die Registerinhalte des Coprozes sors angezeigt Das folgende Beispiel stellt einen Schnappschuss w hrend eines kleinen Benchmark programmes dar PC 0009DDCE 4CDF MOVEM L SP D7 A1 Shell Module at 0009C45C PCrel 00001972 TEST Task at 001F4098 TWSP 001F3E7A TEST 20 Line 0000 SR 00000010 ttsm0Xnzvc SSP 000007F6 0 1 2 3 4 5 6 7 DO 00000001 00000000 00000020 00005B76 00001800 00000004 00000013 O3F62FFC AO 001BA04A 001F4098 001F40FA 001BA17D 001F3E7A 001BA048 04005D9C 001BFB00 FP 1 43333333E 0001 4 186046
309. ohne Netz und doppelten Boden Sie haben zwar eigenen Stack von freiw hlbarer Gr sse was gegen ber Interrupt Handlern schon eine deutliche Verbesserung darstellt aber immer noch keinen Zugriff auf irgendwelche globalen Variablen Auch der Aufruf von Funktio nen die auf globale Variablen zugreifen d rfte rasch zum Crash f hren Wenn Sie mit der Aussenwelt Daten austauschen wollen dann geschieht das blicherweise ber Communication Elemente denn um die Dinger zu verwalten werden die Betreuungstasks schliesslich geschrieben oder alternativ ber absolute Variablen in der common Section Eine weitere M glichkeit besteht darin sich einen gr sseren Taskkopf anzufordern und hinter den internen Informationen des RTOS UH die eigenen Daten abzulegen Mittels des Schl sselwortes TASKHEADSIZE size lassen sich size Bytes zus tzlich im Taskkopf anfordern Einen Zeiger auf den Speicher der Ihnen nun zur freien Verf gung steht erhalten Sie mit z B mittels der folgenden Konstruktion void my_memory rt_my_TID 1 Um von einer fremden Task an diesen Speicher heranzukommen muss diese lediglich die TID der Task mit dem erweiterten Taskkopf kennen oder ermitteln Dies kann z B mittels pragma SYSTEMTASK PRIO 1 TASKHEADSIZE 0x0200 STACKSIZE 1024 void MyTask void 13 5 Interrupts und Exceptions 107 void main void void common_memory rt_search_task MyTask 1 erfolgen wobei der Pointer
310. oid char id Buffer reader_ptr amp Buffer buffer Buffer writer_ptr amp Buffer buffer IRA Level4 Interrupt jetzt scharfmachen l3 IT 0 0 13 5 Interrupts und Exceptions 115 for 55 Warten auf Freigabe durch Interrupthandler rt_suspend c Buffer reader_ptr t Abbildung 13 12 Kommunikation tiber absolute Variablen Diese Methode funktioniert deshalb weil der Interrupt Handler die Adresse der Variablen Buffer bereits vom CLN zugeteilt bekommt 13 5 4 Das Verlassen einer Interrupt Routine Normalerweise sollen Exceptions und Interrupts unter RTOS UH mittels des Dispatchers verlassen werden Die Methode einen Interrupt Handler durch ein RTE Kommando zu terminieren ist eigent lich nur nach vorheriger Kontrolle der Speicherzelle DPC 800 wW zul ssig Diese 16 Bit Variable dient dem Dispatcher des RTOS UH als Kontrollzelle ob ein Dispatcherlauf erforderlich ist Enth lt sie einen Wert kleiner Null so startet der Dispatcher Ansonsten wird der Handler korrekt ber RTE verlassen Um also einen Dispatcherprozess zu forcieren sollten Sie bei Bedarf diese Speicherstelle selbst dekrementieren wie es in den vorausgegangenen Abschnitten mehrfach demonstriert wurde Un terbleibt diese Aktion so greift z B das Aufheben der Blockierbedingung der Grundebenentask erst dann wenn ein anderer Prozess einen Dispatcherlauf ausl st was einem deterministischen Verhalten doch arg im Wege
311. ojektes viele Programmierer vor der Unterteilung Ihrer Programme in wartbare Ein zelkomponenten zur ckschrecken l sst entsch rft CMAKE ein wesentliches Problem das der modula ren Programmierung oft genug im Wege steht Bei Fehlbedienungen oder Verwendung der Option gibt der CMAKE einen kurzen berblick ber die unterst tzten Optionen aus Sie k nnen diese Usage Meldungen im Anhang Abschnitt C 13 nach schlagen Die Funktionsweise aller MAKE Tools ist im Prinzip recht trivial In einer beliebig benamten Datei blicherweise Makefile wird notiert welche Dateien des Projektes wann und wie bei nderungen neu zu erzeugen sind F r die korrekte Funktionsweise von CMAKE ist eine korrekt gesetzte Uhrzeit auf dem Entwicklungs rechner und aller beteiligten Dateien eines Projektes von essentieller Bedeutung 10 1 Die Optionen des cmake CMAKE erwartet als ersten Aufrufparameter die optionale Angabe eines Makefiles Fehlt diese Anga be so wird versucht die Datei Makefile zu ffnen Ist diese ebenfalls nicht vorhanden so generiert CMAKE eine Fehlermeldung Vor der Verarbeitung des explizit angegebenen Makefiles oder der impliziten Vorgabe Make file ver sucht CMAKE eine Default Datei zu ffnen und zu verarbeiten Diese kann dazu dienen projekt oder systemspezifische Vorgaben zu hinterlegen Dabei sucht CMAKE zun chst im Workingdirectory und an schliessend im Wurzelverzeichnis nach der Default Datei Es wird je nach Betrie
312. olche Regel besteht aus den bereits bekannten drei Komponenten Ziel Abhingigkeiten und Aktionen Ist eine Datei in den Abh ngigkeiten bereits vorhanden und es existiert eine Regel so wird diese Regel zun chst ausgewertet und kontrolliert ob deren Ziel noch aktuell ist Da dieser Mechanismus rekursiv abl uft ist bei korrekter Angabe der Abh ngigkeiten und erfolgreicher Ausf hrung aller Aktionen stets sichergestellt dass bei nderungen im Projekt alle erforderlichen Schritte zur Aktualisierung des ersten Zieles in der Makedatei automatisch abgespult werden 10 3 Syntax von cmake Nachdem im letzten Abschnitt die grundlegende Funktionalit t von CMAKE erl utert wurde sollen die folgenden Ausf hrungen Ihnen dabei behilflich sein mittels CMAKE lesbare und portable Makefiles f r ihre Projekte zu erstellen 10 3 1 Kommentare CMAKE erm glicht die Angabe von Zeilenkommentaren innerhalb der Makefiles Ein Doppelkreuz in der ersten Spalte leitet einen Kommentar ein der am Ende einer Zeile endet Makefile ftir Projekt test Erstellungsdatum 05 11 1999 Programmierer Stephan Litsch Letzte nderung S dE e e e e H test sr test c test h 82 10 3 Syntax von cmake ccc68k test c test obj cln68k test lnk test sr N TEST 10 3 2 Zeilenfortsetzung Da die Syntax von CMAKE bei der Angabe von Ziel und Abh ngigkeiten zwingend vorschreibt dass diese in einer Zeile angegeben werden kann ein Makefile bei einer lange
313. on Fahrzeugen sperrbar ist An beiden Einfahrstellen sind jeweils in Fahrtrichtung Induktionsschleifen installiert tiber die ein Einfahrwunsch gemeldet und das Verlassen der Engstelle erkannt werden kann Der einfachste zu betrachtende Fall besteht aus zwei Fahrzeugen die sich aus entgegengesetzten Rich tungen der Engstelle n hern Das Fahrzeug das als erstes seine Einfahrt Induktionsschleife erreicht erh lt Gr n f r die Weiterfahrt und setzt automatisch Rot f r die Gegenseite so dass der Einfahrt wunsch der Gegenseite abgelehnt wird Erst mit dem berfahren seiner Austritts Induktionsschleife gibt das Fahrzeug die Engstelle frei und erwirkt Gr n f r das wartende Fahrzeug Die bertragung auf Semaphore unter RTOS UH erfordert nur eine neue Terminologie das Erfragen der Einfahrterlaubnis durch Uberfahren der Einfahrt Induktionsschleife wird REQUEST Operation ge nannt das Verlassen der Engstelle RELEASE Operation Die einzelnen Tasks sind wie die Fahrzeuge zu betrachten Task A f hrt ein REOUEST auf die Semaphore Engstelle durch und belegt die Engstelle hiermit Diese Operation hat keine Auswirkungen auf den Zustand der Task A F hrt nun Task B die z B durch ein Unterbrechungssignal oder einen Bedienereingriff lauff hig geworden ist und wegen ih rer h heren Priorit t den Prozessor zugeteilt erhalten hat ebenfalls eine REOUEST Operation durch so wird sie suspendiert d h ihre Ausf hrung wird trotz der h heren Priorit t ausgese
314. on diesem Kommando nicht mit bernommen Sie m ssen zu diesem Zwecke die Initial Scantabelle selbstst ndig modifizieren ohne die zwei Null Langworte auf den Adressen Nukleus Start 0x20 und NukleusStart 0x24 wird nicht nach einer neuen Scantabelle gesucht Und ohne den korrekten Scanbereich f r die neue Scheibe auf den Langworten NukleusStart 0x28 und NukleusStart 0x2C bleibt RTOS UH schon aus Prinzip schlicht stehen Um mal einen Fall durchzuspielen sei folgendes Szenario gegeben die Anwenderhardware bestehe aus zwei EPROM B nken und zwei Flash EPROM s Die erste EPROM Bank mit 1MB Umfang l ge von 0xA0000 bis OxAFFFFF und sei von IEP geliefert Sie enthielte RTOS UH und die zugeh rigen Treiber f r die betreffende Hardware und das komplette Paket von CREST C Executables um die Gr sse zu rechtfertigen Die zweite EPROM Bank sei nicht so gigantisch und l ge von 0xB0000 bis OxBFFFF mit 64KB Platz f r Anwendersoftware Weiterhin sollen zwei Flash B nke mit jeweils IMB Speicher ab 0xD0000 und 0xE00000 vollst ndig beziehungsweise im zweiten Fall nur zur H lfte berscannt werden 16 2 Kaltstart 199 Unter CREST C s he die Codierung wie folgt aus pragma SCAN_RANGES 0x000001 OxOOFFFF 0x0B0000 OXOBFFFO 0x0D0000 OXODFFFO A 0xE00000 OxEO7FFO a Das Kommando tibernimmt die korrekte Codierung der SLICE 0 und terminiert die Tabelle mit dem verlangten Null Langwort Weiterhin m sste die Initial Scantabelle so gepatc
315. on vor dem Start des Haupttask her umspielen k nnen Es gibt sie einfach noch nicht und sie entstehen erst unter Programmkontrolle F r echte RTOS UH Freaks mag das zun chst als eine l stige Einschr nkung erscheinen Der Sicherheit von Programmen tut es jedoch zweifellos recht gut wenn z B Tasks die gerade keinen Sinn machen w rden oder bei unsachgem sser weil fr hzeitiger Aktivierung gar Schaden anrichten k nnten dem Spieltrieb des Anwenders komplett entzogen werden Die bisherige Resonanz zu diesem Thema deutet darauf hin dass diese Meinung auch von den meisten Anwendern geteilt wird Durch die Verwendung der pragma Anweisung TASK bleiben die Taskk pfe der C Subtasks auch nach der Ausf hrung des return Statements im System Explizite Einplanungen oder rechtzeitige Neuaktivierungen sind jetzt nicht mehr notwendig um den Taskkopf am Leben zu erhalten Jede erneute Aktivierung sollte nun allerdings mittels rt_activate erfolgen da Sie ansonsten das System recht bald in einem Wust von Tasks ersticken die sich alle hartn ckig weigern automatisch zu verschwinden Sie haben so auch die M glichkeit die default Priorit t der Subtask zu bersteuern und jede weitere Aktivierung mit variabler Priorit t vorzunehmen Um solche dauerhafteren Tasks programmgesteuert zu ermorden dient die Funktion rt_unload_task Sie wirkt wie ein UNLOAD name von der Shell aus nimmt die Ausplanung der angegebenen Task vor terminiert sie und v
316. onen bei Bedarf in eine separate Datei ausgelagert werden die dann ohne diese Reparatur Optionen zu bersetzen ist Eine weitere Abhilfe besteht darin den Compiler durch Angabe des Schl sselwortes auto bei der 3 2 Vordefinierte Makros im ccc 25 Definition lokaler Variablen dazu zu zwingen die Zahl potentieller Registervariablen der fehlerhaft compilierten Funktion zu reduzieren Da bei Argumenten die Angabe der Speicherklasse auto nicht zul ssig ist klappt dieser Trick nur wenn der CCC nicht bereits bei der Zuteilung dieser Parametern ins Trudeln geraten ist 3 2 Vordefinierte Makros im ccc ANSI C Compiler bieten die M glichkeit mittels vordefinierter Makros Informationen in die Quell texte zu integrieren die erst zur bersetzungszeit bekannt sind Dazu z hlen neben dem Dateinamen und der Zeilennummer auch Datum und Uhrzeit der bersetzung Bedeutung Ersatztext Dateiname als String test c LINE Zeilennummer als Zahl Datum als String Jul 30 1993 Uhrzeit als String 16 04 22 ANST als Zahl Tabelle 3 12 ANSI Einbau Makros Die Einbau Makros lassen sich nicht bersteuern Der Versuch eines dieser Makros mittels undef ung ltig zu machen f hrt zu einer Fehlermeldung Neben diesen Makros sind noch die beiden compilerspezifischen Makros _CRESTC_ und__RTOSUH_ vordefiniert Beide enthalten keinen Ersatztext und lassen sich mittels if defined __CRESTC__ Teile die nur mit CREST C uebers
317. ouble y double long double latan2 long double y long double x x x y Die Funktion atan2 y x berechnet den Winkel im Bogenmass dessen Tangens dem Quotienten y x entspricht Das Resultat liegt im Bereich von bis Im Unterschied zur Funktion atan liefert atan2 zus tzlich den korrekten Quadranten des Ergebnisses Wertebereich und Fehler Wird als Parameter x oder y der Wert NaN oder Inf angegeben so wird ein domain error durch das Setzen der Variable errno auf EDOM angezeigt Die Funktion liefert NaN zur ck A 2 5 cos 1 0 5 0 0 5 1 3 2 1 0 1 2 3 Syntax float fcos float Xx double cos double x long double lcos long double x Die Funktion cos x berechnet den Cosinus des Argumentes x das im Bogenmass anzugeben ist Bei 216 A 2 Trigonometrische Funktionen grossen Argumenten verlieren die Resultate an Genauigkeit Wertebereich und Fehler Wird als Parameter x der Wert NaN oder Inf angegeben so wird ein domain error durch das Setzen der Variable errno auf EDOM angezeigt Die Funktion liefert den Parameter x zurtick Theoretisch deckt die Funktion cos x den gesamten Bereich der Rationalen Zahlen ab Verursacht durch die begrenzte Aufl sung der Fliesskommadarstellungen verliert der Parameter x jedoch bereits bei der Reduktion auf den internen Wertebereich von m lt x lt r an Genauigkeit Entsprechend ungenauer werden die Funktionsergebnisse
318. pace vorhat besteht die erste Aktion des Startup s darin den alten TWSP durch ein etwas ppigers Exemplar zu ersetzen Es sei dringend davon abgeraten an diesen Stellen des Startupcodes Ver nderungen vorzu nehmen Der Speicherblock der nun als TWSP eingeklinkt ist enth lt neben dem Platz f r die RTOS UH internen Daten nun auch die Local data und bss Section von CREST C Dabei gilt grunds tzlich dass die Local Section ab Adressoffset 200 beginnt Jetzt m ssen die transferierten Parameter und die Initialdaten des Programmes in den dat a Bereich kopiert werden Anschliessend steht der alte PwSP Block dem C Programm als Stack zur Verf gung 13 1 2 C Shellmodule f rs EPROM Der Unterschied zwischen dem Startup f rs RAM der im letzten Kapitel beschrieben wurde und der EPROM Version ist nur relativ winzig Der Startup sstart s enth lt zus tzlich zum ladbaren Mo dulkopf eine als Scheibe codierte Variante Ein Shellmodul das f rs EPROM erstellt werden soll muss mit der CLN Option O address gelinkt werden Das Resultat besteht in einem S Record der keine Referenzen mehr enthalten darf und bei dem die Verschiebeinformationen bereits vom CLN f r eben die angegebene EPROM Adresse aufgel st wurden 13 2 C Tasks 95 EPROM Position Shellmodulscheibe text Bereich Initial data Relocation Infos Taskkopf Taskworkspace local Bereich data Bereich bss Bereich Abbildung 13
319. peicher einer beliebigen Subtask in Listen einer anderen Task zu ketten Wenn eine Subtask terminiert ist das weitere Verhalten der anderen Task beim Zugriff 182 15 6 Speicherverwaltung auf derartige Listen von zunehmender Stochastik bestimmt Solche nichtdeterministischen Fehler zu debuggen ist hochgradig ekelig und deshalb sollten Sie immer daran denken was Sie sich mit einem solchen Speicher Mischmasch einhandeln k nnen Die Funktionsweise der ANSI C Routinen ist simpel Bei fehlendem Speicher antworten sie mit ei nem NULL Pointer Ist Speicher vorhanden so wird ein Pointer auf einen ausreichend grossen Block geliefert Dieser Speicherblock ist grunds tzlich an einer Wortgrenze des Speichers ausgerichtet 15 6 2 Direkte Speicheranforderungen In manchen F llen ist es l stig oder geradezu unm glich sich mit den von mir implementierten ANSI C Funktionen herumzuschlagen Gerade in Programmen die intensiv mit vielen kleinen Speicher bereichen hantieren die dynamisch angefordert und wieder freigegeben werden m ssen kann der Verwaltungs Overhead der ANSI C Funktionen st rend sein So f hrt in der aktuell ausgelieferten Implementierung die Anforderung von einem Byte zu einer Speicherbelegung von achtzehn Bytes im Ringpuffer Dieses krasse Missverh ltnis basiert auf der Gr sse des Verwaltungskopfes von sechs zehn Bytes pro dynamischem Block und der Forderung der MC68000 CPU den n chsten Header bittesch n auf einer geraden Adresse z
320. per_write_memory_long 152 256 rt_super_write_memory_word 152 rt_supervisor_mode 161 189 rt_suspend 140 rt_suspend_external 141 rt_suspend_external_quick 141 rt_take_of_queue 161 rt_task_status 134 rt_terminate_and_vanish 140 rt_terminate_external 140 rt_terminate_external_quick 140 rt_terminate_internal 140 rt_Test_And_Set 146 rt_timed_activate 142 rt_timed_activate_quick 142 rt_timed_continue 143 rt_timed_continue_quick 143 rt_timed_resume 144 rt_transfer_ce 159 160 rt_trigger_event 149 rt_try_sema 146 rt_unblock_waiting_taskQ 147 rt_unload_task 102 140 rt_unload_task_quick 140 rt_used_stack 39 42 43 rt_user_mode 161 189 rt_wait_for_activation 147 161 rt_wait_for_ce 162 rt_wait_for_exit 139 rt_write_battery_clock 149 rt_write_memory_byte 152 rt_write memory_long 152 rt_write_memory_word 152 RTE 108 115 RUN 116 133 136 139 141 148 Runtime Relocs 47 SCAN_RANGES 198 232 Scanbereich 205 SCHD 137 147 SCHEDULE Byte 134 SD 158 Sections bss Section 56 58 62 common Section 56 58 63 data Section 56 57 62 local Section 56 58 63 text Section 56 61 SEMA 133 134 137 139 145 147 Semaphoren 145 SET_VECTOR 232 Shellextension 8 92 93 Shellmodul 92 101 125 INDEX short 26 sign 225 Signalmarke 200 Signalmarken 205 Single Precision 211 sinh 219 SIZE 111 sizeo
321. pragma MEMBER_PADDING_ON dar der das Default Verhalten der CPU restauriert Auf 68K Compilern ist dazu das Kommando pragma MEMBER_PADDING_68K quivalent zu verwenden Die Kommandos wirken global auf alle Strukturen die im weiteren Verlauf der bersetzungseinheit verein bart werden Das Padding der Gesamtstrukturgr sse wird davon jedoch nicht ber hrt und ist grunds tz lich ein gerader Wert 28 3 4 Benutzereigene Datentypen typedef struct Testl char aj 0 short bz 2 char oz ZZ 4 int d 6 char e 10 Testi sizeof Testi 12 pragma MEMBER _PADDING_OFF typedef struct Test2 char aj 0 short b 1 char 5 f f 3 int d 4 char e 8 Test2 sizeof Testl 10 pragma MEMBER DADDING ON CREST C legt die Komponenten einer Struktur stets in der Reihenfolge der Definition ab und versucht nicht den Speicherbedarf einer Struktur zu optimieren Die Struktur in Abbildung 3 4 belegt 20 Bytes im Speicher obwohl die Summe der einzelnen Komponenten nur 16 Bytes betr gt Bei der Anpassung eigener Strukturen an vorgegebene Datentypen m ssen Sie folgendes beachten e Alle nicht char Daten liegen auf geraden Adressen Wenn Sie nicht an einen bestimmten Aufbau gebunden sind k nnen Sie durch Umstellung der Komponenten innerhalb solcher Strukturen oft erheblich Speicherplatz sparen e Strukturen liegen immer auf 16 Bit Grenzen e Felder liegen immer liegen immer auf 16 Bit Grenzen sofern der
322. ption L path bersteuern 7 1 5 Debuginformationen exportieren Die Option z weist den SSL an Debuginformationen die in den Objektdateien enthalten sind in die ref Datei zu exportieren Kapitel 8 Der Library Manager clm Beim CLM handelt es sich um die rudiment re Implemetierung eines Library Managers Bei Fehlbedienungen oder Aufruf ohne Parameter gibt der CLM einen kurzen berblick ber die un terst tzten Optionen aus Sie k nnen diese Usage Meldungen im Anhang clm68k Abschnitt C 9 clmppe Abschnitt C 10 nachschlagen 75 76 KAPITEL 8 DER LIBRARY MANAGER CLM Kapitel 9 Der Objekt Inspektor cop Beim COP handelt es sich um ein Werkzeug zur Betrachtung von bin ren Files des CREST C Paketes Bei Fehlbedienungen oder Aufruf ohne Parameter gibt der COP einen kurzen berblick ber die un terst tzten Optionen aus Sie k nnen diese Usage Meldungen im Anhang cop68k Abschnitt C 11 copppc Abschnitt C 12 nachschlagen 77 78 KAPITEL 9 DER OBJEKT INSPEKTOR COP Kapitel 10 Das cmake Utility Das unter UNIX weitverbreitete make Tool erlaubt die leichte Bearbeitung komplexer Projekte Es erm glicht die Modularisierung Ihrer Programme ohne dass Sie dabei die bersicht ber die Ein zelkomponenten Ihres Gesamtprojektes verlieren Ohne grossen Aufwand f r den Programmierer h lt CMAKE die Bestandteile Ihres Projektes stets auf dem neuesten Stand Da gerade dieser Verlust an Transparenz des Pr
323. r sprache zu erlernen versuchen die Bibel der C Programmierer Kernighan Brian W The C Pro gramming Language Second Edition Prentice Hall Software Series Dieses Buch enth lt zwar ein paar Ungereimtheiten so sind z B die C Bibliotheken etwas zu kurz gekommen aber es sind zu die sem Thema wiederum spezielle Nachschlagewerke verf gbar Plauger P J The Standard C Library Prentice Hall Auch dieses sehr zu empfehlende Buch ist nicht v llig fehlerfrei wie mir inzwischen bewiesen wurde aber als genereller Leitfaden ist es dennoch bestens geeignet 1 3 Allgemeines zu C unter RTOS UH Wenn Sie ANSI C Quelltexte aus der DOS oder UNIX Welt portieren wollen sind bis auf das leidige Thema der Bibliotheken nur wenige Klippen vorhanden die es zu umschiffen gilt Im Laufe der Jahre ist aus CREST C in dieser Hinsicht ein echter Allesfresser geworden der sich darum bem ht aus jedem halbwegs sinnvollen ANSI C Quelltext noch lauff higen Code zu erzeugen Die Gefahr besteht allerdings darin dass CREST C auch grobe Programmierfehler mit lapidaren Warnungen abtut gem ss dem Motto der Anwender wird schon wissen was er da tut Der weitere Vorteil von CREST C besteht darin dass sich nun nahezu alles auf Hochsprachenebe ne abhandeln l sst was vormalig den Einsatz eines Assemblers erforderlich gemacht h tte Wenn es nicht gerade darum geht an speziellen Registern der CPU SR SSP FPSR etc herumzuspielen oder der Ein
324. r ptr 7 register int count S LDN und DRIVE fuer die Ports holen rt_get_filedata amp port_info_A A PORT_NR A_Port rt_get_filedata amp port_info_B B PORT_NR B_Port rt_get_filedata amp port_info_C C PORT_NR C_Port rt_get_filedata amp port_info_D D PORT_NR D_Port printf A PORT_NR LDN 3d DRV 3d n int port_info_A ldn int port_info_A drive printf B PORT_NR LDN 3d DRV 3d n int port_info_B ldn int port_info_B drive printf C PORT_NR LDN 3d DRV 3d n int port_info_C ldn int port_info_C drive printf D PORT_NR LDN 3d DRV 3d n int port_info_D ldn int port_info_D drive Schreib CE fuer A Port aufsetzen z B mit einer Puffergroesse von 512 Bytes 15 5 I O unter RTOS UH und einem kleinen Ausgabetext wce_A rt_fetch_ce 512 Bleibt liegen bis das CE da ist Bei Ueberlauf des CE Kontin gents wird die aufrufende Task blockiert wce_A gt ldn port_info_A ldn wce_A gt drive port_info_A drive wce_A gt mode MODMWA Auf Beendigung der Ausgabe warten MODMOU Output einstellen IOCNE Keine Fehlermeldungen aufs Terminal IOCRWI Befehl READ WRITE strcpy wce_A gt file_name WRITE_A xFF Einen CE Namen eintragen strepy wce_A gt buffer A Text Einen Ausgabetext in den wce_A gt reclen strlen A T rt
325. r C Task f hrt demnach zu einer sequentiellen Abarbeitung der hintereinanderfolgenden Aktivierungen e C Subtasks Bei den als Subtask bezeichneten Funktionen handelt es sich um Tasks die dynamisch zur Lauf zeit von C Shellmodulen oder C Tasks aus gebildet werden k nnen Sie erben weitesgehend die Eigenschaften des erzeugenden Prozesses und sind nur solange lebensf hig solange die main Task von der sie abstammen im System existiert Innerhalb einer C Subtask stehen alle wesentlichen Features gem ss ANSI C zur Verf gung e Systemtasks Als Systemtasks werden alle RTOS UH Tasks bezeichnet die nicht mit einer CREST C Laufzeitumgebung ausgestattet sind CREST C ist in der Lage diverse Sonderformen von Sy stemtasks zu generieren Die Kodierung von Systemtasks wird jedoch nur f r spezielle Aufga 91 92 13 1 C Shellmodule benstellungen angeraten und ist nicht als die Standardform eines CREST C Programmes zu verstehen e Interface Funktionen zum Aufruf von PEARL Funktionen Innerhalb von C Shellmodulen C Tasks und C Subtasks besteht die M glichkeit PEARL Funktionen aufzurufen CREST C bietet f r einen Grossteil der unter PEARL blichen Daten typen die entsprechenden Parameter Schnittstellen e C Funktionen die von PEARL Tasks aufgerufen werden k nnen Hier bietet sich die M glichkeit Unterprogramme in C zu schreiben die von PEARL aus ver wendet werden k nnen Es besteht innnerhalb dieser Funktionen jedoch keinerle
326. r Datentyp char als unsigned char aufzu fassen ist besteht mittels der S Option die M glichkeit den Datentyp signed char als Standard aufzufassen 3 1 5 bergabe von Makros Mit der Option macnam repl lassen sich von der Kommandoshell aus argumentfreie Makros definieren Der Aufruf HALLO HELLO entspricht einem define HALLO HELLO zu Beginn der ersten zu compilierenden Datei Es lassen sich nur durch die L nge der Kommandozeile begrenzt beliebig viele Makros auf diese Weise importieren Zus tzliche Makros lassen sich wie im Abschnitt 3 1 1 erl utert ber Argumentdateien einlesen 3 1 6 Zeilenkommentare CREST C erlaubt die von C eingef hrten Zeilenkommentare Zwei Schr gstriche Slashes leiten solange sie sich nicht in einem String auftreten einen Kommentar ein der bis zum Zeilenende geht Dies ist ein Kommentar der bis zum Zeilenende geht 3 1 7 Boolscher Datentyp Mittels der Compileroption l sst sich der von C bekannte Datentyp bool im CCC zuschalten Dazu geh ren die vordefinierten Literale true und false Wird diese Spracherweiterung verwendet so definiert der CCC automatisch das Makro__CPLUSPLUS_ 3 1 8 Makroverarbeitung in Pragma Kommandos blicherweise werden pragma Kommandos vom CCC nicht durch den Makro Pr prozessor ge schickt sondern in der Form interpretiert wie sie im Quelltext vorzufinden sind In manchen F llen ist es jedoch sehr n tzlich auch Kommandozeilen mittel
327. r Wert Inf angegeben so wird ein range error durch das Setzen der Variable errno auf ERANGE angezeigt Die Funktion liefert den Parameter x zurtick Uberschreitet die Berechnung value 1x2 den darstellbaren Wertebereich der gew hlten Fliesskom maaufl sung so wird ein range error durch das Setzen der Variable errno auf ERANGE angezeigt 222 A 4 Exponential und logarithmische Funktionen und entsprechend dem Vorzeichen des Parameters x als R ckgabewert Inf geliefert A 4 7 log 1 5 1 0 5 0 0 5 1 1 5 2 2 5 3 3 5 0 0 5 1 1 5 2 2 5 3 Syntax float flog float x double log double zi long double llog long double x Die Funktion log liefert den nat rlichen Logarithmus des Parameters x Wertebereich und Fehler Wird als Parameter x eine unzul ssige Zahl angegeben NaN oder Inf so wird ein domain error durch das Setzen der Variable errno auf EDOM angezeigt Bei NaN und Inf wird der Eingabeparameter zur ckgegeben bei Inf liefert die Funktion NaN Bei negativen Argumenten liefert log als Resultat NaN und setzt errno auf EDOM Ist der Para meter x Null so liefert die Funktion nf und setzt errno ebenfalls auf EDOM A 4 8 log2 Syntax float flog2 float x double log2 double x long double llog2 long double x Die Funktion log2 liefert den Logarithmus des Parameters x zur Basis 2 A 4 9 log100 Syntax float flogl0 float do
328. r Zeit keine Prozessorkapazitat erhalten will Allerdings ist f r diese Task schon eine Bedingung definiert unter der sie in den Zustand RUN berf hrt wird Diese Bedingung kann sowohl eine zeitliche Einplanung z B vom Bediener AT 17 00 00 ACTIVATE Taskname als auch eine Einplanung auf einen Event z B vom Bediener WHEN EV 00000001 ACTIVATE Taskname sein Der Zustand SCHD stellt den bergeordneten Begriff der Taskzust nde TIAC CYAC EVAC TICO und EVCO dar die in Tabelle 15 3 aufgefiihrt sind Der bergang in den Zustand der Einplanung ist aus allen anderen Zust nden mit Ausnahme des Zu standes SEMA m glich Insbesondere ist allein durch den Zustand SCHD nicht gesagt ob diese Task schon einmal Prozessorkapazitat erhalten hat oder ob sie erst durch die Einplanung aktiviert wird Wird die gegebene Einplanungsbedingung erf llt berf hrt RTOS UH die entsprechende Task auto matisch in den Zustand RUN und teilt ihr den Prozessor zu falls keine h her priorisierte Task laufwillig ist 15 3 1 5 1 0 Blockiert durch I O Vorgang Eine Task wartet auf den Abschluss einer Ein oder Ausgabe Unter RTOS UH werden die tats chli chen Ein und Augabeoperationen von langsamen Ger ten nicht direkt von der veranlassenden Task ausgef hrt sondern von sogenannten Betreuungstasks Ist eine Task im Zustand 1 0 so hat sie eine Ein oder Ausgabeoperation angestossen und wartet auf deren Abschluss F r diese Zeit erh lt sie keine Prozessor
329. r Zugriff auf Eproms viel zeitaufwendiger gestaltet als ein Lesezugriff auf RAM Bereiche wird oft das Verfahren angewendet die entsprechenden EPROM Bereiche ins RAM zu kopieren und dort ausf hren zu lassen Geschieht dieser Vorgang allerdings mit dem Betriebs system selbst so muss am Ende dieser Kaltstartscheibe ein erneuter Kaltstart ausgel st werden um RTOS UH an seiner neuen Position aufwachen zu lassen e In einigen F llen ist es aus Anwendersicht w nschenswert eine berwachung der Kalt und Warmstarts des Systems mitzuloggen Die Vorgehensweise besteht dann zumeist darin im batte riegepufferten RAM eine Verwaltungsstruktur anzulegen in der bei jedem Kaltstart ein Flag ge setzt wird dass eine Kaltstartscheibe berlaufen wurde In einer dazu korrespondierenden Warm startscheibe also zu einem Zeitpunkt des Systemstarts zu dem bereits die meisten System dienste zur Verf gung stehen kann dann in der Verwaltungsstruktur das vorher gesetzte Flag ausgewertet werden Im Normalbetrieb kann dann mittels einer Anwendertask die Verwaltungs struktur z B auf Platte abgelegt oder ber ein Netzwerk weitergeleitet werden 16 2 Kaltstart 201 16 2 4 Scannen nach Systemtasks 16 2 5 Anforderung der Interruptpuffer 16 2 6 Suchen nach Device Treibern 16 2 7 Installieren der Error Puffer 16 2 3 Suchen nach Device Parametern 16 2 9 Scannen nach Shell Befehlen 16 2 10 Einrichten des verwalteten RAM s In diesem Betriebszustand sucht
330. r als Typ akzeptiert wird In diesem Betriebszustand erwartet er nun zwingend und fehlerhafterweise eine Variablenvereinbarung typedef int void f int S Ss s 17 Abhilfe Ein Semikolon das als leere Expression verstanden wird und den CCC davon berzeugt dass der Deklarationsteil des Compounds nunmehr beendet ist typedef int void f int G S S 2 Auch hier wieder ein Fall wo der CCC sich intern verl uft typedef struct int hi s s f s s return s s gt hi In der Return Expression sind zwei unterschiedliche Verwendungen des Bezeichners s aus einanderzuhalten was er leider nicht sauber geregelt bekommt In beiden F llen geht er bei einer ge ffneten Klammer innerhalb einer Expression zun chst auf die Suche nach einer abstrak ten Deklaration oder im Klartext er schaut nach ob es sich um einen Cast handelt Im ersten Fall s wird er dabei korrekt f ndig Im zweiten Fall s gt h1 geht er ebenfalls hin ter der Klammer davon aus dass es sich beim Bezeichner s um einen Datentyp handelt und scheitert beim Auftreten des Strukturselektors an dieser fehlerhaften Beurteilung der Lage Abhilfe Die Klammern um die Expression weglassen um den CCC von dem Gedanken abzu bringen dass nun ein Cast folgen k nnte typedef struct int hi s 24 3 1 Die Optionen des ccc s f s s return s s gt hi Da es sich bei dem Quellcod
331. r aus einer assem blercodierten Routine wieder restaurieren Um task lokale Variablen in der 1ocal Section zu verwalten wird zudem das Adressregister A4 verwendet Dieses entspricht dem Zeiger auf den TWSP der Task denn unter CREST C wird die local Section hinter dem von RTOS UH ben tigten TWSP allokiert Weiterhin belegt CREST C bei Generierung von Code f r den Debugger das Adressregister A6 ber dieses Register wird die Aufrufstruktur der Funktionen verwaltet um so einen Callingstack verwalten zu k nnen Zur R ckgabe von Funktionswerten verwendet CREST C f r Integer R ckgaben das Datenregister DO und f r Pointer R ckgaben das Adressregister AO 3 10 Interner Registergebrauch von CREST C 45 68k Register Sonder Bedeutung Integer R ckgaben Pointer R ckgaben Zeiger auf die local Section Zeiger auf die data Section Zeiger auf den Calling Stack Stackpointer Der CCC benutzt alle Register deren er habhaft werden kann Er betrachtet A4 und A5 und im Debug modus zus tzlich A6 als gesperrt allenfalls bei der Codegenerierung f r Interruptroutinen Kalt und Warmstartscheiben vergibt der CCC diese Register Die Adressierung der C lokalen Variablen und der bergabeparameter erfolgt grunds tzlich ber den Stackpointer SP 3 10 1 Besonderheiten des PowerPC RTOS UH basiert sowohl f r 68K Targets als auch f r den PowerPC gr ssenteils auf identi schen Assembler Quelltexten Der ablauff hige Assemblercod
332. r durch das Auftreten eines Events 15 3 Multi Tasking 149 Der Bediener kann und darf hierauf nur begrenzt Einfluss nehmen Eine Beeinflussung der Uhr zeit ist mit dem Befehl CLOCKSET durchaus m glich Sie sollten dabei stets im Hinterkopf behalten dass ein Umstellen der Uhrzeit bei laufenden Anwenderprogrammen unter RTOS UH leider oft im ab soluten Chaos endet Das Betriebssystem verwaltet Einplanungszeitpunkte intern auch wenn diese relativ angegeben wurden stets mittels absoluter Uhrzeiten Wenn Sie dem Betriebssystem mitteilen dass eine Operation nach 5 Sekunden auszuf hren ist so rechnet sich RTOS UH intern den Zeitpunkt aus der der Angabe nach 5 Sekunden entspricht und speichert sich nur diesen Zeitpunkt ndern Sie nun die Systemuhrzeit so ger t so ziemlich alles in Trudeln Die Funktion rt_read_clock liefert die aktuelle Systemuhrzeit in Millisekunden zur ck Time rt_read_clock void Wenn das System eine batteriegepufferte Uhr besitzt so kann aus einem C Programm heraus mittels der folgenden beiden Funktionen darauf zugegriffen werden void rt_write_battery_clock ULONG date Time time void rt_read_battery_clock ULONG date Time time Die Funktion rt_read_battery_clock aktualisiert die Systemuhrzeit entsprechend den Vorga ben der Hardwareuhr Umgekehrt l sst sich die Hardwareuhr mittels rt_write_battery_clock neu stellen dies hat jedoch keinerlei Auswirkungen auf die System
333. r entweder gefuellt oder ein Fehler aufgetreten rce_C gt reclen lt 0 FEHLER else 23 Hier stehen die Daten im Puffer il Aus reclen kann man entnehmen wieviele Bytes es sind X Bei reclen 1 und buffer 0 0 ist kein Zeichen 2 eingelaufen E ptr rce_C gt buffer Pointer auf Puffer oder auch ptr my_buffer for count 0 count lt rce_C gt reclen count printf Sd Zeichen 081X n count 1 ptr count amp OxFFUL rt_release_ce rce_C Und das CE wieder verschrotten S Und jetzt mit dem Timeout rumspielen Es sollen 50 Zeichen vom A Port gelesen werden 5 enn nach 5 Sekunden die Zeichen noch nicht da sind soll ein Fehlerabbruch stattfinden Ze J Lese CE fuer A Port aufsetzen amp Hier mit einem Puffer von 50 Byte rce_A rt_fetch_ce 50 rce_A gt ldn port_info_A ldn gt ll Das Timeout wird im oberen Byte des drive Wortes abgelegt Die Zeit wird in Vielfachen von 512ms angegeben Um RTOS ueber diese i Betriebsart zu informieren muss das oberste Bit des Wortes ke angeschaltet werden ZS rce_A gt drive port_info_A drive 5000 512 0x80 lt lt 8 ca 5000 ms rce_A gt mode MODMWA Auf Beendigung des I O Vorganges warten IOCNE Fehlermeldungen im CE liefern 178 15 5 I O unter RTOS UH IOCRWI Befehl READ WRITI Fl
334. r includierten Dateien unterbleibt Will man auch noch den ersten Includelevel betrachten so l sst sich dies durch Q 1 erreichen etc Mit der Option H path lassen sich zus tzliche Includepfade angeben Es sind bis zu 16 zus tzliche Pfade m glich die entsprechend der Reihenfolge der Definition abgearbeitet werden Wenn in den zus tzlichen Pfaden kein Treffer erzielt wurde so wird zuletzt der Standardpfad H bzw h nach der angegebenen Includedatei durchsucht Wenn Sie oft fremde Quelltexte portieren kann es zuweilen l stig werden stets die Schreibweise der Includedateien an die gew nschte Gross oder Kleinschreibung des Compilers anzupassen Mit der J 0 Option k nnen Quelltexte die Includedateien in der Form include lt stdlib h gt vereinbart haben trotzdem erfolgreich auf eine Datei STDLIB H zugreifen Umgekehrt findet der Compiler unter Verwendung der Option J 1 bei Angabe des Dateinamens in der Form inclu de lt STDLIB H gt auch die kleingeschriebene Variante der Includedatei st dlib h File in Grossschreibung suchen File in Kleinschreibung suchen File in Gross und Kleinschreibung suchen Tabelle 3 7 Suche nach Include Dateien Die J Option greift erst wenn die Datei nicht in der Originalschreibweise gefunden wurde Die Su che nach alternativen Schreibweisen erfolgt stets nach der Umwandlung des kompletten Suchpfades in Gross bzw Kleinbuchstaben Bei der Angabe der Option J 2 wird zun chst die Umwandlun
335. r nur sehr eingeschr nkt m glich da das System sich erst konfiguriert und viele Dienste noch nicht zur Verf gung stehen Antwortet die Testerfunktion mit Null so hat die Skip Slice keinerlei Wirkung Wird ein Wert ungleich Null geliefert so berspringt RTOS UH bei der Suche nach weiteren Scheiben den Bereich dessen Ende durch die Angabe von pragma END_SLICE_SKIP definiert wird pragma START_SLICE_SKIP int test void beliebige Treiber etc pragma HEADER Bin drin pragma END_SLICE_SKIP CREST C verwaltet dabei bis zu 16 ineinandergeschachtelte START_SLICE_SKIP END_SLICE_SKIP Paare Sie sollten es sich zur Angewohnheit machen bei derartig eingeblendeten Bereichen aussagekr ftige Headertexte hinter der Testerfunktion einzutragen wie es in Abschnitt 17 3 erl utert wird 17 3 Headertexte beim Systemstart 207 17 3 Headertexte beim Systemstart Sie kennen ohne Zweifel den Effekt dass RTOS UH bei jedem Hochlaufen den Bildschirm mit diversen Meldungen vollschreibt Diese Angewohnheit ist recht sinnvoll um zu berpr fen ob die Selbstkonfiguration des Systems auch geklappt hat und welche Versionen der einzelnen Komponenten verf gbar sind Wenn Sie das Betriebssystem um eigene Treiber und Programme erweitern sollten Sie ebenso verfahren Mittels der Anweisung pragma HEADER k nnen Sie die Einschaltmeldungen um die Aufz hlung der eigenen Grosstaten bereichern Die Syntax entspricht der
336. rames benutzen ist es zwingend notwen dig die abgelegten Stackframes zu modifizieren bevor der Exception Handler in den Dispatcher h pft Ansonsten sind Sie zum letzten Mal geh pft um es mal so auszudr cken Bei derartigen Ver nderungen muss auch der Supervisor Stackpointer angepasst werden Dies ge 13 6 Exception Handler in C 119 typedef struct ExceptionStackFrame unsigned short sr A void pc i unsigned short format_vector CPU abhaengig union SixWordFrame six_word MidInstructionFrame mid_instruction ShortBusCycleFrame short_bus_cycle LongBusCycleFrame long_bus_cycle ext ExceptionStackFrame Abbildung 13 15 Aufbau eines Exception Stackframes schieht von der Ebene der Hochsprache tiber die Modifikation der Struktur auf die registers weist Diese Struktur dient nicht nicht der Sicherung der Registerinhalte der unterbrochenen Task sondern kann zur Ver nderung des Supervisor Stackpointers herangezogen werden Nach Beendigung des von Ihnen kodierten Handlers bernimmt der Rechner automatisch alle Registerinhalte der Struktur siehe Abbildung 13 13 13 6 1 Exceptions f r EPROM Systeme kodieren Um Exception Handler zu kodieren die sich in der Startphase von RTOS UH selbstt tig auf den zu betreuenden Vektor einklinken steht das Schl sselwort VECTOR zur Verf gung Mittels VECTOR addr wird der CCC angewiesen eine entsprechende Scheibe im Code zu generieren um den Pointer auf die n
337. rauszusetzen Es ist immer dann sinnvoll wenn ein Programm entwickelt werden soll bei dem sich der Wert einer bestimmten Speicherstelle ohne direkten Zusammenhang mit dem ablaufenden Programm ndern kann Ein Beispiel daf r ist die Programmierung von I O Bausteinen bei denen es durchaus Sinn machen kann mehrmals einen identischen Wert auf die gleiche Adresse zu schreiben Auch Schleifen bei denen auf die Antwort eines Peripherie Ger tes oder einer Interrupt Routine gewartet wird sollten tunlichst unter Verwendung dieses Schl sselwortes entworfen werden 3 18 Sections unter CREST C CREST C verwaltet f nf verschiedene Sections in denen Daten abgelegt und angesprochen werden k nnen Beim Begriff Section handelt es sich schlicht um eine begriffliche Festlegung mittels derer sich unterschiedliche aber jeweils logisch zusammenh ngende Speicherbereiche mit unterschiedlichen Eigenschaften sprachlich eindeutig trennen lassen 1 text Section 2 data Section 3 bss Section 4 common Section 5 local Section In den folgenden Abschnitten soll die Bedeutung der einzelnen Sections erl utert werden Weiterhin soll vorgestellt werden in welcher Form sich die Sections von CREST C auf Hochsprachen und Assemblerebene ansprechen lassen 3 18 1 Die text Section Die text Section beinhaltet unter CREST C den unver nderlichen Anteil dessen was ein Pro gramm ausmacht Wenn Sie ein Programm entwickeln so besteht eine grund
338. rd Userinterface f r die betreffende dn ERROR Die Task soll als ERROR Task arbeiten Siehe auch Abschnitt 13 4 B 29 TAG_COPY_BYTE Es wird Code der Form generiert dass bei der Zuweisung von Strukturen oder Unions der Speicherin halt byteweise MOVE B umkopiert wird Parameter keine Siehe auch Abschnitt 3 4 1 3 B 30 TAG_COPY WORD Es wird Code der Form generiert dass bei der Zuweisung von Strukturen oder Unions der Speicherin halt wortweise MOVE W umkopiert wird Parameter keine Siehe auch Abschnitt 3 4 1 3 B 31 TAG_COPY_LONG Es wird Code der Form generiert dass bei der Zuweisung von Strukturen oder Unions der Speicherin halt langwortweise MOVE L umkopiert wird Parameter keine Siehe auch Abschnitt 3 4 1 3 B 32 TAG_COPY_SIZE 235 B 32 TAG_COPY_SIZE Gibt die Gr sse von Strukturen oder Unions an ab der statt einzelner MOVE Befehle bei Zuweisungen zum Umkopieren des Speicherinhaltes eine DBF Schleife generiert wird pragma TAG_COPY_SIZE 20 Parameter Maximale Gr sse eines Tags in Bytes der mittels einzelner MOVE Befehle umkopiert werden soll Siehe auch Abschnitt 3 4 1 3 B 33 TAG_PUSH_SIZE Gibt die Gr sse von Strukturen oder Unions an ab der statt einzelner MOVE Befehle bei der Parame ter bergabe an eine Funktion per value eine DBF Schleife generiert wird pragma TAG_PUSH_SIZE 20 Parameter Maximale Gr sse einer Tags in Bytes der mittels einzelner MOVE Befehle auf d
339. riablen in der 1oca1 Section nicht verf gbar sind weil Interrupt Handler nunmal keine Tasks sind Das dazu ben tigte Adressregister A4 ist auf Interruptebene nicht besetzt und wird bei der Codegenerierung verwendet Nur auto und register Variablen die CREST C auf dem Stack allokiert bzw CPU Registern zuordnet sind sinnvoll einsetzbar W hrend der Laufzeit des Interrupt Handlers k nnen Sie mit diesen Zellen arbeiten Sie sollten jedoch auch hier beachten dass der Platz der zu diesem Zwecke verf gbar ist nur eine erschreckend endliche Gr sse besitzt Der folgende Code in Abbildung 13 9 l sst sich zwar bersetzen f hrt aber mit Sicherheit bei der ersten Aktivierung zur Ausl schung s mtlicher lebens wichtiger Systemvektoren von RTOS UH Ein entsprechend schneller Abgang ins Nirwana ist da eine Selbstverst ndlichkeit pragma INTERRUPT LEVEL 3 void KillMe void register int t auto char test 5000 for t 0 t lt 5000 test t 0 Abbildung 13 9 Stackoverf low auf Interruptlevel 13 5 2 Die Interrupt Data Pointer RTOS UH bietet eine standardisierte M glichkeit die Daten eines Interrupt Handlers in die Aussen welt zu transferieren In den RTOS UH Systemvariablen existieren 7 Pointer die auf Datenbereiche zeigen in denen Interrupts der Level 1 bis 7 ihre Datenbest nde ablegen k nnen Diese Pointer bzw die entsprechend einzurichtenden Datenbereiche k nnen bereits bei Konfig
340. rsorgen pragma INTERRUPT NO_VECTOR void InterruptHandler4 void Um das Retten und Restaurieren der alten Vektornummer brauchen Sie sich jedoch nicht zu ktimmern Diese Aufgabe nimmt Ihnen der Compiler ab Wenn Sie komplett auf die Versorgung der IID Zelle verzichten wollen Sie sollten dabei aller dings ernsthaft wissen was Sie tun dann ist die Verwendung der Schl sselworte NQ IID oder NO_MALFUNCTION die Tat der Stunde pragma INTERRUPT NO_IID void InterruptHandler5 void pragma INTERRUPT NO_MALFUNCTION void InterruptHandler6 void Der erzeugte Code entspricht dann allerdings nicht mehr so ganz dem was das Betriebssystem erwartet und bei Fehlern innerhalb des Interrupt Handlers knallt es ganz furchtbar weil der Rticksturzmecha nismus von RTOS UH nicht aufgesetzt wurde Wenn ein Fehler auftritt dann ist das Resultat f r den Rechner final 110 13 5 Interrupts und Exceptions 13 5 1 Laufzeitcode eines Interrupt Handlers CREST C ist es zun chst v llig gleichg ltig ob der Code im Supervisor oder im User Mode abl uft Das Problem beginnt allerdings dann wenn man irgendwo Daten unterbringen m chte Interrupts ha ben die unangenehme Angewohnheit asynchron zum normalen Programmverlauf aufzutreten F r Sie bedeutet dies dass beim Eintritt in den Interrupt Handler unbrauchbarer M ll in den Registers tzen der CPU steht der zwar f r die gerade unterbrochene Task welche auch imm
341. rspr nglichen Wert gezwungen werden F r Funktionen mit R ckgabewert gilt folgende einfache Regel e Integerr ckgaben wie char short und long werden in DO erwartet e Pointerr ckgaben wie char oder void werden ber AO transferiert e Fliesskommawerte wie float oder double k nnen von der aufrufenden Funktion dem Regi ster FPO entnommen werden Wenn keine FPU verhanden ist wird es etwas komplexer e Die R ckgabe von Strukturen oder Unions erfolgt ber einen Pointer auf die Variable die das Ergebnis aufnehmen soll Bei Datentypen die nicht in Registern untergebracht werden k nnen wird die Angelegenheit f r As semblerprogrammierer schwieriger Das Ergebnis wird ber einen Pointer auf die Ergebniszelle weg gespeichert Dieser Pointer wird von der aufrufenden Funktion als letztes Argument auf den Stack gepackt liegt also direkt vor der R cksprungadresse auf dem Stack Wenn der Aufrufer nicht am R ck gabewert einer Funktion interessiert ist die gerne eine R ckgabe liefern w rde ist ein NULL Pointer zu bergeben Zur Laufzeit wird dann stets gepr ft ob der Aufrufer den R ckgabewert wirklich haben m chte 3 9 Dynamische Stackverwaltung ber Stacks haben Sie ja bislang gelernt dass die Auswahl einer sinnvollen Stackgr sse eine echte Fleissarbeit darstellt In der Regel ist die Angelegenheit nicht so gemein wie sie bislang erschienen sein mag Fehler enden zwar garantiert mit einem Crash aber die Stellen an denen R
342. rten von Code f r das Betriebssystem RTOS UH e C Shellmodule Die Kodierung eines Programmes als C Shellmodul f hrt zu dem unter anderen Betriebssyste men gel ufigen Verhalten Es lassen sich bergabeparameter mittels argc und argv an die Hauptfunktion main bergeben und bei der Beendigung liefert das Programm einen R ck gabewert an seinen Aufrufer Innerhalb eines C Shellmoduls stehen alle wesentlichen Features gem ss ANSI C zur Verf gung Der Aufruf eines C Shellmoduls f hrt zur Erzeugung einer eigenst ndigen Task Ein mehrmali ger Aufruf des identischen C Shellmoduls liefert eine entsprechende Anzahl unabh ngiger Tasks die v llig asynchron auf dem identischen Maschinencode ablaufen jedoch mit unterschiedlichen Datenbereichen arbeiten e C Tasks Bei der Kodierung eines Programmes als C Task gibt es lediglich einen Unterschied bez glich des Quelltextes C Tasks sind nicht in der Lage Parameter ber die Kommandozeile zu berneh men oder einen R ckgabestatus an den Aufrufer zu liefern Innerhalb einer C Task stehen alle wesentlichen Features gem ss ANSI C zur Verf gung Jeder Aufruf einer C Task f hrt zur einer Aktivierung der betreffenden Task Wie unter RTOS UH blich sind f hren Mehrfach Aktivierungen von C Tasks zu einer Pufferung der Aktivie rung solange die betreffende Task bereits l uft Erst nach der Beendigung der laufenden C Task wird die gepufferte Aktivierung ausgef hrt Ein mehrfacher Aufruf eine
343. ruht auf der Idee des Multi Tasking der F higkeit des Betriebs systems mehrere eigenst ndige und allein lauff hige Programme quasi gleichzeitig betreuen zu k nnen Diese Tasks k nnen gleichzeitig im Rechner vorhanden sein und das Betriebssystem verteilt die verf gbare Prozessorkapazit t auf die laufwilligen Tasks 15 3 1 Task Zust nde Das kleine W rtchen laufwillig kennzeichnet schon dass RTOS UH f r eine Task unterschiedlichste Betriebszust nde kennt RTOS UH verwaltet die Tasks in ihren unterschiedlichen Betriebszust nden und stellt Mechanismen zur Veranlassung und Kontrolle von Zustands berg ngen bereit In der Ab bildung 15 1 sind die wichtigsten Betriebszust nde sowie die m glichen berg nge nebst den diese veranlassenden Operationen exemplarisch aufgef hrt Neben den grunds tzlichen Taskzust nden DORM schlafend RUN laufwillig SUSP ausgesetzt SCHD eingeplant und SEMA warten auf Synchronisation die direkt durch Task oder Bediener operationen erzielt werden k nnen gibt es zudem die eher systeminternen Zust nde I O wartend auf Abschluss einer I O Operation PWS wartend auf Speicher Mehrfachblockierung und CWS warten auf I O Speicher die vom Zustand RUN aus erreicht werden k nnen wenn eine Task eine Aktion einleitet die vom Betriebssystem nicht unmittelbar befriedigt werden kann Der Zustand SCHD wird in aktuellen Systemen etwas spezifischer dargestellt um den aktuellen Einpla
344. rumbasteln will ohne inkompatibel zu irgendwelcher Doku mentation zu werden Zum wesentlichen Verst ndnis von RTOS UH gen gt das Wissen dass es zwei Bereiche von Variablen gibt 1 Der statische Anteil in dem sich die Systemzellen tummeln die grunds tzlich f r jedes RTOS UH unverzichtbar sind Dieser Bereich liegt von 0x7FE bis grob 0xA00 ist also etwas ber ein halbes Kilobyte gross 2 Der dynamische Bereich der sich direkt an den statischen Bereich anschliesst und die Daten enth lt die sich bei der Konfiguration des aktuell gestarteten Systems ergeben Als groben An haltspunkt sollten Sie zun chst im Hinterkopf behalten dass dieser Bereich die Grenze von 32KB nicht berschreiten sollte ansonsten k nnen b se Dinge geschehen Der statische Anteil der Variablen wird beim Kaltstart zun chst gel scht 16 2 2 Installieren des Scheiben Scanners Zum Verst ndnis dieses Abschnittes sind ein paar einleitende Worte notwendig RTOS UH ist die Summe aus dem Systemkern Nukleus und den bei der Implementierung hinzugef gten Komponenten Der Nukleus ist isoliert betrachtet eine reichlich unn tze Angelegenheit Der nackte Nukleus kennt nur 16 2 Kaltstart 197 eine einzige Task die Idle Task IDLE die nichts weiter tut als in einer Endlosschleife die CPU bei Laune zu halten Der Nukleus besitzt jedoch die F higkeit beim Systemstart nachzuschauen ob das Betriebssystem mehr k nnen soll als sinnlos Strom mit der Hard
345. rwendung komplexerer Prototypen extern char f int a double b struct z e int v float w Das entspr che dem Prototyp der Funktion die drei Argumente erwartet und einen Pointer auf char liefert Das Argument a ist ein trivialer Integerwert Als zweiten Parameter erwartet der Com piler einen Pointer auf einen Pointer einer Funktion die einen Pointer auf double liefert Bei der Verwendung dieses Funktionspointers b wird CREST C dar ber meckern dass die Argumentproto typen fehlen Das dritte Argument ist jedoch komplett beschrieben Der Compiler wird angewiesen bei der Verwendung von c die Argumente v und w zu berpr fen gegebenenfalls zu casten und alle weiteren Argumente sofern vorhanden kommentarlos zu akzeptieren und lediglich dem blichen ANSI C Casting zu unterziehen Dummerweise akzeptiert der ANSI C Standard auch die Angabe von Prototypen bei denen die Na 36 3 6 Die Prototypen men der Argumente fehlen Das eben angef hrte Beispiel s he dann etwa so aus char f int double struct z int float Der riesige Vorteil dieser Schreibweise besteht darin dass Sie nie wieder Angst vor dem Diebstahl Ihrer Quelltexte zu haben brauchen Diesen Unfug versteht keiner und Sie nach sp testens einer Woche ebenfalls nicht mehr Sie sollten den Zwang des Prototypeings als eine Chance sehen verst ndlichere und sicherere Quelltexte zu erstellen und von dem Ausweg der Kurzschreibweise
346. s T crest_types L crest_member_table O crest_objects X Functions V Variables C Crest structures U crest_unions E crest_enums Y crest_typedefs M crest_members I crest_file_dir F crest_func_dir D crest_compounds K crest_breakpoints additional hexdump P Program flags R reading of section info B building of section info P shstrtab S strtab E crest_entry_dir O crest_obj_dir F crest_ref_dir additional hexdump B Generate Breakpoint Sources V Verbose all infos C 13 cmake Crest CMAKE 68K Version for Linux x86 Copyright C 1987 1999 by Stephan Litsch Release 2 598 Now 541999 22207324 Usage cmake makefile options file Read argument file macro replace Define argumentfree macro A Make always I Ignore errors while processing T Trace commands V MAKE echoing commands K Define macro __M68K__ P Define macro __MPPC__ 0 Define macro __MC68000_ H 2 Define macro __MC68020__ 3 Define macro __CPU32__ fpu Define macro __FPU__ 247 248 C 13 cmake Dump usage Index 193 BSS_DEF 62 CODE_DEF 61 CODE REF 61 COMMON DEE 63 COMMON REF 63 DATA DFF 62 DATA REF 62 FUNC_REF 61 LITRA 17 LOCAL DEE 63 LOCAL RER 63 SLICE 0 198 SLICE 12 201 SLICE 14 108 SLICE 2 111 SLICE 3 111 SLICE 4 111 SLICE 5 111 SLICE 6 111 SLICE 7 111 SLICE 8 111 WSBS 182 WSFA 182 WSFS 182 bss Section 58 62 cmakerc 79 common
347. s denn ordentlich beschaffte CE s h ngen in zwei internen Speicherketten von RTOS UH Sind diese Werte nicht korrekt vorbesetzt kann so ziemlich alles im System passieren bis zum totalen Stillstand Also verwenden Sie grunds tzlich die Funktion rt_fetch_ce zur Beschaffung von CE s Ce re Fetchzeet wave tE Lens Als Parameter wird eine L nge gefordert und als Resultat erhalten Sie grunds tzlich einen Pointer auf ein g ltiges CE Im CE sind anschliessend einige Eintr ge vorbesetzt Die Priorit t prio entspricht der der anfordernden Task Das Strukturmitglied buffer zeigt auf den internen Puffer des CE s sta tus_of_io ist direkt nach der Anforderung auf Null vorbesetzt und filename enth lt ein einfaches terminiertes Blank Es gibt zwei M glichkeiten eines Fehlschlags bei denen die anfordernde Task blockiert wird Die Angelegenheit mit der Kontigent berschreitung mit CWS Blockierung fehlender Communication Work Space wurde ja bereits erkl rt Wenn im Rechner schon vor der Kontingentaussch pfung keine ausreichend grossen FREE Bl cke mehr verf gbar sind bleibt die Task ebenfalls liegen Diesmal lautet der Status PWS fehlender Procedur Work Space und die Task muss sich gedulden bis eine andere Task Speicher in ausreichender Gr sse ans System zur ckgibt Anschliessend wird sie automatisch wieder lauff hig und taucht aus dem Funktionsaufruf auf Bei der L ngenangabe len handelt es sich um einen 32 Bit Wert
348. s tzliche Zweiteilung aus Speicherbereichen in denen unver nderliche Daten wie z B der Maschinencode den die CPU ausf hren soll und ver nderliche Daten wie z B Ihre Variablen untergebracht werden m ssen Der CREST C Compiler fasst die Anweisungen f r die CPU in der text Section zusammen und be trachtet derartigen Maschinencode grunds tzlich als unver nderlich Weiterhin k nnen in der text Section auch konstante Werte und Tabellen mittels des ANSI C Schl sselwortes const abgelegt werden Beachten Sie bei der Definition von Initialwerten dass der resultierende Maschinencode nur dann EPROM f hig ist wenn alle Adressen im EPROM bereits zur Linkzeit bekannt sind Es d rfen in konstanten Initialwerten deshalb grunds tzlich keine Adressen von Objekten abgelegt werden die aus der data bss oder local Section stammen da diese erst zur Laufzeit dynamisch ermittelt werden und deshalb niemals zur Linkzeit zur Verf gung stehen const int a 0 static const int b 4 void f void 3 18 Sections unter CREST C 57 extern const int c static const int d 3 Der Maschinencode von f liegt in der text Section 7 Halten Sie bei der Verwendung des Schl sselwortes const die korrekte Schreibweise Im folgenden Beispiel sind drei Pointer vereinbart Nur die Objekte a und c werden in der text Section abgelegt und sind somit echte Konstanten Das const vor der Variable b bezieht sich auf die Speicherzelle 0x812 di
349. s 5 Ce t_ce_backs Prio t_ce_prio UWORD dummy 7 Prio actbuf MAX_ACTIVATIONS Abbildung 14 1 Aufbau eines Taskkopfes Kontrollen den Zettel f r die Stempeluhr Eine Task die anlaufen m chte l sst sich zu diesem Zwecke einen weiteren Verwaltungsblock vom Betriebssystem zuteilen in dem RTOS UH dann zu jeder beliebigen Zeit eintragen kann wo und wie die Task gerade im System unterwegs ist Diese Verwaltungsstruktur wird als Taskworkspace TWSP bezeichnet Im Taskkopf wird ber die Struktureintr ge workspace f r die L nge des TWSP und wto als Pointer auf den Speicherblock eine Verkettung von Taskkopf und Taskworkspace vorgenommen Der Aufbau des TWSP kann der Ab bildung 14 2 entnommen werden Auf Rechnern die keine FPU besitzen oder f r Tasks die nur pure Integerarithmetik betreiben spart RTOS UH den Platz f r die Eintr ge fpu_regs und fpu_format ein entsprechend ist der Ein trag workspace im Taskkopf auch deutlich kleiner und das Byte fpu_flag enth lt eine Null Nun kann eine Task endg ltig anlaufen Wenn RTOS UH zwischen den Tasks hin und her schaltet so wird der jeweils aktuelle CPU FPU Zustand mit dem die gestoppte Task unterwegs war in den TWSP geschrieben und von dort auch wieder nachgeladen wenn RTOS UH beschliesst der Task wieder CPU Zeit zur Verf gung zu stellen Solange eine Task nicht auf der Systemuhr nachschaut merkt sie bei einer Fortsetzung absolut nichts davon dass ihr der Prozessor f
350. s CE nicht mehr in eine I O Operation verwickelt ist 15 5 2 6 ber Dateinamen und Pfade Bei RTOS UH gibt es verschiedene Methoden von der Shell aus Ger te und Dateien anzusprechen Diese M glichkeiten sind historisch gewachsen und folglich nicht sonderlich konsistent Bei CREST C wird ausschliesslich die aktuellste Methode unterst tzt die in ihrer Syntax an UNIX angelehnt ist Als Pathseparator wird der Slash verwendet Eine vollst ndige Angabe auf C Ebene besteht aus dem Ger t Device dem Zugriffspfad und dem Namen des Files Eine Angabe ohne f hrende Ger teangabe wird als relativer Pfad zum aktuellen Working Directory betrachtet Wenn Sie direkt mit CE s arbeiten wollen besteht ein Zugriffspfad aus der Angabe von 1dn drive und dem kompletten Namen mit abgetrennter Ger tekennung Dateiname Dateiname Basisname der Date Endung der Date Tabelle 15 6 Nomenklatur bei DOS hnlichen Pfadangaben Die Ger teangabe wird grunds tzlich mit einem Slash eingeleitet und auch mit einem Slash abgeschlos sen Innerhalb des Betriebssystem existiert eine Umsetzungstabelle die den Ger tenamen die entspre chenden 1dn drive Kennung zuordnet Mit D erhalten Sie die Liste der auf Ihrem System un terst tzten Devices In Abbildung 15 10 liegt ein Auszug aus solch einer Liste vor Ger te die nicht in dieser symbolischen Tabelle existieren deren 1dn drive Kennung jedoch be kannt ist k nnen ebenfalls direkt von CREST
351. s Makros abzufassen oder gar den Compiler f r sich rechnen zu lassen Mittels der Compileroption q wird die Quelltextzeile hinter der Steueran weisung pragma zun chst durch den Makroverarbeitungsteil des Compilers geschickt Die pragma Kommandos die numerische Optionsparameter entgegennehmen k nnen wurden in der Syntax dahingehend erweitert dass zus tzlich zu den bislang unterst tzten Zahlenangaben gem ss C Nomenklatur nun auch konstante Ausdr cke ausgewertet werden k nnen Um den CCc syntaktisch davon zu berzeugen dass ein auszuwertender Ausdruck folgt muss dieser grunds tzlich geklammert werden 14 3 1 Die Optionen des ccc define MY_IR_LEVEL 4 typedef struct Task SEL char reader_ptr S Char writer_ptr S Char buffer 256 DataSpace pragma ALLOCATE_INTERRUPT_BUFFER LEVEL MY_IR_LEVEL x SIZE sizeof DataSpace define MY_STACK 1024 256 pragma TASK STACKSIZE MY_STACK Abbildung 3 1 Makroverarbeitung und Expressionauswertung in pragma Zeilen Wie der Darstellung 3 1 zu entnehmen ist ist nicht nur die Expressionauswertung von numerischen Konstanten m glich vielmehr sind alle Expressions g ltig die bereits der Compiler evaluieren kann und die ein Integerresultat liefern 3 1 9 Includedateien Ein C Programm besteht blicherweise aus mehreren Modulen bersetzungseinheiten die die Datei endung c besitzen Globale Informationen die in mehreren Modulen verf gbar sein m
352. s des Kommandos pragma WARMSTART dem Betriebssystem hinzugef gt werden Auch in der Warmstartphase l uft RTOS UH auf Supervisor Mode unter Interruptsperre auf Level 7 Sie sollten auch hier nicht versuchen diesen Zustand in einer Warmstartscheibe zu ver ndern 16 4 Normalbetrieb 16 3 1 L schen der Interruptbuffer 16 3 2 Initialisieren der Vektortabellen 16 3 3 Bestimmung der CPU FPU 16 3 4 Initialisierung der Exceptionhandler 16 3 5 Aufsetzen der Dispatcherkette 16 3 6 Initialisieren der O Queues 16 3 7 Anlegen der residenten Taskworkspaces 16 3 8 Initialisierung der Error Puffer 16 3 9 Ausf hren von Warmstart Code 16 3 10 Starten des Normalbetriebes 16 4 Normalbetrieb Wenn RTOS UH sich komplett konfiguriert hat sind folgende Minimalvoraussetzungen erfiillt 203 e Die Vektortabellen des Prozessors sind initialisiert und verweisen auf entsprechende Behand lungsroutinen im Nukleus e Die RTOS UH Traps also die Aufrufm glichkeit von Systemfunktionen sind installiert e Ein Hardware Timer liefert quidistante Interrupts quasi das Herz von RTOS UH Auf MC68K Plattformen ist dieses Intervall auf 1 Millisekunde eingestellt Alle Millisekunde wird folglich eine Interruptroutine durchlaufen die kontrolliert ob Aktionen bez glich des Taskings vorzunehmen sind e Es existiert mindestens eine Task die Idle Task IDLE Wenn keine anderen Tasks Prozes sorzeit ben tigen so l sst das Sys
353. s ebenfalls ordnungsgem ss aber rt_unblock waiting_task besitzt den grossen Vorteil dass lediglich die Blockierbedingung der betreffenden Task aufgehoben wird und diese damit wieder laufwillig wird Der interne Z hler f r aufgelaufene Aktivierungen wird dabei stets auf den Wert f r genau eine Aktivierung gesetzt auf diese Weise werden die unerw nschten OVERFLOW ACT Meldungen vermieden Nachdem die Vorteile nun behandelt wurden sollen die Besonderheiten die Sie sich bei der Verwen dung dieser Funktionen ber cksichtigen m ssen nicht verschwiegen werden e Eine Task die mittels rt_unblock_waiting_task fortgesetzt werden soll muss bereits in der Dispatcher Kette stehen Eine Task die nicht bereits auf eine derartige Fortsetzung durch Aufhebung der Blockierbedingung wartet wird auch nicht implizit aktiviert e Normalerweise erfolgt die Aktivierung einer Task mittels rt_activate_ unter Angabe einer Priorit t Wenn eine Task mittels rt_wait_for_activation schlafengelegt wurde dann reagiert sie zwar auch auf Aktivierungen verwendet allerdings immer die gerade aktuelle Laufzeitpriorit t der Task rt_unblock_waiting_task verzichtet deshalb sogar ganz auf diesen Parameter 15 3 4 Ereigniseintritt Ein bergang aus dem Zustand SCHD in den Zustand RUN ist nur durch den Eintritt des bei der Einpla nung festgelegten Ereignisses m glich sei es durch das Erreichen einer Uhrzeit durch das Verstreichen einer Zeitdauer ode
354. s es nicht Sinn einer Norm sein kann eine Sprachfestlegung so zu treffen dass eine bestimmte Hardware zwingend zur Implemen tierung erforderlich ist 3 4 Benutzereigene Datentypen 31 Im Prinzip sind Bitfelder keineswegs Felder sondern sollten eher als Bitstrukturen bezeichnet wer den Auch die Syntax entspricht der von Strukturen Als Basistyp der Strukturmitglieder sind allerdings nur die Datentypen signed int undunsigned int zul ssig wie in Abbildung 3 6 ersichtlich ist Manche Compiler erlauben auch andere Datentypen die Norm ist an diesem Punkt sehr freiz gig Der angegebene Datentyp sagt nichts ber die Bitanzahl aus mit der der betreffende Eintrag abge legt wird Es wird dadurch lediglich bestimmt wie das betreffende Strukturmitglied extrahiert werden muss Strukturmitglieder die als signed int vereinbart wurden werden vorzeichenbehaftet inter pretiert womit wohl klar sein d rfte dass beim Datentyp unsigned int das h chstwertige Bit des Strukturmembers nicht als Vorzeichenbit aufgefasst wird struct test signed int a SEN 4 unsigned int E K 6 unsigned int ie E oe Abbildung 3 6 Deklaration eines Bitfeldes Die Mitglieder einer solchen Struktur werden mit aufsteigenden Speicheradressen bitweise hinterein ander abgelegt Die maximale Breite einer einzelnen Komponente darf 32 Bit nicht tiberschreiten hierbei handelt es sich schlicht um eine sinnvolle Beschr nkung auf die M glichkeiten von 3
355. s expan diert Verwenden Sie deshalb weder Backslash noch Slash bei der Notation von Pfaden Resultat dieser kleinen Bem hung ist ein Makefile das sich sowohl auf UNIX als auch auf WINDOWS Entwicklungsumgebungen korrekt verh lt 10 3 4 1 Einbau Makros CMARE stellt neben dem im letzten Abschnitt angesprochenen Makro S je nach Entwicklungs umgebung weitere Einbau Makros zur Verf gung um so auf einfache Art innerhalb des Makefiles systemspezifische Auswertungen vornehmen zu k nnen F r die drei unterst tzten Plattformen sind dies Betriebssystem RTOS UH LINUX WINDOWS Tabelle 10 2 CMAKE Einbau Makros Die aufgef hrten Einbau Makros waren in fr heren Versionen von CMAKE undokumentiert ohne die umgebenden doppelten Underlines implementiert Die alte Schreibweise ist mit Erscheinen dieser Do kumentation abgek ndigt und wird ohne weitere Ank ndigung in sp teren Versionen von CMAKE ver schwinden Sie sollten alte Makefiles deshalb auf die offizielle Schreibweise umstellen 10 3 4 2 Spezielle Kommandozeilen Makros ber die Kommandozeile lassen sich einige Makros die in der CREST C Umgebung sinnvoll ein setzbar sind mittels spezieller Optionen definieren Die aufgef hrten Kommandozeilen Makros waren in fr heren Versionen von CMAKE undokumentiert ohne die umgebenden doppelten Underlines implementiert Die alte Schreibweise ist mit Erscheinen dieser Dokumentation abgek ndigt und wird ohne weitere Ank ndigung in sp
356. satz von Sonder Adressierungsarten MOVEP ADDX etc unumg nglich ist reicht der Sprachumfang blicherweise aus um Probleme bequem und lesbar zu kodieren Beim Zugriff auf Pe ripheriebausteine wirkt der C Code dann oft wie der eines Makro Assemblers und steht diesem im Bezug auf Effizienz auch kaum nach Wenn eingefleischte Assemblerprogrammierer einen f nfseitigen Assembleroutput von CREST C mit den Worten Also die drei Befehle sind ja wohl Mist kommen tieren bin ich es durchaus zufrieden Bei der Wartbarkeit und der Portierbarkeit der Quelltexte sammelt eine Hochsprache in jedem Falle die entscheidenden Pluspunkte In vielen F llen liegt es nicht im Sinne des Entwicklers portabel zu programmieren Stattdessen soll das einmal ausgew hlte Betriebssystem bis an die Grenzen der Leistungsf higkeit ausgereizt werden Wer der Hardware grunds tzlich das Maximum an Leistung entlocken m chte kommt um die Programmie rung auf Assemblerebene nicht herum Ein Compiler kann prinzipiell Keinen besseren Code erzeugen als es ein ausgebuffter Programmierer mit mehrj hriger Prozessorerfahrung und viel berfl ssiger Zeit mittels eines Assemblers tun k nnte Der Code eines Compilers ist stets nur ein Kompromiss aus ver tretbarem Aufwand bei der bersetzung und der Qualit t des erzeugten Codes Mit einer Tabelle zum Ausz hlen der Taktzyklen und viel Zeit an der Tastatur sieht Compilercode bei Laufzeitvergleichen immer blass aus Die Frage ist
357. sdauer von Variablen 53 static int cj Alle drei Variablen a b und c sind dauerhafte Variablen CREST C reserviert da keine keine In itialisierung erfolgt ist f r diese Objekte Speicherplatz in der bss Section Dieser Speicherbereich wird beim Start einer Task automatisch mit Nullen initialisiert Erfolgt jedoch wie im n chsten Bei spiel ersichtlich eine explizite Initialisierung durch den Programmierer so legt CREST C die Daten in der data Section ab Dieses unterscheidet sich von der bs s Section lediglich dadurch dass der Compiler nun auch Startwerte hinter dem Programmcode ablegen muss die bei jedem Aufsetzen einer Task in die der Task zugeordnete data Section bernommen werden m ssen int a 1 Diese Variablen werden beim Programmstart static int b 2 einmalig vorneweg mit den Startwer ten versehen void f void static int c 3 Um auf einen h ufig gemachten Anf ngerfehler nochmals hinzuweisen Die st at ic Variable c wird nicht bei jedem Durchlauf durch die Funktion f erneut initialisiert Die Initialisierung erfolgt nur ein malig beim Programmstart Variablen innerhalb von Funktionen sind in der Regel fl chtiger Natur Das bedeutet dass ihre Lebens dauer nur vom Eintritt in die Funktion bis zum Verlassen der Funktion reicht oder um korrekt zu sein sich nur auf den Bereich erstreckt der dem zugeordneten Compound Level den beiden geschweiften Klammern die zur Defin
358. sei vom Linker mit dem Namen X versehen worden Nach dem Laden des Programmes existiert demnach ein C Shellmodul SMDL X im System absolute absolute_variable long x pragma TASK void A void int a0 static int al 3 14 Schliisselworte fiir Speicherklassen 51 long y pragma TASK void B void int b static int bl long zZ void main void int w A B rt_suspend A B rt_suspend Wenn Sie dieses C Shellmodul X starten so erzeugt das System einen neuen Taskkopf und im Normal fall liegt danach eine Subtask mit dem Basisnamen X und einer vom RTOS UH verteilten Kennummer vor Der Einfachheit halber fangen wir im Beispiel bei 00 mit der Verteilung an Unsere Task liegt also als X 00 in der Speicherkette vor Die Aufrufe der Funktionen A und B f hren zur Erzeugung zweier Sohnprozesse A 01 und B 02 Die exakte Vorgehensweise ist im Abschnitt 13 3 1 beschrieben Anschliessend wird unserer Vaterprozess suspendiert um das Zwischenergebnis anzuschauen Wenn unsere main Task X 00 das Bed rfnis versp rt sich mit ihren Ablegern zu unterhalten so kann das ber die normalen globalen Variablen von X 00 geschehen da bei der Erzeugung der beiden Kinder auch das Wissen um die Lage der globalen Zellen von X 00 vererbt wurde Dabei gelten die bei C blichen Scope Regeln So kommt X 00 an alle drei globalen Zellen x y und z heran w hrend A 01 nur die Variable x kennt und B 02 nur Zugri
359. sich leichter verstehen lassen und meiner Ansicht nach fast selbstdokumentierend sind Der Basisname der Trap oder RTOS UH spezifischen Anschl sse lautet rt Darauf folgt eine Art Kurzbeschreibung der jeweiligen Funktion Die erforderlichen Prototypen sind in der Includedatei lt rtos h gt enthalten Die Verwendung dieser Funktionen f hrt mit absoluter Gewissheit zu ernst haften Problemen bei der Portierung auf ein anderes Betriebssystem Die folgenden Erkl rungen be treffen alle Funktionen die die entsprechenden Parameter enthalten und sind dort nicht mehr explizit beschrieben 15 1 1 1 Relative oder absolute Zeitangaben Zeiten k nnen relativ oder absolut angegeben werden Die Angabe erfolgt grunds tzlich in Millise kunden Absolute Zeiten beschreiben feste Zeitpunkte z B 19 45 05 Relative Zeiten geben eine Zeitdauer ab dem aktuellen Zeitpunkt an z B nach 5 Sekunden Unterschieden werden absolute und relative Zeiten durch das oberste Bit des betreffenden 32 Bit Langwortes Ist es gesetzt so wird die 15 2 Tasks und Tasking 131 Zeit als relativ zum Aufrufzeitpunkt der Funktion interpretiert Aus einer absoluten Zeit kann folgen dermassen eine relative gemacht werden TimeSchedule startzeit 5000 Ox80000000UL 5000 ms 15 1 1 2 Trapinterne Tasksuche Es gibt fiir die Traps die mit einer Task arbeiten sollen zwei unterschiedliche Mechanismen um diese zu identifizieren e Der Trap bekommt einen Pointer auf de
360. so nicht selbstst ndig terminiert hat void rt_set_report_code ReportCode rep_cod ReportCode rt_get_report_code void Die Reportcodes SFFFFFFFF 0 bis einschliesslich 10 sind f r Systemmeldungen reserviert M chte eine berwachte Task dem W chter weitere Informationen zukommen lassen so lassen sich mittels der Funktionen rt_set_report_code und rt_get_report_code entsprechende Eintr ge vom Sohnprozess vornehmen und sp ter von Vaterprozess auslesen Dabei tr gt der Sohn prozess die sp tere Antwort in seinem eigenen Taskkopf ein Terminiert sich der Sohn ordnungsgem ss selbst so vererbt er diese Information als eine seine letzten Lebensbekundungen an seinen Vater Die ser erh lt die Information entweder ber den R ckgabewert von rt_wait_for_exit oder kann ihn mittels rt_get_report_code sp ter auslesen 15 3 2 3 Terminieren Terminierung ist die zur Aktivierung entgegengesetzte Operation Die Ausf hrung einer Task wird an der Stelle an der sie sich gerade befindet abgebrochen Die Task wird sofort in den Zustand DORM berf hrt es sei denn eine gepufferte Aktivierung liegt vor 140 15 3 Multi Tasking Bei der Terminierung wird der Task jeglicher zugeteilter Speicher entzogen Ausnahme TWSP resi denter Tasks und O Speicherbereiche und wieder zu freiem Speicher erkl rt Hat eine Task schon VO Operationen angestossen die noch nicht beendet sind so wird wie folgt verfahren alle Ausgaben bleiben wei
361. sollten Sie bei WARNING s bez glich fehlender Prototypen stets davon ausgehen dass das erzeugte Programm eher nicht lauff hig sein wird Funktionsaufrufe ohne Prototypen sollten Sie tunlichst vermeiden Wenn der R ckgabetyp einer Funktion nicht bekannt ist wird standardm ssig int vorausgesetzt Deckt sich diese Annahme nicht mit den Realit ten entsteht entweder schlechterer Code oder das Programm l uft irgendwann aus schwer nachvollziehbaren Gr nden gar heftig gegen die n chste deutsche Eiche Eine Meldung bez glich fehlender Funktionsprototypen sollte ebenfalls ernst genommen werden Feh lende Argumentprototypen sind unsch n f hren aber in der Regel zu korrektem Code 3 6 1 Prototypen f r R ckgabewerte Jede Funktion hat standardm ssig den Datentyp int als R ckgabewert Leider wurde auch in der ANSI C Norm die unselige Angewohnheit von FORTRAN nicht abgelegt einen Datentyp als Stan dard zu betrachten Funktionen k nnen s mtliche Basisdatentypen als Ergebnis liefern Seit Einf hrung des ANSI C Standards k nnen auch struct s und union s als Funktionsergebnis zur ckgeliefert werden Ausserdem kann eine Funktion ohne R ckgabe nun mit dem Typ void vereinbart werden Es empfiehlt sich dringend alte Quellen zu berarbeiten die st ndig mit dem default Datentyp int hantieren da Sie sich sonst kaum vor der Masse der Fehlermeldungen von CREST C retten k nnen wenn er fehlende ret urn Werte moniert Der minimale Prototyp d
362. ssat unbekannt Auftreten kann sowas eigentlich nur wenn Sie Schrott ins CE eingef llt haben der Eintrag 1dn ist dann der B sewicht oder ein Treiber angesprochen wurde der nicht installiert wurde Im zweiten Fall ist erstmal zu kontrollieren ob die Hardware beim Hochlaufen des Systems ordnungsgem ss erkannt wurde in diesem Falle melden sich die Treiber aus dem EPROM im Systemprolog der RTOS UH Startmeldung Fehlt dort ein Treiber den Sie da eigentlich erwartet h tten so deutet alles darauf hin dass eine Karte in ihrem Rechner fehlt der positive Fall oder die betreffende Hardware seit dem letzten Einschalten das Handtuch geschmissen hat dann haben Sie ein echtes Problem Auch bei nachladbaren Treibern kann es zu derartigem Verhalten kommen In 99 aller F lle wurde schlicht vergessen den Treiber zu laden oder der Treiber wurde bereits angesprochen bevor er sich in stalliert hat Lachen Sie nicht das ist wirklich ernst gemeint und fasst stundenlange Online Fehlersuche bei verzweifelten Anrufern knapp und b ndig zusammen Mit D k nnen Sie sich anschauen welche LDN s in ihrem System belegt sind Das betrifft aller dings nur die Treiber die beim Systemstart erkannt wurden Nachgeladene Treiber werden in dieser Tabelle nicht aufgef hrt bedauerlich aber leider ein Faktum Einzelheiten entnehmen Sie bitte dem Abschnitt 15 5 2 6 und der Beispieltabelle 15 10 Die Tabelle der m glichen LDN s muss nicht unbe dingt vol
363. start Code Kaltstart Routinen werden vor der Initialisierung der IDP s ausgef hrt Die korrekte Reihenfolge zum Aufsetzen eines Interrupt Handlers im EPROM k nnte korrekt folgendermassen ablaufen 1 Erzeugung einer Funktion mittels pragma COLDSTART Diese Funktion sollte die interrup terzeugende Hardware aufsetzen 2 Erzeugung einer Funktion mittels pragma WARMSTART Diese Funktion sollte die nunmehr verf gbaren Kommunikationspuffer initialisieren und bei Bedarf auch schon die Interrupts hard warem ssig freigeben 3 Erzeugung einer Grundebenentask Es bietet sich meist an diese mittels pragma SYSTEM TASK zu generieren und autostartf hig zu machen 13 5 3 3 Interrupt Handler mit absoluten Variablen Das die Kommunikation von Grundebene und Interrupt Handler auch ohne die Verwendung von IDP s funktionieren kann zeigt das nachfolgende Beispiel Hier werden C Variablen der Speicherklasse ab solute verwendet um eine gemeinsame Datenbasis zu garantieren typedef struct Task Xtra A char reader_ptr S Char writer_ptr H char buffer 256 DataSpace absolute DataSpace Buffer define DPC WORD 0x800L define IR4 void 0x70L define I_O char OxFFFF6803UL pragma INTERRUPT LEVEL 4 void Level4 void Buffer writer_ptr 10 Jetzt Betreuungstask wieder anwerfen bptr gt tid gt block amp BLKBSU DPE void main v
364. steht nur ein eingeschr nkter Befehlssatz zur Verf gung der jedoch f r die blichen Aufgaben von Nutzerprogrammen hinreichend ist Im privilegierten Betriebszustand dem Supervisor Mode ste hen weitere Befehle bereit die f r administrative Aufgaben auf Betriebssystemebene ben tigt werden Dazu z hlen z B schreibende Zugriffe auf bestimmte Prozessorregister diverse Sonderadressierungs arten der CPU und viele andere Dinge mehr Die Zweiteilung dient bei vielen Betriebssystemen dem Datenschutz Man erreicht damit dass nicht jeder Anwenderprozess sich durch legale CPU Anweisungen Privilegien verschaffen kann die ihm nicht zustehen Nur der Systemadministrator kann Prozesse starten bei denen die Hardware Schutzmechanismen nicht mehr greifen Unter RTOS UH geh rten solche Datenschutz berlegungen nicht zu den Kriterien bei der Auslegung des Betriebssystems Jede Task kann sich beliebige System rechte verschaffen Diese Freiheit erkauft man wie berall im Leben mit einem zwangsl ufig h heren berlegungsaufwand bei der Verwendung dieser Features Man kann durch Missbrauch des 15 7 CPU Status wechseln 189 Supervisor Modes RTOS UH beliebig ver rgern das Systemverhalten gravierend beeintr chtigen Unter RTOS UH bewirkt ein Wechsel in den privilegierten Modus ein Ausschalten des Dispatchers Das bedeutet f r die Task die die Funktion rt_supervisor_mode aufruft dass sie nicht mehr durch eine andere Task vom Besitz des Betriebsm
365. t indem der Makrobezeichner mit umgeben wird Die oben aufgef hrte Regel wird demnach folgendermassen expandiert test sr test c test h ccc68k test c test obj cln68k test68k 1Ink test sr N TEST Nach dem Entfernen der Kommentare vor den PPC spezifischen Makros erh lt man folgendes Resultat test sr test c test h eccppc test c test obj celnppc testppc lnk test sr N TEST Sie erkennen daran auch dass eine erneute Definition eines bereits bekannten Makros nicht zu einer Fehlermeldung f hrt sondern die alte Definition kommentarlos bersteuert Das angef hrte Beispiel ist allerdings noch nicht praxistauglich da es sich nicht zur parallelen Er stellung beider Konfigurationen eignet und soll nun so erweitert werden dass die erzeugten Dateien projektspezifisch in den Ordnern ob j68k und ob jppc abgelegt werden Projekt f r 68K und PPC 84 10 3 Syntax von cmake EXT 68k EXT ppc CCE ccc EXT CLN c1n EXT OUTPUT obj EXT S S OUTPUT test sr test c test h S CCC test c OUTPUT test obj S CLN test EXT lnk OUTPUT test sr N TEST Bei der Definition der Makros fiir Compiler Linker und Ausgabeverzeichnis sehen Sie zun chst dass die Anwendung von Makros auch bei der Definition neuer Makros verwendet werden kann Weiterhin ist bei der Definition von OUTPUT das Einbau Makros S verwendet worden das CMAKE automatisch zu einem g ltigen Pathseparator des jeweiligen Entwicklungssystem
366. t n double frexp double value int n long double lfrexp long double value int n Die Funktion frexp liefert die Mantisse und den bin ren Exponenten einer Fliesskommazahl in zwei getrennten Werten zurtick Dabei wird aus dem Argument value eine Mantisse x absoluter Wert gr sser 0 5 und kleiner 1 0 zusammen mit einen Exponenten der Basis 2 gebildet Es handelt sich dabei um eine bin r normalisierte Fliesskommazahl Anders gesagt frexp erf llt die Gleichung value x 2 Der Wert x wird als Funktionsergebnis zur ckgeliefert der Exponent n in dem Integer auf den der Parameter n zeigt Wertebereich und Fehler Wird als Parameter value eine unzul ssige Zahl angegeben NaN oder Inf so wird ein domain error durch das Setzen der Variable errno auf EDOM angezeigt Der Eingabewert wird als Funktionsr ck gabe zur ckgeliefert und der Integerwert auf den der Parameter n zeigt auf Null gesetzt A 4 6 Idexp Syntax float fldexp float x int n double ldexp double x int nl long double lldexp long double x int n Die Funktion 1dexp liefert als Rtickgabewert value das Resultat der Berechnung value 1x2 stellt also das Gegenst ck zur Funktion frexp dar Wertebereich und Fehler Wird als Parameter x der Wert NaN angegeben so wird ein domain error durch das Setzen der Variable errno auf EDOM angezeigt Die Funktion liefert den Parameter x zurtick Wird als Parameter x de
367. t tzten Optionen aus Sie k nnen diese Usage Meldungen im Anhang ccc68k Abschnitt C 1 ccc ppc Abschnitt C 2 nachschlagen Das hier behandelte Beispiel kann sich von der Anzeige des von Ihnen erworbenen Compilers unter scheiden da Software in der Regel schneller als die zugeh rige Dokumentation w chst Die Kombina tion aus read_me und history File auf der ausgelieferten CD sollte dann den jeweils aktuellen Stand beschreiben Der Compiler gibt Release und Erstellungsdatum aus In diesem Fall handelt es sich um eine Crossver sion unter LINUX die Code f r 68k Prozessoren erzeugen kann Als erster Parameter wird der Name des zu bersetzenden C Programmes gefordert Es wird ein g ltiger Dateiname erwartet Wenn Ihre Datei nicht mit c endet so wird diese Extension automatisch erg nzt Der Aufruf ccc test ist also identisch zu ccc test c Der zweite Parameter ist optional Hier kann der Name der zu generierenden Objektdatei angegeben werden CCC generiert sich bei dessen Fehlen aus dem Namen der Eingabedatei eine Ausgabedatei mit der Endung ob Statt ccc test h tte man also auch ccc test c test obj mit identischer Wirkung eingeben k nnen 3 1 Die Optionen des ccc Die Optionen des CCc erlauben die Ansteuerung unterschiedlichster bersetzungsparameter des Com pilers Ohne Angabe von weiteren Optionen wird Code f r den MC68000 generiert Die weiteren Para meter stehen ebenfalls auf den Standardwerten f r den kleinsten unters
368. t tzten Prozessor Die Standard Optionen f r den ccc68k lauten 0 A 1 C 0 D 0 E 0 G 0 R 0 W 5 Y 0 Die Angabe der Optionen des CCC erfolgt hinter dem bzw den Dateinamen und wird durch einen Bindestrich eingeleitet Optionen ohne zus tzliche Parameter k nnen aneinandergereiht werden So ist die Schreibweise 2V identisch mit 2 V die Eingabe R 1V ist dagegen unzul ssig Die mehrfache Angabe von identischen Optionen f hrt in der Regel nicht zu Fehlermeldungen In den folgenden Kapiteln werden die Optionen des Compilers nach Themengebieten sortiert beschrie ben In den Tabellen ist sofern vorhanden die Standardoption in Fettdruck hervorgehoben 10 3 1 Die Optionen des ccc 3 1 1 Zus tzliche Argumente Sind mehr Argumente an den CCC zu bergeben als in der Kommandozeile untergebracht werden k nnen so lassen sich durch eine Argumentdatei weitere Parameter an den Compiler durchreichen Die Anweisung ccc test c 2 test opt A 2 hO args wird so abgearbeitet dass zun chst alle direkten Optionen die in der Kommandozeile aufgetaucht sind hier 2 und A 2 ausgewertet und danach hintereinander die Datei test opt auf dem aktuel len Workingdirectory und die Datei h0 args gelesen und ausgewertet werden Innerhalb der Argumentdateien sind die Optionen zeilenweise anzugeben Das folgende Beispiel stellt eine korrekt aufgebaute Argumentdatei dar 2U Ich bin ein
369. t auf ein CE so sind Systemabst rze vorprogrammiert Besonders ekelhaft ist es wenn man durch Unvorsichtigkeit ein bereits freigegebenes CE erneut freigibt rt release ce ber pr ft ob es sich bei dem adressierten Speicherbereich berhaupt um ein CE handeln kann und ignoriert eine Doppelfreigabe wenn dies nicht der Fall ist Die Funktion berpr ft jedoch nicht ob der Speicher bereich inzwischen von RTOS UH an ein v llig anderes CE vergeben wurde Die h ssliche Folge besteht bei einer solchen Fehlfreigabe darin dass nun eine nichtsahnende Fremd Task der man ihr CE 15 5 VO unter RTOS UH 163 heimtiickisch entrissen hat kurz danach voll daneben greift viel Spass beim Suchen nach solchen Fehlern void rt_release_ce C akt_ce Bei der Freigabe sind mehrere F lle zu unterscheiden e Das CE ist nicht in einen Ein oder Ausgabevorgang verwickelt Es wird sofort in freien Speicher verwandelt e Das CE steht in der Warteschlange einer Betreuungstask ist aber noch nicht in Bearbeitung Es wird das Release Bit gesetzt e Das CE ist in Bearbeitung einer Betreuungstask das CE hat keinen Besitzer mehr Es wird das Release Bit gesetzt e Das CE ist in Bearbeitung einer Betreuungstask die aber nicht Eigent mer ist Ist kein Ei gent mer vorhanden wird das CE zu freiem Speicher Ist noch ein Besitzer eingetragen und das Release Bit gesetzt wird das CE ebenfalls zu freiem Speicher ansonsten wird kenntlich gemacht dass da
370. t den Puffer mit den naechsten 5 Zeichen Wenn man hier angekommen ist ist der Puffer entweder gefuellt oder ein Fehler aufgetreten Ke if rce_A gt reclen lt 0 FEHLER else Hier stehen die Daten im Puffer kof ptr rce_A gt buffer Pointer auf Puffer for count 0 count lt rce_A gt reclen count printf d Zeichen 081X n count 1 ptr count amp OxFFUL rt_release_ce rce_A Und das CE wieder verschrotten E 176 5 T O unter RTOS UH 15 5 F Les rce_B rce_B gt ldn rce_B gt drive rce_B gt mode c Hier mit fuer B Port aufsetzen einem Puffer von 256 Byte B rt_fetch_ce 256 port_info_B ldn port_info_B drive r strcpy rce_ rce_B gt recl rt_transfer_ MODMWA Auf Beendigung des I O Vorgangs warten MODBIN Schnittstelle im binaeren Betrieb fahren IOCNE Fehlermeldungen im CE liefern IOCRWI Befehl READ WRITE B gt file_name READ_B xFF n 256 ce rce_B CE an den Treiber schicken Der Treiber liefert zunaechst aus seinem internen Puffer Zeichen bis die Laenge des CE s erfuellt ist Wenn Zeichen fehlen wird auf weitere Zeichen gewartet GG Wenn man hier angekommen ist ist der Puffer entweder b mit der gew nschten Anza
371. t ein Pointer auf den Verwaltungs Header vom Typ Linked Workspace geliefert wird Es stehen drei wesentliche Funktionen zur Speicherverwaltung Verf gung rt_alloc_memory_backward und rt_alloc_memory_forward besorgen im Freispei cher des Systems einen ausreichenden Block Dabei durchsucht rt_alloc_memory forward die Speicherketten von kleinen Adressen beginnend nach oben und teilt nach dem First Fit Verfahren Speicher aus dem ersten passenden FREE Block zu Entsprechend der RTOS UH Konvention sollten Sie diese Funktion f r grosse und langlebige Speicheranforderungen verwenden F r kleine oder kurz fristige Speicherallokationen wird unter RTOS UH bevorzugt Speicher von den h heren Adressen her zugeteilt Dazu dient rt_alloc_memory_backward Wenn Sie sich an diese Zuteilungsregeln halten erleichtern Sie dem Betriebssystem die Sucherei in den Systemketten ganz erheblich und wer den blicherweise mit besseren Leistungen von RTOS UH belohnt Zur Anforderung eines Speicherblockes an einer festgelegten Position ist zudem die Funktion rt_alloc_memory_fixed vorhanden die als Argumente die erste Startadresse des zu belegen den Blockes sowie die Startadresse ab der die n chste Speichersektion beginnen soll erwartet Befindet sich in diesem Bereich keine FREE Sektion so scheitert der Aufruf der Funktion Zur korrekten Verwendung der Trapanschl sse ist es unumg nglich die Funktionsweise und den Auf bau der Struktur LinkedWorkspace zu
372. t speziellen Bibliotheksfunktionen vollst ndig abzudecken m chte ich zur weiteren Vertiefung des Themas noch exemplarisch den Quelltext der Bibliotheksfunktionen rt_named alloc memory_forward und rt_named_free_memory vorstellen und Ihnen viel Spass bei eigenen Experimenten w nschen void rt_named_alloc_memory_forward char str size_t size void header A size_t len brutto void netto user_stack MemSectionName name_ptr z char 1_name_entry 15 6 Speicherverwaltung 187 len strlen str size 1 amp 1L size brutto sizeof UnlinkedWorkspace sizeof UnlinkedWorkspace size 7 if len gt sizeof MemSectionName brutto len 2 amp IL if header rt_alloc_memory_forward brutto NULL return NULL user_stack rt_supervisor_mode 0x2700U LinkedWorkspace header gt fort gt backt LinkedWorkspace header gt backt LinkedWorkspace header gt backt gt fort LinkedWorkspace header gt fort A name_ptr UnlinkedWorkspace header gt name if len lt sizeof MemSectionName memset name_ptr gt name sizeof MemSectionName strncpy name_ptr gt name str len Pointer auf die Rueckverkettung bestimmen netto char UnlinkedWorkspace header 1 else 1_name_entry char UnlinkedWorkspace header 1 name_ptr gt lname name
373. t wichtige Daten ber den Kontext des unterbro chenen Programmes holt den Vektor des Interrupts der gerade anliegt und exekutiert den Code der zu dieser Unterbrechung vorgesehen ist Im einfachsten Falle kann dieser Vektor auf ein RTE Return From Exception zeigen und die Interruptquelle schlicht ignorieren sofern diese sich ignorieren l sst In den n chsten Kapitel geht es darum wie man Code an Stelle eines RTE unterbringen kann um etwas sinnvoller auf eine Unterbrechung zu reagieren Ein Interrupt Handler unterscheidet sich von einer normalen Funktion in zwei wesentlichen Punkten Erstens wird er direkt von der CPU aufgerufen und Sie haben keinerlei Einfluss auf die Parameter die die CPU Ihnen bergibt Eigene Funktionsparameter an Interrupt Handler zu bergeben ist demnach nicht m glich Zweitens will niemand wissen was die Routine zu antworten gedenkt denn einen di rekten Aufrufer auf Funktionsebene gibt es nicht Schlimmer noch denn der unterbrochene Prozess soll typischerweise nichts davon bemerken dass ihm zwischenzeitlich die CPU entzogen war Der Interrupt Handler ist also stets als void Funktion anzulegen Der CCC wird mittels der Anweisung pragma INTERRUPT angewiesen aus der nachfolgenden Funktion einen Interrupt Handler zu generieren pragma INTERRUPT VECTOR 0x78 EPROM EVENT 0x00000001 IROFF void InterruptHandlerl void Das Beispiel w rde einen Interrupt Handler f r den Level 6 erzeugen und zudem durch
374. tand befindet den ich nicht erwartet habe Wenn Sie dennoch von derartigen Meldungen betroffen sind dann sollten Sie mir die Quelltexte zuschicken die dazu gef hrt haben Eine Ausnahme von dieser Regel stellen die FATAL Meldungen dar die Sie auffordern die Optionen a d oder f anzuwenden Lesen Sie dazu bitte die n heren Einzelheiten im Abschnitt 3 1 21 2 nach Die Optionen A B und W bestimmen das Verhalten des Compilers im Fehlerfalle Ohne Verwendung dieser Parameter versucht der CCC die Fehlerzeile auf den Schirm auszugeben und die Position des Fehlers zu markieren Anschliessend wartet der bersetzer auf eine Reaktion des Anwenders C ontinue A bort E dit 22 3 1 Die Optionen des ccc Bei Eingabe von A gegebenenfalls noch ENTER eingeben terminiert der Compiler augenblicklich verabschiedet sich mit User break und kehrt mit Fehlerstatus zum Aufrufer zur ck Bei C setzt der Compiler nach der Fehlerposition die Compilation fort Bei E ruft der Compiler den Editor CED auf und springt die Zeile an in der der Fehler erkannt wurde Nach der R ckkehr aus dem Editor terminiert sich der CCC In jedem Falle stellt der Compiler nach Feststellung des ersten ERROR s die Codegenerierung ein und l scht nach Beendigung des Programms auch das generierte objFile Bei gravierenden Fehlern kann es auch zu einem sofortigen Programmabbruch ohne die M glichkeit einer Einflussnahme kommen Fehlender Speicherplatz und viele Deklarationsfeh
375. tasks stets identisch Beim MC68000 tritt bei diesen Offsets die 32kB Grenze wieder auf F r den C Programmierer bedeu tet dies dass der Gesamtspeicherbereich der globalen Variablen die bereits beim Start des Program mes zur Verf gung stehen 32kB nicht berschreiten darf und der Prozessor immer mit WORD Offsets adressregister relativ auf die Variablen zugreifen muss Das stellt allerdings was den verf gbaren Speicher angeht keine grosse Einschr nkung dar da sich z B ber die Bibliotheks Routine mal loc beliebig Nachschlag zur Laufzeit anfordern l sst Die Option C digit bezieht sich auf Variablen die in der data bzw in der bss Section ab gelegt sind Die Option E digit steuert den Zugriff auf die task lokalen Variablen in der 1ocal Section Bedenken Sie bitte bei der Verwendung von Variablen aus der local Section dass jede Task also alle Sohnprozesse die von einem main abgespalten werden eigenen Speicher f r diese Variablen anlegt Dort mehr als 32kB abzulegen ist zwar prinzipiell mittels E 1 machbar sollte aber vermieden werden Variablenzugriff verschieblich MOVE L DO var W A4 ab MC68000 MOVE L DO var L A4 ab MC68020 Tabelle 3 4 Zugriff auf task lokale Variablen in der local Section Gerade f r Konstanten z B Tabellen besteht zudem keinerlei Notwendigkeit jeder Subtask ei ne eigene Kopie zur Verf gung zu stellen Deshalb werden derartige Bl cke in der text Section
376. taurieren MOVEA L SP SP TST W S800 W BMI DISP_Trace RTE Normal end of exception Trace DISP_Trace JMP 906 W Exit via dispatcher ER RTS End of function Trace Abbildung 13 13 Einstieg in Exception Handler Bei der Behandlung derartiger Exceptions stehen Ihnen die beiden Pointer registers und stack frame zur Verf gung registers zeigt auf eine Struktur deren Aufbau Sie Abbildung 13 14 ent nehmen k nnen typedef struct StoredRegisterSet unsigned long DO 2 D1 E DanS unsigned long _D4 _D5 _D6 DI Char AU FAL Z A27 XAS char Ad F_ASy F2A6 A FSSP 5 StoredRegisterSet Abbildung 13 14 Gerettete Register bei Exception Handlern Der Pointer stack frame k nnte z B mittels einer Struktur gem ss Abbildung 13 15 verwaltet wer den Zu Beginn liegt immer ein Wort mit den Statusregisterinhalt SR des unterbrochenen Prozesses Aus nahmen best tigen auch hier die Regel Es folgt ein Langwort mit dem program counter der Task und ein weiteres Wort mit der vector number der aufgetretenen Exception Diesem letzten Eintrag k nnen Sie entnehmen ob und wie es auf dem Stack weitergeht Als Beispiel sind hier in der folgenden Union ein paar denkbare Stackframes aufgef hrt Aber da kann Ihnen nur ein gutes CPU Handbuch weiter helfen Eine ausf hrliche Beschreibung ist im Rahmen eines Compiler Manuals wohl kaum m glich Bei allen Prozessoren die vom MC68000 abweichende Stackf
377. tcher des RTOS UH beim n chsten Kon textwechsel mit der Nase an die Wand und RTOS UH verl sst meist schweigend diese Welt Nachdem nun bekannt ist wie man den Taskzustand ermitteln kann sollen nunmehr die einzelnen Taskzust nde etwas genauer betrachtet werden 15 3 1 1 DORM Schlafend Der einfachste Betriebszustand wird DORM genannt engl dormand dt schlafend Eine Task im Zustand DORM ist im Rechner geladen aber nicht laufwillig Sie wird nie Prozessorkapazit t erhalten es sei denn ihr Betriebszustand ndert sich durch ussere Einwirkung Eine schlafende Task beansprucht vom Betriebssystem lediglich Speicherplatz f r ihren Code und ggf residente Tasks f r statische Variablen In allen anderen Betriebszust nden besitzt eine Task mit Sicherheit Speicherplatz f r ihren TWSP einzige Ausnahme siehe bergang Aktivierung 15 3 1 2 RUN Laufwillig Im Zustand RUN ist eine Task laufwillig Sobald keine h her priorisierte Task laufwillig ist wird diese Task den Prozessor erhalten und damit ihre Aufgabe bearbeiten k nnen Der Ubergang vom Zustand DORM in den Zustand RUN wird Aktivierung dieser Task genannt Sobald die Task den Prozessor zuge teilt erh lt beginnt sie ihre Abarbeitung beim Programmanfang Die Aktivierung kann nur von aussen d h von einer anderen Task oder vom Bediener ber den Befehl ACTIVATE Taskname erfolgen Es ist klar dass eine Task sich nicht von selbst aus dem Zustand DORM in den Zustand RUN
378. tcher gerettet werden m ssen Die Daten und Adressregi ster und der Kontext der CPU werden dabei ohne weiteres Zutun des Benutzers grunds tzlich gerettet Bei Benutzung einer FPU ist es anders denn hier k nnen Sie selbst entscheiden ob und wenn ja wel che FPU Register gerettet werden sollen Unter CREST C stellt sich die Frage welche FPU Register in Deckung gebracht werden sollen nicht denn im Gegensatz zum PEARL Compiler k nnen Sie als Benutzer nicht bestimmen welche FPU Register benutzt werden sollen CREST C verwendet bei Fliesskommaprogrammen blicherweise alle FPU Register die der Stein zu bieten hat und deshalb werden auch s mtliche Register FPO bis FP 7 bei einem Kontextwechsel gerettet Beim Linken eines Projektes weisen Sie mittels der CLN Flags fpu den CLN an den Startupco de so zu modifizieren dass die main Task sp ter die FPU Resgister rettet Bei Sohn Tasks die zur Laufzeit generiert werden k nnen wird standardm ssig bei der Erzeugung der Sohn Task nachge schaut wie die Vater Task es mit den FPU Registern h lt und dementsprechend der Eintrag beim Sohn vorgenommen pragma SUBTASK pragma SUBTASK USE_FPU pragma SUBTASK NO_FPU pragma TASK pragma TASK USE_FPU pragma TASK NO_FPU Mit der pragma Anweisung TASK oder SUBTASK kann jedoch auch explizit angegeben werden wie die Kinder sich sp ter verhalten sollen So macht es z B durchaus Sinn Sohn Tasks die nur mit Integer Arithmetik umge
379. te C main Task deren globale Variablen ber A5 adressiert werden k nnten noch existiert berhaupt eine Task deren Taskworkspace ber A4 erreichbar w re Auch alle Bemerkungen aus dem Abschnitt 13 5 bez glich des Aufrufers der Verf gbarkeit von globa len Variablen R ckgabewerten und bergabeparameter treffen auch hier zu Da Sie auch hier auf dem Supervisor Stack arbeiten sollten Sie es mit den lokalen Parametern nicht bertreiben da das System sich sonst mit grosser Wahrscheinlichkeit schon beim Hochlaufen kommentarlos von Ihnen verabschie det Also ein kleines Beispiel wenn Sie Peripherie angeschlossen haben die nach dem Systemstart Strei cheleinheiten ben tigt so funktioniert das mittels der folgenden pragma Syntax pragma COLDSTART void Kaltstart void Entsprechend funktioniert die Angelegenheit wenn Sie nach jedem ABORT bestimmte Anweisungen ausf hren m ssen pragma WARMSTART void Warmstart void 122 13 7 Kalt und Warmstart Code Kapitel 14 Uber Programme Tasks und Shellmodule Da CREST C Programme sich nicht im luftleeren Raum bewegen sondern fest eingebetet unter RTOS UH dessen Features nutzen folgt nunmehr eine kleine Einf hrung in einige ausgew hlte Be reiche des Betriebssystems Um das Verhalten von C Programmen verstehen zu k nnen sollten Sie unbedingt diese Kapitel durchlesen und auch begreifen F r Anwender die von Fremdbetriebssystemen kommen sind manche Dinge
380. te Rekursion absteigen kann gen gt also eine Stackanforderung von etwa 12 kB f r diesen Programmteil Sollte eine klare Aussage ber die zu erwartende Rekursionstiefe nicht zu machen sein so hilft nur eine grossz gige Auslegung des Stacks und eine vern nftig gew hlte Abbruchbedingung Anschliessend k nnen Sie einen Gott Ihrer Wahl um Erleuchtung und Beistand anflehen und das Programm starten Die Angelegenheit klingt gef hrlich und sie ist es auch Mit etwas bung hat man jedoch sehr rasch heraus wie gross der Stack bei bestimmten Problemen gew hlt werden muss um sich beruhigt und sicher zu f hlen Es empfiehlt sich dringend in der Testphase den Stack reichlich zu bemessen und die Programme mit der U Option zu bersetzen Da ich Sie nun genug erschreckt habe ist es an der Zeit Ihnen zu verraten wie es auch einfacher geht In der Includedatei lt rtos h gt ist der Prototype der Funktion rt used stack zu finden Wenn Sie Programme mit U Option compiliert haben f hrt das laufende Programm eine Sicherheits ber pr fung und zus tzlich eine kleine Statistik ber den maximal benutzten Stack durch Sie k nnen also am Programmende die Funktion rt used stack aufrufen und sich die maximale Zahl der allo kierten Bytes auf dem Stack anschauen Es empfiehlt sich bei derartigen empirischen Versuchen den zu erwartenden worst case zu simulieren einen Sicherheitsaufschlag beim Linken zu spendieren und rekursive Funktionsaufrufe zus
381. tem eben diese Task laufen Sie exekutiert mit der absolut niedrigsten Priorit t eine Endlosschleife e Weiterhin existiert eine Error Task ERROR die immer dann aufgerufen wird wenn Fehlermel dungen auszugeben sind Diese Task l uft sehr hochprior also mit negativer Priorit t und Anwendertasks sollten es tunlichst unterlassen mit noch h herer Priorit t laufen zu wollen Wenn dieser Punkt erreicht ist dann stehen Ihnen die bekannten Dienste von RTOS UH zur Verf gung Erst jetzt wird das Tasking und die Bearbeitung von Interrupts zugelassen Erst k nnen alle Traps und Systemfunktionen genutzt werden 204 16 4 Normalbetrieb Kapitel 17 Der Umgang mit Scheiben In den folgenden Abschnitten soll erl utert werden welche zus tzlichen Features von CREST C Programmen genutzt werden k nnen bzw wie Programme aufgebaut sein m ssen die auf das C Laufzeitsystem verzichten wollen 17 1 Scheiben Scannen Wenn Sie ein kleines CREST C Programm geschrieben haben in dem sich eine Warmstart Scheibe befindet werden Sie nach schnellem Laden und einem anschliessenden ABORT frustriert feststellen dass sich eigentlich nichts getan hat Der Grund ist dann nicht in einem Fehler des RTOS UH oder des Compilers zu suchen Der Witz besteht darin dass nur Scheiben gefunden werden die sich im Abtastbereich des Scanners befinden und auf gerade Adressen liegen Unter RTOS UH besteht auch auf Nutzerebene die M glichkeit nach Scheib
382. ten Pointer um den alten User Stack zu restaurie ren Dazu noch ein paar erkl rende Worte void rt_user_mode void user_stack Der Supervisor Mode der Motorola CPU s verwendet einen eigenen Stack Dieser Supervisor Stack ist unter RTOS UH verdammt knapp dimensioniert und bei berl ufen kommt es definitiv zum Super GAU Deshalb verwendet CREST C einen Trick und tr gt beim Wechsel des CPU Modus automa tisch den User Stack der aufrufenden Task als Supervisor Stack ein Die Dimensionierung des User Stacks liegt wie im Abschnitt 3 7 beschrieben in der Hand des Programmierers Beim Aufruf von rt_supervisor_mode wird der alte Supervisor Stackpointer als Resultat geliefert Beim Wech sel in den User Mode muss dieser Pointer wieder restauriert werden um den alten Systemzustand wieder herzustellen Bei der Belastung des Stacks auf Supervisor Ebene sollten Sie sich dennoch etwas zur ckhalten Das folgende kleine Beispiel stellt eine bliche Sequenz dar wie man unter CREST C unteilbare Sequenzen kodieren kann void stack stack rt_supervisor_mode 0x2700 Hier den eigentlichen Code unterbringen rt_user_mode stack Der R ckfallmechanismus ist bei mittels der Compileroption U bersetzten Programmen bedauerli cherweise auf Supervisor Ebene paralysiert und deshalb stehr der Rechner wenn Sie in diesem Modus einen Stackoverf low erzeugen Sie sollten einer Task die in den Supervisor Mode wechselt
383. ten Startupdatei unterbleibt Ohne diesen Eingriff unterbleibt das Retten und Restaurieren der Fliesskommaregister der betreffenden Task oder des Shellmodules bei einem Taskwechsel 5 1 11 Zahl der FILE Strukturen Mittels der Option F files l sst sich die Zahl der gleichzeitig in Verwendung befindlichen filehand les f r I O Operation einer Task oder eines Shellmoduls beeinflussen Zul ssig Werte sind O und An gaben gr sser 3 Ein Programm das mittels F 0 gelinkt wurde kann keinerlei I O mehr ber Bi bliotheksroutinen durchf hren Selbst Ein bzw Ausgaben ber stdin stdout und stderr sind danach unm glich Bei F 3 stehen nur diese drei Kan le zur Verf gung Das Anwenderprogramm ist je doch nicht mehr in der Lage ber open bzw fopen Dateien oder Schnittstellen zu ffnen Der Defaultwert von 32 erm glicht es C Programmen pro Task maximal 29 eigene Dateien gleichzeitig offen zu halten 5 1 12 Vorgabe von Ladeadressen Der CLN erm glicht unter Verwendung der Option T address das resultierende Programm fest auf die Adresse address zu binden Verwendet das zu linkende Programm Variablen der Speicherklasse absolute und liegt das Pro gramm auf dem Zielsystem in read only Speicher so ist zudem die Verwendung der Option C address zwingend notwendig Mittels dieser Adressvorgabe wird ein Modul ben tigter Gr sse im RAM Bereich angelegt Dieses Modul erh lt standardm ssig einen auf sechs Buchstaben eingek rz ten Na
384. tenspeicher also der Bereich der f r ihre eigenen Daten zur Verf gung steht wird vom Betriebssystem nicht initialisiert 184 15 6 Speicherverwaltung enth lt also in der Regel noch die Daten der letzten Verwendung wer auch immer den Speicher vorher im Besitz gehabt haben mag 15 6 2 2 Procedureworkspace leicht verwaltet Die Verwendung der Trapanschl sse ist m hsam und bestraft Fehlbedienungen gnadenlos Um etwas einfacher an PWSP Memory heranzukommen sind ein paar Funktionen entstanden die sich etwas weniger benutzerfeindlich pr sentieren rt_pwsp_memory_backward und rt_pwsp_memory_forward verlangen nun nur noch die Angabe des vom Anwender gew nsch ten Netto Speicherbedarfs und ber cksichtigen intern den notwendigen RTOS UH Header Weiterhin zeigt der R ckgabepointer nunmehr direkt auf den Nutzdatenspeicher rt alloc memory fixed liefert bei Erfolg Nutzdatenspeicher im Bereich von start bis end Die Verwaltungsstrukturen befin den sich f r den C Programmierer unsichtbar direkt vor start void rt_pwsp_memory_backward size_t size void rt_pwsp_memory_forward size_t size void rt_pwsp_alloc_memory_fixed void start void end TRE rt_pwsp_free_memory void addr Eine Freigabe von Procedureworkspace w hrend der Laufzeit der Task ist vom Betriebssystem nicht als Trap vorgesehen Dazu bedarf es einiger spezieller Aktionen die von der Funktion rt_pwsp_free_memory ausgef hrt werden Um
385. tentypen abzudecken So steht es als Theorie klar und deutlich in der Norm Das Ignorieren der Konsequenzen f hrt gerade bei zeit kritischen Funktionen oft dazu dass der Compiler Code generiert der wie ein Schlag ins Gesicht wirkt Alternativ sind auch Ergebnisse denkbar die zwar logisch erkl rbar sind aber von vielen Anwender so nicht erwartet wurden Als beste Beispiele dienen da Vergleiche die nie oder unerwartet immer greifen unsigned int a signed int b a gt HS BRA H A ea if OL sch Ebenso unerfreulich sind die Versuche Variablen unterschiedlichen Datentyps mit identischem Bitmu ster zu vergleichen und feststellen zu m ssen dass der Compiler anderer Ansicht ber Identit t der Objekte ist signed char a OxFF unsigned char b OxFEF if a Wird nie durchlaufen else Wird immer durchlaufen Wenn Sie derartige Probleme vermeiden wollen sollten Sie tunlichst darauf verzichten Variablen und Konstanten unterschiedlicher Datentypen ungecastet aufeinander loszulassen oder sich wenigstens die Tabelle 3 14 einpr gen Die kursiv dargestellten Eintr ge UL in der Tabelle repr sentieren die Problemf lle bei denen zwei unterschiedliche Integer Datentypen nicht auf einen gr sseren Datentyp ausweichen k nnen der beide Wertebereiche komplett berstreicht Unter CREST C wird hier mit dem Typ unsigned long ge rechnet Es gibt jedoch auch einige C Compiler die hier anders verfahren und
386. terhin g ltig alle Eingaben die ohne MODMWA abgeschickt wurden sowie alle Eingaben bis auf eventuell gerade in Bearbeitung befindliche werden verworfen Das heisst hat eine Task Einga ben veranlasst so werden nur diejenigen Eingaben die gerade von einer 1 O Betreuungstask bearbeitet werden von der Betreuungstask zu Ende gef hrt alle anderen Eingaben werden verworfen Eine Terminierung ist in jedem Taskzustand m glich Auch eine Task die schon DORM ist kann ter miniert werden das Betriebssystem f hrt in diesem Fall allerdings keine Aktionen durch Die Termi nierung kann sowohl vom Bediener als auch von einer Task veranlasst werden f r Tasks ist sowohl Selbst Terminierung als auch Fremdterminierung zul ssig Die Terminierung wird durch den Bedienbefehl TERMINATE Taskname auch in der Kurzform T Taskname veranlasst Unter CREST C stehen dazu die zwei Funktionen rt_terminate_external und rt_terminate_external_quick zur Terminierung fremder Tasks zur Verfiigung Bestehende Einplanungen fiir Aktivierungen werden dabei nicht ber hrt Einplanungen auf Fortsetzung werden hingegen gel scht void rt_terminate_external char name void rt_terminate_external_quick Task task Zur Selbst Terminierung ist die Funktion rt_terminate_internal zu verwenden void rt_terminate_internal void Eine weitere Form der Selbst Terminierung besteht in der Verwendung der Funktion rt_terminate_and vanish die nach erfolgreich
387. terrupt Handler e 150 15 4 1 1 Timer Intertupt e 150 15 4 1 2 Schnittstellen Interrupt 222222 oo nun 151 15 4 1 3 Floppy Interrupt 2 2 CC Co oo nen 151 15 5 VO unter RTOSTU 1 2 a den ee Bin 151 15 5 1 Direkte Speicherzugriffe 151 15 5 1 1 berwachte Speicherzugriffe o 151 15 5 1 2 Peripherie Ein Ausgabe o o e 152 15 5 2 Von CE s Queues und Betreuungstasks o o 153 15 5 2 1 Anforderung eines Cie 153 15 5 2 2 Verschicken eines CES o e 155 15 5 2 3 I O Queues und Ger tetreiber e 159 15 5 2 4 Warten auf Beendigung eines I O Vorgangs 162 15 5 2 5 FreigebeneinesCE s o 00 0000 0 eee 162 15 5 2 6 ber Dateinamen und Pfade 163 15 5 3 Praktische Anwendung von CE s 2 Common 164 15 5 3 1 Serielle Schnittstellen 165 15 5 3 1 1 L n und drive bestimmen 165 15 5 3 1 2 Ein Ausgabe CE aufbereiten und wegschicken 166 15 5 3 1 3 Ein Output CE an die Duplex Schnittstelle schicken 169 15 5 3 1 4 Ein Eingabe CE aufbereiten und wegschicken 171 15 5 3 1 4 1 Eine Eingabe vom A Port 171 15 5 3 1 4 2 Eine Eingabe vom B Port 173 15 6 Speicherverwaltung a 180 VII INHALTS VERZEICHNIS 15 6 1 Genormte Speicheranforderungen 180 15 6 2 Direkte Speicheranforderungen 182
388. ts ist der Gedanke dass eine Task mit hoher Priorit t die Rechenzeit der CPU in einer Poll Schleife verheizt nicht gerade verlockend Viele Betriebssysteme DOS viele UNIX Systeme OS 9 etc sind in dieser Hinsicht eher schlecht drauf und warten leider nur zu oft tapfer auf die Fertigmeldung langsamer Peripherie indem sie ohne Erbarmen die I O Ports immer und immer wieder abfragen RTOS UH hat geht hier andere Wege die f r neue Anwender des Betriebssystems erstmal ungewohnt erscheinen 15 5 1 Direkte Speicherzugriffe Oftmals ist ein schneller Zugriff auf LUC Karten erw nscht In diesen F llen bietet C mit den normalen Sprachmitteln ausreichende M glichkeiten um 99 der auftretenden F lle zu erschlagen Es wird ein Pointer mit geeignetem Basisdatentyp auf die entsprechende Speicherstelle gelegt und ber normale Zuweisungen darauf zugegriffen Diese Methode funktioniert allerdings nur wenn der Zugriff ber MOVE x Anweisungen gestattet ist 15 5 1 1 Uberwachte Speicherzugriffe In manchen Fallen ist es ganz hilfreich Speicherzugriffe auf geschtitzte oder illegale Adressbereiche machen zu k nnen ohne dabei gleich einen BUS ERROR auszul sen Dieser Zustand ist hochgradig peinlich weil er das Aus f r die verursachende Task darstellt Einsatzf lle sind z B Adressbereiche 152 15 5 I O unter RTOS UH die nur im Supervisor Mode zugreifbar sind oder Zugriffe ber den Bus auf Bereiche von denen man sich nicht sicher sein ka
389. tzt und ihr Zustand auf SEMA d h wartend auf das Freiwerden einer Semaphore gesetzt Es wird eine Neuzuteilung des Prozessors notwendig und Task A hat gute Chancen nun die h chstpriorisierte laufwillige Task zu sein und den Prozessor zugeteilt zu erhalten Verl sst Task A die Engstelle so f hrt sie eine RELEASE Operation auf die Semaphore Engstelle durch Hiermit wird die Engstelle wieder freigegeben Auf den Computer bertragen bedeutet dies die Notwendigkeit einer erneuten Prozessorzuteilung und hierbei wird Task B auf Grund ihrer h heren Priorit t den Prozessor zugeteilt erhalten Umgesetzt von Fahrbahn Engstellen auf Datenbereiche ist also durch Einsatz der Synchronisations Operationen REQUEST und RELEASE die Integrit t des Datenbestandes gewahrt geblieben Von Bedienerebene her sind Semaphore nur ber ihre Adresse mit den Anweisungen REQUEST Se 146 15 3 Multi Tasking maphoradresseund RELEASE Semaphoradress ansprechbar zur Vereinfachung ist auch eine Anweisung RELEASE Taskname m glich die die Semaphore auf die eine Task im Zustand SEMA wartet freigibt Man beachte dass die letztgenannte Form der Anweisung zum einen nicht spezifisch eine bestimmte Semaphore anspricht da die Adresse der betroffenen Semaphor Variablen nicht ange geben wird zum andern aber stets genau eine und nur eine Semaphore betrifft da eine Task im Zustand SEMA stets auf nur eine Semaphore warten kann In Erweiterung zu dem bisher Geschildert
390. u platzieren Selbstverst ndlich verbessert sich das Verh ltnis von Brutto zu Nettospeicher bei gr sseren Speicherbl cken Trotzdem kenne ich eigentlich keinen C Programmierer der nicht eigene Speicherverwaltungen ber die Standardroutinen legt Selbst der C Compiler verwendet die Libraryfunktionen nur zur Beschaffung gr sserer Bl cke die dann durch bergeordnete Funktionen verwaltet werden Sicherheit hat eben ihren Preis und die Zahl der Bytes die die G ltigkeit eines Blockes seinen Zustand im Speicherring und viele langweilige Dinge mehr kontrollieren verlangt eben diesen Wasserkopf Betrachten Sie die Standard Funktionen deshalb als langsame aber sichere Arbeitsgrundlage die bei tagt glich vorkommende Programmierfehlern nicht unbedingt den Griff zum Stromschalter des Com puters erzwingt Selbstverst ndlich geht es auch anders Ich will hier nicht vorschlagen dass Sie sich eine neue ANSI C Speicherverwaltung kodieren Das ist kein Spielplatz f r Sie als Nutzer des Compilers Es gibt jedoch eine Reihe von Methoden sich legal vom Betriebssystem Speicher zu beschaffen Diese Wege sind in der Dokumentation des RTOS UH beschrieben und deshalb sollte die Nutzung derartiger System Funktionalit ten wohl gesichert sein Drei Wege der Speicherbeschaffung sollen hier vorgestellt werden um Ihnen die Allokation von dynamischem Speicher zur Laufzeit der Task zu erm glichen 15 6 2 1 Die Procedureworkspace Traps Der unmittelbarste Weg
391. uble 1log10 double 3 3 x x A 5 Potenzfunktionen 223 long double llog10 long double zi Die Funktion 1og10 liefert den Logarithmus des Parameters x zur Basis 10 A 4 10 modf Syntax float fmodf float X float wl double modf double x double y long double imodf long double x long double y A 5 Potenzfunktionen A 5 1 pow0O A 5 2 sort 3 5 3 2 5 2 1 5 1 0 5 0 0 2 4 6 8 10 Syntax float fsqrt float yo cee double sqrt doubl x Ce z t long double lsqrt long double x Die Funktion sqrt x berechnet die Quadratwurzel des Arguments x Wertebereich und Fehler Bei negativen Argumenten wird ein domain error durch das Setzen der Variable errno auf EDOM angezeigt Wird als Parameter x der Wert NaN oder Inf angegeben so wird ebenfalls ein domain error durch das Setzen der Variable errno auf EDOM angezeigt Die Funktion liefert den Parameter x zur ck Wird als Parameter x der Wert Inf angegeben so wird ein range error durch das Setzen der Variable errno auf ERANGE angezeigt Die Funktion liefert den Parameter x zurtick 224 A 6 Sonstige Funktionen A 6 Sonstige Funktionen A 6 1 ceil Syntax float fceil double ceil doubl long double lceil long doubl Die Funktion ceil x rundet das bergebene Argument x in Richtung auf den n chsth heren Integer wert auf und liefert das Resultat als Fliesskommazahl zur ck Wert
392. uern des Prozessinterrupts erfolgt mit tels der C Funktion rt_trigger_event Mittels dieser Funktion l sst sich bei Tests fehlende Hardware simulieren void rt_trigger_event Event mask 150 15 4 Interrupt Routinen 15 4 Interrupt Routinen Nach dem Konzept der Tasks ist das zweitwichtige Element f r die Effizienz von RTOS UH der plan volle Einsatz von Interrupt Routinen und Software Events Interrupts Unterbrechungen sind Ereignisse die von der Peripherie bzw den Treiberbausteinen f r Peripherieger te unter bestimmten Umst nden ausgel st werden Sie unterbrechen den regul ren Ab lauf eines Programms und werden von speziellen Programmteilen den Interruptroutinen bearbeitet Die Ursache f r den Einsatz von Interrupt Routinen liegt in der im Vergleich zum Prozessor langsamen Arbeitsweise von Peripherieger ten Bei einer seriellen Schnittstelle dauert z B die bertragung eines Zeichens bei 9600 Baud ca 1 ms selbst der alte MC68000 Prozessor k nnte die Daten jedoch um einen Faktor von ca 1000 schneller senden oder empfangen Da die bertragung eines Zeichens von der Hardware selbst ndig erledigt wird und den Prozessor nicht ben tigt ist es sinnvoll den Prozes sor in dieser Zeit andere Aufgaben erledigen zu lassen Erst bei Ende der bertragung eines Zeichens wird der Prozessor wieder ben tigt sei es um ein neues Zeichen bereitzustellen oder um das Ende der bertragung zu erkennen RTOS UH nutzt diese Pausen d
393. uf Resourcen zugreifen wollen und die kritischen 138 15 3 Multi Tasking Pfade mit Semaphoren oder Bolts abgesichert haben Stellt eine Task fest dass eine oder mehrere Tasks den kritischen Pfad bereits betreten haben und einen weiteren Zugang verbieten so bleibt die anfragende Task im Zustand SEMA liegen bis der kritische Bereich von der oder den Tasks wieder freigegeben wurde 15 3 1 9 7777 Mehrfachblockierung Eine Task ist mehrfach blockiert z B wenn sie im Zustand PWS zus tzlich vom Bediener suspendiert wurde Die Ausgabe von als Taskzustand ist hierbei nur als Verzweiflungstat des Betriebssystems zu werten das den Taskzustand nicht mehr in einem Wort berichten kann Intern wird die Kombination unterschiedlicher Zust nde korrekt behandelt Allerdings kann die Ausgabe von als Taskzustand auch auf eine Notwehrreaktion des Betriebssy stems hindeuten hat eine Task eine unerlaubte Aktion durchgef hrt die das Betriebssystem nicht mehr abfangen sondern nur beobachten konnte z B Speicherzugriffsfehler bei privilegierten Speicherzu griffen so versetzt es diese Task in den Zustand um ein Weiterlaufen der Task zuverl ssig zu verhindern 15 3 2 Taskzustands berg nge Nachdem die einzelnen Zust nde in denen sich Tasks befinden k nnen nun gekl rt sind werden hier die M glichkeiten Zustands berg nge zu veranlassen und zu beeinflussen erl utert Dies betrifft nur die grunds tzlichen Taskzust nde DORM
394. ug wirklich ein Fehler sein muss und warnt nur noch eindringlich Sie bekommen dennoch ladbaren Code heraus Ob die Program me dann auch wirklich lauff hig sind bleibt nunmehr Ihrem Forscherdrang berlassen Auf alle F lle sollten Sie die folgenden Warnungen niemals unbeachtet lassen Too few arguments passed to this function Too many arguments passed to this function Expected xxx argument s in call of function lt yyy gt Um Ihnen wenigstens die Chancen auf ein funktionsf higes Programm zu erhalten werden bersch ssi ge Parameter beim Funktionsaufruf so gecastet wie es im Abschnitt 3 6 2 beschrieben wurde Nutzen Sie bitte die Chance Programme jetzt auf die ANSI C Schreibweisen umzur sten Ich bin langsam etwas ver rgert ber Leute die mir meterlange Faxe mit gravierenden WARNING s dieser Kategorie zuschicken und dann auch noch ganz unschuldig fragen weshalb das Programm gelegentlich instabil l uft Beim Entwurf der ANSI C Norm ist leider eine Unart nicht abgestellt worden die gerade bei der Portierung fremder Quelltexte stets zu r tselhaften Abst rzen f hrt Die Angabe von Prototypen respektive extern Deklarationen ist immer noch innerhalb von Funktionen zul ssig Vom Prinzip her ist daran nichts auszusetzen Nur innere Prototypen verdecken kommentarlos alle usseren Verein barungen Diese M glichkeit bereitet in neun von zehn F llen rger CREST C folgt bei Prototypen folgenden Regeln e Prototypen sind nac
395. uhrzeit Bei date 0 wird in time die Zahl der Millisekunden seit Mitternacht erwartet und die Uhr neu gesetzt Das Datum ver ndert sich durch diesen Aufruf nicht Bei date 0 wird ist der Parameter t ime redundant Es wird nur das Datum gesetzt Das Format von date hat wie folgt auszusehen rt_write_battery_clock Oxddmmyyyy 0 dd Tag mm Monat yyyy Jahr Ein Interrupt kann ber den Bedienbefehl TRIGGER Eventkennzeichnung simuliert werden Dazu ist es zuvor notwendig den betreffenden Prozessinterrupt auch als Event bezeichnet f r das System freizugeben Freigabe und Sperren von Prozessinterrupts erfolgen ber die Bedienbefeh le ENABLE Interruptkennzeichnung bzw DISABLE Interruptkennzeichnung Die CREST C Funktionen rt_enable_event und rt_disable_event erlauben das Setzen und Zur cksetzen der Event Maske des Betriebssystems Beachten Sie bei der Verwendung dieser Be fehle stets daran dass es nur exakt eine Event Maske f r den gesamten Rechner gibt und unsinnige Zugriffe sich deshalb stets furchtbar global auf alle Tasks im System auswirken Es werden alle Prozes sinterrupts die in der Maske auf 1 gesetzt sind freigegeben void rt_enable_event Event mask Entsprechend k nnen mittels rt_disable_event alle Prozessinterrupts die in der Maske auf 1 gesetzt sind gesperrt werden Auch die Sperrung gilt global im gesamten System void rt_disable_event Event mask Das eigentliche Fe
396. ukleusEnd END Die mit dem Label Initial ScanTable markierte Tabelle liegt immer 0x20 Bytes hinter dem 198 16 2 Kaltstart Beginn des Nukleus und besteht aus zwei Langwortpaaren mit einem abschliessenden Langwort das immer den Wert Null enth lt Der Tabelleninhalt gibt quasi den Suchbereich vor in dem RTOS UH nach Scheiben forschen soll um sich zu konfigurieren Das erste Langwort eines Parchens bestimmt jeweils die Startadresse eines Bereiches und das zweite Langwort die Endadresse Ist das unterste Bit des Langwortes gesetzt so ist das betreffende Langwort als relativer Offset zum Nukleusbeginn zu interpretieren ansonsten handelt es sich um eine absolute Adresse im Speicherbereich Die Initial Tabelle besitzt lediglich die M glichkeit zwei Bereiche anzugeben In den meisten F llen reicht das v llig aus Es gen gt um dem Nukleus mitzuteilen wie gross der zu berscannende Bereich ist der bei der Implementierung vorgegeben wurde und erlaubt es dem Anwendungsprogrammierer einen zweiten Bereich frei zu definieren der zus tzlich zu untersuchen ist Im Beispiel ist nur ein Bereich definiert der vom Nukleusbeginn bis 128KB hinter dem Nukleusstart reicht Korrekt ausgedr ckt wird die Adresse die durch das zweite Langwort spezifiziert wird nicht mehr zum Test auf einen Scheiben Beginn OxAEB1 herangezogen womit das Beispiel nur einen Scan bereich von 128KB 16Bytes umfassen w rde um Haarspaltern seitenlange Faxe zu ersparen
397. ul 22 2 5 404 Ra ee A eae ia AO 93 13 2 Aufbau eines DATION Blockes e 94 13 3 EPROM Shellmodul 95 13 4 Taskkopf f rs RAM und oder EPROM 0000000000 96 13 5 C Taskim RAM x 2 2 ee a a he 96 13 6 Taskkopf f rs EPROM 97 13 7 C Taskim EPROM 2 CC oo nn 97 13 8 Beispiel zur Generierung von C Subtasks oaoa 101 13 9 StackoverflowaufInterruptlevel 2 2 Comm 110 13 10Kommunikation ber dynamischen Speicher 112 13 11 Kommunikation ber systemeigene IDP Puffer 02 113 13 12Kommunikation ber absolute Variablen 115 13 13Einstieg in Exception Handler 2 2 2 Comm mn 118 13 14 Gerettete Register bei Exception Handlen 118 13 15 Aufbau eines Exception Stackframes o o e 119 XVI ABBILDUNGS VERZEICHNIS 14 1 Aufbau eines Taskkopfes 124 14 2 Aufbau des System Taskworkspaces 125 14 3 Aufbau eines MemSectionHeader s o 0 000000 ee eee 126 15 1 Taskzustands berg nge 134 15 2 R ckgabewert von rt_task_status 2 2 CE 134 15 3 C Struktur zur Verwaltung eines CE S ooa 153 15 4 CE mit eigenem oder externem Puffer o nen 155 15 5 Darstelluns eines CHs na vee ke en DE are ei Bee 156 15 6 Verkettung der CE s mit der Task 2 2 22 2 Comm nn 157 15 7 Interner Aufbau einer Warteschlange 159 15 8 Beispiel einer Warteschlange 160 15 9 Verwaltung der Betreuungstask Adressen 161 15 10 Auszug aus einer Device Tabelle
398. um timing Abbildung 15 12 Aufbau des Errorcodes ab NUK 7 x Mittels des folgenden kleinen Programmes lassen sich z B alle unterst tzten Kombinationen der vor definierten Fehlertexte ausgeben ein entnervendes Spiel wenn Sie den Lautsprecher Ihres Terminals nicht stummschalten k nnen void main void ErrMessag message b c d for b 0 b lt 0xB b for c 0 c lt 0xE c for d 0 d lt 0xD d message b lt lt ErrMessage 8 c lt lt ErrMessage 4 d printf 041X n message rt_error MESSAGE TEST message 3 Ebenfalls erst ab Nukleusversion 7 x steht mit rt_decode_error eine Funktion zur Verf gung die die Dekodierung der Errorcodes in Klartextstrings erm glicht Die ersten drei Parameter der Funk tion enthalten den Pointer auf den Ausgabepuffer die L nge des Puffers und den zu bersetzenden Errorcode Zus tzlich stehen noch die Argumente ierrmsg und ierrlen zur Verf gung Wenn Sie dort sinnvolle Pointer vorgeben so liefert die Funktion dort den Pointer hinter den Ausgabetext und die Restgr sse des Puffers zur ck Sind Sie an einer oder gar beiden R ckgabewerten nicht interessiert so ist jeweils ein NULL Pointer als Argument anzugeben void rt_decode_error char errmsg ErrLength errlen ErrMessage errcod 192 15 8 Fehlermeldungen char jerrmsg ErrLength jerrlen JI 15 8 1 Das Error Handling von
399. ung 13 8 zeigt wie eine nahezu beliebige Anzahl von C Subtasks er schaffen wird und in einem globalen Array Z hler erniedrigt Wenn Sie die Quelle unter dem Namen SUBTASK compilieren erzeugt der Aufruf SUBTASK 10 10 Subtasks Eine Ausgabe Subtask gibt je weils drei Sekunden nach der letzten Ausgabe den aktuellen Stand der Z hler kund main berwacht die Kinder und terminiert wenn alle erzeugten Subtasks mit der Arbeit fertig sind include lt stdlib h gt include lt stdio h gt define NUMBER_OF_SUBTASKS 100 long max_tasks 0 long count NUMBER_OF_SUBTASKS int continue_dump 1 7 pragma SUBTASK PRIORITY 1 STACKSIZE 16000 char dumper void long Eos for continue_dump rt_resume_after 3000 Nach 3 Sekunden weiter for t 0 t lt max_tasks t print Sld gt S ld n ty count t 5 T pragma SUBTASK PRIORITY 20 STACKSIZE 8000 char counter long number register long number_count 10000 while number_count Globale Zelle runterzaehlen count number number_count Die Subtasks machen unterschiedlich lange Mittagspausen 100 13 3 C Subtasks rt_resume_after number void main int argc char argv long t 7 char sub_name NUMBER_OF_SUBTASKS char dump S int fertig weiter E printf main ist als Sa angelaufen n argv 0 if argc
400. unktionieren aber eben nicht allgemeing ltig sind Das history File liefert in die sem Fall meist wertvolle Hinweise Dennoch sollten Sie unbedingt anrufen wenn noch Fragen offen geblieben sind Kapitel 2 Der Einstieg Das folgende Kapitel soll einen berblick bez glich Lieferumfang und Tools des CREST C Paketes liefern Weiterhin soll das Zusammenspiel der verschiedenen Programme erl utert und an Hand von einigen Beispiel erkl rt werden wann man unter Einsatz welcher Waffen zu dem gew nschten Ergebnis kommen kann 2 1 Installation Die Auslieferung des CREST C Paketes erfolgt inzwischen verursacht durch die Gr sse der f r den Debugger ben tigten Bibliotheken auf einer CD Unter WINDOWS liegt das CREST C Paket unkomprimiert auf der CD vor Kopieren Sie den kom pletten Inhalt der Scheibe in ein beliebiges Verzeichnis auf ihrer Festplatte Unter LINUX liegt das CREST C Paket als komprimiertes tar Archiv vor und kann nur komplett in einem beliebigen Verzeichnis entpackt werden Das CREST C Paket besteht im wesentlichen aus vier Komponenten e den ausf hrbaren Programmen e den C Standard Bibliotheken e den zugeh rigen Headerdateien e der Dokumentaion Unterhalb des angegebenen CREST C Installationspfades liegen folgende Ordner e cbin die ausf hrbaren Programme e clib 68k die Startup s und Bibliotheken f r 68k CPU s clib ppc die Startup s und Bibliotheken f r PowerPC CPU s e h die zu den Bibliotheken
401. unser CE bereits das Ziel erreichen F r viele Betreuungs tasks sind diese Adressangaben bereits hinreichend Eine Betreuungstask die z B eine Floppy zu ver walten hat ben tigt f r einen Zugriff auf eine einzelne Datei zus tzlich noch eine M glichkeit die jeweilige Datei zu identifizieren Unter RTOS UH erfolgt diese Identifizierung grunds tzlich ber die Angabe des Dateinamens und des kompletten Zugriffspfades unter dem die Datei bei diesem Betriebs mittel anzusprechen ist F r Sie stellt sich nun das Problem in jedem CE den kompletten Dateinamen ohne die Angabe des Ger tes unter file_name einzutragen und den String ordnungsgem ss mit FF zu terminieren um RTOS UH und die auswertenden Betreuungstasks bei Laune zu halten Bitte denken Sie daran die se Aktion nicht gedankenlos mit strcpy durchzuf hren da RTOS UH mit der abschliessenden Null herzlich wenig anfangen kann Der komplette Eintrag in filename darf 23 Zeichen plus Ter minator nicht berschreiten wenigstens gilt das f r die meisten gebr uchlichen Systeme mit einer maximalen Pfadl nge von 24 Zeichen Neuere RTOS UH Systeme verwalten die maximal zul ssige Namensl nge sauber ber eine Variable die an der Position 8F 2 Wim Speicher zu finden ist Ein g ltiger Eintrag f r einen Filenamen k nnte z B wie folgt vorgenommen werden strncpy ce gt file_name ORDNER RTOS NAME xFE sizeof ORDNER RTOS NAME xFF 1 Solange man sicher davon ausgeh
402. urch Verteilung der Prozessorkapazit t an laufwillige Tasks Lediglich dann wenn der Prozessor f r die Betreuung eines I O Bausteins erforder lich ist wird er auch hierf r eingesetzt Die VO Bausteine l sen in diesem Fall einen Interrupt aus der die regul r arbeitenden Programme unterbricht RTOS UH h lt f r diese F lle spezielle Interruptrou tinen zur Betreuung der Bausteine bereit Hiermit wird erzielt das an keiner Stelle des Betriebssystems Prozessorkapazit t durch wiederholtes Abfragen von Peripheriebausteinen verschwendet wird Interrupt Routinen liegen ausserhalb des Task Konzeptes von RTOS UH da die Interruptbeantwor tung schon im Prozessor als Sonderfall angelegt ist F r die Dauer der Bearbeitung einer Interrupt Routine ist der Taskwechsel Mechanismus von RTOS UH paralysiert Um diese Paralyse Zeiten m glichst gering zu halten arbeiten s mtliche Interrupt Routinen von RTOS UH mit Systemdiensten zusammen die im Regelfall als Tasks angelegt sind Auch hier werden die RTOS UH eigenen Mecha nismen der Taskzustands nderung ausgenutzt die Systemtasks setzen ihre Abarbeitung aus oder planen sich ein um dann von den Interrupt Routinen wieder fortgef hrt zu werden Kontrollierten Zugriff auf diese Interrupt Routinen hat lediglich der Systemprogrammierer Anwenderprogramme bedienen sich hierzu stets der Systemtasks 15 4 1 System Interrupt Handler RTOS UH benutzt Interrupts berall da wo es gilt nicht unn tig auf langsam
403. urierung des Betriebssystems initialisiert werden Dazu dienen auf Assemblerebene die Systemscheiben 2 bis 8 mit deren Hilfe sich 13 5 Interrupts und Exceptions 111 Datenpuffer der gew nschten Gr sse einrichten lassen CREST C erlaubt mittels der Anweisung pragma ALLOCATE_INTERRUPT_BUFFER LEVEL 3 SIZE 0x100 die Generierung derartiger Scheiben SLICE 2bis SLICE 8 Nach einem Kaltstart steht dann ein entsprechender Puffer f r den entsprechenden Interrupt Level zur Verf gung Hinter LEVEL d rfen die Zahlenwerte 1 bis 7 angegeben werden Die Gr sse des Buffers wird mit SIZE vorgegeben Beachten Sie dass die Summe aller Buffer deutlich kleiner als 32kB bleiben muss Zun chst soll nur die Existenz dieser Pointer interessieren die RTOS UH nach dem Kaltstart und dem Auffinden der eben beschriebenen Scheiben f r Sie einrichtet In Tabelle 13 2 sind die Adressen der IDP s Interrupt Data Pointer aufgef hrt Tabelle 13 2 Adressen der Interrupt Data Pointer Der weiterer Vorteil der IDP s besteht darin dass hierdurch unter RTOS UH im Bereich der kon stanten Kernelvariablen ein paar Pointer zur Verf gung stehen die sich trefflich f r eigene Zwecke missbrauchen lassen 13 5 3 Kommunikation mit Interrupt Handlern In der Folge soll an Hand von drei Beispielen verdeutlicht werden welche M glichkeiten prinzipiell bestehen um Daten mit einem Interrupt Handler auszutauschen Es ist beim Design des Datena
404. us tausches mit Interrupt Handlern stets zu beachten dass die Adressen gemeinsam genutzter Resourcen bereits zur Compile oder Linkzeit festgelegt oder ber gewisse Konventionen vom Interrupt Handler bestimmt werden m ssen 13 5 3 1 Interrupt Handler zum Nachladen Als Beispiel ist ein kleiner Interrupt Handler entstanden der sich zur Laufzeit auf Level 4 einklinkt Daten von einer imagin ren 1 O Karte liest und ber einen Puffer an eine Betreuungstask weiterleitet Hier soll ein IDP quasi als globaler Pointer eingesetzt werden Wenn die IDP s von einem Anwen derprogramm verbogen werden dann ist dieser Trick nur mit den IDP s 2 bis 7 machbar da IDP1 eine Sonderbedeutung besitzt eine Ver nderung dieses Pointers zur Laufzeit f hrt beim n chsten ABORT zu interessanten Umgestaltungen Ihrer RAM Inhalte die mit grosser Wahrscheinlichkeit dem Betriebssystem den Todesstoss versetzen typedef struct Task ET A char reader_ptr S Char writer_ptr H char buffer 256 DataSpace 112 13 5 Interrupts und Exceptions define DPC define IR4 define IDP4 define I_O WORD 0x800L void 0x70L void 0x83EL char OxFFFF6803UL E Ff Greed pragma INTERRUPT LEVEL 4 void Level4 void DataSpace bptr IDP4 bptr gt writer_ptr I_O Jetzt Betreuungstask wieder anwerfen bptr gt tid gt block amp BLKBSU DPE 5 vo
405. use steckt und die Betreuungstask ins Leere greift Es kann auch nicht Sinn der Angelegenheit sein jeder Betreuungstask die Aufgabe ans Bein zu binden das Vorhandensein der zu betreuenden Hardware st ndig erneut abzutesten Kartenschrott von dem man von Beginn an weiss dass der Kram stochastisch im laufenden System abschmiert hat eigentlich nichts in industriellen Anlagen verloren F r den einmaligen Vorabtest beim Hochlaufen des Systems existieren unter RTOS UH die Skip Slices mit der Nummer 1 Der Maschinencode direkt hinter der Signalmarke einer solchen Scheibe wird bei der Systemkonfiguration ausgef hrt und in Abh ngigkeit des R ckgabewertes wird ein zu definierender Bereich bei der Systemkonfiguration ignoriert oder als g ltiger Scanbereich akzeptiert Auf diese Weise lassen sich z B Kaltstartscheiben und Systemtasks die wegen fehlender Hardware nur Unfug anstellen w rden komplett ausblenden Sie k nnen beim Systemstart blicherweise an Hand der ausgegebenen Headertexte feststellen welcher Treiber vom System eingebunden wurde Unter CREST C kann dieser Mechanismus recht simpel mittels der zwei pragma Anweisungen START_SLICE_SKIP und END_SLICE_SKIP ausgenutzt werden Dabei sind einige Konventionen einzuhalten Direkt hinter jedem pragma START_SLICE_SKIP wird eine Testerfunktion ohne Pa rameter und mit R ckgabetyp int erwartet hnlich zu den Kalt und Warmstartscheiben siehe Ab schnitt 13 7 ist das Spielen mit Variablen hie
406. usendmal ein CE vom Be triebssystem anfordern das die Puffergr sse Null besitzt ohne zwischendurch auch wieder CE s frei zugeben dann greift ein Sicherheitsmechanismus der verhindern soll dass eine einzelne Task sich ber Geb hr mit Speicherplatz vollsaugt Die Task wird beim berschreiten einer magischen Grenze eisenhart blockiert bis wieder CE s freigegeben werden und das Kontingent der Task f r weitere An forderungen unterschritten wird Also achten Sie darauf dass hier f r Task die geniale M glichkeit besteht sich selbst zu blockieren wenn sie zu gierig und gedankenlos CE s zu hamstern versucht Wenn das CE vom Betriebssystem angeliefert wurde respektive der Pointer auf ein solches Commu nication Element gilt es zun chst den sp teren Empf nger einzutragen Zu diesem Zwecke werden die gerade ermittelten Informationen ber die anzusprechende Schnittstelle ins CE geschaufelt wce_A gt 1dn port_info_A ldn wce_A gt drive port_info_A drive strcpy wce_A gt file_name WRITE_A xFF Bei der Gelegenheit sollte man dem CE auch gleich einen Namen verpassen Wie gesagt fiir seriel le Schnittstellen macht das keinen direkten Sinn weil der Treiber den Namen sowieso ignoriert aber 15 5 VO unter RTOS UH 167 die Zeit sollte schon brig sein um das CE mit einem sprechenden Namen zu versehen Die vorge stellte Variante hat sich bei mir eingeb rgert um kurze CE Namen einzutragen Vergessen Sie n
407. utet n mlich die lustige Meldung Stack_overflow_ SUSPENDED Die Auswirkungen der U Option des CCC hat die Task aus dem Rennen geworfen bevor die Grenze des dynamischen Stacks berhaupt greifen konnte Die implizite Grenze zur Stack berwachung der U Option ist auf 256 Bytes fest eingestellt ist eine kleinere RANGE Angabe f r dynamische Stacks kann folglich nicht greifen N chster Versuch pragma DYNAMIC_STACK NEWSTACK 16384L RANGE 512 Der Rechner mault oder steht schweigend auf dem Tisch traurig aber wahr Jedenfalls war die Ange legenheit bestimmt nicht so geplant Aber schliesslich wird man nur durch Schaden klug Die RANGE Angabe ist als Sicherheitsabstand gedacht Da die Abfrage zu Beginn der Funktion stattfindet die mit einem dynamischen Stack bedacht werden soll muss selbstverst ndlich auch all das ber cksich tigt werden was sich innerhalb der Funktion selbst abspielt In unseren Falle steht dort ein unschuldig wirkendes printf und der rekursive Aufruf von f Da das Programm eine Weile gelaufen ist und uns stets verraten hat dass die rekursive Funktion f sich selbst mit einer Stackbelastung von besagten 120 Bytes erreichen kann muss etwas unvollst ndig sein und so ist es auch wenn Sie bei den Tests nicht die Testbibliotheken stdx 1lib oder fltx lib verwendet haben Die meisten Bibliotheken betreiben selbst keinerlei Statistik Sie sind gr sstenteils ohne U Option compiliert worden Der Wert den uns
408. utomatisch bei jedem Eintritt in eine Funktion neu angelegt Ihre Lebensdauer beschr nkt sich auf die Laufzeit der jeweiligen Funktion in der sie deklariert wurden Da C Funktionen rekursiv aufgerufen werden k nnen w re es unzul ssig f r diese Datenbest nde einen festen Datenbereich im Speicher zu allokieren Vielmehr wird dazu eine dynamische Form der Speicherplatzanforderung benutzt der Stack oder Stapel Dummerweise ist vielen rekursiven Problemen nicht direkt anzusehen wie tief die Rekursion zu ihrer L sung reichen wird Und damit ist man dann an einem kritischen Punkt Wie gross muss der Stack gew hlt werden um einen berlauf zu vermeiden Eine eindeutige Antwort darauf kann es in den meisten F llen nicht geben Im Prinzip sind Sie selbst daf r verantwortlich welche Gr sse Sie als sinnvoll ansehen Sie m ssen sich beim Linken Ihrer Programme darauf festlegen wieviel Speicherplatz Sie f r den Stack verschwenden wollen Wenn Sie zu grossz gig sind bleibt viel Speicher unbenutzt im Besitz Ihrer Task Sind Sie zu kleinlich kommt es zu einem Stackoverflow und damit zu einigen blen Verwirrungen in Ihrem System Um die variablen Daten zu verwalten werden von CREST C drei Adressregister benutzt Der Stack pointer SP bzw A7 zeigt jeweils auf die aktuelle Position in Ihrem Stack Die globalen Daten werden ber das Adressregister A5 angesprochen Die task lokalen Variablen werden ber Adressregister A4 verwaltet Globale Variab
409. verstehen Zu Beginn der Struktur liegen zwei Pointer head forward und head backward die das Betriebssystem zur Verkettung aller von ihm ver walteten Bereiche benutzt Darauf folgen noch zwei Speicherpl tze in denen RTOS UH die aktuelle Verwendung des Blockes head typ und die Kennziffer des Benutzers head owner eingetragen hat In head t yp ist nach der Speicheranforderung eingetragen dass es sich bei dem Block um PWSP Procedureworkspace handelt Zur Verwaltung eines Moduls w rden diese Informationen bereits aus reichen Diese Speicherk pfe werden vom RTOS UH angezeigt wenn Sie auf Kommandoebene S eingeben Bei PwSP Bl cken sind zudem die drei folgenden Pointer sinnvoll vorbesetzt Mittels fort und backt wird eine weitere doppeltverkettete Liste verwaltet in der s mtliche PwSP Anforderungen der Task aufgef hrt sind um bei Terminierung der Task auch aufr umen zu k nnen Die Task die den Block nun besitzt ist zudem noch mittels des Pointers t ido zu identifizieren Bei der Anforderung von Speicher mittels der direkten Trapanschl sse m ssen Sie stets ber cksichti gen dass RTOS UH die Brutto Blockgr sse als Argument verlangt Wenn Sie also mittels der drei Trap Anschl sse Speicher allokieren m ssen Sie den Platz f r einen Header zus tzlich anfordern und daran denken dass ihre Nutzdaten erst hinter dem Header beginnen Die Zerst rung des Headers w rde sehr schnell den totalen Absturz des RTOS UH nach sich ziehen Der Nutzda
410. visionen von Langworten von der CPU direkt unterst tzt Tests auf Adressregister sowie lange rela tive Spr nge und lange Adressregister und PC relative Adressierungsarten zugelassen Die Option 3 bedient die CPU32 Controller Familie von Motorola Diese Familie besitzt einen ka strierten Befehlssatz des MC68020 bei dem z B die eher selten benutzten Bitfeld Operationen und die doppeltindirekten Adressierungsarten gestrichen wurden Aus Sicht des Hardwareentwicklers stellt die CPU32 Reihe jedoch eine leistungsf hige und preisg nstige Alternative zum MC68020 dar Die Optionen 0 2 und 3 schliessen sich gegenseitig aus Die Prozessoren MC68040 und MC68060 sind die HighEnd Prozessoren in Motorolas 68k Serie Sie enthalten eine abgespeckte Version des Floatingpoint Prozessors MC68881 MC68882 Um die FPU 3 1 Die Optionen des ccc 11 ansprechen zu k nnen existiert die Option fpu Der CCC generiert dann die entsprechenden FPU Befehle und verzichtet auf die Emulation der Fliesskommaarithmetik Bei Verwendung dieser Option legt der CCC intern das Makro __FPU_ an Durch die Verwendung dieser Optionen werden automatisch Makros vom Compiler definiert die die Compilationsparameter wiederspiegeln Der Tabelle 3 1 k nnen Sie die definierten Namen und deren Ersatztexte entnehmen Frsatziext o mcosm_ m z Tabelle 3 1 CPU FPU Optionen 68K 3 1 3 Prozessorabh ngige Adressierungsarten fiir 68K Der MC68000 und seine Artverw
411. von Strukturmembers auf Wortgrenzen aus Die Mitglieder einer Struktur werden ohne Padding direkt hintereinander allokiert Parameter keine Siehe auch Abschnitte 3 4 1 1 und 3 4 1 2 B 17 MEMBER_PADDING_ON Stellt das regul re Padding von Strukturmembers auf Wortgrenzen wieder her Parameter keine Siehe auch Abschnitte 3 4 1 1 und 3 4 1 2 B 18 MEMORY Richtet eine Modulvariablenscheibe ein pragma MEMORY NAME 0x10000 0x20000 Parameter 1 String mit max 6 Zeichen langem Bezeichner 2 Startadresse des einzurichtenden Moduls 3 Endadresse des einzurichtenden Moduls Siehe auch Abschnitt 15 6 3 B 19 MODULE Richtet einen Modulkopf ein pragma MODULE MeinModulkopp Siehe auch Abschnitt 17 4 B 20 PEARL_PROCEDURE Einrichten von Prolog und Epilogcode f r die nachfolgende Funktion um den C Code von PEARL aus aufrufen zu k nnen 232 B 24 START_SLICE_SKIP pragma PEARL_PROCEDURE void PearlEntry void Optionale Parameter STACKSIZE size Gr sse des einzurichtenden Stacks in Bytes B 21 RAM_RANGES Richtet eine Scheibe ein in der die unter RTOS UH zu verwaltenden RAM Bereiche anzugeben sind pragma RAM_RANGES 0x000800 OxOFFFEO 0x100000 Ox3FFFEO Parameter n Zahlenpaare jeweils mit Start und Endadresse Siehe auch Abschnitt 16 2 10 B 22 SCAN_RANGES Richtet eine Scheibe ein in der die beim Systemstart zu berscannenden Speicherbereiche anzugeben sind pragma SCAN_RA
412. von normalen C Strings Sonderzeichen und Escape Sequences k nnen wie blich angegeben werden Den Zeilenumbruch und triviale Formatierungen bernimmt RTOS UH automatisch sofern die Meldungen kurz genug gehal ten sind Wenn die Headertexte mehr als 15 druckbare Zeichen enthalten sollten der Lesbarkeit halber Zeilenumbr che eingef gt werden pragma HEADER CCC 2 60 1 Das Beispiel fiihrt allerdings nur zu der erwiinschten Ausgabe wenn Sie die Scheibe im Scanbereich des RTOS UH plaziert haben und der Ort an dem die Scheibe auftaucht nicht durch eine explizite Skipperslice ausgeblendet wurde wie es in Abschnitt 17 2 erl utert ist 17 4 Modulkopf generieren Beim Verzicht auf Startup Dateien im Linkfile eines Projektes ist es zwingend notwendig zu Beginn des zu erzeugenden S Records einen geeigneten MemSectionHeader einzuf gen wenn man den generierten S Record sp ter laden m chte Um einen Modulkopf entsprechend den RTOS UH Konventionen zu generieren wurde die Anwei sung pragma MODULE implementiert Sinn macht dieses Kommando nur wenn es vor dem Beginn der eigentlichen Codegenerierung verwendet wird Das bedeutet dass es so ziemlich in die erste Zeile der C Datei geh rt die im Linkfile des Projektes ganz vorne steht Gepr ft wird lediglich die L nge des Bezeichners die 23 Zeichen nicht berschreiten darf Der triviale Anwendungszweck besteht darin z B PEARL Interfaceroutinen ladbar zu machen oder einen Modulkopf f r ei
413. ware zu verbrauchen Dazu existiert das Konzept der Scheiben bzw neudeutsch Slices Diese Scheiben bestehen aus jeweils drei 16 Bit Worten im Speicher Der Inhalt einer Scheibe beginnt stets mit OxAEB1 OxBF95 Es folgt eine verschl sselte Scheibennummer die sich nach der Rechenvorschrift scheibennr 2 1 37 ergibt Warum die Scheibennummer so seltsam kodiert wird Die Scheibennummer 1 bis 18 sind aktuell im RTOS UH Manual dokumentiert und werden im CREST C Handbuch in den folgenden Abschnitten erl utert F r RTOS UH stellt sich zu Beginn das Problem wo nach diesen Scheiben zu suchen ist Um sich selbst am Schopf aus dem Sumpf zu ziehen existiert zu Beginn des Nukleus an dokumentierten Position eine Tabelle der diese Information zu entnehmen ist Der folgende Assemblercode ist repr sentativ f r jedes RTOS UH auf Motorola Prozessoren NukleusStart DE E 0 0 LOADABLE MODULE DC W 0010 DEB NucX x DE E 800 INITIAL SYS STACK DC W NukleusEnd NukleusStart LEN OF NUKLEUS IROFF FOR USER RESET BRA W ColdStart FOR RESET BRA W EXCEPTION_Abort FOR ABORT Initial_ScanTable DEC S00000001 0001FFF1 FIRST SCAN RANGE DC L 0 0 ADDITIONAL SCAN RANGE DC L 0 END MARKER ColdStart Der Kaltstart Code WarmStart Der Warmstart Code G EXCEPTION_Abort Eine Testroutine ob ein Warmstart sinnvoll ist oder ein Kaltstart ausgel st werden muss i Der eigentliche Nukleus N
414. wurde ist demnach niemals von einer anderen C Subtask erreichbar die vom identischen Shellkommando aus erzeugt wird Der Begriff der globalen Variable ist unter CREST C also immer nur so zu verstehen dass die globa len Variablen einer CREST C Subtask nur innerhalb der Funktionen einer solchen Subtask und den Sub Subtasks Threads dieser Subtasks bekannt sind 50 3 14 Schliisselworte f r Speicherklassen 3 14 Schliisselworte f r Speicherklassen Die folgenden Schliisselworte bestimmen wie der Compiler Objekte verwaltet wo diese erreichbar sind und wie sie im Speicher abgelegt werden K amp R KS ae EA Fein register X X static X RI Tabelle 3 18 Schl sselworte zur Angabe der Speicherklassen F const x x pas x A Tabelle 3 19 Schliisselworte zur Modifikation der Speicherklassen 3 14 1 Das Schl sselwort absolute Um die Kommunikation von absolut unabh ngigen Prozessen miteinander zu erm glichen wurde die Speicherklasse absolute eingef hrt Das Schl sselwort wird in folgenden Kombinationen un terst tzt absolute int a static absolute int by extern absolute int x void f void static absolute int cj extern absolute int y Die absoluten Variablen dienen zur Kommunikation zwischen vollst ndig unabh ngigen Prozessen Als Beispiel diene ein Programm das in der Lage sein soll zwei dauerhafte Subtasks mit Namen A und B zu erzeugen Das Programm selbst
415. xceptions wurde im vorangegangen Kapitel bereits kurz angesprochen Da RTOS UH in n herer Zukunft in der Lage sein soll Signale auf Hochsprachenebene abzufangen und zu verar beiten betrachten Sie die hier vorgestellte Implementierung bitte als einen Notnagel der nur bis zur endg ltigen L sung des Problems auf Systemebene Bestand haben wird Die nun folgende Beschreibung reisst das Thema nur oberfl chlich an kann aber als Grundlage eines kompletten Exception Handlers dienen Eine wesentliche Einschr nkung ist dabei jedoch zu beachten Das RTOS UH hat ein gest rtes Verh ltnis zu den Exception Stackframes der Motorola Prozessoren Man merkt hier nur zu deutlich dass der MC68000 der Stammvater des Betriebssystems ist Fast alle Nachfolgemodelle bieten erweiterte M glichkeiten an die bei der Erkennung und Behebung derartiger Ausnahmebedingungen n tzlich oder absolut unumg nglich sind RTOS UH macht davon keinerlei Gebrauch und k rzt die ankommenden Stackframes die die CPU brav abgelegt hat auf ein f r den MC68000 verst ndliches Format ein Diese kurzen Stackframes sind dann allerdings nicht mehr zum Debuggen geeignet Was nun folgt stellt keinen Exception Handler dar der den des RTOS UH ersetzen soll Dazu sind die betreffenden Routinen zu stark ins System integriert Eine BUS ERROR Routine muss nicht nur in einem speziellen Einsatzfall f r eine spezielle Task korrekt funktionieren sondern f r alle denkbaren Situationen ger stet se
416. xe Library Linker e ssl68k exe Shared Library Linker clm68k exe Library Manager 2 2 Lieferumfang im berblick 7 e cop68k exe Object Inspector Bei Installation f r PowerPC Zielsysteme e cccppc exe e clnppc exe e Inkppc exe e sslppc exe e clmppc exe e copppc exe In beiden Paketen sind zudem die folgenden plattformunabh ngigen Tools enthalten e cmake exe e ced exe Unter LINUX fehlt den korrespondierenden Tools die Extension exe 2 2 2 clib 68k Der Ordner clib 68k enth lt die Startupdateien und Standardbibliotheken f r 68k CPU s Nach CPU Gruppen sortiert sind dies e Zielsystem 68000 long Libs debug Libs stackdebug Libs stdOfast lib stdOlong lib stdOstack lib stdOdebug lib stdOstackdebug lib fitOfast lib fltOlong lib fitOstack lib fltOdebug lib fltOstackdebug lib ffpOfast lib ffpOlong lib ffpOstack lib ffpOdebug lib ffpOstackdebug lib e Zielsystem CPU32 e Zielsystem 68020 long Libs debug Libs stackdebug Libs std2fast lib std2long lib std2stack lib std3debug lib std3stackdebug lib fit2fast lib flt2long lib fit2stack lib fit2debug lib flt2stackdebug lib ffp2fast lib ffp2long lib ffp2stack lib ffp2debug lib ffp2stackdebug lib fpu2fast lib fpu2long lib fpu2stack lib fpu2debug lib fpu2stackdebug lib 2 2 3 clib ppc Der Ordner clib ppc enth lt die Startupdateien und Standardbibliotheken f r PowerPC CPU s Da bislang erst die
417. ystem Aber Speicherschutz ist ohne Einsatz einer MMU faktisch ein Ding der Unm glichkeit Dem willentlichen Austausch von Daten kommt dieses Konzept jedoch sehr entgegen Wenn eine Task mit einer anderen Task Daten teilen m chte muss es lediglich eine M glichkeit geben mittels derer die Tasks sich auf einen gemeinsamen Speicherplatz im Adressraum einigen k nnen Die Daten liegen dann an einer absoluten Position und beide Tasks k nnen unter Verwendung der absoluten Adresse darauf zugreifen Wenn Sie in PEARL kodieren und mit globalen Variablen arbeiten dann ermittelt der LOAD Befehl zur Ladezeit einen freien RAM Bereich f r diese Variablen und ersetzt s mtliche Zugriffe auf diese Speicherzellen die in den S Records mittels spezieller Escapesequencen vermerkt sind durch die nun bekannte absolute Position im Speicher Diese Methode klappt ganz wunderbar hat jedoch in einer Reihe von Anwendungen ein entscheidendes Manko Eine Task die ihren ausf hrbaren Code mit absoluten Variablenbereichen verknipft hat ist nicht wiedereintrittsfest In vielen F llen braucht man auch keinen wiedereintrittsfesten Code Eine in PEARL kodierte Task legt ihre Variablen auf feste Positionen Demnach muss verhindert werden dass eine erneute Aktivie rung einer bereits gestarteten Task zu einer Doppelnutzung identischer Variablenbereiche f hrt Unter RTOS UH ist dies so realisiert dass das System derartige Mehrfachaktivierungen verhindert und die Aktivierun
418. zu verstehen wann Sie diese Funktion einset zen diirfen ist es hilfreich das Funktionsprinzip zu kennen Der angeforderte PWSP bleibt im Besitz der Task bis diese beendet wird Wenn Sie Bl cke w hrend der Laufzeit einer Task ans System zuriickgeben wollen so wird die Sache etwas schwieriger Es gibt zwar den RTOS UH Trap RWSP der Procedureworkspace wieder als Freispeicher ans Betriebssy stem bergibt Der Name des Trapanschlusses lautet rt_free_memory Also den Pointer auf den freizugebenden Block an diese Funktion tibergeben die Funktion aufrufen und weg ist der Speicher So einfach ist es nicht denn leider zerfetzt es jetzt mit aller Wahrscheinlichkeit in geringem zeitlichen Abstand ihr System Der Block ist zwar wieder frei und kann anderweitig neu allokiert werden die Task die ihn angefordert hatte kennt ihn jedoch noch und betrachtet ihn als integralen Bestandteil ihrer PWSP Kette Wenn zwei Tasks sich um einen Block streiten ohne voneinander zu wissen ist das meist das Todesurteil fiir die Systemstabilitat Darin besteht der ganze Trick Vor der Freigabe ans System muss der Block aus der PWSP Kette der Task ausgeklinkt werden die ihn angefordert hat Im Prinzip m ssen Sie nur die Zeiger fort und backt benutzen um dem Vorg nger und Nachfolger zu erkl ren dass der fragliche Block nicht mehr zwischen den beiden liegt Dazu ist ein kurzer Ausflug in den Supervisor Mode angebracht da das System sonst durch offene Ketten
419. zubekommen was mein eigener C Compiler jetzt wohl aus einem bestimmten Konstrukt zu machen gedenkt als Warnung Gerade beim Einsatz in sicherheitsrelevanten Bereichen obliegt es dem Programmierer mit besonderer Sorgfalt zu Werke zu gehen Aber warum erz hle ich das gerade die Leute die sich getroffen f hlen sollten sind die notorischen Nicht Handbuchleser Anh nger von anderen Sprachen f hren gerade in Hinsicht auf den Sicherheitsaspekt erbittert Krieg gegen C Es werden die d mmsten Argumente mit seltsam anmutendem Pathos vorgetragen C Programmierer sind schreibfaul schlampig verantwortungslos und verfassen nur kryptische Program me Ich pers nlich kann mit jeder Programmiersprache Schaden anrichten und wenn ich mir fremde Quelltexte anschaue dr ngt sich mir der Verdacht auf dass ich damit keinesfalls alleine bin Gute und lesbare Programme sind nicht sprachgebunden Schlechte Programme durch die falsche Wahl der Pro grammiersprache gibt es dagegen zu Hauf Bitmanipulationen in PEARL sind daf r ein prima Beispiel Moderne Programmiersprachen geben dem Anwender in der Regel ausreichend M glichkeiten in die Hand seine Probleme zu l sen Es gibt f r nahezu alle Einsatzgebiete Spezialsprachen die den je weiligen Aufgabenstellungen mehr oder weniger gut angepasst sind Es gibt keine wirklich guten oder schlechten Sprachen Die Auswahl des Werkzeugs muss nur dem zu l senden Problem angemessen sein oder w rden Sie einen Sc
420. zur Verf gung steht Die Aktivierung kann sowohl vom Bediener als auch von einer beliebigen Task veranlasst werden Tasks k nnen sowohl sich selbst als auch andere Tasks aktivieren Eine Aktivierung wird ber den Bedienbefehl ACTIVATE Taskname auch in der Kurzform A Tas kname oder allein durch die Angabe des Tasknamens veranlasst In CREST C stehen die Funktionen rt_activate und rt_activate_ quick zur Verf gung void rt_activate char name Prio prio void rt_activate_quick Task task Prio prio 15 3 Multi Tasking 139 Die Task wird mit der Priorit t prio aktiviert Bei prio 0 wird die Defaultpriorit t der Task verwendet Diese Defaultpriorit t l sst sich beim Compilieren einer Task explizit angeben Bei C Shellmodulen wird diese Priorit t standardm ssig auf den Wert 20 vorbesetzt Negative Priorit ten sind nicht zul ssig und f hren zu einer Fehlermeldung Befindet sich die Task im Zustand DORM wird sie gem ss ihrer Priorit t aktiviert Steht die angesprochene Task im Zustand waiting for activation in der Dispatcher Kette so wird sie entsprechend ihrer Priorit t gestartet L uft die Task wird die Akti vierung gepuffert Bei einem berlauf des Aktivierungspuffers geht die Aktivierung verloren und es erfolgt eine Fehlermeldung 15 3 2 2 Warten RTOS UH erm glicht ab Nukleus 7 x das Warten auf die Terminierung einer Task Die C Funktion rt_wait_for_exit realisiert hierzu den Hochsprachenanschluss Da

Download Pdf Manuals

image

Related Search

crest c crest capital crest ce courses free crest cadillac frisco tx crest capital equipment financing crest certification crest coating crest cadillac crest cleaners crest cavity protection toothpaste crest continuing education crest cafe crest cadillac syracuse crest charcoal toothpaste crest careers crest country inn williamsburg ia crest continuing education free crest cadillac brookfield wi crest capital management crest cadillac frisco crest cinema shoreline crest clinical mouthwash crest collaborative crest cinnamon toothpaste crest capital partners crest clothing

Related Contents

Des goûts et des couleurs ou Quel crédit accorder aux «tests    Brise Lavande  Bedienungsanleitung  Photo Fusion: A Wedding Photographers Guide to  AC-3000F - Rice Lake Weighing Systems  ISTRUZIONI PER L`USO  HP PhotoSmart User's Manual  Gebrauchsanweisung ................................................................ 6  WR8500 SERIES  

Copyright © All rights reserved.
Failed to retrieve file