RISC-V 架構與嵌入式開發快速入門

胡振波

  • 出版商: 人民郵電
  • 出版日期: 2019-01-01
  • 售價: $474
  • 貴賓價: 9.5$450
  • 語言: 簡體中文
  • 頁數: 352
  • 裝訂: 平裝
  • ISBN: 7115494134
  • ISBN-13: 9787115494139
  • 相關分類: RISC-V
  • 立即出貨

買這商品的人也買了...

商品描述

本書是一本介紹RISC-V架構嵌入式開發的入門書籍,以通俗的語言系統介紹了嵌入式開發的基礎知識和RISC-V架構的內容,力求幫助讀者快速掌握RISC-V架構的嵌入式開發技術。
本書共分為兩部分。第一部分為第1~14章,基本涵蓋了使用RISC-V架構進行嵌入式開發所需的所有關鍵知識。第二部分為附錄部分,詳細介紹了RISC-V指令集架構,輔以作者加入的背景知識解讀和註解,以便於讀者理解。

作者簡介

胡振波

本科畢業於上海交通大學電子工程系,碩士畢業於上海交通大學微電子學院。
擁有多年ASIC和CPU設計與驗證經驗,曾在Marvell公司任ARM架構CPU設計高級工程師,
在Synopsys公司任研發經理,在比特大陸公司任IC設計總監,
在武漢聚芯微電子公司任架構師,現致力於RISC-V架構在國內的傳播和發展。
他開發並開源了蜂鳥E203超低功耗RISC-V處理器內核。

目錄大綱

第1章進入32位時代,誰能成為下一個8051 1 
1.1磨刀不誤砍柴工—CPU基礎知識介紹1 
1.1.1 ISA—CPU的靈魂2 
1.1.2 CISC與RISC 3 
1.1.3 32位與64位架構4 
1.1.4 ISA眾生相5 
1.1.5 CPU的領域之分9 
1.1.6 8位時代的傳奇“前輩”—8051 10 
1.1.7 IoT的崛起—32位時代的到來11 
1.2無敵是多麼寂寞—ARM統治著的世界11 
1.2.1獨樂樂與眾樂樂—ARM公司的盈利模式12 
1.2.2小個子有大力量—無處不在的Cortex-M系列14 
1.2.3移動王者— Cortex-A系列在手持設備領域的巨大成功16 
1.2.4進擊的巨人—ARM進軍PC與服務器領域的雄心18 
1.2.5遊戲終結者之ARM 19 
1.3東邊日出西邊雨,道是無晴卻有晴—RISC-V登場19 
1.4 RISC-V和其他開放架構有何不同21 
1.4.1 “平民英雄”—OpenRISC 22 
1.4.2 “豪門顯貴”—SPARC 22 
1.4.3 “名校優生”—RISC-V 23 
1.5結語:進入32位時代,誰能成為深嵌入式領域的下一個8051?23

第2章開源蜂鳥E203超低功耗RISC-V Core與SoC 25 
2.1亂花漸欲迷人眼25 
2.2與眾不同的蜂鳥E203處理器25 
2.3蜂鳥雖小,五臟俱全—蜂鳥E203簡介26 
2.4蜂鳥E203性能指標27 
2.5蜂鳥E203配套SoC 28 

第3章大道至簡—RISC-V架構之魂29 
3.1簡單就是美—RISC-V架構的設計哲學29 
3.1.1無病一身輕—架構的篇幅30 
3.1. 2能屈能伸—模塊化的指令集31 
3.1.3濃縮的都是精華—指令的數量31 
3.2 RISC-V指令集架構簡介32 
3.2.1模塊化的指令子集32 
3.2.2可配置的通用寄存器組33 
3.2.3規整的指令編碼33 
3.2.4簡潔的存儲器訪問指令34 
3.2.5高效的分支跳轉指令35 
3.2.6簡潔的子程序調用36 
3.2.7無條件碼執行36 
3.2.8無分支延遲槽37 
3.2.9零開銷硬件循環37 
3.2.10簡潔的運算指令38 
3.2.11優雅的壓縮指令子集38 
3.2.12特權模式39 
3.2.13 CSR寄存器40 
3.2.14中斷和異常40
3.2.15矢量指令子集40 
3.2.16自定制指令擴展40 
3.2.17總結與比較41 

