0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線(xiàn)課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

PYNQ移植ZCU102詳細(xì)流程分析

電子設(shè)計(jì) ? 來(lái)源:csdn ? 作者:vacajk ? 2020-12-23 10:52 ? 次閱讀

在goggle上搜zcu102 pynq可以找到一些移植方法的信息

0. Prebuilt
PYNQ移植ZCU102編譯好的固件

1. 生成鏡像
git clone
$ git clone https://github.com/Xilinx/PYNQ.git
$ cd PYNQ
$ git checkout v2.3
$ git checkout -b vacajk_dev

檢查依賴(lài)環(huán)境,qemu,crosstool-ng
$ cd sdbuild/scripts
$ ./setup_host.sh
$ source /opt/pkg/petalinux/settings.sh
$ source /opt/Xilinx/Vivado/2018.2/settings64.sh
$ cd ../../

拷貝ZCU104的配置作為ZCU102來(lái)使用,刪除不用的ZCU104petalinux配置
$ cp -rf ./boards/ZCU104 ./boards/ZCU102
$ rm -rf ./boards/ZCU102/petalinux_bsp/
$ mv ./boards/ZCU104/ZCU104.spec ./boards/ZCU102/ZCU102.spec
$ gedit ./boards/ZCU102/ZCU102.spec

修改ZCU102.spec的內(nèi)容
ARCH_ZCU102 := aarch64
BSP_ZCU102 := xilinx-zcu102-v2018.2-final.bsp
STAGE4_PACKAGES_ZCU102 := ethernet

從官網(wǎng)上下載xilinx-zcu102-v2018.2-final.bsp,復(fù)制到./boards/ZCU102目錄下從github下載的腳本能夠完整的生成img文件,并會(huì)自動(dòng)將所有的環(huán)境搭建完畢,但是速度很慢,看了PYNQ的官網(wǎng)發(fā)現(xiàn)能夠直接下載編譯好的rootfs
這樣僅僅編譯BOOT.bin和只包含kernel的image.ub就可以了。

網(wǎng)上下載的rootfs
如果準(zhǔn)備使用下載的rootfs,在這里下載rootfs的鏡像

o4YBAF9uHLyADX4iAAGP-IO00CM228.png

http://www.pynq.io/board.html
https://www.xilinx.com/member/forms/download/xef.html?filename=pynq_root...
解壓后把bionic.aarch64.2.3.img復(fù)制到./sdbuild/prebuilt下
如下指令:
$ make boot_files BOARDS=ZCU102
$ make images BOARDS=ZCU102 PREBUILT=./prebuilt/bionic.aarch64.2.3.img

自行生成的rootfs
如果準(zhǔn)備自行編譯rootfs,如下指令。比較花時(shí)間且網(wǎng)速影響較大
$ make BOARDS=ZCU102

2. 燒寫(xiě)鏡像
生成的img文件在./sdbuild/output/ZCU102-2.3.img
使用Win32_Disk_Imager將img燒寫(xiě)到SD卡中

o4YBAF9uHL2AGlWCAAA_s5XwPjg466.png

linux上可以查看SD卡分區(qū)及內(nèi)容,可以看到包含一個(gè)FAT32分區(qū)用于存放BOOT.bin和image.ub
第二個(gè)分區(qū)是文件系統(tǒng),ubunttu 18.04嘗試啟動(dòng),使用串口可以看到能夠正常登陸

o4YBAF9uHMGAOMqrAAKYuSMxqHs096.png

通過(guò)網(wǎng)頁(yè)直接連接訪(fǎng)問(wèn)ZCU102,輸入密碼xilinx可以打開(kāi)jupyter-notebook,默認(rèn)目錄中有各種例子,可以進(jìn)行嘗試。

pIYBAF9uHMyALBlMAAv_JMvswno672.png

3. 自定義FPGA固件
因?yàn)槭褂玫氖莃sp中的FPGA固件,里面的邏輯外設(shè)可能不符合要求,下面重新編輯FPGA固件,測(cè)試板上的LED和DIP SWITCH

