Forum: Mikrocontroller und Digitale Elektronik [PIC] .c + .asm zusammen in einem Projekt verwenden


von Joachim .. (joachim_01)


Lesenswert?

Hi,
ich such n Tutorial in dem das gemeinsame Verwenden von C- und 
Assemblerfiles in einem Projekt erklärt wird. Oder hat jemand was 
Selbstgeschriebenes das er mir borgen kann?


Joachim

von Meister E. (edson)


Lesenswert?

Hallo Joachim,

das Thema ist schon sehr oft und erschöpfend besprochen worden. Wenn du 
trotzdem hier im Forum nichts findest, schau doch mal im 
PIC-Mikrocontroller-Forum vorbei:

http://fernando-heitor.de/

Weiterer Tipp: In der C18 (oder C30) Hilfedatei nach "Mixing C with ASM" 
suchen. Da ist das Wesentliche erklärt.

Gruß,
Edson

von Peter D. (peda)


Lesenswert?

Meine Erfahrungen vom 8051 und AVR sind: Laß es sein.

Man vereint damit nur die Nachteile von beiden, also unportabler, 
unleserlicher Code des Assembler und mehr Flashverbrauch des C.

Nach etwas Einarbeitung in C merkt man schnell, man kann alles in C 
machen, Assembler ist völlig unnötig.

Beim PIC wird es auch so sein, es sei denn, der C-Compiler taugt nichts.


Peter

von Meister E. (edson)


Lesenswert?

Peter Dannegger schrieb:
> Man vereint damit nur die Nachteile von beiden, also unportabler,
> unleserlicher Code des Assembler und mehr Flashverbrauch des C.

Das ist sicher richtig, aber es gibt Ausnahmen. Interrupts, bzw. 
ISR-Definitionen lassen sich immer schlecht portieren, ich finde es in 
dem Fall klarer ein eigenes ASM-Modul mit der ISR* zu erstellen. Es gibt 
vieles zu beachten wenn man ein C-Projekt portiert, da kommen vollkommen 
unterschiedliche Anforderungen dazu - je nachdem, ob man den Code für 
ein anderes Target oder (ggf.zusätzlich) mit einem anderen Compiler 
kompilieren muss. Kein Entwickler wird übersehen, wenn Assembler-Module 
verwendet wurden und er weis wie viel Arbeit beim Portieren auf ihn 
zukommen wird. (Vorausgesetzt, das zugehörige C-Programm ist bereits 
portabel)

Peter Dannegger schrieb:
> Nach etwas Einarbeitung in C merkt man schnell, man kann alles in C
> machen, Assembler ist völlig unnötig.

Bis auf die Ausnahmen ;)

Gruß,
Edson

* bei PIC12 und PIC16 gibt es nur einen Interrupt-Vektor und keine IVT, 
daher benötigt man in zeitkritischen Anwendungen besonders schmalen 
ISR-Code und verzichtet soweit wie möglich auf calls zu untergeordneten 
ISRs. Es herrscht quasi "Spaghetti-Code-Gebot".

von Joachim .. (joachim_01)


Lesenswert?

>das Thema ist schon sehr oft und erschöpfend besprochen worden.
Ich habe nach zwei Tagen Netz absuchen das Gegenteil festgestellt. Es 
geht ja eigentlich nicht um das eigentliche Portieren (16f auf 18F) 
sondern um das Gedöns mit dem Linker, der 'Globalifizierung' beim 
Austausch von Daten (C-Funktion schickt zur Asm-Routine u. zurück). Hab 
an dieser Stelle einfach viel zu wenig Erfahrung. Alles andere ist ja 
nur Fleißarbeit und nicht der Rede wert.

Dem Ganzen steht ca 2,2kB zeitkritischer Assemblercode fehlerfrei nach C 
zu übersetzten gegenüber. Und ob die Ferdinand-Heitor-Lauflicht-Webseite 
welche die Programmierung von Zeitschleifen am liebsten mit delay(); 
durchführt für das alles die richtige Instanz ist, wage ich jetzt nicht 
weiter zu erfragen.

von Meister E. (edson)


Lesenswert?

Joachim ... schrieb:
> Und ob die Ferdinand-Heitor-Lauflicht-Webseite
> welche die Programmierung von Zeitschleifen am liebsten mit delay();
> durchführt für das alles die richtige Instanz ist, wage ich jetzt nicht
> weiter zu erfragen.

Weis jetzt nicht wie du darauf kommst. Genau wie hier auch tummeln sich 
da jede Menge Anfänger (die haben nunmal die meisten Fragen), Bastler 
und Profis.

