SylixOS日誌子系統簡介

一、日誌子系統簡介

爲了能夠實時記錄系統中發生的各種事件,SylixOS加入了日誌管理功能。通過分析日誌文件可以及時發現和處理系統運行過程中的問題。SylixOS日誌子系統的主要功能是記錄系統發生的各個事件,根據不同使用場景可以選擇不同的日誌等級,來決定是否打印信息,還可以設置日誌系統輸出的文件集。

二、SylixOS中日誌系統初始化

系統內核啓動時候會調用到_logInit函數,創建消息隊列;調用函數API_PartitionCreate創建內存分區,建立printk緩衝;同時建立日誌處理線程t_log,並初始化t_log線程。

t_log線程處理日誌系統中消息的接收和發送,執行流程如下:

    1. 調用函數API_MsgQueueReceive從消息隊列接收消息;

    2. 判斷是任務中發送,還是中斷中發送,根據是否打印頭部的參數,選擇是否打印頭部信息;

    3. 調用函數__logPrintk或者__logPrintf函數打印數據;

    4. 更新_G_iLogMsgsLost值,即丟失的日誌消息數量。

三、SylixOS中日誌打印函數printk

SylixOS中會調用函數printk來實現日誌打印,函數執行過程如下:

由函數執行過程可以看出,printk函數本質上是將需要打印的數據保存到消息中,以消息隊列的方式發送出去,由t_log線程接收消息隊列中的消息,執行打印數據的操作。

    1. 解析輸入字符串中的打印等級,如果有則設置解析值爲打印級別,若沒有則設置爲默認級別,即default_message_loglevel;

    2. 判斷打印級別,若大於console_loglevel則不打印信息;

    3. 調用C庫函數vsnprintf向字符串中打印自定義數據格式;

    4. 填充消息結構體中其餘成員參數;

    5. 判斷log系統是否初始化,如果沒有初始化則調用函數__logBspMsg打印信息;若初始化完成,則調用API_MsgQueueSend函數向消息隊列發送消息,發送失敗則增加丟失消息隊列計數值,即_G_iLogMsgsLost值。

四、相關Shell命令

SylixOS提供了相關Shell命令供用戶使用。包括:logfiles命令用於顯示內核日誌打印文件列表;logfileclear命令從內核日誌打印文件表中清除指定的內核文件描述符;logfileadd命令向內核日誌打印函數加入指定的內核文件描述符;loglevel命令顯示或設置當前內核日誌(printk)打印等級。

根據以上Shell命令,構建測試程序,演示printk函數向文件描述符中輸出日誌信息的使用方法。

4.1 測試程序代碼

構建簡單的測試程序,在應用層調用printk函數打印字符串"Hello SylixOS!"。

#include <stdio.h>

#include "system/loglib/loglib.h"

 

int main (int argc, char **argv)

{

printk("Hello SylixOS!\n");

 

return (0);

}

編譯測試程序並部署到mini2440虛擬機上。

4.2 使用Shell命令測試

測試過程如圖 4.1所示。

圖 4.1 日誌系統使用演示

由測試用例可以看出,printk函數完成了向文件中輸出打印信息的操作。

採用同樣的方法也可以向telnet終端,串口終端等輸出打印信息。


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