編輯Vivado工程
使用vivado 2018.2打開(kāi)xilinx-zcu102-v2018.2-final.bsp中的vivado工程

o4YBAF9uHM2AH98rAACR4GKkKg0489.png

增加兩個(gè)AXI_GPIO模塊,分別用于測(cè)試led和switch,添加幾個(gè)其他ip用于整體系統(tǒng)組成

pIYBAF9uHNOAXwb0AAWo-UtGE5Y722.png

在xdc中添加IO管腳約束。
set_property PACKAGE_PIN AG14 [get_ports {led_8bits_tri_o[0]}]
set_property PACKAGE_PIN AF13 [get_ports {led_8bits_tri_o[1]}]
set_property PACKAGE_PIN AE13 [get_ports {led_8bits_tri_o[2]}]
set_property PACKAGE_PIN AJ14 [get_ports {led_8bits_tri_o[3]}]
set_property PACKAGE_PIN AJ15 [get_ports {led_8bits_tri_o[4]}]
set_property PACKAGE_PIN AH13 [get_ports {led_8bits_tri_o[5]}]
set_property PACKAGE_PIN AH14 [get_ports {led_8bits_tri_o[6]}]
set_property PACKAGE_PIN AL12 [get_ports {led_8bits_tri_o[7]}]
set_property IOSTANDARD LVCMOS33 [get_ports {led_8bits_tri_o[0]}]
set_property IOSTANDARD LVCMOS33 [get_ports {led_8bits_tri_o[1]}]
set_property IOSTANDARD LVCMOS33 [get_ports {led_8bits_tri_o[2]}]
set_property IOSTANDARD LVCMOS33 [get_ports {led_8bits_tri_o[3]}]
set_property IOSTANDARD LVCMOS33 [get_ports {led_8bits_tri_o[4]}]
set_property IOSTANDARD LVCMOS33 [get_ports {led_8bits_tri_o[5]}]
set_property IOSTANDARD LVCMOS33 [get_ports {led_8bits_tri_o[6]}]
set_property IOSTANDARD LVCMOS33 [get_ports {led_8bits_tri_o[7]}]
set_property PACKAGE_PIN AN14 [get_ports {dip_switch_8bits_tri_i[0]}]
set_property PACKAGE_PIN AP14 [get_ports {dip_switch_8bits_tri_i[1]}]
set_property PACKAGE_PIN AM14 [get_ports {dip_switch_8bits_tri_i[2]}]
set_property PACKAGE_PIN AN13 [get_ports {dip_switch_8bits_tri_i[3]}]
set_property PACKAGE_PIN AN12 [get_ports {dip_switch_8bits_tri_i[4]}]
set_property PACKAGE_PIN AP12 [get_ports {dip_switch_8bits_tri_i[5]}]
set_property PACKAGE_PIN AL13 [get_ports {dip_switch_8bits_tri_i[6]}]
set_property PACKAGE_PIN AK13 [get_ports {dip_switch_8bits_tri_i[7]}]
set_property IOSTANDARD LVCMOS33 [get_ports {dip_switch_8bits_tri_i[0]}]
set_property IOSTANDARD LVCMOS33 [get_ports {dip_switch_8bits_tri_i[1]}]
set_property IOSTANDARD LVCMOS33 [get_ports {dip_switch_8bits_tri_i[2]}]
set_property IOSTANDARD LVCMOS33 [get_ports {dip_switch_8bits_tri_i[3]}]
set_property IOSTANDARD LVCMOS33 [get_ports {dip_switch_8bits_tri_i[4]}]
set_property IOSTANDARD LVCMOS33 [get_ports {dip_switch_8bits_tri_i[5]}]
set_property IOSTANDARD LVCMOS33 [get_ports {dip_switch_8bits_tri_i[6]}]
set_property IOSTANDARD LVCMOS33 [get_ports {dip_switch_8bits_tri_i[7]}]

