QUOTE (kan35 @ Jul 29 2011, 13:35)

если не обзывать putchar как extern "С"putchar, то компилятор (IAR) просто его не вставляет в код, а как только обзываю как extern в том и другом namespace, то линкер ругается на то, что функции дублируются... тупик какой то, должен же быть простой выход?!
Да, потому что printf - сишная функция. Выход - напишите свою printf, "завернув" в нее sprintf и вывод в нужный порт:
CODE
class iodevice
{
public:
virtual void putchar(const uint8_t &byte) = 0;
void send(char const* buffer);
void puts(char const* buffer);
void printf(char const *format, ...);
protected:
iodevice() {}
};
void iodevice::send(char const* buffer)
{
while(*buffer)
putchar(*buffer++);
}
void iodevice::puts(char const * string)
{
send(string);
send("\r\n");
}
void iodevice::printf(char const * format, ...)
{
const size_t BUFFER_SIZE = 80;
char Buffer[BUFFER_SIZE];
va_list args;
va_start (args, format);
vsnprintf (Buffer, BUFFER_SIZE, format, args);
va_end (args);
send(Buffer);
}
class system_uart_t : public iodevice
{
public:
void putchar(const uint8_t &byte) { UART1.send(byte); }
};
class user_uart_t : public iodevice
{
public:
void putchar(const uint8_t &byte) { UART2.send(byte); }
};
system_uart_t System_uart;
user_uart_t User_uart;
void test()
{
System_uart.printf("Tipa test %d", 1);
User_uart.printf("Tipa test %d", 2);
iodevice * pOutput = &User_uart;
pOutput->printf("слава мне, победителю %s!!!", "драконов")
}