Macro i AVR-GCC

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
erixon
Inlägg: 380
Blev medlem: 27 augusti 2003, 10:21:58

Macro i AVR-GCC

Inlägg av erixon »

Jag håller på med att skriva till uart ganka mycket på en AVR och då uppstår problem med att ram minnet tar slut efter som av någon anledning lägger alla strängar där :( , så lösningen blir att lägga de i program minet vilket är ett lite bökit man måste då skriva PSTR("hej\n") för att den ska lägga det i program minnet. Så då tänkte jag skriva ett makro som gör det åt mej, och det fungerar nästan...

Macrot

Kod: Markera allt

#define printf(x,...) {char temp[100];avr_printf(strcpy_P(temp,PSTR(x)),__VA_ARGS__);}
om man skriver exempel printf("hej %d\n", 10)
så kommer makrot att ersätta det med
{char temp[100];avr_printf(strcpy_P(temp,PSTR("hej %d\n")),10);}
vilket fungerar ut märkt

Problemet upstår när man bara har med "strängen", delvis exempel printf("hej\n")
så kommer resultatet att bli
{char temp[100];avr_printf(strcpy_P(temp,PSTR("hej\n")),);}
vilket inte går att kompilera på grund av _ , _ som kommer med :cry:

Hur löser man detta...
Det borde gå... tycker man...
Användarvisningsbild
Melker
Inlägg: 410
Blev medlem: 26 maj 2003, 22:17:34
Ort: Umeå

Inlägg av Melker »

Ingen aning om det funkar, men kanske med ett till makro med samma namn, men utan "..." argumentet?

edit: eller glöm det, verkar inte vara möjligt.
Användarvisningsbild
Melker
Inlägg: 410
Blev medlem: 26 maj 2003, 22:17:34
Ort: Umeå

Inlägg av Melker »

http://www.redhat.com/docs/manuals/ente ... acros.html
verkar ha lösningen; ##__VA_ARGS__
Användarvisningsbild
erixon
Inlägg: 380
Blev medlem: 27 augusti 2003, 10:21:58

Inlägg av erixon »

Tusen Tack det löste problemet :D
henkebenke
Inlägg: 515
Blev medlem: 31 maj 2003, 10:42:37
Ort: Helsingborg

Inlägg av henkebenke »

Verkar som någon redan gjort jobbet annars:

Kod: Markera allt

/******************************************************************************
 This file is a patched version of printf called _printf_P
 It is made to work with avr-gcc for Atmel AVR MCUs.
 There are some differences from standard printf:
 	1. There is no floating point support (with fp the code is about 8K!)
 	2. Return type is void
 	3. Format string must be in program memory (by using macro printf this is
 	   done automaticaly)
 	4. %n is not implemented (just remove the comment around it if you need it)
 	5. If LIGHTPRINTF is defined, the code is about 550 bytes smaller and the
 	   folowing specifiers are disabled :
 		space # * . - + p s o O
	6. A function void uart_sendchar(char c) is used for output. The UART must
		be initialized before using printf.

 Alexander Popov
 sasho@vip.orbitel.bg
******************************************************************************/
Hittade filen i "\avrgcc\lib\avr-libc-20011126\src\contrib\printf_P.zip", vet inte om det är standard katalogstruktur.
Skriv svar