This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] LP-MSPM0L2228:无法使用 CCS 20.0.1.4__1.6.1使用 printf ()来打印变量

Guru**** 2328790 points
Other Parts Discussed in Thread: LP-MSPM0L2228, LP-MSPM0G3507
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/1465691/lp-mspm0l2228-cannot-use-printf-to-print-variable-by-using-ccs-20-0-1-4__1-6-1

器件型号:LP-MSPM0L2228
主题中讨论的其他器件: LP-MSPM0G3507

工具与软件:

您好、先生、

我试图使用 printf()来打印变量、但它似乎是挂起的、我曾尝试添加堆大小、但仍然有同样的问题。 是否有任何可能的方法来解决该问题?

该代码用于打印从 UART 接收到的字符。

printf ("GOT %x\n"、recvChar);

我的目标板是 LP-MSPM0L2228。

谢谢!

Edware

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、 Edware

    printf 不会在 LP-MSPM0L2228上测试、但 printf 在 LP-MSPM0G3507上运行良好。

    在 G3507上、在调试时、printf 会在 CCS 控制台窗口中打印调试日志。

    您可以试用 L2228。

    此外、您还可以使用 GitHub 中的以下演示代码:

    e2e.ti.com/.../TinyPrintf_5F00_uart_5F00_rw_5F00_M0G3507_5F00_nortos_5F00_ticlang.zip

    这使用旧版本 SDK 和 syscfg、需要切换到最新版本、也需要从 G3507更改为 L2228。

    此致、

    Helic

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Helic:

    对我来说,这是一件好事。 但我对输出接口有疑问。 printf()的默认输出是 UART0、我是否知道如何将其更改为 CIO?

    谢谢!

    Edware

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、 

    有关 UART 接口更改、请参阅演示注释。

     * @Tips:
     * You can modify the hardware of MSPM0 in printf.c file, Line 132:
     * Function: static inline void _putchar(const char _c).
     * You can use the macro definitions in printf.h to turn off
     * complex printf functions such as float point numbers,
     * longlong type variables, to reduce the program size.

    此致、

    Helic

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Helic:

    谢谢你。 我知道我可以修改_putchar()函数。

    static inline void _putchar (const char _c){

      /*等待直到 TX FIFO 被发送且 TX FIFO 未满*/
      while (DL_UART_isTXFIFOFULL (UART_0_INST));
      DL_UART_transmitData (UART_0_INST、_c);
    }

    但我不知道 CIO 的实例。 是否有向 CIO 输出消息的示例?

    谢谢!

    Edware

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、 

    您可以在 ticlang 中找到一些相关代码、例如 fputs.c、如下所示:
    此器件函数会将 CIO 输出作业发送到 CCS 控制台。

    /*****************************************************************************/
    /* FPUTS -  Write a string to a stream                                       */
    /*                                                                           */
    /*    This function writes string _PTR to stream _FP, returning the number   */
    /*    of characters written upon success, or an EOF upon failure.            */
    /*                                                                           */
    /*****************************************************************************/
    _CODE_ACCESS int fputs(const char * __restrict _ptr, FILE * __restrict _fp)
    {
       /*------------------------------------------------------------------------*/
       /* Local variables                                                        */
       /*------------------------------------------------------------------------*/
       size_t   num_left, ptr_strlen;
       char     *fpos          = (char *)_ptr;
       int      room_left,
                flush_flag     = 0,
                num_to_write;
    
       /*------------------------------------------------------------------------*/
       /* The current thread in a multi-threaded application must protect access */
       /* to the file stream. In this case, _fp may be updated, so we must       */
       /* ensure that the local copy of _fp is flushed to shared memory before   */
       /* leaving the critical section (invalidated if it is not modified).      */
       /*------------------------------------------------------------------------*/
       __TI_file_lock(_fp);
    
       /*------------------------------------------------------------------------*/
       /* Make sure that the stream is writeable.                                */
       /*------------------------------------------------------------------------*/
       if (!__TI_wrt_ok(_fp)) 
       { 
          __TI_data_synch_INV(_fp, sizeof(FILE));
          __TI_file_unlock(_fp);
          return (EOF);
       }
     
       room_left = (int)(_fp->bufend - _fp->pos);
       ptr_strlen = num_left = strlen(_ptr);
    
       /*------------------------------------------------------------------------*/
       /* If the stream is non-buffered, call the lowlevel WRITE function.       */
       /*------------------------------------------------------------------------*/
       if (_BUFFMODE(_fp) == _IONBF) 
       {
           int num_written = 0;
    
           while (num_left > 0)
           {
    	   int write_return = write(_fp->fd, _ptr + num_written, num_left);
    	   if (write_return < 0) 
    	   { 
    	       _SET(_fp, _STATERR); 
                   __TI_data_synch_WBINV(_fp, sizeof(FILE));
                   __TI_file_unlock(_fp);
    	       return (EOF);
    	   }
    	   else
    	   {
    	       num_written += write_return;
    	       num_left    -= write_return;
    	   }
           }
    
           __TI_data_synch_WBINV(_fp, sizeof(FILE));
           __TI_file_unlock(_fp);
           return ptr_strlen;
       }
     
       /*------------------------------------------------------------------------*/
       /* Write the string into the buffer, flushing it when full.               */
       /*------------------------------------------------------------------------*/
       while (num_left > 0)
       {
          num_to_write = (num_left > room_left) ? room_left : num_left;
          if ((_BUFFMODE(_fp) == _IOLBF) && memchr(fpos, '\n', num_to_write))
          { 
             num_to_write = (char *)memchr(fpos, '\n', num_to_write) - fpos + 1;
             flush_flag = 1;
          }
          memcpy(_fp->pos, fpos, num_to_write);
    
          /*---------------------------------------------------------------------*/
          /* Update pointers and counters.                                       */
          /*---------------------------------------------------------------------*/
          _fp->pos  += num_to_write;
          fpos      += num_to_write;
          num_left  -= num_to_write;
          room_left -= num_to_write;
    
          /*---------------------------------------------------------------------*/
          /* If the buffer is full, flush it.  Any I/O errors cause this         */
          /* function to exit, returning an EOF.                                 */
          /*---------------------------------------------------------------------*/
          if (room_left == 0 || flush_flag)
          {
             if (__TI_doflush(_fp))
             {
                _SET(_fp, _STATERR);
                __TI_data_synch_WBINV(_fp, sizeof(FILE));
                __TI_file_unlock(_fp);
                return (EOF);
             }
             room_left = (int)(_fp->bufend - _fp->pos);
             _SET(_fp, _MODEW);
             flush_flag = 0;
          }
       }
    
       __TI_data_synch_WBINV(_fp, sizeof(FILE));
       __TI_file_unlock(_fp);
       return ptr_strlen;
    }

    但我从来没有尝试将 tinyprintf 与 CIO 合并。

    此致、

    Helic