《VxWorks7編程指南》筆記(九)——I/O系統:其他格式化I/O函數(可用於調試)

目錄

1.使用串行I/O輪詢模式輸出:kprintf()

2.其他格式化I/O函數

3.消息記錄(message logging)


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功能。

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章