第4章RISC-V架構的中斷和異常43 
4.1中斷和異常概述43 
4.1.1中斷概述43 
4.1.2異常概述44 
4.1.3廣義上的異常44 
4.2 RISC-V架構異常處理機制46 
4.2.1進入異常47 
4.2.2退出異常50 
4.2.3異常服務程序50 
4.3 RISC-V架構中斷定義51 
4.3.1中斷類型51 
4.3.2中斷屏蔽54 
4.3.3中斷等待55 
4.3.4中斷優先級與仲裁55 
4.3.5中斷嵌套56 
4.3.6總結比較57 
4.4 RISC-V架構異常相關CSR寄存器57 
4.5蜂鳥E203的中斷和異常實現58 

第5章開源蜂鳥E203 MCU SoC總體介紹59 
5.1 Freedom E310 SoC簡介59 
5.2蜂鳥E203 MCU SoC簡介60 
5.3蜂鳥E203 MCU SoC框圖60 
5.4蜂鳥E203 MCU SoC存儲資源61 
5.4.1片上存儲資源61 
5.4.2片外Flash存儲資源61
5.5蜂鳥E203 MCU SoC外設資源62 
5.6蜂鳥E203 MCU SoC地址分配62 
5.7蜂鳥E203 MCU SoC時鐘域劃分63 
5.8蜂鳥E203 MCU SoC電源域劃分64 
5.9蜂鳥E203 MCU SoC低功耗模式64 
5.10蜂鳥E203 MCU SoC的全局復位65 
5.11蜂鳥E203 MCU SoC的上電流程控制66 
5.12蜂鳥E203 MCU SoC芯片引腳表67 
5.13蜂鳥E203 MCU SoC的GPIO引腳分配68 
5.14蜂鳥E203 MCU SoC的中斷處理70 
5.14.1蜂鳥E203處理器核的異常和中斷處理70 
5.14.2蜂鳥E203處理器的中斷接口71 
5.14.3 CLINT模塊生成計時器中斷和軟件中斷72 
5.14.4 PLIC管理多個外部中斷73 

