目錄
VxWorks還提供了其他內核格式化I/O功能。
1.使用串行I/O輪詢模式輸出:kprintf()
kprintf()按照printf()相同的方式進行格式化輸出,區別在於kprintf()是按照輪詢的方式向目標串口輸出字符。該函數主要用於系統調試,可以在系統啓動過程中(中斷使能或I/O系統初始化之前)或在ISR中使用,這些都是printf()無法實現的。該函數由INCLUDE_DEBUG_KPRINTF組件提供。
kputs()提供了類似的功能,只是不能格式化輸出。該函數由INCLUDE_DEBUG_KPUTS組件提供。
可選的組件INCLUDE_DEBUG_KWRITE_USER可用於實現輸出到存儲介質中。
內核函數kprintf()和kputs()可以用於向用戶自定義的存儲介質中寫入數據(如FLASH)。
下面的函數展示瞭如何向用戶預留的內存中寫入數據。
執行如下步驟以使用該函數:
(1)將代碼添加到一個C文件中;
(2)使用合適的BSP創建一個VIP項目;
(3)將這個C文件添加到VIP中;
(4)爲項目添加如下組件:
- INCLUDE_DEBUG_KPRINTF
- INCLUDE_DEBUG_KWRITE_USER
- INCLUDE_USER_RESERVED_MEMORY
(5)設置配置參數DEBUG_KWRITE_USR_RTN和USER_RESERVED_MEM;
(6)構建項目並啓動VxWorks
當再調用kprintf()和kputs()時,輸出結構被寫入了用戶預留的內存中。後續可以從用戶預留的內存起始地址讀取數據,以獲取相關信息。
2.其他格式化I/O函數
用戶級fioLib庫提供了其他格式化輸出和讀取的函數(非ANSI)。
內核fioLib庫提供了 其他格式化但非緩衝的輸出和讀取函數(非ANSI)。
舉例來說,在兩種情況下,printErr()函數與printf()函數類似,只是將結果輸出到了標準錯誤文件描述符中。fdprintf()函數想一個指定的文件描述符輸出格式化字符串。
3.消息記錄(message logging)
內核logLib庫提供了高層級的I/O內核功能,允許在當前任務上下文或沒有任務上下文時,記錄格式化消息而不用I/O操作。消息格式和參數被髮送到一個記錄任務的消息隊列中,該任務後續將格式化並輸出消息。對於必須在終端中記錄消息,或不想因爲I/O延遲當前的任務,或不想使用當前任務棧進行消息格式化(將使用大量棧空間)的清空,就可以使用消息記錄功能。消息將顯示在控制檯中,也可以在啓動時使用logInit()或在運行時使用logFdSet()函數進行輸出重定向。
需要引入INCLUDE_LOGLIB組件以包含logLib功能。