Letmo jsem koukal do manuálu toho kompileru a zdá, že maj prostě tu svoji implementaci stdio tvrdě zadrátovanou.
Otázka je, jestli portací nějaké externí odlehčené knihovny si pomůžeš (newlib, embedded printf) apod.
Většinou jde jenom to, že implementuješ nějakou obdobu funkce putchar() a pak to přesměruješ na standartní výstup.
Ve tvým kompilátoru je třeba naznačeno tohle s UARTem
Kód: Vybrat vše
void putch(char data) {
while( ! TXIF) // check buffer
continue; // wait till ready
TXREG = data; // send data
}
přesměrování standartního výstupu se u GNU AVR Cdělá třeba takhle:
Kód: Vybrat vše
#include <stdio.h>
static int uart_putchar(char c, FILE *stream);
static FILE mystdout = FDEV_SETUP_STREAM(uart_putchar, NULL,
_FDEV_SETUP_WRITE);
static int
uart_putchar(char c, FILE *stream)
{
if (c == '\n')
uart_putchar('\r', stream);
loop_until_bit_is_set(UCSRA, UDRE);
UDR = c;
return 0;
}
int
main(void)
{
init_uart();
stdout = &mystdout;
printf("Hello, world!\n");
return 0;
}
Ten tvůj PIC má 2kB FLASHky. To je na hrátky s printf a sprintf dost málo
Další kámen úrazu je v v datové paměti, kde si podle mě zbytečně ukládáš konstatní řetězce - jednou jsou ve programové paměti a podruhé v datové zbytečně. Kompilátor by měl umět vytvářet a přistupovat ke konstatním proměnným jenom ve FLASHCe, ale pochybuju, že toho dosáhneš použitím const v Cčku.
Trošku OT:
Chápu, že se chceš asi urputně držet svých 8-bitových PICů, co jsou za zenitem, ale možná by stálo za úvahu pouvažovat o nějakých modernějších 8-bitových mcučkách, které nemají takové paměťové limitace, periferie jako ten PIC a nemají krkolomný přístup k programování v C...a stojej zhruba stejně.
Například nové STM8 jsou dobrý (k SDCC kompilátoru máš slušný příklady), AVR8 nebo modernější PIC8, když už seš zvyklý na PICy...