Aber wenn du schon die Doku zu deinem Compiler nicht lesen magst, welche 
Art Hilfe erwartest du denn? Ich kann dir auch nur sagen, was dort steht 
solange du keine konkrete Frage hast.

Gruß,
Edson

von Meister E. (edson)


Lesenswert?


von Joachim .. (joachim_01)


Lesenswert?

Näheres dazu findest Du im C18 User's Guide
("Calling Assembly Functions from C").

Tatsächlich. Ein Treffer. Also gut, hast gewonnen. Jetzt wo ich's seh' 
erinnere ich mich auch wieder das ich das ca 2004 mal las.

Hatte mich auf den Linker konzentriert, in der zugehörigen Dok war 
nichts zu finden.

von W.S. (Gast)


Lesenswert?

Peter Dannegger schrieb:
> Nach etwas Einarbeitung in C merkt man schnell, man kann alles in C
> machen, Assembler ist völlig unnötig.
>
> Beim PIC wird es auch so sein, es sei denn, der C-Compiler taugt nichts.

Der C-Compiler als Allheilmittel?

Wahrscheinlich hast du nur wenig Erfahrungen mit PIC's, um sowas zu 
schreiben. Mit der gleichen Logik könnte ich schreiben: "Man kann auch 
alles mit CLIPPER machen, C ist völlig unnötig". Das ist natürlich eine 
heftige Übertreibung meinerseits - aber daran siehst du sicherlich 
selbst, was für einen Unsinn man beim Generalisieren (DER_ _Pic) 
verzapft.

