Xtensa 仿真器 (xt-run)

前提條件

Xtensa 仿真器 (xt-run) 是用于運(yùn)行 Xtensa ELF 可執(zhí)行文件的專有 Xtensa 工具剃浇。這份指南假設(shè)你已經(jīng)正確地安裝了它及你的平臺的核墩蔓。它描述如何使用 xt-run攘烛。

為你的平臺運(yùn)行仿真舶赔,需要通過 XTENSA_CORE 環(huán)境變量設(shè)置你的核(就像其它的 Xtensa 工具湃交,如 xt-xcc熟空、xt-clangxt-makext-gdb 一樣)搞莺。如果沒有設(shè)置 XTENSA_CORE 環(huán)境變量息罗,則需要為這些工具加上 --xtensa-core=xxxxxx 參數(shù)。如果你可以通過 xt-xcc/xt-clang 編譯器成功構(gòu)建固件才沧,則所有的配置應(yīng)該都已經(jīng)準(zhǔn)備好了阱当。

xt-run 可執(zhí)行程序調(diào)用 RI-2022.10-linux/XtensaTools/lib/iss 目錄下的 iss 程序運(yùn)行仿真俏扩,ISS 即 Xtensa Instruction Set Simulator。

獨(dú)立程序

使用 xt-xcc/xt-clangxt-run 開發(fā)程序與常見的 *nix 程序開發(fā)類似弊添。

我們從一個(gè) "Hello World!" 示例開始录淡。把如下的代碼片段保存為 test.c

#include <stdio.h>

int main() {
     printf("Hello World!\n");
     return 0;
}

要運(yùn)行這個(gè)程序,首先通過 xt-xcc/xt-clang 構(gòu)建 Xtensa ELF:

xt-clang --xtensa-core=ABCDE_ADSP_1027 test.c -o test

默認(rèn)情況下油坝,用 xt-xcc/xt-clang 編譯程序?qū)㈡溄訕?biāo)準(zhǔn) C 庫嫉戚。接下來,通過 xt-run 運(yùn)行輸出的二進(jìn)制文件:

sof$ xt-run --xtensa-core=ABCDE_ADSP_1027  test
Hello, world!

通過 printf() 向標(biāo)準(zhǔn)輸出打印的消息澈圈,將顯示在控制臺彬檀。你可以像這樣獨(dú)立運(yùn)行任何代碼,例如測試某些算法瞬女。

xt-run 中運(yùn)行的程序還支持 stdlib(在通常的 FW 中不可用)窍帝,因此你可以使用 stdio 來打印輸出。xt-run 還支持所有的核特有特性诽偷,因而你可以在你的 C 程序中使用 intrinsics(比如 HiFi3)坤学。

通常的 FW 為了方便在沒有操作系統(tǒng)加載的裸機(jī)環(huán)境運(yùn)行,在編譯鏈接時(shí)會加上 "-nostdlib" 標(biāo)記报慕,以移除對標(biāo)準(zhǔn) C 庫的依賴深浮,如 SoF 在 sof/src/arch/xtensa/CMakeLists.txt 文件中加了這個(gè)標(biāo)記:

if(BUILD_UNIT_TESTS)
    set(stdlib_flag "")
else()
    set(stdlib_flag "-nostdlib")
endif()

stdlib 對于通常的 FW 中不可用,也就很難通過 printf() 之類的函數(shù)打印消息來調(diào)試通常的 FW眠冈。Xtensa 工具鏈中包含了 xt-gdb飞苇,可以用來調(diào)試 Xtensa ELF 可執(zhí)行程序,包括通常的 FW蜗顽。

xt-gdb 調(diào)試上面的 test 程序布卡,和用 gdb 調(diào)試 PC 平臺的程序基本沒什么區(qū)別,如:

sof$ xt-gdb --xtensa-core=ABCDE_ADSP_1027 test
GNU gdb (GDB) 10.1 Xtensa Tools 14.10
Copyright (C) 2020 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Type "show copying" and "show warranty" for details.
This GDB was configured as "--host=x86_64-pc-linux-gnu --target=xtensa-elf".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<https://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
    <http://www.gnu.org/software/gdb/documentation/>.

For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from test...
(xt-gdb) break main
Breakpoint 1 at 0x80000f4f
(xt-gdb) r
Starting program: /media/data/sof/test 
Starting the ISS simulator.
Switching to remote protocol
Remote debugging using localhost:59226
_ResetVector () at /home/abc/RI-2022.10/ib/tools/swtools-x86_64-linux/xtensa-elf/src/xtos/xea2/reset-vector-xea2.S:81
81  /home/abc/RI-2022.10/ib/tools/swtools-x86_64-linux/xtensa-elf/src/xtos/xea2/reset-vector-xea2.S: 沒有那個(gè)文件或目錄.

Breakpoint 1, 0x80000f4f in main ()
(xt-gdb)

xt-gdb 可以啟動(dòng) xt-run/iss 來運(yùn)行 Xtensa ELF雇盖。在 xt-gdb 中忿等,可以使用一般的 gdb 調(diào)試可用的斷點(diǎn)等各種命令。

對于那些通常的 FW刊懈,xt-gdbxt-run/iss 可以分開運(yùn)行來調(diào)試这弧。首先運(yùn)行 xt-run/iss

$ xt-run --xtensa-core=ABCDE_ADSP_1027 --xtensa-system=/media/data/xtensa/XtDevTools/install/tools/RI-2022.10-linux/XtensaTools/config --xtensa-params= --console --gdbserve=0 --vector=0 dsp0.elf
SOCKET:53497

xt-run/iss 開啟一個(gè)調(diào)試端口娃闲,如上面的 53497虚汛。然后運(yùn)行 xt-gdb,如:

$ xt-gdb --xtensa-core=ABCDE_ADSP_1027 dsp0.elf 
GNU gdb (GDB) 10.1 Xtensa Tools 14.10
Copyright (C) 2020 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Type "show copying" and "show warranty" for details.
This GDB was configured as "--host=x86_64-pc-linux-gnu --target=xtensa-elf".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<https://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
    <http://www.gnu.org/software/gdb/documentation/>.

For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from dsp0.elf...
(xt-gdb) target remote localhost:53497 
Remote debugging using localhost:53497
_ResetVector () at /home/abc/RI-2022.10/ib/tools/swtools-x86_64-linux/xtensa-elf/src/xtos/xea2/reset-vector-xea2.S:81
81  /home/abc/RI-2022.10/ib/tools/swtools-x86_64-linux/xtensa-elf/src/xtos/xea2/reset-vector-xea2.S: 沒有那個(gè)文件或目錄.
(xt-gdb) break main
Breakpoint 1 at 0x800665ff: file top/src/main/main.c, line 108.
(xt-gdb) r
The "remote" target does not support "run".  Try "help target" or "continue".
(xt-gdb) c
Continuing.

Breakpoint 1, main (argc=1, argv=0x80440004) at top/src/main/main.c:108

xt-gdb 中通過 target remote localhost:53497 命令連接 xt-run/iss皇帮。之后在 xt-gdb 中可以使用 gdb 的各種調(diào)試命令來調(diào)試 FW卷哩。

Xtensa 提供的基于 Eclipse 的 IDE 工具 Xtensa Xplorer 使用相同的 xt-run/issxt-gdb 工具來調(diào)試程序。

單元測試

在 SOF 項(xiàng)目中属拾,xt-run 被用作單元測試的執(zhí)行者将谊。

下面的示例演示了冷溶,如何為示例函數(shù)添加簡單的單元測試用例:math 模塊中的 my_add

首先尊浓,添加一個(gè)將成為單元測試主題的函數(shù):
Code Block 8 src/include/sof/math/numbers.h

