Hallo Forum,
ich versuche gerade printf innerhalb einer Funktion mit Parameterwert
für printf zu benutzen.
Die C-Datei von Wickenhäuser enthält folgenden Code:
extern int _doprnt( void (*iofunc)(unsigned char) reentrant, char* pfmt, va_list(ap));
16
17
// PRINTF - that's all! Use _put() for char-output (Note: the 'far' has no effect)
18
int printf(far char* pfmt, ...){
19
va_list(ap);
20
va_start(ap,pfmt);
21
return _doprnt(_putc, pfmt, ap);
22
}
23
24
// END
Vereinfacht habe ich folgendes probiert:
1
void p1(const char* c) {
2
printf("%c", c);
3
}
4
5
void p2(char* c) {
6
printf("%c", c);
7
}
Beides Mal bekomme ich keine Ausgabe. Hängt das mit dynamischen Speicher
zusammen, wegen das nicht funktioniert?
Auch: Wie muss der Funktionsaufbau sein, damit es funktioniert?
MfG
Bastian
Bastian N. schrieb:> * To access own peripherals (i.e. LCDs) modify a own> xxx_printf-functions> * as described in the manual
Worauf gibst du deinen Text aus?
Zudem hilft manchmal ein Zeilenvorschub am Ende der Augabe.
Oliver
Bastian N. schrieb:> void p1(const char* c) {> printf("%c", c);> }>> void p2(char* c) {> printf("%c", c);> }
%c ist für einzelne char's, du übergibst aber einen Pointer
(vernünftige™ Compiler wie der GCC merken das btw) - also entweder mit
*c dereferenzieren oder mit %s als ganzen String ausgeben.
Bastian N. schrieb:> Vereinfacht habe ich folgendes probiert:void p1(const char* c) {> printf("%c", c);> }>> void p2(char* c) {> printf("%c", c);> }>> Beides Mal bekomme ich keine Ausgabe. Hängt das mit dynamischen Speicher> zusammen, wegen das nicht funktioniert?
Das schaust Du dir besser nochmal an. c ist was? Richtig, ein Pointer.
Und "%c" ist was? Genau, das Ausgabeformat für ein char.
Paßt irgendwie nicht so recht zusammen.
Das hätte dir allerdings durchaus eine Ausgabe produzieren müssen (bloß
nicht die, die Du erwartet hättest).
Was macht _putc() genau und wo schickt es seine Ausgabe hin (Manual)?
Also mit %s geht es! Danke :)
Wegen der Verbindung die geht über Serial RS232 mit Hyperterm oder
Putty.
Wenn wenigstens die Lehrbücher die ich vom B.v.B habe gescheit wären...
... weil der %s Parameter wird darin nicht aufgelistet :/
Irgendwie kommt mir der ganze Lehrgang den ich da mache ziemlich
"lieblos" vor.
Bastian N. schrieb:> Irgendwie kommt mir der ganze Lehrgang den ich da mache ziemlich> "lieblos" vor.
Das Gefühl hatte ich auch, als ich die Wickenhäuser IDE vorgesetzt
bekam. Nicht wegen dieser Software, aber das drumherum und da passt
dieses Frickelprogramm gut rein. Ich denke das wird sich schon oft so
abgespielt haben...
Bastian N. schrieb:> Wenn wenigstens die Lehrbücher die ich vom B.v.B habe gescheit wären...> ... weil der %s Parameter wird darin nicht aufgelistet :/
Du hast "Lehrbücher", die sich mit printf beschäftigen, und nicht %s
erwähnen? Echt jetzt?
krumeltee (Nils S.) schrieb:> Bastian N. schrieb:>> Irgendwie kommt mir der ganze Lehrgang den ich da mache ziemlich>> "lieblos" vor.>> Das Gefühl hatte ich auch, als ich die Wickenhäuser IDE vorgesetzt> bekam. Nicht wegen dieser Software, aber das drumherum und da passt> dieses Frickelprogramm gut rein. Ich denke das wird sich schon oft so> abgespielt haben...
Hallo krumeltee,
kennst du diesen Lehrgang etwa? :)
MfG
Bastian
Rufus Τ. F. schrieb:> Bastian N. schrieb:>> Wenn wenigstens die Lehrbücher die ich vom B.v.B habe gescheit wären...>> ... weil der %s Parameter wird darin nicht aufgelistet :/>> Du hast "Lehrbücher", die sich mit printf beschäftigen, und nicht %s> erwähnen? Echt jetzt?
Ernsthaft, sonst wäre mir das %s bestimmt nicht entgangen.
Habe auch nachdem ich den Lösungsvorschlag mit dem %s bekommen habe, um
sicher zu gehen, ein CTRL+F auf das Lehrbuch losgelassen: 0 Treffer (+
von Hand nochmal die Stellen durchgegangen: 00).
Bastian N. schrieb:> Ernsthaft, sonst wäre mir das %s bestimmt nicht entgangen.
Wenn Du die Dokumentation einer C-Standardfunktion suchst, gib bei
google einfach
man funktionsname
ein. "man" steht für den Manual-Befehl unter Unix bzw. Linux. In der
Regel bekommst Du dann als ersten Treffer das Handbuchkapitel zu der
gewünschten Funktion. Bei manchen Funktionen bekommst Du Alternativen
angezeigt, wie z.B. printf(1) und printf(3). Die Zahlen sind
Kapitelnummern. In der Regel sind für C-Programmierer die Kapitel 3 (und
manchmal auch 2) interessant. Kapitel 1 kannst Du links liegen lassen.
Allerdings wirst Du auch bemerken, dass die
Mikrocontroller-Laufzeitumgebungen oft nur einen Bruchteil des Standards
tatsächlich vollständig implementiert haben. Du wirst daher im Manual
oft mehr Möglichkeiten finden, als dann tatsächlich mit Deinem
merkwürdigen Wickenhäuser Compiler/Lib tatsächlich geht.
Aber schaden tut es nicht, ruhig mal die kompletten Möglichkeiten von
printf() kennenzulernen.
Also: man printf
und Du hast etwas "Vernünftiges" zu lesen ;-)
Frank M. schrieb:>> Allerdings wirst Du auch bemerken, dass die> Mikrocontroller-Laufzeitumgebungen oft nur einen Bruchteil des Standards> tatsächlich vollständig implementiert haben. Du wirst daher im Manual> oft mehr Möglichkeiten finden, als dann tatsächlich mit Deinem> merkwürdigen Wickenhäuser Compiler/Lib tatsächlich geht.
Mir wurde auch angeraten, gerade deswegen nur die Lehrbücher zu
verwenden.
Es wäre alles enthalten :/
> Aber schaden tut es nicht, ruhig mal die kompletten Möglichkeiten von> printf() kennenzulernen.>> Also: man printf>> und Du hast etwas "Vernünftiges" zu lesen ;-)
Werde in Zukunft das doppelt machen. Also nachdem ich eine Funktion
beschrieben bekommen habe, diese mit der Manpage zu vergleichen.
Bastian N. schrieb:> Mir wurde auch angeraten, gerade deswegen nur die Lehrbücher zu> verwenden.> Es wäre alles enthalten :/
Nenn bitte Ross & Reiter: Wie heißen diese "Lehrbücher"?
Bastian N. schrieb:> Hallo krumeltee,> kennst du diesen Lehrgang etwa?Diesen wahrscheinlich nicht, aber zwei andere und die waren unter
aller ...
Die Wickenhäuser IDE war vielleicht mal was ziemlich tolles, aber da
gibt's mittlerweile deutlich besseres, kostenloses. Ich habe das Gefühl,
jeder Berufsschulkurs, dessen Lehrer kein/kaum Englisch kann, baut
darauf auf...
Einerseits will der TE keine anderen Unterlagen benutzen. Andererseits
tippt er einen längeren Post hier im Forum.
Ich habe im Browser oben in das Suchfenster printf (das sind nur 6
Buchstaben, ) eingeben, und dann 2mal geklickt, und schon hatte ich alle
Infos zu printf.
Das sollte man heute in den Kursen vermitteln, dass man auch mal bei
google nachschaut.
Frage an den Rest hier:
Muss man wirklich für einen 8051 einen Wickenhäuser Compiler verwenden?
https://stackoverflow.com/questions/978189/what-is-the-best-c-compiler-for-the-8051-family
PittyJ schrieb:> Einerseits will der TE keine anderen Unterlagen benutzen.
Er schrieb, dass ihm davon abgeraten wurde, nicht dass er nicht will. Da
der vorliegende Compiler offenbar bei weitem nicht den ganzen
Funktionsumfang von Standard C enthält, klingt das zunächst ja auch
sinnvoll. Was bringen einem Unterlagen, die was anderes beschreiben, als
das, was er nutzen muss?
> Andererseits tippt er einen längeren Post hier im Forum.> Ich habe im Browser oben in das Suchfenster printf (das sind nur 6> Buchstaben, ) eingeben, und dann 2mal geklickt, und schon hatte ich alle> Infos zu printf.
Er hat wohl nicht damit gerechnet, dass der ihm vorliegende
Dokumentation an der Stelle was fehlen würde. Muss man ja erstmal drauf
kommen.
> Frage an den Rest hier:> Muss man wirklich für einen 8051 einen Wickenhäuser Compiler verwenden?
Man muss, wenn man einen Kurs macht, der den vorschreibt.
Danke rmagnus,
genau so ist es, danke.
Was noch anzumerken ist: Für den Kurs gibt es eigentlich kein
equivalents Informationsmaterial. Nur im Elektorforum habe ich da was
gefunden. Liegt aber größtenteils am Wickenhäuser und der 8051er ist ja
auch nicht mehr der Jüngste :)
PittyJ schrieb:> Muss man wirklich für einen 8051 einen Wickenhäuser Compiler verwenden?
Muss man wirklich im 21. Jahrhundert eine Lehre überhaupt noch auf dem
8051 basieren lassen? SDCC ist meines Wissens auch auf dem Stand von
C89, wäre also in dieser Hinsicht kein besonderer Gewinn.
Dass die Dinger in freier Wildbahn noch eine gewisse Bedeutung haben,
ist das Eine, aber für eine Ausbildung würde ich die heutzutage gewiss
nicht mehr nehmen. Viele Designentscheidungen darin sind
technologischen Randbedingungen der Ära vor knapp 40 Jahren geschuldet,
die man mit einem moderneren Controller nicht mehr braucht. Auch einen
kleinen ARM kann man problemlos „bare metal“ programmieren, um so
jenseits irgendwelcher Codegeneratoren der Hersteller auch die
tieferliegenden Details noch zu verstehen.
Wenn man den 8051 links liegen lässt, gibt es wiederum genügend gute und
auch freie / kostenlose Compiler und Entwicklungsumgebungen, dass man
sich nicht mehr mit angestaubten C-Dialekten rumschlagen muss.
Jörg W. schrieb:> PittyJ schrieb:>> Muss man wirklich für einen 8051 einen Wickenhäuser Compiler verwenden?>> Muss man wirklich im 21. Jahrhundert eine Lehre überhaupt noch auf dem> 8051 basieren lassen? SDCC ist meines Wissens auch auf dem Stand von> C89, wäre also in dieser Hinsicht kein besonderer Gewinn.
Ist keine Lehre, sonder ein Studium bei mir, zwecks Weiterbildung.
> Dass die Dinger in freier Wildbahn noch eine gewisse Bedeutung haben,> ist das Eine, aber für eine Ausbildung würde ich die heutzutage gewiss> nicht mehr nehmen. Viele Designentscheidungen darin sind> technologischen Randbedingungen der Ära vor knapp 40 Jahren geschuldet,> die man mit einem moderneren Controller nicht mehr braucht.
Ich verstehe auch nicht wirklich, warum der Studiumslehrgang
Mikrocontroller sich immer noch um 8051er dreht. Außer das es in der
Industrie noch eingesetzt wird. Die Studiumsunterlagen sind von 2007.
Konnte man vorher aber nicht wissen, bzw. besser: erahnen, was man vllt.
vorher abklären müsste. (Bin ja Anfänger und kann ja nicht wirklich
wissen was da wichtig ist.). Und in der Regel geht man ja auch davon
aus, das gerade die Kurse, welche nicht gerade "umsonst" sind - einfach
aktuell und funktional sein sollten.
Bis jetzt finde ich alles zu diesem Thema (8051er) sehr unhandlich und
ohne eine detaillierte Anleitung/Herstellerbeschreibung lässt sich da
praktisch nix entwickeln und dauert meines Empfinden nach sehr, sehr
lange.
Na ja, was will man machen ¯\_(ツ)_/¯
Rufus Τ. F. schrieb:> Bastian N. schrieb:>> Mir wurde auch angeraten, gerade deswegen nur die Lehrbücher zu>> verwenden.>> Es wäre alles enthalten :/>> Nenn bitte Ross & Reiter: Wie heißen diese "Lehrbücher"?
Ich habe dir hierzu eine Email über die Forensoftware zugesendet.
MfG
Bastian
Bastian N. schrieb:> int printf(far char* pfmt, ...){> va_list(ap);> va_start(ap,pfmt);> return _doprnt(_putc, pfmt, ap);
Da fehlt ein va_end(ap) nach dem _doprnt().
Jörg W. schrieb:> SDCC ist meines Wissens auch auf dem Stand von> C89, wäre also in dieser Hinsicht kein besonderer Gewinn.
Bei SDCC gibt es noch ein paar Lücken bei der Standardkompatiblität,
aber im großen und ganzen kann man auch C11 (oder etwas eingeschränkter
C99) verwenden.
Philipp
Johann L. schrieb:> Bastian N. schrieb:>> int printf(far char* pfmt, ...){>> va_list(ap);>> va_start(ap,pfmt);>> return _doprnt(_putc, pfmt, ap);>> Da fehlt ein va_end(ap) nach dem _doprnt().
Das ist der Code für das printf, welches mit dem Wickenhäuser
mitgeliefert wird. Ich habe da nichts geändert.
Was hat das für Auswirkungen, wenn da ein va_end fehlt?
Bastian N. schrieb:> Was hat das für Auswirkungen, wenn da ein va_end fehlt?
Das kann man so nicht sagen, denn die Mimik hinter va_* ist einfach
stark von der Implementierung abhängig. Kann gut sein, dass eine
konkrete Implementierung hinter va_end gar nichts hat, aber portabler
Code darf sich darauf nicht verlassen.
Es ist also einfach schlampig oder gedankenlos dahin geschrieben worden
von demjenigen, der das tat.
Jörg W. schrieb:> Auch einen> kleinen ARM kann man problemlos „bare metal“ programmieren
man muss da definitiv mehr Register anfassen bis mal ein Pin wackelt
Walter S. schrieb:> Jörg W. schrieb:>> Auch einen>> kleinen ARM kann man problemlos „bare metal“ programmieren>> man muss da definitiv mehr Register anfassen bis mal ein Pin wackelt
Ja, und?
1
#include"sam.h"
2
3
void_init(void)
4
{
5
}
6
7
int
8
main(void)
9
{
10
// unusable, since PORT is a macro
11
// PM->APBBMASK.bit.PORT = 1;
12
PM->APBBMASK.reg=8;
13
14
/* PA19: input with pulldown */
15
PORT->Group[0].PINCFG[19].bit.INEN=1;
16
PORT->Group[0].PINCFG[19].bit.PULLEN=1;
17
PORT->Group[0].OUTCLR.bit.OUTCLR=(1<<19);
18
19
/* PA16: input with pullup */
20
PORT->Group[0].PINCFG[16].bit.INEN=1;
21
PORT->Group[0].PINCFG[16].bit.PULLEN=1;
22
PORT->Group[0].OUTSET.bit.OUTSET=(1<<16);
23
24
/* LED0 on XPlainedPro: PB30, active low */
25
PORT->Group[1].DIRSET.bit.DIRSET=(1<<30);
26
PORT->Group[1].OUTSET.bit.OUTSET=(1<<30);
27
28
for(;;)
29
{
30
if((PORT->Group[0].IN.bit.IN&(1<<19))!=0)
31
{
32
/* PA19 pulled high */
33
/* turn on LED */
34
PORT->Group[1].OUTCLR.bit.OUTCLR=(1<<30);
35
/* wait for button release */
36
while((PORT->Group[0].IN.bit.IN&(1<<19))!=0)
37
{
38
}
39
}
40
41
if((PORT->Group[0].IN.bit.IN&(1<<16))==0)
42
{
43
/* PA16 pulled low */
44
/* turn off LED */
45
PORT->Group[1].OUTSET.bit.OUTSET=(1<<30);
46
/* wait for button release */
47
while((PORT->Group[0].IN.bit.IN&(1<<16))==0)
48
{
49
}
50
}
51
}
52
53
return0;
54
}
Damit hat man eine LED, die durch das Umstecken eines Jumpers ein-
und ausgeschaltet wird (SAMD20 Xplained Pro).
Ich würde das durchaus noch für anfängertauglich finden, auch wenn es
natürlich ein bisschen mehr ist als bei einem AVR.