在設(shè)計之初我們希望通過調(diào)試程序完成我們需要的代碼設(shè)計,這些都需要我們進(jìn)行調(diào)試,進(jìn)入degug模式,往往系統(tǒng)運行起來我們無法判斷程序運行哪一步因此需要通過打印功能顯示關(guān)鍵步驟的程序運行節(jié)點,同樣在rt-thread操作系統(tǒng)中依然可以進(jìn)行此過程 的代碼實現(xiàn)。下面就此進(jìn)行討論。
作為打印函數(shù)它提供了我們對應(yīng)的函數(shù)接口,我們調(diào)用時其實與printf是相同的用法,但是看底層的函數(shù)描述我們就知道其實還是存在差異的。
首先粘貼出函數(shù)的實際項目中的用法:
rt_kprintf("the producer generates a number: %d\n", array[set%MAXSEM]);
運行起來我們看到相應(yīng)的打印結(jié)果
相比于之前我們接觸到的重定義函數(shù),rt_kprintf定義為:void rt_kprintf(const char *fmt, ...)
下面我們看一下具體函數(shù)的描述(看注釋):
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) //判斷控制臺設(shè)備是否為空
{
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); //設(shè)備寫線程
_console_device->open_flag = old_flag; //控制臺設(shè)備狀態(tài)
}
#else
rt_hw_console_output(rt_log_buf); 0 //控制臺輸出buf
#endif
va_end(args);
}
RTM_EXPORT(rt_kprintf);
其中包含的幾個線程大家可以自行觀看官方文件庫。
-
操作系統(tǒng)
+關(guān)注
關(guān)注
37文章
6889瀏覽量
123642 -
函數(shù)
+關(guān)注
關(guān)注
3文章
4345瀏覽量
62901 -
RT-Thread
+關(guān)注
關(guān)注
31文章
1305瀏覽量
40331
發(fā)布評論請先 登錄
相關(guān)推薦
評論