mikrocontroller.net

Forum: Compiler & IDEs Ansi C; Syntax einer Funktion, die eine ROM-Adresse zurückgibt


Autor: BL (Gast)
Datum:

Bewertung
-2 lesenswert
nicht lesenswert
Hallo,


ich brauch eine Funktion, die eine Adresse aus dem Flash zurückgibt. Nun 
komm ich aber nicht auf die richtige Syntax und die 
Compilerbeschreibung(CC8e) gibt nix her. Kann mir jemand auf die Sprünge 
helfen?

const char *Text (uns8 Zeiger) // Anzeige Text
{
   ...
}

Das nimmt der Compiler z.B. nicht. Muß man dann die Flash-Adresse als 
uns32-Zahl übergeben oder wo ist da der Schlauch geknickt?


Besten Dank für sachdienliche Antworten und verschwendet mit anderen 
bitte nicht Eure Zeit!


BL

Autor: Jörg W. (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
2 lesenswert
nicht lesenswert
BL schrieb:
> Das nimmt der Compiler z.B. nicht.

Wie wäre es mit 'ner Fehlermeldung?

Btw., ANSI-C (oder auch seine deutlich jüngeren ISO-Pendants) haben
keine Idee von RAM, ROM oder sowas.

Autor: Mark B. (markbrandis)
Datum:

Bewertung
-1 lesenswert
nicht lesenswert
Jörg W. schrieb:
> BL schrieb:
>> Das nimmt der Compiler z.B. nicht.
>
> Wie wäre es mit 'ner Fehlermeldung?
>
> Btw., ANSI-C (oder auch seine deutlich jüngeren ISO-Pendants) haben
> keine Idee von RAM, ROM oder sowas.

Ich würde sogar meinen, dass das auf die allermeisten 
Programmiersprachen ab der 3. Generation zutrifft.

Autor: Jörg W. (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
1 lesenswert
nicht lesenswert
Das wollte ich jetzt aber nicht groß auswalzen.  Die Fehlermeldung
wäre schon von Interesse, dann kann sich vielleicht auch jemand einen
Reim drauf machen, der den fraglichen Compiler nicht zur Hand hat.

Autor: Markus F. (mfro)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
CC8e ist offensichtlich ein Compiler für PIC18?

Nachdem meiner Erinnerung nach das Memory-Layout der PICs - sagen wir 
mal so - eher unkonventionell ist, kann es durchaus sein, daß Du da mit 
Banking fummeln mußt. Wie das geht, sollte eigentlich im Datenblatt 
stehen.

Ich würde mal raten(nachdem die PICs nach meiner Erinnerung - zumindest 
in einem für C einigermaßen brauchbaren Memory-Modell - mit 12 Bit 
Adressen arbeiten), daß der Zeiger 16 Bit haben muß.

Autor: BL (Gast)
Datum:

Bewertung
-1 lesenswert
nicht lesenswert
Besten Dank, Problem schein erst mal gelöst.

Der Compiler -ja, für PIC18- frißt es erst mal. Im Controller hab ich's 
noch nicht ausprobiert.

Die korrekte Syntax lautet:

const size2 char *MenuText (uns8 Zeiger)

"size2" bezeichnet, dass der ganze Adressbereich, bzw. ein 16-Abschnitt 
angesprochen wird.

Autor: Oliver S. (oliverso)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
An das "uns8 Zeiger" glaube ich aber immer noch nicht. Entweder ist das 
ein blöd gewählter Parametername, oder es ist falsch.

Oliver

: Bearbeitet durch User
Autor: Markus F. (mfro)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich denke, das muß
const size2 char *text(int index) { return txt[index]; }

(oder so ähnlich) heißen. size2 ist anscheinend ein "type modifier" der 
sagt, daß das ein 16-Bit langer Zeiger sein soll.

aber: das ist alles Mögliche, aber "ANSI C", wie in der Fred-Überschrift 
verlangt, ist das ganz bestimmt nicht ;).

Autor: W.S. (Gast)
Datum:

Bewertung
-3 lesenswert
nicht lesenswert
Markus F. schrieb:
> Nachdem meiner Erinnerung nach das Memory-Layout der PICs - sagen wir
> mal so - eher unkonventionell ist,

Du bist bloß nicht dran gewöhnt, daß es eben neben der 
v.Neumann-Architektur eben auch noch was Anderes gibt, z.B. Harvard. Da 
ist überhaupt nichts unkonventinelles dran, sondern Harvard ist für 
Controllersysteme eigentlich die viel bessere Architektur, weil sie 
Daten und Befehle in getrennten Adreßräumen führt, was wiederum zu 
beträchtlich einfacherer und damit stromsparender Konstruktion des Chips 
führt. Und auf dem Controller werkelt ja normalerweise eine feste 
Firmware und nicht tausend ladbare Programme wie im PC.

Kein Wunder, wenn es zu Holpereien kommt, wenn man als C-Programmierer 
partout NICHT sich mit den Gegebenheiten der zugrundeliegenden Hardware 
befassen will. Was, Assembler? Bäh. Was, Architektur? nochmals Bäh. Da 
kann nix gescheites draus werden.

W.S.

Autor: Jörg W. (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
4 lesenswert
nicht lesenswert
W.S. schrieb:
> Da ist überhaupt nichts unkonventinelles dran, sondern Harvard ist für
> Controllersysteme eigentlich die viel bessere Architektur, weil sie
> Daten und Befehle in getrennten Adreßräumen führt

Sieht man ja prima daran, dass sich ARMs, bei denen alles in einem
Adressraum liegt, partout nirgends durchsetzen konnten.

Autor: Markus F. (mfro)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
W.S. schrieb:
> Du bist bloß nicht dran gewöhnt, daß es eben neben der
> v.Neumann-Architektur eben auch noch was Anderes gibt, z.B. Harvard. Da
> ist überhaupt nichts unkonventinelles dran, sondern Harvard ist für
> Controllersysteme eigentlich die viel bessere Architektur, weil sie
> Daten und Befehle in getrennten Adreßräumen führt, was wiederum zu
> beträchtlich einfacherer und damit stromsparender Konstruktion des Chips
> führt.

Jo, da hast Du völlig recht. Daran bin ich nicht gewöhnt.

Will mich aber auch nicht daran gewöhnen.

Muß ich auch - zum Glück - nicht ;).

Autor: Peter D. (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
BL schrieb:
> Der Compiler -ja, für PIC18- frißt es erst mal. Im Controller hab ich's
> noch nicht ausprobiert.

Zwischen "kein Syntaxfehler" und "funktioniert auch" liegen aber Welten.

Wenn Du nicht ins Assemblerlisting schauen willst, kannst Du einfach ein 
Minimalprogramm drumrum schreiben und es in den Simulator laden.

Wenn ich Funktionspointer oder Structs übergeben will, mache ich das 
vorzugsweise mit typedef.

: Bearbeitet durch User
Autor: W.S. (Gast)
Datum:

Bewertung
-2 lesenswert
nicht lesenswert
Jörg W. schrieb:
> Sieht man ja prima daran, dass..

Anstatt mal wieder herumzupolemisieren, hättest du besser an die 
Milliarden 8051 denken können.


Und noch einer:
Markus F. schrieb:
> Will mich aber auch nicht daran gewöhnen.
> Muß ich auch - zum Glück - nicht

Ja, Gärtner oder Friseur ist auch ein grundanständiges Handwerk. Da 
brauchst du keinerlei Detail von irgendwelchen µC zu kennen.

W.S.

Autor: Jörg W. (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
1 lesenswert
nicht lesenswert
W.S. schrieb:
> Anstatt mal wieder herumzupolemisieren,

Machst du doch auch.

> hättest du besser an die
> Milliarden 8051 denken können.

Ja, Totgesagte leben länger.  Eine moderne Architektur wird es aber
deshalb trotzdem nicht mehr.  Sie waren gut für ihre Zeit.  Die
getrennten Adressräume sind wohl dennoch das, was ein Programmierer
beim Übergang auf eine Architektur mit flachem Adressraum am wenigsten
vermissen wird.

Autor: W.S. (Gast)
Datum:

Bewertung
-1 lesenswert
nicht lesenswert
Jörg W. schrieb:
> Machst du doch auch.

Und? quod licet jovi...

Und es ist egal, welche Architektur sich in den Zeitläuften wie 
verbreitet - wichtig hingegen ist, deren Spezifika zu kennen und 
sachgemäß heranzugehen. Da hapert es allerdings allenthalben, wie man an 
diesem Thread sehen kann. Wer eben zu blöd ist, den Unterschied zwischen 
Harvard und v.Neumann überhaupt zu kennen und dennoch unbedarft in C 
einfach drauflos zu programmieren, kriegt genau deshalb Probleme. 
Unfähigkeit eben.

W.S.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.