int my_add(int a, int b);

Code Block 9 src/math/numbers.c

int my_add(int a, int b)
{
     return a + b;
}

接下來逞频,添加單元測試實(shí)現(xiàn):
Code Block 10 test/cmocka/src/math/numbers/my_add.c

// header with function that we test
#include <sof/math/numbers.h>

// standard headers that have to be included in every cmocka's unit test
#include <stdarg.h>
#include <stddef.h>
#include <setjmp.h>
#include <stdint.h>
#include <cmocka.h>

// one of test cases
static void my_add_2_plus_3_equals_5(void **state)
{
     int result;

     (void)state;

     result = my_add(2, 3);
     assert_int_equal(result, 5);
}

int main(void)
{
     // list of all test cases, here we have just 1
     const struct CMUnitTest tests[] = {
             cmocka_unit_test(my_add_2_plus_3_equals_5),
     };

     cmocka_set_message_output(CM_OUTPUT_TAP);

     return cmocka_run_group_tests(tests, NULL, NULL);
}

對每個(gè)進(jìn)行單元測試的函數(shù)使用一個(gè)單獨(dú)的文件;這也就是我們把代碼放進(jìn) test/cmocka/src/math/numbers 目錄下的 my_add.c 文件中的原因栋齿。

最后苗胀,讓 CMake 知道單元測試的存在。
Code Block 11 test/cmocka/src/math/numbers/CMakeLists.txt

cmocka_test(my_add
     my_add.c
     ${PROJECT_SOURCE_DIR}/src/math/numbers.c
)

要運(yùn)行單元測試瓦堵,可以按照 單元測試 一文中的說明進(jìn)行基协。

如果你只想運(yùn)行你的測試用例 (而不是所有的測試),你可以把如下的命令:

make -j4 && ctest -j8

替換為:

make my_add && ctest -R my_add

Testing/Temporary/LastTest.log 可以找到運(yùn)行 ctest 時(shí)產(chǎn)生的日志菇用。

參考文檔
Xtensa Simulator (xt-run)

Done.

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末澜驮,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子惋鸥,更是在濱河造成了極大的恐慌杂穷,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件揩慕,死亡現(xiàn)場離奇詭異亭畜,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)迎卤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進(jìn)店門拴鸵,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人蜗搔,你說我怎么就攤上這事劲藐。” “怎么了樟凄?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵聘芜,是天一觀的道長。 經(jīng)常有香客問我缝龄,道長汰现,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任叔壤,我火速辦了婚禮瞎饲,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘炼绘。我一直安慰自己嗅战,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布俺亮。 她就那樣靜靜地躺著驮捍,像睡著了一般疟呐。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上东且,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天启具,我揣著相機(jī)與錄音,去河邊找鬼珊泳。 笑死富纸,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的旨椒。 我是一名探鬼主播晓褪,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼综慎!你這毒婦竟也來了涣仿?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤示惊,失蹤者是張志新(化名)和其女友劉穎好港,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體米罚,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡钧汹,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了录择。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片拔莱。...
    茶點(diǎn)故事閱讀 39,690評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖隘竭,靈堂內(nèi)的尸體忽然破棺而出塘秦,到底是詐尸還是另有隱情,我是刑警寧澤动看,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布尊剔,位于F島的核電站,受9級特大地震影響菱皆,放射性物質(zhì)發(fā)生泄漏须误。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一仇轻、第九天 我趴在偏房一處隱蔽的房頂上張望京痢。 院中可真熱鬧,春花似錦拯田、人聲如沸历造。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽吭产。三九已至,卻和暖如春鸭轮,著一層夾襖步出監(jiān)牢的瞬間臣淤,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工窃爷, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留邑蒋,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓按厘,卻偏偏與公主長得像医吊,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子逮京,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評論 2 353

推薦閱讀更多精彩內(nèi)容