第6章開源蜂鳥E203 MCU SoC外設介紹77 
6.1蜂鳥E203 MCU SoC外設總述77 
6.2 PLIC 78 
6.3 CLINT 78 
6.4 LCLKGEN 78 
6.4.1 LCLKGEN簡介78 
6.4.2 LCLKGEN寄存器列表78 
6.5 HCLKGEN 79 
6.5.1 HCLKGEN簡介79
6.5.2 HCLKGEN寄存器列表79 
6.6 GPIO 79 
6.6.1 GPIO特性79 
6.6.2 GPIO寄存器列表80 
6.6.3 I/O結構和IOF模式80 
6.6.4 SoC各外設復用GPIO引腳83 
6.6.5 GPIO中斷83 
6.6.6 GPIO_VALUE寄存器84 
6.6.7 GPIO_INPUT_EN寄存器84 
6.6.8 GPIO_OUTPUT_EN寄存器85 
6.6.9 GPIO_PORT寄存器85 
6.6.10 GPIO_PUE寄存器85 
6.6.11 GPIO_DS寄存器85 
6.6.12 GPIO_OUTPUT_XOR寄存器85 
6.6.13 GPIO_RISE_IE、 GPIO_RISE_IP等寄存器85 
6.7 SPI 86 
6.7.1 SPI背景知識簡介86 
6.7.2 SPI特性88 
6.7.3 SPI寄存器列表89 
6.7.4 SPI接口數據線90 
6.7.5通過SPI_SCKDIV寄存器配置SCK時鐘頻率90 
6.7.6通過SPI_SCKMODE寄存器配置SCK的極性與相位90 
6.7.7通過SPI_CSID寄存器配置SPI使能信號92 
6.7.8通過SPI_CSDEF寄存器配置使能信號的空閒值92
6.7.9通過SPI_CSMODE寄存器配置使能信號的行為92 
6.7.10通過SPI_DELAY0和SPI_DELAY1寄存器配置使能信號的行為93 
6.7.11通過SPI_FCTRL寄存器使能QSPI0的Flash XiP模式94 
6.7.12通過SPI_FFMT寄存器控制QSPI0讀取外部Flash 95 
6.7.13通過SPI_FMT寄存器配置傳輸參數97 
6.7.14通過SPI_TXDATA寄存器發送數據97 
6.7.15通過SPI_RXDATA寄存器接收數據98 
6.7.16通過SPI_TXMARK寄存器配置發送中斷閾值100 
6.7.17通過SPI_RXMARK寄存器配置接收中斷閾值100 
6.7.18通過SPI_IE和SPI_IP寄存器控制中斷101 
6.8 I2C 102 
6.8.1 I2C背景知識簡介102 
6.8.2 I2C特性103 
6.8.3 I2C寄存器列表103 
6.8.4 I2C接口數據線104 
6.8. 5通過I2C_PRERlo和I2C_PRERhi寄存器配置SCL時鐘頻率104 
6.8.6通過I2C_CTR寄存器配置功能和中斷使能104 
6.8.7 I2C模塊產生中斷105 
6.8.8通過I2C_TXR和I2C_RXR寄存器發送和接收數據105 
6.8.9通過I2C_CR和I2C_SR寄存器發起命令和查看狀態106
6.8.10初始化I2C模塊的序列107 
6.8.11通過I2C模塊向外部從設備寫數據的常用序列107 
6.8.12通過I2C模塊從外部從設備讀數據的常用序列108 
6.9 UART 109 
6.9.1 UART背景知識簡介109 
6.9.2 UART特性110 
6.9.3 UART寄存器列表110 
6.9.4 UART接口數據線111 
6.9.5通過UART_TXDATA寄存器發送數據111 
6.9.6通過UART_RXDATA寄存器接收數據112 
6.9.7通過UART_TXCTRL寄存器進行發送控制113 
6.9.8通過UART_RXCTRL寄存器進行接收控制113 
6.9.9通過UART_IE和UART_IP寄存器控制中斷114 
6.9.10通過UART_DIV寄存器配置波特率115 
6.10 PWM 116 
6.10.1 PWM背景知識簡介116 
6.10.2 PWM特性和結構圖116 
6.10.3 PWM寄存器列表117 
6.10.4通過PWMCFG寄存器進行配置118 
6.10.5計數器計數值PWMCOUNT寄存器和PWM週期119 
6.10.6計數器比較值PWMS寄存器120 
6.10.7 PWM接口數據線121 
6.10. 8產生左對齊或者右對齊的脈衝信號121
6.10.9產生居中對齊的脈衝信號122 
6.10.10配置pwmcmpgang結連產生任意形狀的脈衝信號124 
6.10.11配置pwmdeglitch防止輸出毛刺124 
6.10.12 PWM產生中斷124 
6.11 WDT 125 
6.11.1 WDT背景知識簡介125 
6.11.2 WDT特性和結構圖125 
6.11.3 WDT寄存器列表126 
6.11.4通過WDOGCFG寄存器進行配置127 
6.11.5計數器計數值WDOGCOUNT寄存器128 
6.11.6通過WDOGKEY寄存器解鎖128 
6.11.7通過WDOGFEED寄存器餵狗129 
6.11.8計數器比較值WDOGS寄存器129 
6.11.9通過WDOGCMP寄存器配置閾值130 
6.11.10 WDT產生全局復位130 
6.11.11 WDT產生中斷130 
6.12 RTC 131 
6.12.1 RTC背景知識簡介131 
6.12.2 RTC特性和結構圖131 
6.12.3 RTC寄存器列表131 
6.12. 4通過RTCCFG寄存器進行配置132 
6.12.5計數器計數值RTCHI/RTCLO寄存器133 
6.12.6計數器比較值RTCS寄存器133 
6.12.7通過RTCCMP寄存器配置閾值134 
6.12.8 RTC產生中斷134
6.13 PMU 134 
6.13.1 PMU背景知識簡介134 
6.13.2 PMU特性和結構圖135 
6.13.3 PMU寄存器列表136 
6.13.4通過PMUKEY寄存器解鎖136 
6.13.5通過PMUSLEEP寄存器進入休眠模式137 
6.13.6通過PMUSLEEPI寄存器配置休眠指令序列137 
6.13.7通過PMUBACKUP寄存器保存關鍵信息139 
6.13.8通過PMUIE寄存器配置喚醒條件139 
6.13.9通過PMUWAKEUPI寄存器配置喚醒指令序列140 
6.13.10通過PMUCAUSE寄存器查看喚醒原因141 

