ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

之前写的乱七八糟一大堆2

2022-03-03 14:36:56  阅读:168  来源: 互联网

标签:rt __ LOG 乱七八糟 之前 一大堆 RT buf log


关于打印输出函数的使用

rt_kprintf()

不能打印浮点数!

//RT官方预留的打印功能rt_kprintf无法输出小数(不知道是不是全部版本都这样,我这里使用的是3.1.4的版本出现这种情况,使用 MCU为stm32。  即 使用类似下方打印输出时,

float num = 10.0f;
rt_kprintf("float %.2f\n", num);
//输出的结果并不是
float 10.00
//而是
float %f
   
   
/* 查看了下rt_kprintf这个函数的实现方式后发现问题   官方对于这个函数的实现如下 */
void rt_kprintf(const char *fmt, ...)
{
   va_list args;
   rt_size_t length;
   static char rt_log_buf[RT_CONSOLEBUF_SIZE];

   va_start(args, fmt);
   /* the return value of vsnprintf is the number of bytes that would be
    * written to buffer had if the size of the buffer been sufficiently
    * large excluding the terminating null byte. If the output string
    * would be larger than the rt_log_buf, we have to adjust the output
    * length. */
   length = rt_vsnprintf(rt_log_buf, sizeof(rt_log_buf) - 1, fmt, args);
   
   if (length > RT_CONSOLEBUF_SIZE - 1)
       length = RT_CONSOLEBUF_SIZE - 1;
#ifdef RT_USING_DEVICE
   if (_console_device == RT_NULL)
  {
       rt_hw_console_output(rt_log_buf);
  }
   else
  {
       rt_uint16_t old_flag = _console_device->open_flag;

       _console_device->open_flag |= RT_DEVICE_FLAG_STREAM;
       rt_device_write(_console_device, 0, rt_log_buf, length);
       _console_device->open_flag = old_flag;
  }
#else
   rt_hw_console_output(rt_log_buf);
#endif
   va_end(args);
}
//仔细看会发现 官方这里格式化参数 调用的接口是RT自己实现的


/*******************************************************************/
length = rt_vsnprintf(rt_log_buf, sizeof(rt_log_buf) - 1, fmt, args);
//阅读了下RT实现的方法发现 并没有对%f进行处理,因此把官方使用的接口替换成stdio.h中的

length = vsnprintf(rt_log_buf, sizeof(rt_log_buf) - 1, fmt, args);
//再次打印小数就正常了,注意修改完 需添加头文件,即

#include <stdio.h>
//目前暂未发现这样修改后有什么问题,所以也不清楚RT官方是出于什么原因使用这样的实现方式,如果后期使用出现问题的时候可自行修改回原来的方式
/********************************************************************/

 

 

 

关于ulog

其一可以解决打印浮点数的问题

LOG_I("sm9541 fetch pressure is %f, %d\r\n",
                       sm9541_p / 1000,
                       sm95_data[0].timestamp);
LOG_I("sm9541 fetch temperature is %f, %d\r\n",          
                       sm9541_t / 100,
                       sm95_data[1].timestamp);

输出不同等级的log信息 [ output different level log by LOG_X API ]

 

#define LOG_TAG "example"

#define LOG_LVL LOG_LVL_DBG

#include <ulog.h>

LOG_I()
LOG_E()
LOG_W()
LOG_D()
/*
* output different level log by LOG_X API
*
* NOTE: The `LOG_TAG` and `LOG_LVL` must be defined before including the <ulog.h> when you want to use LOG_X API.
*
* #define LOG_TAG             "example"
* #define LOG_LVL             LOG_LVL_DBG
* #include <ulog.h>
*
* Then you can using LOG_X API to output log
*
* LOG_D("this is a debug log!");
* LOG_E("this is a error log!");
*/

#define LOG_E(...)                     ulog_e(LOG_TAG, __VA_ARGS__)
#define LOG_W(...)                     ulog_w(LOG_TAG, __VA_ARGS__)
#define LOG_I(...)                     ulog_i(LOG_TAG, __VA_ARGS__)
#define LOG_W(...)                     ulog_d(LOG_TAG, __VA_ARGS__)
#define LOG_RAW(...)                   ulog_raw(__VA_ARGS__)
#define LOG_HEX(name, width, buf, size)     ulog_hex(name, width, buf, size)

 

 

 


关于编写 .md /markdown文档 (英文输入法下)

markdown ---- 文本标记语言

 

  • (“ -” + “ ” + 回车)

插入图片

分隔线 “---” + 回车

表格 “|” + “ ” + “|” + “ ” + “|” 等 + 回车

   
     

插入代码块 “```” + 回车

 

 

 

 

 

 

 

标签:rt,__,LOG,乱七八糟,之前,一大堆,RT,buf,log
来源: https://www.cnblogs.com/programming-debug/p/15959660.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有