Sida 1 av 1

Macro i AVR-GCC

Postat: 20 mars 2005, 17:30:52
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...

Postat: 20 mars 2005, 18:02:50
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.

Postat: 20 mars 2005, 18:24:34
av Melker
http://www.redhat.com/docs/manuals/ente ... acros.html
verkar ha lösningen; ##__VA_ARGS__

Postat: 20 mars 2005, 18:28:59
av erixon
Tusen Tack det löste problemet :D

Postat: 20 mars 2005, 19:13:15
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.