《嵌入式系統軟硬體協同設計實戰指南》是機械工業出版社出版發行陸佳華 / 江舟 / 馬岷著作的實體書。
本書由淺入深,由基礎知識到實戰案例向讀者系統闡述了如何利用Zynq平台進行嵌入式系統以及軟硬體協同設計的開發。本書分為基礎篇與進階篇兩部分,基礎篇中介紹了Zynq器件、ZedBoard,並配有簡單入門實驗,同時針對軟體開發人員增設了FPGA硬體加速等內容。在進階篇中介紹了利用Zynq進行軟硬體協同設計,同時對處理器與可程式邏輯接口等技術進行了詳細剖析。本書提供了20個詳細的設計案例,涵蓋了硬體板卡、FPGA邏輯、Linux驅動、Linux作業系統、上層套用、軟硬體協同設計等Zynq開發中可能遇到的各個方面的知識,並在最後將前述獨立案例整合為4個系統案例。本書重點突出實戰,以案例為指導,配合介紹相關參考文檔,協助讀者儘快掌握在Zynq上進行各項設計的方法。
基本介紹
- 作者:陸佳華 / 江舟 / 馬岷
- ISBN:9787111411079
- 頁數:354
- 定價:69.00元
- 出版社:機械工業出版社
- 出版時間:2013-1-26
- 裝幀:平裝
- 副標題:基於Xilinx Zynq
內容介紹,作者介紹,作品目錄,
內容介紹
本書由淺入深,由基礎知識到實戰案例向讀者系統闡述了如何利用Zynq平台進行嵌入式系統以及軟硬體協同設計的開發。本書分為基礎篇與進階篇兩部分,基礎篇中介紹了Zynq器件、ZedBoard,並配有簡單入門實驗,同時針對軟體開發人員增設了FPGA硬體加速等內容。在進階篇中介紹了利用Zynq進行軟硬體協同設計,同時對處理器與可程式邏輯接口等技術進行了詳細剖析。本書提供了20個詳細的設計案例,涵蓋了硬體板卡、FPGA邏輯、Linux驅動、Linux作業系統、上層套用、軟硬體協同設計等Zynq開發中可能遇到的各個方面的知識,並在最後將前述獨立案例整合為4個系統案例。本書重點突出實戰,以案例為指導,配合介紹相關參考文檔,協助讀者儘快掌握在Zynq上進行各項設計的方法。
本書可作為Zynq初學者、軟硬體協同設計開發人員的參考用書,亦可作為大專院校嵌入式系統設計、片上系統設計、可程式邏輯器件等相關專業的教師和學生的參考用書。
作者介紹
陸佳華,開源硬體社區Openhw.org資深版主,Xilinx高級套用工程師,現任職於Xilinx全球大學計畫部,主要負責Xilinx全球大學相關的參考設計開發,技術推廣、支持。陸佳華2006年畢業於西安交通大學並獲得碩士學位。2006年加入Xilinx公司後任產品套用工程師,主要負責FPGA上的嵌入式系統設計,乙太網設計,記憶體控制器設計等方向技術支持。陸佳華著有《零存整取-NetFPGA開發指南》一書。
江舟,開源硬體社區Openhw.org的資深版主,浙江大學碩士研究生,現為Xilinx全球大學計畫部實習生,主要參與Zynq上的軟體開發。江舟是美信DIY大賽的主要技術支持者之一,並擔任Xilinx開源硬體大賽的技術支持。
馬岷,開源硬體社區Openhw.org的資深版主,浙江大學碩士研究生,現為Xilinx全球大學計畫部實習生,主要參與Zynq上的硬體開發。馬岷是美信DIY大賽的主要技術支持者之一,並擔任Xilinx開源硬體大賽的技術支持。
作品目錄
Foreword
前言
第一部分 基礎篇
第1章 初試ZedBoard/2
1.1 GPIO LED動手玩/2
1.1.1 拷貝SD卡/2
1.1.2 跳線與外設連線/2
1.1.3 演示操作/2
1.2 Linaro Ubuntu動手玩/3
1.2.1 SD卡分區/3
1.2.2 檔案拷貝(FAT/EXT)/6
1.2.3 外設連線/6
1.2.4 可演示的效果/7
第2章 Zynq平台介紹/9
2.1 7系列FPGA簡介/9
2.2 Zynq-7000 AP SoC體系簡介/12
第3章 ZedBoard開發環境/15
3.1 ZedBoard的板載外設/15
3.1.1 LED/15
3.1.2 按鍵/16
3.1.3 開關/16
3.1.4 OLED/17
3.1.5 USB接口/18
3.1.6 音頻接口/20
3.1.7 VGA接口/21
3.1.8 HDMI接口/22
3.1.9 10/100/1000兆網口/23
3.2 ZedBoard的擴展外設/25
3.2.1 外擴PMod插座/25
3.2.2 外擴FMC插槽/27
3.2.3 外擴AMS插座/28
第4章 開發工具鏈/29
4.1 可程式邏輯開發工具鏈/29
4.1.1 PlanAhead/29
4.1.2 Xilinx Platform Studio/31
4.2 軟體開發工具鏈/34
4.2.1 Xilinx Software Development Kit/34
4.2.2 交叉編譯工具鏈/35
4.3 軟硬體調試工具/36
4.3.1 ChipScope Pro/36
4.3.2 GDB與GDBserver/38
第5章 Zynq體系結構/40
5.1 套用處理器單元(APU)/40
5.1.1 ARM Cortex A9處理器/40
5.1.2 偵聽控制單元(SCU)/43
5.1.3 L2高速快取/44
5.1.4 APU接口/44
5.2 通用外設/46
5.2.1 通用IO(GPIO)/46
5.2.2 SPI接口/49
5.2.3 UART接口/51
5.2.4 計時器/54
5.2.5 USB控制器/57
5.2.6 DDR控制器/58
5.3 數字邏輯設計/59
5.3.1 可程式邏輯“外設”(PL)/59
5.3.2 XADC/61
5.3.3 PCIe/62
5.4 MIO/EMIO/63
第6章 系統級信號/66
6.1 電源管理/66
6.2 Clock信號/67
6.2.1 CPU時鐘域/68
6.2.2 DDR時鐘域/69
6.2.3 基本的時鐘分支結構/69
6.2.4 I/O外設(IOP)時鐘/70
6.2.5 PL時鐘/72
6.2.6 其他時鐘/72
6.3 復位系統/73
6.4 JTAG/75
6.5 中斷處理/76
第7章 Zynq啟動與配置/78
7.1 Zynq啟動過程簡介/78
7.2 外部啟動條件/79
7.2.1 電源要求/79
7.2.2 時鐘要求/79
7.2.3 復位要求/79
7.2.4 啟動引腳設定/80
7.3 BootROM/80
7.3.1 BootROM的作用/80
7.3.2 BootROM的特點/81
7.3.3 BootROM後的狀態/82
7.4 FSBL/82
7.5 SSBL/84
7.6 Linux啟動過程/84
7.7 Secure Boot/86
第8章 面向軟體工程師的邏輯設計/87
8.1 FPGA硬體加速原理/87
8.1.1 以空間換時間/87
8.1.2 以存儲器換門電路/89
8.1.3 以IP集成換生產力/90
8.2 部分動態可重配置於Zynq/93
第9章 ZedBoard入門/95
9.1 UART和GPIO控制/95
9.1.1 UART和GPIO接口/95
9.1.2 硬體設計過程/96
9.1.3 軟體設計過程/106
9.2 硬體/軟體調試方法/112
9.2.1 ChipScope IP Core/112
9.2.2 SDK Gdb使用/115
9.3 搭建你的單板計算機(Single Board Computer)/117
9.3.1 搭建系統環境/118
9.3.2 準備工作/118
第二部分 進階篇
第10章 基於虛擬平台的Zynq開發/126
10.1 QEMU介紹/126
10.2 編譯QEMU源碼/126
10.2.1 下載QEMU源碼/126
10.2.2 配置QEMU/127
10.2.3 QEMU所依賴的庫檔案/127
10.2.4 編譯QEMU/127
10.3 啟動QEMU/127
10.4 QEMU中的嵌入式Linux/128
10.5 商業版虛擬平台/131
第11章 PL和PS的接口技術詳解/132
11.1 PL和PS的接口/132
11.1.1 AXI接口簡介/133
11.1.2 AXI Interconnect/134
11.2 Zynq的內部連線/137
11.2.1 AXI_HP/139
11.2.2 AXI_GP/140
11.2.3 AXI_ACP/140
11.3 PL和存儲器系統性能概述/142
11.3.1 接口理論頻寬/142
11.3.2 DDR控制器的吞吐率及其效率/143
11.3.3 內部互連吞吐量瓶頸/143
11.3.4 如何選擇PL的接口/144
第12章 基於Zynq的軟硬體協同設計/149
12.1 多核處理器架構簡介/149
12.1.1 什麼是多核處理器/149
12.1.2 多核處理器發展的動機和優勢/150
12.1.3 同構、異構多核架構的優點和挑戰/152
12.2 軟硬體協同設計方法論/152
12.2.1 什麼是軟硬體協同設計/152
12.2.2 軟硬體協同設計發展的動機和優勢/152
12.2.3 軟硬體協同設計的基本流程/153
12.2.4 基於Xilinx工具的軟硬體協同設計簡介/154
12.3 高層次綜合/154
12.3.1 高層次綜合綜述/154
12.3.2 高層次綜合發展的動機與優勢/155
12.3.3 Xilinx AutoESL工具簡介/156
12.4 基於Xilinx Zynq的軟硬體協同設計實例/157
12.4.1 功能簡介/157
12.4.2 設計流程簡介/157
12.4.3 實驗結果與驗證/165
第13章 Zynq開發實戰/166
13.1 用戶IP設計/166
13.1.1 用戶IPcore介紹/166
13.1.2 用戶IPcore設計/167
13.2 嵌入式Linux設備驅動開發/180
13.2.1 設備驅動開發介紹/180
13.2.2 驅動程式的載入與卸載/181
13.2.3 sys檔案系統簡介/181
13.2.4 PWM模組驅動程式/182
13.2.5 PWM驅動程式編譯與測試/184
13.3 構建嵌入式Linux系統/186
13.3.1 搭建系統環境/186
13.3.2 編譯u-boot/186
13.3.3 編譯核心與設備樹/187
13.3.4 製作根檔案系統/188
13.3.5 啟動嵌入式Linux/192
13.4 HDMI設計/193
13.4.1 HDMI傳輸原理/193
13.4.2 ADV7511晶片的相關控制信號/195
13.4.3 設計過程/198
13.5 OpenCV移植/203
13.5.1 開發環境準備/203
13.5.2 配置cmake/203
13.5.3 OpenCV編譯與安裝/205
13.5.4 OpenCV移植與ZedBoard測試/206
13.6 基於OpenCV的樹葉識別系統/207
13.6.1 項目總覽/208
13.6.2 圖像採集/208
13.6.3 預處理/209
13.6.4 特徵提取/211
13.6.5 分類決策/216
13.6.6 總結/219
13.7 基於OpenCV的人臉識別系統/220
13.7.1 系統綜述/220
13.7.2 基於Haar特徵和Adaboost算法的人臉檢測/220
13.7.3 系統設計與實現/222
13.7.4 總結/226
13.8 嵌入式Web伺服器的移植與搭建/226
13.8.1 嵌入式Web伺服器介紹/226
13.8.2 Boa伺服器移植與配置/228
13.8.3 Boa伺服器部署與測試/230
13.9 嵌入式網路攝像機的移植與搭建/233
13.9.1 嵌入式網路攝像機/233
13.9.2 mjpg-streamer的移植與架設/234
13.10 FreeRTOS實時作業系統的套用/238
13.10.1 FreeRTOS介紹/238
13.10.2 FreeRTOS與ucOS-Ⅱ的比較/239
13.10.3 FreeRTOS在Zynq上的套用實例與分析/239
13.10.4 基於FreeRTOS的Lwip/250
13.11 XADC的使用/250
13.11.1 建立硬體工程/252
13.11.2 軟體工程設計/253
13.11.3 程式分析/255
13.12 基於Zynq的部分可重配置/256
13.12.1 可重配置系統介紹/256
13.12.2 可重配置的開發流程/257
13.12.3 小結/265
13.13 在Zynq上搭建Android簡介/265
第14章 系統級設計案例/266
14.1 電機控制系統/266
14.1.1 雙閉環控制器理論/266
14.1.2 雙閉環系統/267
14.1.3 雙閉環控制IP核說明/272
14.1.4 硬體實現過程/275
14.1.5 軟體實現過程/285
14.1.6 硬體平台測試/286
14.2 智慧型家庭健康平台/287
14.2.1 智慧型家庭健康平台簡介/287
14.2.2 EKG AFE模組硬體設計/287
14.2.3 Night EKG Controller IP設計/292
14.2.4 建立可運行Linux的完整系統/295
14.2.5 Night EKG Controller的Linux驅動設計/297
14.2.6 基於Qt的圖形用戶界面設計/299
14.2.7 在ZedBoard上運行Qt程式/308
14.2.8 實現軟體開機自動運行/310
14.3 高性能視頻處理系統設計/311
14.3.1 系統架構/312
14.3.2 硬體架構設計/313
14.3.3 軟體架構設計/316
14.3.4 利用Vivado HLS實現Sobel濾波硬體/318
14.3.5 使系統在ZedBoard上運行/320
14.4 智慧型小車系統開發/320
14.4.1 智慧型小車系統結構/320
14.4.2 運動控制設計/323
14.4.3 Linux系統應用程式設計/326
14.4.4 智慧型小車平台的後續拓展/333
第15章 如何獲取資料和幫助/334
15.1 如何獲取Xilinx的技術文檔/334
15.1.1 DocNav介紹/334
15.1.2 DocNav使用案例/334
15.2 如何找到Zynq開發資料/336
15.2.1 如何獲取本書的最新例程/336
15.2.2 如何獲取Zynq開發資料/337
15.2.3 如何獲取ZedBoard文檔與例程/337
15.3 Xilinx網站資源導讀/338
15.3.1 序/338
15.3.2 Xilinx軟體介紹/338
15.3.3 軟體版本和軟體更新/340
15.3.4 軟體教程/341
15.3.5 硬體資料/343
15.3.6 參考資源/343
15.3.7 問題解決/344
附錄A Xilinx開發套件版本14.1到14.3的主要升級變化/346
參考資料/353
前言
第一部分 基礎篇
第1章 初試ZedBoard/2
1.1 GPIO LED動手玩/2
1.1.1 拷貝SD卡/2
1.1.2 跳線與外設連線/2
1.1.3 演示操作/2
1.2 Linaro Ubuntu動手玩/3
1.2.1 SD卡分區/3
1.2.2 檔案拷貝(FAT/EXT)/6
1.2.3 外設連線/6
1.2.4 可演示的效果/7
第2章 Zynq平台介紹/9
2.1 7系列FPGA簡介/9
2.2 Zynq-7000 AP SoC體系簡介/12
第3章 ZedBoard開發環境/15
3.1 ZedBoard的板載外設/15
3.1.1 LED/15
3.1.2 按鍵/16
3.1.3 開關/16
3.1.4 OLED/17
3.1.5 USB接口/18
3.1.6 音頻接口/20
3.1.7 VGA接口/21
3.1.8 HDMI接口/22
3.1.9 10/100/1000兆網口/23
3.2 ZedBoard的擴展外設/25
3.2.1 外擴PMod插座/25
3.2.2 外擴FMC插槽/27
3.2.3 外擴AMS插座/28
第4章 開發工具鏈/29
4.1 可程式邏輯開發工具鏈/29
4.1.1 PlanAhead/29
4.1.2 Xilinx Platform Studio/31
4.2 軟體開發工具鏈/34
4.2.1 Xilinx Software Development Kit/34
4.2.2 交叉編譯工具鏈/35
4.3 軟硬體調試工具/36
4.3.1 ChipScope Pro/36
4.3.2 GDB與GDBserver/38
第5章 Zynq體系結構/40
5.1 套用處理器單元(APU)/40
5.1.1 ARM Cortex A9處理器/40
5.1.2 偵聽控制單元(SCU)/43
5.1.3 L2高速快取/44
5.1.4 APU接口/44
5.2 通用外設/46
5.2.1 通用IO(GPIO)/46
5.2.2 SPI接口/49
5.2.3 UART接口/51
5.2.4 計時器/54
5.2.5 USB控制器/57
5.2.6 DDR控制器/58
5.3 數字邏輯設計/59
5.3.1 可程式邏輯“外設”(PL)/59
5.3.2 XADC/61
5.3.3 PCIe/62
5.4 MIO/EMIO/63
第6章 系統級信號/66
6.1 電源管理/66
6.2 Clock信號/67
6.2.1 CPU時鐘域/68
6.2.2 DDR時鐘域/69
6.2.3 基本的時鐘分支結構/69
6.2.4 I/O外設(IOP)時鐘/70
6.2.5 PL時鐘/72
6.2.6 其他時鐘/72
6.3 復位系統/73
6.4 JTAG/75
6.5 中斷處理/76
第7章 Zynq啟動與配置/78
7.1 Zynq啟動過程簡介/78
7.2 外部啟動條件/79
7.2.1 電源要求/79
7.2.2 時鐘要求/79
7.2.3 復位要求/79
7.2.4 啟動引腳設定/80
7.3 BootROM/80
7.3.1 BootROM的作用/80
7.3.2 BootROM的特點/81
7.3.3 BootROM後的狀態/82
7.4 FSBL/82
7.5 SSBL/84
7.6 Linux啟動過程/84
7.7 Secure Boot/86
第8章 面向軟體工程師的邏輯設計/87
8.1 FPGA硬體加速原理/87
8.1.1 以空間換時間/87
8.1.2 以存儲器換門電路/89
8.1.3 以IP集成換生產力/90
8.2 部分動態可重配置於Zynq/93
第9章 ZedBoard入門/95
9.1 UART和GPIO控制/95
9.1.1 UART和GPIO接口/95
9.1.2 硬體設計過程/96
9.1.3 軟體設計過程/106
9.2 硬體/軟體調試方法/112
9.2.1 ChipScope IP Core/112
9.2.2 SDK Gdb使用/115
9.3 搭建你的單板計算機(Single Board Computer)/117
9.3.1 搭建系統環境/118
9.3.2 準備工作/118
第二部分 進階篇
第10章 基於虛擬平台的Zynq開發/126
10.1 QEMU介紹/126
10.2 編譯QEMU源碼/126
10.2.1 下載QEMU源碼/126
10.2.2 配置QEMU/127
10.2.3 QEMU所依賴的庫檔案/127
10.2.4 編譯QEMU/127
10.3 啟動QEMU/127
10.4 QEMU中的嵌入式Linux/128
10.5 商業版虛擬平台/131
第11章 PL和PS的接口技術詳解/132
11.1 PL和PS的接口/132
11.1.1 AXI接口簡介/133
11.1.2 AXI Interconnect/134
11.2 Zynq的內部連線/137
11.2.1 AXI_HP/139
11.2.2 AXI_GP/140
11.2.3 AXI_ACP/140
11.3 PL和存儲器系統性能概述/142
11.3.1 接口理論頻寬/142
11.3.2 DDR控制器的吞吐率及其效率/143
11.3.3 內部互連吞吐量瓶頸/143
11.3.4 如何選擇PL的接口/144
第12章 基於Zynq的軟硬體協同設計/149
12.1 多核處理器架構簡介/149
12.1.1 什麼是多核處理器/149
12.1.2 多核處理器發展的動機和優勢/150
12.1.3 同構、異構多核架構的優點和挑戰/152
12.2 軟硬體協同設計方法論/152
12.2.1 什麼是軟硬體協同設計/152
12.2.2 軟硬體協同設計發展的動機和優勢/152
12.2.3 軟硬體協同設計的基本流程/153
12.2.4 基於Xilinx工具的軟硬體協同設計簡介/154
12.3 高層次綜合/154
12.3.1 高層次綜合綜述/154
12.3.2 高層次綜合發展的動機與優勢/155
12.3.3 Xilinx AutoESL工具簡介/156
12.4 基於Xilinx Zynq的軟硬體協同設計實例/157
12.4.1 功能簡介/157
12.4.2 設計流程簡介/157
12.4.3 實驗結果與驗證/165
第13章 Zynq開發實戰/166
13.1 用戶IP設計/166
13.1.1 用戶IPcore介紹/166
13.1.2 用戶IPcore設計/167
13.2 嵌入式Linux設備驅動開發/180
13.2.1 設備驅動開發介紹/180
13.2.2 驅動程式的載入與卸載/181
13.2.3 sys檔案系統簡介/181
13.2.4 PWM模組驅動程式/182
13.2.5 PWM驅動程式編譯與測試/184
13.3 構建嵌入式Linux系統/186
13.3.1 搭建系統環境/186
13.3.2 編譯u-boot/186
13.3.3 編譯核心與設備樹/187
13.3.4 製作根檔案系統/188
13.3.5 啟動嵌入式Linux/192
13.4 HDMI設計/193
13.4.1 HDMI傳輸原理/193
13.4.2 ADV7511晶片的相關控制信號/195
13.4.3 設計過程/198
13.5 OpenCV移植/203
13.5.1 開發環境準備/203
13.5.2 配置cmake/203
13.5.3 OpenCV編譯與安裝/205
13.5.4 OpenCV移植與ZedBoard測試/206
13.6 基於OpenCV的樹葉識別系統/207
13.6.1 項目總覽/208
13.6.2 圖像採集/208
13.6.3 預處理/209
13.6.4 特徵提取/211
13.6.5 分類決策/216
13.6.6 總結/219
13.7 基於OpenCV的人臉識別系統/220
13.7.1 系統綜述/220
13.7.2 基於Haar特徵和Adaboost算法的人臉檢測/220
13.7.3 系統設計與實現/222
13.7.4 總結/226
13.8 嵌入式Web伺服器的移植與搭建/226
13.8.1 嵌入式Web伺服器介紹/226
13.8.2 Boa伺服器移植與配置/228
13.8.3 Boa伺服器部署與測試/230
13.9 嵌入式網路攝像機的移植與搭建/233
13.9.1 嵌入式網路攝像機/233
13.9.2 mjpg-streamer的移植與架設/234
13.10 FreeRTOS實時作業系統的套用/238
13.10.1 FreeRTOS介紹/238
13.10.2 FreeRTOS與ucOS-Ⅱ的比較/239
13.10.3 FreeRTOS在Zynq上的套用實例與分析/239
13.10.4 基於FreeRTOS的Lwip/250
13.11 XADC的使用/250
13.11.1 建立硬體工程/252
13.11.2 軟體工程設計/253
13.11.3 程式分析/255
13.12 基於Zynq的部分可重配置/256
13.12.1 可重配置系統介紹/256
13.12.2 可重配置的開發流程/257
13.12.3 小結/265
13.13 在Zynq上搭建Android簡介/265
第14章 系統級設計案例/266
14.1 電機控制系統/266
14.1.1 雙閉環控制器理論/266
14.1.2 雙閉環系統/267
14.1.3 雙閉環控制IP核說明/272
14.1.4 硬體實現過程/275
14.1.5 軟體實現過程/285
14.1.6 硬體平台測試/286
14.2 智慧型家庭健康平台/287
14.2.1 智慧型家庭健康平台簡介/287
14.2.2 EKG AFE模組硬體設計/287
14.2.3 Night EKG Controller IP設計/292
14.2.4 建立可運行Linux的完整系統/295
14.2.5 Night EKG Controller的Linux驅動設計/297
14.2.6 基於Qt的圖形用戶界面設計/299
14.2.7 在ZedBoard上運行Qt程式/308
14.2.8 實現軟體開機自動運行/310
14.3 高性能視頻處理系統設計/311
14.3.1 系統架構/312
14.3.2 硬體架構設計/313
14.3.3 軟體架構設計/316
14.3.4 利用Vivado HLS實現Sobel濾波硬體/318
14.3.5 使系統在ZedBoard上運行/320
14.4 智慧型小車系統開發/320
14.4.1 智慧型小車系統結構/320
14.4.2 運動控制設計/323
14.4.3 Linux系統應用程式設計/326
14.4.4 智慧型小車平台的後續拓展/333
第15章 如何獲取資料和幫助/334
15.1 如何獲取Xilinx的技術文檔/334
15.1.1 DocNav介紹/334
15.1.2 DocNav使用案例/334
15.2 如何找到Zynq開發資料/336
15.2.1 如何獲取本書的最新例程/336
15.2.2 如何獲取Zynq開發資料/337
15.2.3 如何獲取ZedBoard文檔與例程/337
15.3 Xilinx網站資源導讀/338
15.3.1 序/338
15.3.2 Xilinx軟體介紹/338
15.3.3 軟體版本和軟體更新/340
15.3.4 軟體教程/341
15.3.5 硬體資料/343
15.3.6 參考資源/343
15.3.7 問題解決/344
附錄A Xilinx開發套件版本14.1到14.3的主要升級變化/346
參考資料/353