Probleme mit Typendefinition bei uart_puts

OP #2061091
Lesenswert?
• ▲
▼
Hallo liebe MikrocontrollerGemeinde,

ich möchte in ein Projekt (mittels CodeVision) eine Terminal-Funktion 
einbauen, mit der ich dann während des Debuggen gewisse Dinge anzeigen 
lassen kann. Die .c- und die .h-Dateien sind vorgefertigte Bausteine aus 
den Beispielen von CodeVision.
Allerdings gibt er mir folgende Fehler aus:

Error: USART_LCD_Mega16.h(177), included from: main.c: function argument 
#1 of type 'unsigned char' is incompatible with required parameter of 
type 'flash unsigned char *'

Error: USART_LCD_Mega16.h(177), included from: main_usart_lcd_mega16.c: 
function argument #1 of type 'unsigned char' is incompatible with 
required parameter of type 'flash unsigned char *'

Error: main_usart_lcd_mega16.c(132): function argument #1 of type 
'unsigned char' is incompatible with required parameter of type 'flash 
unsigned char *'

Vielleicht kann mir ja einer helfen. Ich denke, dass es ein kleiner 
Implementierungsfehler ist. Ich hänge die betroffenden Dateien in den 
Anhang..

Vielen Dank und einen schönen Sonntag noch
Angehängte Dateien:
Gast #2061309
Lesenswert?
• ▲
▼
Mindestens zwei Probleme

> void uart_puts (const flash unsigned char *s)
> unsigned char *string01 = "Das ist der ...
>        uart_puts(*string01);

1. In der Definition von uart_puts ist durch const flash angegeben, 
dass der als Argument übergebene String sich im FLASH befindet.

IMHO passt das nicht zur Definition von string01. string01 liegt im RAM. 
So wäre es zumindest beim AVR-GCC, der nur speziell mit Schlüsselwort 
gekennzeichnete Variablen im den FLASH (PROGMEM) speichert.

Über ein Spezialverhalten des Codevision muss man dessen Doku 
durchsuchen. Ich könnte mir vorstellen, dass es bei const 
gekennzeichneten Variablen einen Spezialfall geben könnte. In obiger 
Form halte ich das für unwahrscheinlich.

2. Bei der Übergabe an uart_puts wird string01 mit dem * Operator 
dereferenziert. D.h. es wird statt einem gültigen Pointer das erste 
Zeichen des Strings übergeben.

3. Die Implementierung von mit const flash ist IMHO falsch. Es wird kein 
FLASH String ausgegeben sondern es wird über eine zeichenweise Ausgabe 
ein normaler RAM String ausgegeben.

Lösung:

1. void uart_puts (const /* flash */ unsigned char *s)...

2. uart_puts(string01);
OP #2063000
Lesenswert?
• ▲
▼
Danke schön für deine Antwort.

Ich habe in der Hilfe von CodeVision eine einfachere Lösung gefunden, um 
die USART-Schnittstelle zu realisieren. Diese Funktion funktioniert so 
weit auch, allerdings habe ich nun ein Problem damit, dass sich in 
meinem Projekt, in der auch die USB-Schnittstelle funktionsfähig 
realisiert ist, die USART-Umsetzung mit USB beißt. Je nachdem wie ich 
die Funktionsaufrufe in meiner main.c anordne funktioniert entweder das 
Eine oder das Andere.
    Ich benutze als µC den Atmega32U4. Hat da jemand eine fixe Idee 
woran das liegen könnte? Es könnte ja an der Frequenz liegen, die habe 
ich allerdings mit FOSC=8000000(inHz) (das ist der Arbeitstakt mit dem 
ich arbeite) definiert, die Baudrate habe ich auf 9600 und lasse UBRR 
extra berechnen. Trotzdem tritt dieses Phänomen auf.

Grüße

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.