Create HDL Wrapper,注意zcu102_wrapper.v的內(nèi)容是否正常,我是刪除了原有的,然后重新生成的。編譯并生成bitstream
完成后使用Export Block Design將bd的tcl生成文件輸出。
拷貝并重命名剛生成的bit和tcl文件,并重命名為:
zcu102_led.bit和zcu102_led.tcl

使用PYTHON測(cè)試LED和DIP
使用tftp將剛才的兩個(gè)文件復(fù)制到板上的目錄中:/home/xilinx/zcu102_test/
$ cd ~/zcu102_test/
$ sudo python3
Python 3.6.5 (default, Apr 1 2018, 05:46:30)
[GCC 7.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from pynq import Overlay
>>> ol = Overlay('zcu102_led.bit')
>>> leds = ol.gpio_leds.channel1
>>> leds[0:8].on()
>>> leds[0:8].off()
>>> sws = ol.gpio_sws.channel1
>>> sws.read()
170
>>> sws.read()
85

如上即可使用python測(cè)試led和dip switch

使用jupyter-notebook來(lái)進(jìn)行測(cè)試:
import time
from pynq import Overlay

ol = Overlay("./bit/zcu102_led.bit")

leds = ol.gpio_leds.channel1
sws = ol.gpio_sws.channel1

for i in range(256):
leds.write(mask=255, val=i)
time.sleep(0.05)
print("led test finish!")

led test finish!

print("sws status: 0x%08x" % sws.read())

sws status: 0x00000028

4. 問(wèn)題
問(wèn)題1:發(fā)現(xiàn)在python中使用自動(dòng)補(bǔ)全時(shí)程序崩潰
在python中使用ol = Overlay(‘zcu102_led.bit’)后,輸入ol進(jìn)行自動(dòng)補(bǔ)全時(shí)會(huì)使python程序崩潰。
>>> ol.[ 1491.769317] Bad mode in Error handler detected on CPU0, code 0xbf000002 -- SError
[ 1491.776716] Internal error: Oops - bad mode: 0 [#3] SMP
[ 1491.781922] Modules linked in:
[ 1491.784963] CPU: 0 PID: 4501 Comm: python3 Tainted: G D 4.14.0-xilinx-v2018.2 #1
[ 1491.793466] Hardware name: ZynqMP ZCU102 Rev1.0 (DT)
[ 1491.798416] task: ffffffc877b4c000 task.stack: ffffff80092f8000
[ 1491.804319] PC is at 0x7f9d84b458
[ 1491.807616] LR is at 0x55cc3c
[ 1491.810568] pc : [] lr : [] pstate: 80000000
[ 1491.817946] sp : 0000007fc15c5060
[ 1491.821245] x29: 0000007fc15c5060 x28: 0000007f9945ae00
[ 1491.826540] x27: 0000007f99297e40 x26: 0000000000845578
[ 1491.831836] x25: 0000000000000000 x24: 0000000000860000
[ 1491.837131] x23: 0000007f9c5c0f60 x22: 0000007f9c645230
[ 1491.842426] x21: 000000003b4ccf90 x20: 0000007f9c645282
[ 1491.847721] x19: 0000007f9945ac48 x18: 0000007f9e0d3a70
[ 1491.853017] x17: 00000000005751e0 x16: 0000007f9d8ab650
[ 1491.858312] x15: 00000000000001ff x14: 0000000000000008
[ 1491.863608] x13: 0000007f9a2bc348 x12: 0000000000000000
[ 1491.868903] x11: 0000000000000000 x10: 000000003bb93498
[ 1491.874198] x9 : 000000003bb93490 x8 : 0000000000000001
[ 1491.879493] x7 : 00000000007b5750 x6 : 0000007f9db43008
[ 1491.884789] x5 : 0000007fc15c4a48 x4 : 0000007f9d8b5d58
[ 1491.890084] x3 : 0000007f994cb738 x2 : 5d43e4b8b60b9d00
[ 1491.895380] x1 : 0000007f9d84b458 x0 : 0000007f994cb738
[ 1491.900676] Process python3 (pid: 4501, stack limit = 0xffffff80092f8000)
[ 1491.907448] ---[ end trace fef7a706ca15de64 ]---
Segmentation fault

檢查發(fā)現(xiàn)問(wèn)題出在了Vivado中Zynq UltraScale+ MPSoC模塊的配置有問(wèn)題,但一直未定位到。。

模塊配置文件:zcu102_ps_conf.tcl

可使用該配置在模塊中進(jìn)行Apply Configuration,就能解決崩潰問(wèn)題

o4YBAF9uHNaAV4fCAAJF-M7zZRo890.png

>>> ol.
ol.BS_FPGA_MAN ol.gpio_dict ol.load_ip_data(
ol.BS_FPGA_MAN_FLAGS ol.gpio_leds ol.parse_bit_header(
ol.axi_intc_0 ol.gpio_sws ol.parser
ol.bin_path ol.hierarchy_dict ol.partial
ol.bitfile_name ol.interrupt_controllers ol.reset(
ol.clock_dict ol.interrupt_pins ol.timestamp
ol.convert_bit_to_bin( ol.ip_dict
ol.download( ol.is_loaded(

問(wèn)題2:發(fā)現(xiàn)網(wǎng)絡(luò)不能正常連接
啟動(dòng)以后進(jìn)入系統(tǒng),發(fā)現(xiàn)沒(méi)有eth0網(wǎng)口,感覺(jué)是下載的rootfs img沒(méi)有加載執(zhí)行STAGE4_PACKAGES_$(board)定義的ethernet包
查看/sdbuild/packages/ethernet內(nèi)的文件內(nèi)容,發(fā)現(xiàn)需要將eth0文件放在/etc/network/interfaces.d下
有三種方式:
1. 在格式化sd卡前,直接在linux內(nèi)編輯鏡像,并復(fù)制eth0到指定位置
2. 在串口控制臺(tái)使用vim編輯文本,并復(fù)制到指定位置
3. 使用sudo ifconfig eth0 up && sudo ifconfig eth0 192.168.2.99 先使能網(wǎng)絡(luò)然后用tftp將eth0文件復(fù)制到指定位置

eth0文件內(nèi)容如下:
auto eth0
iface eth0 inet dhcp auto eth0:1
iface eth0:1 inet static
address 192.168.2.99
netmask 255.255.255.0

編輯完成后,重啟板子,即可看到網(wǎng)卡信息
xilinx@pynq:~$ ifconfig
eth0: flags=4163 mtu 1500
inet 192.168.2.110 netmask 255.255.255.0 broadcast 192.168.2.255
inet6 fe80::f4e8:61ff:fe39:2f29 prefixlen 64 scopeid 0x20
ether f6:e8:61:39:2f:29 txqueuelen 1000 (Ethernet)
RX packets 1207 bytes 1082085 (1.0 MB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 1180 bytes 106838 (106.8 KB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
device interrupt 31
eth0:1: flags=4163 mtu 1500
inet 192.168.2.99 netmask 255.255.255.0 broadcast 192.168.2.255
ether f6:e8:61:39:2f:29 txqueuelen 1000 (Ethernet)
device interrupt 31
lo: flags=73 mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10
loop txqueuelen 1000 (Local Loopback)
RX packets 191 bytes 22047 (22.0 KB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 191 bytes 22047 (22.0 KB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

eth0為dhcp得到的ip地址。
eth0:1為靜態(tài)ip地址

編輯:hfy

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • FPGA
    +關(guān)注

    關(guān)注

    1630

    文章

    21777

    瀏覽量

    604779
  • Vivado
    +關(guān)注

    關(guān)注

    19

    文章

    815

    瀏覽量

    66725
  • zcu102
    +關(guān)注

    關(guān)注

    0

    文章

    24

    瀏覽量

    7210
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    RE超標(biāo)之整機(jī)定位詳細(xì)流程

    全面記錄測(cè)試過(guò)程、數(shù)據(jù)分析、問(wèn)題定位、解決方案及其實(shí)施效果等關(guān)鍵環(huán)節(jié)。報(bào)告需清晰闡述RE超標(biāo)問(wèn)題的具體情況,包括超標(biāo)程度、影響范圍及潛在后果,并詳細(xì)說(shuō)明所采用的定位方法、測(cè)試設(shè)備、測(cè)試環(huán)境及測(cè)試步驟
    發(fā)表于 12-16 14:44 ?0次下載

    時(shí)源芯微——RE超標(biāo)整機(jī)定位與解決詳細(xì)流程

    一、初步測(cè)量與問(wèn)題確認(rèn)使用專(zhuān)業(yè)的電磁輻射測(cè)量設(shè)備,對(duì)整機(jī)的輻射發(fā)射進(jìn)行精確測(cè)量。確認(rèn)是否存在RE超標(biāo)問(wèn)題,并記錄超標(biāo)頻段和幅度。二、電纜檢查與處理若存在信號(hào)電纜:步驟一:拔掉所有信號(hào)電纜,僅保留電源線(xiàn),再次測(cè)量整機(jī)的輻射發(fā)射。若測(cè)量合格:判定問(wèn)題出在信號(hào)電纜上,可能是電纜的共模電流導(dǎo)致。逐一連接信號(hào)電纜,每次連接后測(cè)量,定位具體哪根電纜或接口導(dǎo)致超標(biāo)。對(duì)問(wèn)題
    發(fā)表于 12-12 10:06 ?0次下載

    請(qǐng)問(wèn)ADC12DJ3200EVM可以搭配Xilinx ZCU111開(kāi)發(fā)板使用嗎?

    ADC12DJ3200EVM可以搭配Xilinx ZCU111開(kāi)發(fā)板使用嗎?
    發(fā)表于 11-27 07:20

    AMD/Xilinx Zynq? UltraScale+ ? MPSoC ZCU102 評(píng)估套件

    AMD/Xilinx Zynq? UltraScale+ ? MPSoC ZCU102 評(píng)估套件可快速啟動(dòng)汽車(chē)、工業(yè)、視頻和通信應(yīng)用設(shè)計(jì)。AMD/Xilinx MPSoC ZCU102 評(píng)估套件采用
    的頭像 發(fā)表于 11-20 15:32 ?490次閱讀
    AMD/Xilinx Zynq? UltraScale+ ? MPSoC <b class='flag-5'>ZCU102</b> 評(píng)估套件

    基于PYNQ和機(jī)器學(xué)習(xí)探索MPSOC筆記

    新版本中,不僅僅介紹了MPSOC的體系結(jié)構(gòu)和應(yīng)用場(chǎng)景,更是結(jié)合當(dāng)前應(yīng)用最廣的PYNQ框架和機(jī)器學(xué)習(xí)應(yīng)用進(jìn)行分析。作為一本不可多得的免費(fèi)電子英文書(shū)籍,本書(shū)既是使用Zynq MPSoC的開(kāi)發(fā)人員的實(shí)用指南
    的頭像 發(fā)表于 11-16 11:32 ?365次閱讀
    基于<b class='flag-5'>PYNQ</b>和機(jī)器學(xué)習(xí)探索MPSOC筆記

    Huffman壓縮算法概述和詳細(xì)流程

    Huffman壓縮算法是一種基于字符出現(xiàn)頻率的編碼算法,通過(guò)構(gòu)建Huffman樹(shù),將出現(xiàn)頻率高的字符用短編碼表示,出現(xiàn)頻率低的字符用長(zhǎng)編碼表示,從而實(shí)現(xiàn)對(duì)數(shù)據(jù)的壓縮。
    的頭像 發(fā)表于 10-21 13:48 ?308次閱讀

    租用云數(shù)據(jù)庫(kù)違法嗎?租用流程和注意事項(xiàng)集錦

    租用云數(shù)據(jù)庫(kù)違法嗎?租用云數(shù)據(jù)庫(kù)本身并不違法,但用戶(hù)需要遵守相關(guān)法律法規(guī)和服務(wù)商的管理規(guī)則,不得用于違法活動(dòng)。以下是關(guān)于租用云數(shù)據(jù)庫(kù)的詳細(xì)流程和注意事項(xiàng):
    的頭像 發(fā)表于 10-16 10:28 ?222次閱讀

    ZCU106評(píng)估板用戶(hù)指南

    電子發(fā)燒友網(wǎng)站提供《ZCU106評(píng)估板用戶(hù)指南.pdf》資料免費(fèi)下載
    發(fā)表于 09-10 10:17 ?1次下載

    自動(dòng)售貨機(jī)MDB協(xié)議中文解析(七)MDB-RS232控制紙幣器的詳細(xì)流程和解析

    自動(dòng)售貨機(jī)MDB協(xié)議中文解析(七)MDB-RS232控制紙幣器的詳細(xì)流程和解析
    的頭像 發(fā)表于 09-09 10:04 ?662次閱讀

    使用PYNQ訓(xùn)練和實(shí)現(xiàn)BNN

    使用 PYNQ 可以輕松在 FPGA 上實(shí)現(xiàn)加速 AI/ML,而無(wú)需編寫(xiě)一行 HDL!讓我們看看如何做到這一點(diǎn)。
    的頭像 發(fā)表于 08-05 17:15 ?591次閱讀
    使用<b class='flag-5'>PYNQ</b>訓(xùn)練和實(shí)現(xiàn)BNN

    PCBA加工打樣流程詳解,看這一篇就夠了

    PCBA打樣。接下來(lái)帶大家深入了解PCBA打樣的詳細(xì)流程,以幫助客戶(hù)更好地理解整個(gè)生產(chǎn)過(guò)程。 PCBA打樣流程解析 第一步:客戶(hù)訂單 整個(gè)PCBA打樣流程始于客戶(hù)向信賴(lài)的電子加工廠(chǎng)下訂單。在訂單中,客戶(hù)會(huì)
    的頭像 發(fā)表于 07-25 09:23 ?429次閱讀

    圖像邊緣檢測(cè)系統(tǒng)的設(shè)計(jì)流程

    圖像邊緣檢測(cè)系統(tǒng)的設(shè)計(jì)流程是一個(gè)涉及多個(gè)步驟的復(fù)雜過(guò)程,它旨在從圖像中提取出重要的結(jié)構(gòu)信息,如邊界、輪廓等。這些邊緣信息對(duì)于圖像分析、機(jī)器視覺(jué)、圖像壓縮等領(lǐng)域至關(guān)重要。以下是一個(gè)詳細(xì)的圖像邊緣檢測(cè)系統(tǒng)設(shè)計(jì)
    的頭像 發(fā)表于 07-17 16:39 ?385次閱讀

    現(xiàn)場(chǎng)可編程門(mén)陣列設(shè)計(jì)流程

    現(xiàn)場(chǎng)可編程門(mén)陣列(FPGA)設(shè)計(jì)流程是一個(gè)綜合性的過(guò)程,它涵蓋了從需求分析到最終實(shí)現(xiàn)的各個(gè)環(huán)節(jié)。下面將詳細(xì)介紹FPGA設(shè)計(jì)流程的主要步驟。
    的頭像 發(fā)表于 03-16 16:38 ?1983次閱讀

    vivado2017中找不到ZCU102對(duì)應(yīng)的板卡,求解決和分享,應(yīng)該如何解決

    vivado2017中找不到ZCU102對(duì)應(yīng)的板卡,求解決和分享,應(yīng)該如何解決
    發(fā)表于 02-29 17:31

    【鴻蒙】標(biāo)準(zhǔn)系統(tǒng)移植指南

    標(biāo)準(zhǔn)系統(tǒng)移植指南 本文描述了移植一塊開(kāi)發(fā)板的通用步驟,和具體芯片相關(guān)的詳細(xì)移植過(guò)程無(wú)法在此一一列舉。后續(xù)社區(qū)還會(huì)陸續(xù)發(fā)布開(kāi)發(fā)板移植的實(shí)例供開(kāi)
    的頭像 發(fā)表于 02-27 14:36 ?965次閱讀
    【鴻蒙】標(biāo)準(zhǔn)系統(tǒng)<b class='flag-5'>移植</b>指南