Jede Programmierweise, egal ob mit einer Programmiersprache oder ohne 
(ja, sowas gibt's auch, denk mal an Schematics versus VHDL) hat ihren 
sinnvollen Anwendungsbereich - und außerhalb dessen ist sie eben nicht 
mehr so sinnvoll bzw. angemessen.

Bei den PIC's gibt's große, kleine und winzige. Welche meinst du denn, 
wenn du "Beim PIC wird es.." schreibst? Was bitte sehr soll man mit C 
bei einem Controller im winzigen SOT23-Gehäuse mit maximal 512 
Programmschritten anfangen? Da kommt man nicht weit. Und portabel? WOZU 
portabel? PIC's sind fast immer die erste Wahl für echte 
Spezialanwendungen, die man SO mit anderen Controllern nicht 
hinbekommt. Nee, bei solchen kleinen Controllern ist schlichtweg 
Assembler angesagt. Bei größeren Exemplaren, wo man reichlichst 
Ressourcen hat, sieht das wiederum anders aus. Die Wahl des 
Programmier-Mittels sollte eigentlich durch die Aufgabe bestimmt werden 
- und nicht durch das Maß der Fähigkeit des Entwicklers.

Allerdings sehe ich, daß die Anzahl derer, die tatsächlich Assembler 
können und bereit sind, die Hardware mit der sie umgehen sollen zu 
verstehen, mittlerweile klein geworden ist. Die überwältigende Mehrheit 
unserer tollen jungdynamischen Ingenieure kann außer C kaum noch etwas - 
und damit man sich nicht mit Hardware befassen muß, benötigt man 
Treiber-Libs. Oh ja, es gibt schon einige Arbeitgeber, wo derartige 
Ingenieure noch nicht zu abgehoben sind. Aber eben nur einige.

W.S.

von Peter D. (peda)


Lesenswert?

W.S. schrieb:
> Was bitte sehr soll man mit C
> bei einem Controller im winzigen SOT23-Gehäuse mit maximal 512
> Programmschritten anfangen?

Was willst Du denn mit einem 6-Pinner programmieren, doch nicht etwa 
MP3, USB, NTFS?

Damit macht man doch nur kleine Steuerungen und die gehen sehr gut in C 
mit 512 Worten. Ich benutze z.B. den ATtiny13 (512 Worte, 8 Pins) und 
ausschließlich in C.
Z.B. für einen Dimmertaster mit Phasenanschnittsteuerung und kapazitivem 
Qtouch-Sensor.

Allerdings benutze ich keine PICs, sondern AVRs.
Und die AVRs haben den großen Vorteil, daß die 6- und 8-Pinner genau die 
gleiche Architektur haben, wie die großen 100-Pinner. D.h. aus 
Compilersicht muß man keinerlei Abstriche machen oder gar einen anderen 
Compiler nehmen.
Der ATtiny10 im SOT23 hat z.B. 512 Worte Flash, 1*16Bit Timer, 
4Kanal-8Bit-ADC, 2*PWM, 10 Interruptquellen (Vektoren).


W.S. schrieb:
> Nee, bei solchen kleinen Controllern ist schlichtweg
> Assembler angesagt.

Beschreib dochmal ne Aufgabe, wofür man bei einem SOT23 Mikrocontroller 
unbedingt Assembler benötigen sollte.

Und wenn Du hier schon ne Weile mitliest, wirst Du bestimmt wissen, daß 
mir in puncto 8051- oder AVR-Assembler keiner so leicht was vormachen 
kann.


Peter

von Reinhard Kern (Gast)


Lesenswert?

Peter Dannegger schrieb:
> Und wenn Du hier schon ne Weile mitliest, wirst Du bestimmt wissen, daß
> mir in puncto 8051- oder AVR-Assembler keiner so leicht was vormachen
> kann.

Wenn du bekennenderweise garnicht in Assembler programmierst, ist das ja 
wohl reine Angabe. Oder sprichst du von einem früheren Leben?

Rein theoretisch kann ich auch alles Mögliche, auch Mongolisch. Ich 
halte es bloss für überflüssig.

Gruss Reinhard

von Peter D. (peda)


Lesenswert?

Reinhard Kern schrieb:
> Wenn du bekennenderweise garnicht in Assembler programmierst, ist das ja
> wohl reine Angabe.

Seit wann darf ein C-Programmierer kein Assembler können?

Als ich 1990 mit 8051 angefangen habe, da waren C-compiler selten oder 
schweineteuer.
Und auch als 1997 der AVR das Licht der Welt erblickte, sah es mit 
Compilern düster aus.
Ich habe also beide über Jahre hinweg in Assembler programmiert.

Daß ich heutzutage Assembler nur mit der Kneifzange anfasse, spricht 
wohl sehr dafür, daß C deutliche Vorteile hat. Man kommt wesentlich 
schneller voran mit seinen Projekten.

Natürlich ist es nicht von Schaden, wenn ein C-Programmierer Assembler 
kann. Man kann dadurch den Compiler viel besser verstehen und 
optimaleren Code schreiben. Man weiß, welche Konstrukte teuer sind und 
vermeidet sie, soweit möglich.

Und wenn man mal ehrlich ist, staunt man oft, wie clever der Compiler 
manche Sachen macht.
Ich hab z.B. beim 8051 mit der 32Bit-Division wochenlang rumoptimiert, 
um dann später festzustellen, daß die Compilerroutine doppelt so schnell 
ist und nur halb soviel Flash benötigt.
Es ist also nicht unwarscheinlich, daß ein Assemblerprogramm nach dem 
Umschreiben in C sogar schneller und kleiner ist.


Wie gesagt, meine Erfahrungen betreffen konkret den 8051 und den AVR.
Wie gut die Compiler beim PIC sein können bzw. sind, kann ich natürlich 
nicht beurteilen. Man liest allerdings oft, daß die meisten PICs dem 
Compiler die Arbeit sehr schwer machen und man besser PIC18 und höher 
nehmen soll.


Peter

von Reinhard Kern (Gast)


Lesenswert?

Peter Dannegger schrieb:
> Ich hab z.B. beim 8051 mit der 32Bit-Division wochenlang rumoptimiert,
> um dann später festzustellen, daß die Compilerroutine doppelt so schnell
> ist und nur halb soviel Flash benötigt.

Ja, glaube ich ja sofort, aber das liegt ja daran, dass derjenige, der 
das in Assembler programmiert hat, besser war oder vor allem länger und 
sorgfältiger dran gearbeitet hat und/oder Spezialist war für 
Rechenalgorithmen. Das spricht also ganz und garnicht gegen Assembler. 
Deine Argumentation läuft ja bloss darauf hinaus, die schwierigen Sachen 
anderen zu überlassen.

Im übrigen bin ich der Meinung, dass solche Primitiven wie 
Schiebe-Operationen und Maskierungen in Assembler viel übersichtlicher 
sind als mit den kryptischen C-Operatoren. Wenn ich eine Routine für den 
Empfang eines ASCII-Zeichens per UART schreibe, ist die in Assembler 
viel verständlicher (Und mehr Zeit kostet mich das auch nicht). Was 
dagegen garnicht zu bezweifeln ist, ist die Tatsache, dass man ganz ohne 
Mühe sowohl in C als auch in Assembler grottenschlechte Software 
schreiben kann.

Gruss Reinhard

von Peter D. (peda)


Lesenswert?

Reinhard Kern schrieb:
> Ja, glaube ich ja sofort, aber das liegt ja daran, dass derjenige, der
> das in Assembler programmiert hat, besser war oder vor allem länger und
> sorgfältiger dran gearbeitet hat und/oder Spezialist war für
> Rechenalgorithmen.

Nö, das ist eben keine 1-Mann Aktion, der das nur nebenbei macht, 
sondern ne Firma mit einem Team, die damit Geld verdient.

Reinhard Kern schrieb:
> Deine Argumentation läuft ja bloss darauf hinaus, die schwierigen Sachen
> anderen zu überlassen.

Nö, der Applikations-Programmierer wird ja vom Kunden nicht dafür 
bezahlt, den Urschleim nachzuentwickeln, sondern für das Lösen der 
Aufgabe.
Es ist die Ehre eines jeden Programmierers, die Zeit und damit das Geld 
des Kunden nicht zu vergeuden.

Die Frage nach Assembler + C zu vermanschen, kommt auch fast nur von 
Anfängern und deren Assembler-Programmier-Versuche wird ein Compiler oft 
spielend übertrumpfen.

Reinhard Kern schrieb:
> Im übrigen bin ich der Meinung, dass solche Primitiven wie
> Schiebe-Operationen und Maskierungen in Assembler viel übersichtlicher
> sind als mit den kryptischen C-Operatoren.

Das mag sein, aber Du vergißt den Prolog/Epilog.
In Assembler schreibt man ja nicht nur den Schiebebefehl hin, sondern 
auch das PUSH/POP der Arbeitsregister und Laden der Variablen.
Ein C-Ausdruck benötigt schonmal leicht 5 Assemblerzeilen und das ist 
dann überhaupt nicht übersichtlicher.
Wenn ich so an Assembler zurück denke, wie oft hat mich ein falsches 
PUSH/POP schon fast zur Verzweiflung getrieben.


Peter

von W.S. (Gast)


Lesenswert?

Ach Reinhard,

laß den Peter Dannegger sein. Er versteht nichts von PIC's, meint 
aber, seine Meinung über das Programmieren von PIC's sei die ultimative 
Weisheit. Ich entsinne mich noch an seine völlig unqualifizierten 
Bemerkungen in einem anderen Thread, wo es um die maximale Zählfrequenz 
ging, die man an einem mit dem Systemtakt synchronisierten Portpin eines 
uC messen kann. Auch so ein PIC versus AVR Streit, bei dem er nichts 
begreifen wollte.

Ich kenne einige Leute, die mit gerümpfter Nase sagen "So ein PIC hat ja 
nur ein W-Register und mein AVR hat viel mehr Register, deswegen ist PIC 
Mist und AVR gut". Diese Leute werden PIC's nie begreifen und für sie 
sind klassisch aufgebaute Registermaschinen genau richtig, weil das die 
einzige Architektur ist, die solche Trolle zu begreifen imstande sind: 
Lade Register, verknüpfe Register, speichere Register.

Irgendwie sind die AVR's von Atmel clever gemacht: Ihre Architektur ist 
zwar altbacken (Registermaschine, RAM-Bereich, I/O-Bereich), aber sie 
entsprechen genau den Wertvorstellungen von C-Programmierern, die sich 
mit Hardware eigentlich nicht befassen wollen. Ist auch ein 
Erfolgsrezept, wie man sieht.

Also, laß mal, es ist vergeblich.

W.S.

von Meister E. (edson)


Lesenswert?

Peter Dannegger schrieb:
> Man liest allerdings oft, daß die meisten PICs dem
> Compiler die Arbeit sehr schwer machen und man besser PIC18 und höher
> nehmen soll.

Zumindest wurde ab PIC18 mit einer "für C-Compiler optimierten" 
Architektur geworben. Den Spruch kennst du ja von den AVRs.

Aber es ist wohl richtig, dass die Architektur der PIC10/12/16 so 
speziell ist, dass sich kein vorhandener C99-Compiler wie der GCC für 
die AVRs einfach darauf umkonfigurieren lässt. Erst ab PIC24/dsPIC gibt 
es GCC-Derivate.

Peter Dannegger schrieb:
> Wenn ich so an Assembler zurück denke, wie oft hat mich ein falsches
> PUSH/POP schon fast zur Verzweiflung getrieben.

Das kann auf dem in Hardware ausgeführten CALL/RETURN-Stack eines 
PIC10/12/16/18 schlecht passieren bzw. ist relativ leicht aufzuspüren. 
Für den High-Priority Interrupt der PIC18 gibt es sogar 
Schattenregister, die automatisch das Sichern und Wiederherstellen der 
sogenannten Kontext-Register übernehmen (in der Regel sind das nur 3 
Register).

Gruß,
Edson

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.