瑞萨Synergy平台怎样添加printf接口?
查找SPP User's Manual,只找到下图描述。Threads Configuration窗口也没找到相关选项,映射{:mad:}自己写个Printf模块就好~网上也有很多,之前在STM8上面测试用过~
可惜我那机械盘挂了,好多种子,不对,好多资料都没了~{:cry:} heimareed 发表于 2018-11-27 09:58
自己写个Printf模块就好~网上也有很多,之前在STM8上面测试用过~
可惜我那机械盘挂了,好多种子,不对,好 ...
//=============================================================================
//
//=============================================================================
static void DoPrint( const char *fmt, va_list ap )
{
charch;
chari;
longvalue;
bit fl_zero;
bit fl_num;
BYTEfl_len;
BYTEcnt;
DWORD mask=1;
char *ptr;
while(1) {
//----- Find Formatter % -----
switch( ch = *fmt++ ) {
case 0: return;
case '%': if( *fmt != '%' ) break;
fmt++;
default: _outchar( ch );
continue;
}
//----- Get Count -------------
fl_zero = 0;
fl_num = 0;
cnt = 0;
ch = *fmt++;
if( ch=='0' ) {
fl_zero = 1;
ch = *fmt++;
cnt = ch - '0';
ch = *fmt++;
}
else if( ch>='0' && ch<='9' ) {
cnt = ch - '0';
ch = *fmt++;
}
//----- Get char(B) / int / long(L) ----------------
fl_len = 2;
switch(ch) {
case 'l':
case 'L': ch = *fmt++; fl_len = 4; break;
case 'b':
case 'B': ch = *fmt++; fl_len = 1; break;
}
//----- Get Type Discriptor -----
switch( ch ) {
case 'd':
case 'u':
switch (fl_len) {
case 1:
if( ch=='d' ) value = (char)va_arg( ap, BYTE );
else value = (BYTE)va_arg( ap, BYTE );
break;
case 2:
if( ch=='d' ) value = (int)va_arg( ap,WORD );
else value = (WORD)va_arg( ap, WORD );
break;
case 4:
if( ch=='d' ) value = (long)va_arg( ap, DWORD );
else value = (DWORD)va_arg( ap, DWORD );
break;
}
if( value<0 ) {
_outchar('-');
value = value*(-1);
}
if(cnt==0) {
if( value==0 ) { _outchar('0'); continue; }
for(cnt=0, mask=1; cnt<10; cnt++) {
if( (value/mask)==0 ) break;
mask = mask*10;
}
}
for(i=0, mask=1; i<cnt-1; i++) mask = mask*10;
while(1) {
ch = (value / mask) + '0';
if( ch=='0' && fl_zero==0 && mask!=1 ) ch=' ';
else fl_zero = 1;
_outchar(ch);
value = value % (mask);
mask = mask / 10;
if( mask==0 )
break;
}
continue;
case 'x':
case 'X':
switch (fl_len) {
case 1: value = (BYTE)va_arg( ap, BYTE ); break;
case 2: value = (WORD)va_arg( ap, WORD ); break;
case 4: value = (DWORD)va_arg( ap, DWORD ); break;
}
if(cnt==0) cnt = fl_len*2;
for(i=0; i<cnt; i++) {
_outchar( Hex[(value >> (cnt-i-1)*4) & 0x000f] );
}
continue;
case 's':
ptr = (char *)va_arg( ap, BYTE* );
while(*ptr!='\0')
_outchar(*ptr++);
continue;
case 'c':
value = va_arg( ap, BYTE );
_outchar((BYTE)value);
continue;
default:
value = (WORD)va_arg( ap, int );
continue;
}
}
}
void Printf( const char *fmt, ... )
{
BYTE flg = 0;
va_list ap;
va_start(ap, fmt);
if(flg) DoPrint( fmt, ap );
va_end( ap );
}
!!!瑞萨给你发的种子?
你说的是这种实现方式吧?但是,我想了解Synergy平台怎样定义的,因为官方例程有用到printf,但是没有检测到哪个引脚有字符输出。 xld826 发表于 2018-11-27 10:34
//=============================================================================
// ...
你需要的是重定向吧 就是重定向啊 xld826 发表于 2018-11-27 10:34
//=============================================================================
// ...
楼上两位都说了,你这意思要的是重定向嘛。
程序里面_outchar()函数,你把他重定向到串口(或者其他你想要输出的IO口)输出不就好了~ heimareed 发表于 2018-11-28 10:43
楼上两位都说了,你这意思要的是重定向嘛。
程序里面_outchar()函数,你把他重定向到串口(或者其他你 ...
Synergy平台跟Keil和IAR重映射方式并不一样,使用E2Studio IDE时需要
1、Project/Properties/C/C++ Build/Setting/Tool Setting/Cross ARM C Linker/General 使用 “-nostdlib” compiler option
2、Project/Properties/C/C++ Build/Setting/Tool Setting/Cross ARM C Linker/Miscellaneous 去掉 “-specs=rdimon.specs” linker option
然后添加自己的 _write函数
int _write (int fd, char *ptr, int len)
{
g_usb_terminal.p_api->write(g_usb_terminal.p_ctrl, ptr, len, TX_WAIT_FOREVER);
return len;
}
huangqi412 发表于 2018-11-27 12:13
你需要的是重定向吧
见7楼答复 wowangru 发表于 2018-11-27 16:21
就是重定向啊
见7楼答复
页:
[1]