搜索
bottom↓
回复: 8
打印 上一主题 下一主题

瑞萨Synergy平台怎样添加printf接口?

[复制链接]

出0入0汤圆

跳转到指定楼层
1
发表于 2018-11-26 15:06:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
查找SPP User's Manual,只找到下图描述。Threads Configuration窗口也没找到相关选项,映射


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

2
发表于 2018-11-27 09:58:11 | 只看该作者
自己写个Printf模块就好~网上也有很多,之前在STM8上面测试用过~
可惜我那机械盘挂了,好多种子,不对,好多资料都没了~

出0入0汤圆

3
 楼主| 发表于 2018-11-27 10:34:59 | 只看该作者
heimareed 发表于 2018-11-27 09:58
自己写个Printf模块就好~网上也有很多,之前在STM8上面测试用过~
可惜我那机械盘挂了,好多种子,不对,好 ...


//=============================================================================
//                                                                           
//=============================================================================
static void DoPrint( const char *fmt, va_list ap )
{
        char  ch;
        char  i;
        long  value;
        bit   fl_zero;
        bit   fl_num;
        BYTE  fl_len;
        BYTE  cnt;
        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,但是没有检测到哪个引脚有字符输出。

出0入0汤圆

4
发表于 2018-11-27 12:13:45 | 只看该作者
xld826 发表于 2018-11-27 10:34
//=============================================================================
//                ...

你需要的是重定向吧  

出10入12汤圆

5
发表于 2018-11-27 16:21:24 | 只看该作者
就是重定向啊

出0入0汤圆

6
发表于 2018-11-28 10:43:17 | 只看该作者
xld826 发表于 2018-11-27 10:34
//=============================================================================
//                ...

楼上两位都说了,你这意思要的是重定向嘛。

程序里面_outchar()函数,你把他重定向到串口(或者其他你想要输出的IO口)输出不就好了~

出0入0汤圆

7
 楼主| 发表于 2018-12-4 16:12:19 | 只看该作者
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;
}

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

8
 楼主| 发表于 2018-12-4 16:12:50 | 只看该作者
huangqi412 发表于 2018-11-27 12:13
你需要的是重定向吧

见7楼答复

出0入0汤圆

9
 楼主| 发表于 2018-12-4 16:13:13 | 只看该作者

见7楼答复
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-3-29 16:35

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表