第7章開源蜂鳥E203 MCU開發板與調試器143 
7.1蜂鳥E203 MCU開發板143 
7.2蜂鳥E203 JTAG調試器143 

第8章編譯過程簡介145 
8.1 GCC工具鏈介紹145 
8.1.1 GCC工具鏈概述145 
8.1.2 Binutils 146 
8.1.3 C運行庫147 
8.1.4 GCC命令行選項148 
8.2準備工作148 
8.2.1 Linux安裝148 
8.2.2準備Hello World程序148 
8.3編譯過程149 
8.3.1預處理149 
8.3.2編譯150 
8.3.3彙編150 
8.3.4鏈接151 
8.3.5一步到位的編譯153 
8.4分析ELF文件153 
8.4.1 ELF文件介紹153 
8.4.2 ELF文件的段154 
8.4.3查看ELF文件154 
8.4.4反彙編155 
8.5嵌入式系統編譯的特殊性156 
8.6本章小結156 

第9章嵌入式開發特點與RISC-V GCC工具鏈158
9.1嵌入式系統開發特點158 
9.1.1交叉編譯和遠程調試158 
9.1.2移植newlib或newlib-nano作為C運行庫159 
9.1.3嵌入式引導程序和中斷異常處理160 
9.1.4嵌入式系統鏈接腳本160 
9.1.5減少代碼體積161 
9.1.6支持printf函數161 
9.1.7提供板級支持包162 
9.2 RISC-V GCC工具鏈簡介162 
9.2.1 RISC-V GCC工具鏈種類162 
9.2.2 riscv-none -embed工具鏈下載163 
9.2.3 RISC-V GCC工具鏈的(–march=)和(–mabi=)選項164 
9.2.4 RISC-V GCC工具鏈的(–mcmodel=)選項168 
9.2.5 RISC -V GCC工具鏈的其他選項169 
9.2.6 RISC-V GCC工具鏈的預定義宏170 
9.2.7 RISC-V GCC工具鏈使用實例170 

第10章RISC-V彙編語言程序設計171 
10.1彙編語言簡介171 
10.2 RISC-V彙編程序概述172 
10.3 RISC-V彙編指令173 
10.4 RISC-V彙編程序偽操作173 
10.5 RISC-V彙編程序示例177 
10.5.1定義標籤177
10.5.2定義宏178 
10.5.3定義常數178 
10.5.4立即數賦值178 
10.5.5標籤地址賦值179 
10.5.6設置浮點舍入模式179 
10.5.7完整實例180 
10.6在C/C++程序中嵌入彙編181 
10.6.1 GCC內聯彙編簡述181 
10.6.2 GCC內聯彙編“輸出操作數”和“輸入操作數”部分182 
10.6.3 GCC內聯彙編“可能影響的寄存器或存儲器”部分183 
10.6 .4 GCC內聯彙編參考實例一184 
10.6.5 GCC內聯彙編參考實例二185 
10.6.6小結186 
10.7在彙編中調用C/C++函數186 
10.8本章小結187 

