在設(shè)計(jì)之初我們希望通過(guò)調(diào)試程序完成我們需要的代碼設(shè)計(jì),這些都需要我們進(jìn)行調(diào)試,進(jìn)入degug模式,往往系統(tǒng)運(yùn)行起來(lái)我們無(wú)法判斷程序運(yùn)行哪一步因此需要通過(guò)打印功能顯示關(guān)鍵步驟的程序運(yùn)行節(jié)點(diǎn),同樣在rt-thread操作系統(tǒng)中依然可以進(jìn)行此過(guò)程 的代碼實(shí)現(xiàn)。下面就此進(jìn)行討論。
作為打印函數(shù)它提供了我們對(duì)應(yīng)的函數(shù)接口,我們調(diào)用時(shí)其實(shí)與printf是相同的用法,但是看底層的函數(shù)描述我們就知道其實(shí)還是存在差異的。
首先粘貼出函數(shù)的實(shí)際項(xiàng)目中的用法:
rt_kprintf("the producer generates a number: %d\n", array[set%MAXSEM]);
運(yùn)行起來(lái)我們看到相應(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); //計(jì)算長(zhǎng)度
if (length > RT_CONSOLEBUF_SIZE - 1)
length = RT_CONSOLEBUF_SIZE - 1;
#ifdef RT_USING_DEVICE
if (_console_device == RT_NULL) //判斷控制臺(tái)設(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è)備寫(xiě)線程
_console_device->open_flag = old_flag; //控制臺(tái)設(shè)備狀態(tài)
}
#else
rt_hw_console_output(rt_log_buf); 0 //控制臺(tái)輸出buf
#endif
va_end(args);
}
RTM_EXPORT(rt_kprintf);
其中包含的幾個(gè)線程大家可以自行觀看官方文件庫(kù)。
-
操作系統(tǒng)
+關(guān)注
關(guān)注
37文章
6847瀏覽量
123420 -
函數(shù)
+關(guān)注
關(guān)注
3文章
4338瀏覽量
62734 -
RT-Thread
+關(guān)注
關(guān)注
31文章
1293瀏覽量
40228
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論