在设计之初我们希望通过调试程序完成我们需要的代码设计,这些都需要我们进行调试,进入degug模式,往往系统运行起来我们无法判断程序运行哪一步因此需要通过打印功能显示关键步骤的程序运行节点,同样在rt-thread操作系统中依然可以进行此过程 的代码实现。下面就此进行讨论。
作为打印函数它提供了我们对应的函数接口,我们调用时其实与printf是相同的用法,但是看底层的函数描述我们就知道其实还是存在差异的。
首先粘贴出函数的实际项目中的用法:
rt_kprintf("the producer generates a number: %d\n", array[set%MAXSEM]);
运行起来我们看到相应的打印结果
相比于之前我们接触到的重定义函数,rt_kprintf定义为:void rt_kprintf(const char *fmt, ...)
下面我们看一下具体函数的描述(看注释):
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); 0 //控制台输出buf
#endif
va_end(args);
}
RTM_EXPORT(rt_kprintf);
其中包含的几个线程大家可以自行观看官方文件库。
全部0条评论
快来发表一下你的评论吧 !