第11章基於HBird-E-SDK平台的軟件開發與運行188 
11.1 HBird-E-SDK平台簡介188 
11.2 HBird-E-SDK平台代碼結構189 
11.3 HBird-E-SDK板級支持包解析190 
11.3.1移植了Newlib樁函數190 
11.3.2支持了printf函數192 
11.3.3提供系統鏈接腳本193 
11.3.4系統啟動引導程序198 
11.3.5系統異常和中斷處理202 
11.3.6減少代碼體積206
11.4使用HBird-E-SDK開發和編譯程序208 
11.4.1在HBird-E-SDK環境中安裝工具鏈208 
11.4.2在HBird-E-SDK環境中開發程序210 
11.4.3編譯使得程序從Flash直接運行211 
11.4.4編譯使得程序從ITCM中運行212 
11.4.5編譯使得程序從Flash上載至ITCM中運行213 
11.5使用HBird-E-SDK下載程序213 
11.5.1 JTAG調試器與MCU原型開發板的連接213 
11.5.2設置JTAG調試器在Linux系統中的USB權限214 
11.5.3將程序下載至MCU原型開發板216 
11.6在MCU原型開發板上運行程序216 
11.6.1程序從Flash直接運行217 
11.6.2程序從ITCM中運行217 
11.6.3程序從Flash上載至ITCM中運行218 
11.7使用GDB遠程調試程序218 
11.7.1調試器工作原理218 
11.7.2 GDB常用操作示例220 
11.7.3使用GDB調試Hello World示例221 

第12章開源蜂鳥E203 MCU的更多示例程序226 
12.1 Dhrystone示例程序226 
12.1.1 Dhrystone示例程序功能簡介226
12.1.2 Dhrystone示例程序代碼結構229 
12.1.3運行Dhrystone 229 
12.2 CoreMark示例程序231 
12.2.1 CoreMark示例程序功能簡介231 
12.2.2 CoreMark示例程序代碼結構232 
12.2.3運行CoreMark 233 
12.3 Demo_IASM示例程序234 
12.3 .1 Demo_IASM示例程序功能簡介234 
12.3.2 Demo_IASM示例程序代碼結構234 
12.3.3 Demo_IASM示例程序源碼解析235 
12.3.4運行Demo_IASM 235 
12.4 Demo_GPIO示例程序236 
12.4.1 Demo_GPIO示例程序功能簡介236 
12.4.2 Demo_GPIO示例程序代碼結構237 
12.4.3 Demo_GPIO示例程序源碼分析237 
12.4.4運行Demo_GPIO 243 
12.5中斷嵌套244 

第13章Windows IDE集成開發調試環境245 
13.1 MCU Eclipse IDE簡介與安裝245 
13.1.1 MCU Eclipse IDE簡介245 
13.1.2 RISC-V MCU Eclipse下載246 
13.1.3 RISC-V MCU Eclipse安裝247
13.2啟動Eclipse 248 
13.3創建Hello World項目249 
13.4配置Hello World項目253 
13.4.1配置工具鏈路徑253 
13.4.2配置項目的編譯和鏈接選項256 
13.4.3配置項目的BSP 262 
13.4.4配置項目的包含路徑和文件265 
13.5編譯Hello World項目267 
13.6運行Hello World項目269 
13.6.1安裝JTAG調試器在Windows系統中的USB驅動269 
13.6.2通過Eclipse下載程序至MCU開發板270 
13.6.3在MCU開發板上運行程序274 
13.7調試Hello World項目276 
13.8拓展一:基於MCU Eclipse運行調試demo_gpio示例280 
13.9拓展二:基於MCU Eclipse運行調試dhrystone示例281 

