在嵌入式编程中,我经常会得到类似这样的代码:
void debug_terminal_printf(const char* format, va_list ap){
char tmp[ARBITRARY_LIMITATION];
vsprintf( tmp, format, ap );
for(int pos=0; pos<strlen(tmp); pos++){
if( tmp[pos] == 0 ) break;
uart_putc( tmp[pos] );
}
}
我希望我的界面提供字符串格式的便利,但通常格式化字符串的使用者是一次消耗格式化字符串几个字节的东西,在这种情况下就像UART。所以我在每个帮助器函数中都得到了这些小的临时缓冲区。使用动态内存并不合适,因为关于动态内存使用的决策是在系统级别进行的,在嵌入式平台代码中使用它是不合适的。
我希望能够做的是逐步处理字符串,如下所示:
void debug_terminal_printf(const char* format, va_list ap){
char tmp[MAX_TOKEN_SIZE];
while(*format){
int len = single_token_sprintf( tmp, format, ap );
uart_puts(tmp);
format += len;
}
}
这样我就不需要为整个格式化字符串提供足够的内存,我可以等到硬件使用了最后一个令牌,然后继续解码下一个令牌。
有没有人见过这样的(希望是可移植的)成语,摆脱了对大型临时缓冲区的需求?
答案 0 :(得分:0)
非常感谢@chux指导我朝着正确的方向前进。
答案是可以挂接运行时环境的putc()实现,以便在调用fprintf时,我可以一次一个字节地使用生成的字符串。这是非常不便携的。对于每种环境,完成此任务的确切方法将有所不同。
在我的案例中(Keil上的Cortex M),Keil在此提供说明: http://www.keil.com/support/man/docs/gsac/gsac_retargetcortex.htm