在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<menu id="6qfwx"><li id="6qfwx"></li></menu>
    1. <menu id="6qfwx"><dl id="6qfwx"></dl></menu>

      <label id="6qfwx"><ol id="6qfwx"></ol></label><menu id="6qfwx"></menu><object id="6qfwx"><strike id="6qfwx"><noscript id="6qfwx"></noscript></strike></object>
        1. <center id="6qfwx"><dl id="6qfwx"></dl></center>

            博客專(zhuān)欄

            EEPW首頁(yè) > 博客 > Diagnostic Log and Trace——開(kāi)發(fā)人員如何使用 DLT

            Diagnostic Log and Trace——開(kāi)發(fā)人員如何使用 DLT

            發(fā)布人:電子禪石 時(shí)間:2023-11-17 來(lái)源:工程師 發(fā)布文章

            DLT 示例應(yīng)用

            要在應(yīng)用程序中使用 DLT,它必須鏈接到 DLT 庫(kù)。在系統(tǒng)上安裝 DLT 守護(hù)程序后,將有一個(gè)名為 libdlt.so 的共享庫(kù),它為應(yīng)用程序提供接口以獲取與 DLT 守護(hù)程序的連接。在使用共享 dlt 庫(kù)構(gòu)建程序之前,必須在構(gòu)建環(huán)境中設(shè)置庫(kù)路徑和包含路徑。默認(rèn)情況下,頭文件“dlt.h”位于標(biāo)準(zhǔn)包含目錄中名為“dlt/”的目錄中。


            此示例通過(guò)使用最少的代碼示例概述了應(yīng)用程序內(nèi)部的 DLT 使用情況。

            #include <dlt/dlt.h>
             
            DLT_DECLARE_CONTEXT(ctx); /* declare context */
             
            int main()
            {
            	DLT_REGISTER_APP("TAPP", "Test Application for Logging");
             
            	DLT_REGISTER_CONTEXT(ctx, "TES1", "Test Context for Logging");
             
            	/* … */
             
            	DLT_LOG(ctx, DLT_LOG_ERROR, DLT_CSTRING("This is an error"));
             
            	/* … */
             
            	DLT_UNREGISTER_CONTEXT(ctx);
            	DLT_UNREGISTER_APP();
            	return 0;

            DLT 非常易于使用。開(kāi)發(fā)人員必須做的第一件事是包含 dlt 頭文件??梢允褂孟乱恍兄酗@示的宏靜態(tài)聲明 DLT 上下文。首先,必須在主函數(shù)內(nèi)注冊(cè)一個(gè) DLT 應(yīng)用程序。為此,必須指定應(yīng)用程序標(biāo)識(shí)符 APID 和應(yīng)用程序描述。之后,可以指定一個(gè)或多個(gè) DLT 上下文。要以詳細(xì)模式記錄消息,可以使用 DLT_LOG 宏。作為參數(shù),必須指定日志上下文、日志級(jí)別和參數(shù)變量列表。 DLT 要求使用 DLT 類(lèi)型宏對(duì)每個(gè)參數(shù)進(jìn)行強(qiáng)類(lèi)型化。在本例中,DLT_CSTRING 用于指定一個(gè)常量字符串。在應(yīng)用程序清理時(shí),所有 DLT 上下文以及 DLT 應(yīng)用程序都必須注銷(xiāo)。

            ————————————————

            cmake 中如何加入 DLT

            要將 DLT 加入 CMake,推薦的方法是使用作為安裝一部分生成的 CMake 配置文件。

            你可以這樣:

            find_package(automotive-dlt REQUIRED)
            ...
            target_link_libraries(myapp PRIVATE Genivi::DLT)

            這讓您的項(xiàng)目自動(dòng)獲得 libdlt 所需的所有必要編譯和鏈接標(biāo)志,包括包含目錄。


            生成的 CMake 配置文件遵循“Modern CMake”約定,并且只導(dǎo)出一個(gè) IMPORTED CMake 目標(biāo);它不設(shè)置任何變量,除了可用于將 DLT 視為可選依賴(lài)項(xiàng)的automotive-dlt_FOUND 變量。


            生成的 CMake 配置文件(在調(diào)用 find_package(automotive-dlt) 時(shí)隱式使用)默認(rèn)僅將頂級(jí)目錄添加到編譯器的頭文件搜索路徑中;這要求用戶(hù)的 #include 指令以常規(guī)形式編寫(xiě),例如<dlt/dlt.h>。如果您還希望能夠使用舊形式 <dlt.h>(出于向后兼容性原因,pkg-config 模塊始終允許使用),您可以使用 CMake 選項(xiàng) -DWITH_LEGACY_INCLUDE_PATH=On 配置 DLT,以便達(dá)到目的。

            ————————————————

            DLT使用 pkg-config

            除了上面詳述的 CMake 集成之外,還可以通過(guò) pkg-config 使用 DLT。這也可以通過(guò) CMake 的 PkgConfig 模塊來(lái)完成。


            PkgConfig 與“Modern CMake”的使用


            在這里,您也讓 PkgConfig 模塊創(chuàng)建目標(biāo);然而,目標(biāo)的名稱(chēng)由 PkgConfig 模塊確定:

            ————————————————

            find_package(PkgConfig)
            pkg_check_modules(DLT REQUIRED IMPORTED_TARGET automotive-dlt)

            根據(jù)“Modern CMake”,不需要再添加的變量,而只有要添加到鏈接庫(kù)的 CMake 目標(biāo):

            target_link_libraries(myapp PRIVATE PkgConfig::DLT)

            PkgConfig 與“Legacy CMake”(<3.0)的使用

            在這里,您讓 PkgConfig 模塊只創(chuàng)建變量,而不創(chuàng)建目標(biāo):

            find_package(PkgConfig)
            pkg_check_modules(DLT REQUIRED automotive-dlt)

            到 INCLUDE_DIRECTORIES(或者,從 CMake 2.8.11 開(kāi)始,TARGET_INCLUDE_DIRECTORIES),添加

            ${DLT_INCLUDE_DIRS}

            TARGET_LINK_LIBRARIES:


            ${DLT_LINK_LIBRARIES}  (preferred, for CMake >= 3.12)

            ${DLT_LIBRARIES}       (otherwise)

            ${DLT_LIBRARIES} 的內(nèi)容不包括庫(kù)的路徑(例如 -L/path/to/lib),因此如果庫(kù)駐留在不在鏈接器默認(rèn)搜索路徑上的位置,您要么必須添加LINK_DIRECTORIES 的路徑:


            link_directories(${DLT_LIBRARY_DIRS})

            或者,不使用 ${DLT_LIBRARIES},而是使用 ${DLT_LDFLAGS},它結(jié)合了 ${DLT_LIBRARIES} 和 ${DLT_LIBRARY_DIRS}:


            target_link_libraries(myapp ${DLT_LDFLAGS})

            局限性

            在 Android 上,應(yīng)避免在 DLT 應(yīng)用程序中定義 SIGUSR1,因?yàn)?DLT 庫(kù)會(huì)阻止 SIGUSR1 在退出時(shí)終止管家線(xiàn)程。

            ————————————————

            測(cè)試工程源碼

            下面是我的工程:


            dlt_test/

            ├── CMakeLists.txt

            ├── dlt_test.c

            └── LICENSE

            dlt_test.c


            #include <dlt/dlt.h>

             

            DLT_DECLARE_CONTEXT(ctx); /* declare context */

             

            int main()

            {

                DLT_REGISTER_APP("TAPP", "Test Application for Logging");

             

                // DLT_REGISTER_CONTEXT(ctx, "TES1", "Test Context for Logging");

                // 向守護(hù)進(jìn)程注冊(cè)新的上下文,初始日志級(jí)別為DLT_LOG_VERBOSE

                DLT_REGISTER_CONTEXT_LL_TS(ctx, "TES1", " First context ", DLT_LOG_VERBOSE, DLT_TRACE_STATUS_OFF);

                // dlt_register_context_ll_ts(&ctx, "TES1", " First context ", DLT_LOG_VERBOSE, DLT_TRACE_STATUS_OFF);

             

             

                /* … */

                sleep(3);

                DLT_LOG(ctx, DLT_LOG_VERBOSE , DLT_CSTRING("This is an error"));

             

                /* … */

                sleep(3);

                DLT_UNREGISTER_CONTEXT(ctx);

                DLT_UNREGISTER_APP();

                return 0;

            }

            CMakeLists.txt


            # for dlt_test

             

            cmake_minimum_required (VERSION 3.0)

            # The version number.

            set (rtser_VERSION_MAJOR 0)

            set (rtser_VERSION_MINOR 1)

            set (rtser_VERSION_PATCH 0)

            ######################### Project settings #####################################

            project(dlt_test)

            #打印make詳細(xì)信息

            set(CMAKE_VERBOSE_MAKEFILE on)

            #設(shè)置編譯級(jí)別

            add_definitions (-Wall -g)

            SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O0")

            #SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O0 -pthread")

            #include( FindPkgConfig )

             

            ######## config inc&src&linklib settings and build #############################

            find_package(PkgConfig)

            pkg_check_modules(DLT REQUIRED IMPORTED_TARGET automotive-dlt)

            include_directories(

            )

             

            link_directories(

            )

             

            file(GLOB SOURCES

                "*.c"

            )

             

            add_executable(dlt_test

                ${SOURCES}

            )

             

             

            target_link_libraries(dlt_test PRIVATE PkgConfig::DLT)

             

            #安裝位置

            set(CMAKE_INSTALL_PREFIX ${PROJECT_BINARY_DIR})

            # build a CPack driven installer package

            include (InstallRequiredSystemLibraries)

            set (CPACK_RESOURCE_FILE_LICENSE  

                 "${CMAKE_CURRENT_SOURCE_DIR}/LICENSE")

            set (CPACK_PACKAGE_VERSION_MAJOR "${rtser_VERSION_MAJOR}")

            set (CPACK_PACKAGE_VERSION_MINOR "${rtser_VERSION_MINOR}")

            set (CPACK_PACKAGE_VERSION_PATCH "${rtser_VERSION_PATCH}")

            include (CPack)

             

            ######## Install targets ########

            install(TARGETS dlt_test

            RUNTIME DESTINATION  /usr/bin/

            )

            記錄的一般規(guī)則

            需要在關(guān)鍵位置打印log,例如錯(cuò)誤處理,不要亂用log,因?yàn)榇蛴og需要消耗資源;


            避免高頻輸出;


            合并多條消息,請(qǐng)始終考慮每條日志消息都會(huì)產(chǎn)生一定的開(kāi)銷(xiāo)。所有必要的信息總是被組合在一起。此類(lèi)log通常使用正則表達(dá)式 - 讓工作更輕松!


            不要使用 ASCII art;


            不要使用 ASCII 創(chuàng)建圖表;


            避免在循環(huán)中跟蹤;


            日志級(jí)別的使用

            DLT 中提供以下日志級(jí)別:


            DLT_LOG_FATAL 致命的系統(tǒng)錯(cuò)誤,應(yīng)該很少見(jiàn)


            DLT_LOG_ERROR 影響正確功能的錯(cuò)誤


            DLT_LOG_WARN 無(wú)法確保正確行為時(shí)發(fā)出警告


            DLT_LOG_INFO 信息,提供高層次的理解


            DLT_LOG_DEBUG 程序員詳細(xì)調(diào)試信息


            DLT_LOG_VERBOSE 程序員的詳細(xì)調(diào)試信息


            請(qǐng)注意默認(rèn)日志級(jí)別設(shè)置為 INFO;這意味著記錄在 INFO、WARN、ERROR 和 FATAL 中的消息將被記錄。提示:可以通過(guò)設(shè)置環(huán)境變量來(lái)更改默認(rèn)日志級(jí)別(請(qǐng)參閱 DLT 庫(kù) - 運(yùn)行時(shí)配置)。


            DLT API 使用

            注冊(cè)申請(qǐng)

            重要的提示:因?yàn)?DLT是非異步線(xiàn)程安全函數(shù),所以在子線(xiàn)程中不能使用。


            DLT_REGISTER_APP 是異步的。建立 IPC 通道可能需要幾毫秒的時(shí)間。因此,如果您在注冊(cè)后立即登錄,可能會(huì)丟失消息。在應(yīng)用程序初始化期間,必須通過(guò)調(diào)用 DLT_REGISTER_APP() 盡早注冊(cè) DLT 應(yīng)用程序。每個(gè)應(yīng)用程序只允許調(diào)用一次 DLT_REGISTER_APP()。必須指定應(yīng)用程序 ID(最多四個(gè)字符)并且在 ECU 中必須是唯一的。在這個(gè)例子中使用了“MAPP”。并且還可以指定應(yīng)用程序的描述,這里是“用于日志記錄的測(cè)試應(yīng)用程序”。


            int main(int argc, const char* argv[])

            {

                DLT_REGISTER_APP("MAPP","Test Application for Logging");

            }

            獲取應(yīng)用程序 ID

            要獲取應(yīng)用程序 ID 值,請(qǐng)求分配一個(gè)至少 4 字節(jié)長(zhǎng)度的字符數(shù)組并輸入到函數(shù)調(diào)用中。


            應(yīng)用程序 ID 將存儲(chǔ)在此輸入字符數(shù)組中。


            MACRO


            DLT_GET_APPID(appid);

            Function


            dlt_get_appid(appid);

            定義和注冊(cè)所有日志上下文

            可以根據(jù)需要定義盡可能多的上下文。這些上下文可以在不同的 C 或 CPP 文件中聲明為上下文。但是每個(gè)上下文只允許聲明一次。因此,必須為每個(gè)上下文使用唯一的變量名稱(chēng)。


            DLT_DECLARE_CONTEXT(myContext1);

            DLT_DECLARE_CONTEXT(myContext2);

            DLT_DECLARE_CONTEXT(myContext3);

            如果應(yīng)使用來(lái)自另一個(gè) C 或 CPP 文件的上下文,則可以通過(guò)調(diào)用來(lái)導(dǎo)入這些上下文:


            DLT_IMPORT_CONTEXT(myContext1);

            DLT_IMPORT_CONTEXT(myContext2);

            DLT_IMPORT_CONTEXT(myContext3);

            在注冊(cè)應(yīng)用程序并聲明上下文后,需要在應(yīng)用程序初始化期間盡早注冊(cè)上下文。 DLT_REGISTER_CONTEXT() 不應(yīng)在 DLT_REGISTER_APP() 之前調(diào)用。


            在注冊(cè)每個(gè)上下文期間,必須提供一個(gè)上下文 ID(最多四個(gè)字符)。在這個(gè)例子中使用了“TESX”。還可以提供上下文的描述;這里是“用于日志記錄的測(cè)試上下文 X”。還可以使用宏 DLT_REGISTER_CONTEXT_LL_TS 使用預(yù)定義的日志級(jí)別和跟蹤狀態(tài)注冊(cè)上下文。使用此方法注冊(cè)第三個(gè)上下文。


            int main(int argc, const char* argv[])

            {

              DLT_REGISTER_APP("MAPP","Test Application for Logging");

             

              DLT_REGISTER_CONTEXT(myContext1,"TES1","Test Context 1 for Logging");

              DLT_REGISTER_CONTEXT(myContext2,"TES2","Test Context 2 for Logging");

              DLT_REGISTER_CONTEXT_LL_TS(myContext3, "TES3","Test Context 3 for Logging",

                                         DLT_LOG_DEBUG, DLT_TRACE_STATUS_OFF);

            }

            注意:請(qǐng)注意,在 DLT 守護(hù)程序和應(yīng)用程序之間的日志級(jí)別同步完成之前,可能需要一秒鐘的時(shí)間。


            注銷(xiāo)上下文和應(yīng)用程序

            在終止應(yīng)用程序注冊(cè)的上下文之前,最后需要取消注冊(cè)應(yīng)用程序。


            int main(int argc, const char* argv[])

            {

            /* business logic */

             

              DLT_UNREGISTER_CONTEXT(myContext1);

              DLT_UNREGISTER_CONTEXT(myContext2);

              DLT_UNREGISTER_CONTEXT(myContext3);

             

              DLT_UNREGISTER_APP();

             

              return 0;

            }

            log命令

            DLT 提供的函數(shù)允許使用任意數(shù)量的參數(shù)靈活構(gòu)建消息。支持 Verbose 和 Non-Verbose 消息,具有不同的 API。使用這些函數(shù)發(fā)送消息需要多個(gè)函數(shù)調(diào)用,以啟動(dòng)消息構(gòu)造、添加參數(shù)和發(fā)送消息。


            下表顯示了使用常量字符串和整數(shù)進(jìn)行日志記錄的所有 4 種類(lèi)型的示例。


            Verbose與非Verbose API


            以下部分顯示了所有 4 種日志類(lèi)型的示例,例如一個(gè)字符串和一個(gè)整數(shù)。


            MACRO


            Verbose


            DLT_LOG(ctx, DLT_LOG_INFO, DLT_STRING("ID: "), DLT_UINT32(123));

            Non-Verbose


            DLT_LOG_ID(ctx, DLT_LOG_INFO, 42 /* unique message ID */, DLT_STRING("ID: "),

                       DLT_UINT32(123));

            Function


            Verbose


            if (dlt_user_log_write_start(&ctx, &ctxdata, DLT_LOG_INFO) > 0) {

                dlt_user_log_write_string(&myctxdata, "ID: ");

                dlt_user_log_write_uint32(&myctxdata, 123);

                dlt_user_log_write_finish(&myctxdata);

            }

            Non-Verbose


            if (dlt_user_log_write_start_id(&ctx, &ctxdata, DLT_LOG_INFO, 42) > 0) {

                dlt_user_log_write_string(&myctxdata, "ID: ");

                dlt_user_log_write_uint32(&myctxdata, 123);

                dlt_user_log_write_finish(&myctxdata);

            }

            記錄參數(shù)

            可以使用以下參數(shù)類(lèi)型??梢詫⒍鄠€(gè)參數(shù)添加到單個(gè)日志消息中。所有日志參數(shù)的大小加在一起不應(yīng)超過(guò) 1390 字節(jié),包括 DLT 消息頭。


            類(lèi)型 說(shuō)明

            DLT_STRING(TEXT) 字符串


            DLT_STRING_ATTR(TEXT,NAME) 字符串(帶屬性)


            DLT_SIZED_STRING(TEXT,LENGTH) 已知長(zhǎng)度的字符串


            DLT_SIZED_STRING_ATTR(TEXT,LENGTH,NAME) 已知長(zhǎng)度的字符串(帶屬性)


            DLT_CSTRING(TEXT) 常量字符串(不以非詳細(xì)模式發(fā)送)


            DLT_CSTRING_ATTR(TEXT,NAME) 常量字符串(帶屬性;不以非詳細(xì)模式發(fā)送)


            DLT_SIZED_CSTRING(TEXT,LENGTH) 已知長(zhǎng)度的常量字符串(不以非詳細(xì)模式發(fā)送)


            DLT_SIZED_CSTRING_ATTR(TEXT,LENGTH,NAME) 已知長(zhǎng)度的常量字符串(帶屬性;不以非詳細(xì)模式發(fā)送)


            DLT_UTF8(TEXT) utf8 編碼的字符串


            DLT_UTF8_ATTR(TEXT,NAME) Utf8 編碼字符串(帶屬性)


            DLT_SIZED_UTF8(TEXT,LENGTH) 已知長(zhǎng)度的 Utf8 編碼字符串


            DLT_SIZED_UTF8_ATTR(TEXT,LENGTH,NAME) 已知長(zhǎng)度的 utf8 編碼字符串(帶屬性)


            DLT_RAW(BUF,LENGTH) 原始緩沖區(qū)


            DLT_RAW_ATTR(BUF,LENGTH,NAME) 原始緩沖區(qū)(帶屬性)


            DLT_INT(VAR) 整數(shù)變量,取決于平臺(tái)


            DLT_INT_ATTR(VAR,NAME,UNIT) 整數(shù)變量,取決于平臺(tái)(帶屬性)


            DLT_INT8(VAR) 整數(shù) 8 位變量


            DLT_INT8_ATTR(VAR,NAME,UNIT) 整數(shù) 8 位變量(帶屬性)


            DLT_INT16(VAR) 整數(shù) 16 位變量


            DLT_INT16_ATTR(VAR,NAME,UNIT) 整數(shù) 16 位變量(帶屬性)


            DLT_INT32(VAR) 整數(shù) 32 位變量


            DLT_INT32_ATTR(VAR,NAME,UNIT) 整數(shù) 32 位變量(帶屬性)


            DLT_INT64(VAR) 整數(shù) 64 位變量


            DLT_INT64_ATTR(VAR,NAME,UNIT) 整數(shù) 64 位變量(帶屬性)


            DLT_UINT(VAR) 無(wú)符號(hào)整數(shù)變量


            DLT_UINT_ATTR(VAR,NAME,UNIT) 無(wú)符號(hào)整數(shù)變量(帶屬性)


            DLT_UINT8(VAR) 無(wú)符號(hào) 8 位整數(shù)變量


            DLT_UINT8_ATTR(VAR,NAME,UNIT) 無(wú)符號(hào) 8 位整數(shù)變量(帶屬性)


            DLT_UINT16(VAR) 無(wú)符號(hào) 16 位整數(shù)變量


            DLT_UINT16_ATTR(VAR,NAME,UNIT) 無(wú)符號(hào) 16 位整數(shù)變量(帶屬性)


            DLT_UINT32(VAR) 無(wú)符號(hào) 32 位整數(shù)變量


            DLT_UINT32_ATTR(VAR,NAME,UNIT) 無(wú)符號(hào) 32 位整數(shù)變量(帶屬性)


            DLT_UINT64(VAR) 無(wú)符號(hào) 64 位整數(shù)變量


            DLT_UINT64_ATTR(VAR,NAME,UNIT) 無(wú)符號(hào) 64 位整數(shù)變量(帶屬性)


            DLT_BOOL(VAR) 布爾變量


            DLT_BOOL_ATTR(VAR,NAME) 布爾變量(帶屬性)


            DLT_FLOAT32(VAR) 浮點(diǎn)型 32 位變量


            DLT_FLOAT32_ATTR(VAR,NAME,UNIT) 浮點(diǎn)型 32 位變量(帶屬性)


            DLT_FLOAT64(VAR) Float 64 位變量


            DLT_FLOAT64_ATTR(VAR,NAME,UNIT) Float 64 位變量(帶屬性)


            DLT_HEX8(UINT_VAR) 8 位十六進(jìn)制值


            DLT_HEX16(UINT_VAR) 16 位十六進(jìn)制值


            DLT_HEX32(UINT_VAR) 32 位十六進(jìn)制值


            DLT_HEX64(UINT_VAR) 64 位十六進(jìn)制值


            DLT_BIN8(UINT_VAR) 8 位二進(jìn)制值


            DLT_BIN16(UINT_VAR 16 位二進(jìn)制值


            DLT_PTR(PTR_VAR) 用于打印指針的架構(gòu)獨(dú)立宏

            ————————————————

            版權(quán)聲明:本文為CSDN博主「andylauren」的原創(chuàng)文章,遵循CC 4.0 BY-SA版權(quán)協(xié)議,轉(zhuǎn)載請(qǐng)附上原文出處鏈接及本聲明。

            原文鏈接:https://blog.csdn.net/andylauren/article/details/121118770




            *博客內(nèi)容為網(wǎng)友個(gè)人發(fā)布,僅代表博主個(gè)人觀點(diǎn),如有侵權(quán)請(qǐng)聯(lián)系工作人員刪除。



            關(guān)鍵詞: DLT

            技術(shù)專(zhuān)區(qū)

            關(guān)閉