第14章開源蜂鳥E203 MCU開發板移植RTOS 283 
14.1 RTOS簡述283 
14.2常用實時操作系統概述284 
14.3 FreeRTOS簡介285 
14.4蜂鳥E203 MCU移植RTOS 286 

附錄A RISC-V架構指令集介紹287 
A.1 RV32GC架構概述287 
A.2 RV32E架構概述288
A.3蜂鳥E203支持的指令列表288 
A.4寄存器組288 
A.4.1通用寄存器組289 
A.4.2 CSR寄存器290 
A.5指令PC 290 
A.6尋址空間劃分290 
A.7大端格式或小端格式290 
A.8工作模式290 
A.9 Hart概念291 
A.10復位狀態291 
A.11中斷和異常292 
A.12存儲器地址管理292 
A.13存儲器模型292 
A.14指令類型293 
A. 14.1 RV32IMAFDC指令列表293 
A.14.2基本整數指令(RV32I) 293 
A.14.3整數乘法和除法指令(RV32M指令子集) 302 
A.14.4浮點指令(RV32F,RV32D指令子集) 304 
A.14.5存儲器原子操作指令(RV32A指令子集) 315 
A.14.6 16位壓縮指令(RV32C指令子集) 318 
A.15偽指令320 
A.16指令編碼320 

附錄B RISC-V架構CSR寄存器介紹321 
B.1蜂鳥E203支持的CSR寄存器列表321 
B.2 RISC-V標準CSR 322 
B.2.1 misa 322 
B.2.2 mvendorid 323
B.2.3 marchid 323 
B.2.4 mimpid 323 
B.2.5 mhartid 324 
B.2.6 fflags 324 
B.2.7 frm 324 
B.2.8 fcsr 324 
B.2.9 mstatus 324 
B.2.10 mtvec 326 
B.2.11 mepc 326 
B.2.12 mcause 327 
B.2.13 mtval (mbadaddr) 327 
B.2.14 mie 328 
B.2.15 mip 328 
B.2.16 mscratch 328 
B.2.17 mcycle和mcycleh 329 
B.2.18 minstret和minstreth 329 
B.2.19 mtime、mtimecmp和msip 329 
B.3蜂鳥E203自定義CSR 330mcounterstop 330 

附錄C RISC-V架構的PLIC介紹331 
C.1概述331 
C.2 PLIC中斷目標332PLIC中斷目標之閾值333 
C.3 PLIC中斷源333 
C.3.1 PLIC中斷源之閘口(Gateway )和IP 334 
C.3.2 PLIC中斷源之編號(ID) 334 
C.3.3 PLIC中斷源之優先級(Priority) 334
C.3.4 PLIC中斷源之中斷使能(Enable) 334 
C.4 PLIC中斷處理機制335 
C.4.1 PLIC中斷通知機制(Notification) 335 
C.4.2 PLIC中斷響應機制(Claim) 335 
C.4.3 PLIC中斷完成機制(Completion) 336 
C.4.4 PLIC中斷完整流程336 
C.5 PLIC寄存器總結337 
C.6總結與比較339 

附錄D存儲器模型背景介紹340 
D.1為何要有存儲器模型的概念340 
D.2存儲器模型定義了什麼341 
D.2.1按序一致性模型341 
D.2.2鬆散一致性模型342 
D.2.3釋放一致性模型342 
D.2.4存儲器模型總結342 
D.3存儲器模型應用實例343 
D.4 RISC-V架構的存儲器模型344 

附錄E存儲器原子操作指令背景介紹345 
E.1什麼是“上鎖”問題345 
E.2通過原子操作解決“上鎖”問題346 
E.3通過互斥操作解決“上鎖”問題346 
E.4 RISC-V架構的相關指令348 

附錄F RISC-V指令編碼列表349 
F.1 RV32I指令編碼349 
F.2 RV32M指令編碼350
F.3 RV32A指令編碼350 
F.4 RV32F指令編碼350 
F.5 RV32D指令編碼351 
F.6 RVC指令編碼351 
附錄G RISC-V偽指令列表353