18video性欧美19sex,欧美高清videosddfsexhd,性少妇videosexfreexxx片中国,激情五月激情综合五月看花,亚洲人成网77777色在线播放

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

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

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

深入淺出了解華為云 API 網(wǎng)關(guān)的 Gzip 功能

jf_94205927 ? 來源:jf_94205927 ? 作者:jf_94205927 ? 2023-11-12 17:36 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

Gzip 是什么

Gzip 是一種用于數(shù)據(jù)壓縮的編碼格式,經(jīng)常被使用在基于 HTTP 協(xié)議的網(wǎng)絡(luò)傳輸中。Gzip 功能允許服務(wù)器在傳輸數(shù)據(jù)是對其進(jìn)行壓縮,從而減小傳輸?shù)臄?shù)據(jù)量,加快頁面加載速度,這對于節(jié)省帶寬和提高用戶體驗非常有用。本文將從 Gzip 使用場景、Gzip 原理、Gzip 在 nginx 中的應(yīng)用以及華為云 API網(wǎng)關(guān)的 Gzip 功能實(shí)現(xiàn)幾個方面介紹 Gzip。

Gzip 使用場景

Gzip 能夠提升傳輸速度和降低帶寬消耗,因此適合應(yīng)用 Gzip 的場景有很多。

網(wǎng)頁傳輸:在 web 開發(fā)中,使用 Gzip 可以減小文件大小,從而加快頁面加載速度。

移動應(yīng)用通信:在移動應(yīng)用中,使用 Gzip 可以降低移動網(wǎng)絡(luò)的數(shù)據(jù)消耗,加快數(shù)據(jù)傳輸速度,提升用戶體驗。

文件備份和傳輸:在進(jìn)行文件備份或者文件傳輸時,使用 Gzip 可以減小備份文件的大小,節(jié)省存儲空間和傳輸帶寬。

網(wǎng)絡(luò)傳輸限制:在網(wǎng)絡(luò)帶寬受限的環(huán)境下,使用Gzip可以減小數(shù)據(jù)傳輸量,提升網(wǎng)絡(luò)性能。

API 通信:對于RESTfulAPI或其他數(shù)據(jù)接口的傳輸,使用Gzip可以降低傳輸?shù)臄?shù)據(jù)量,減少對網(wǎng)絡(luò)帶寬的占用,提升響應(yīng)速度。

Gzip 原理

gzip 使用 deflate 算法進(jìn)行壓縮。其原理主要包括 LZ77 算法以及 Huffman 編碼(哈夫曼編碼)。

LZ77 算法

LZ77 算法是將重復(fù)字符串替換為長度距離對來達(dá)到壓縮的目的。長度是重復(fù)字符串的長度,距離是重復(fù)字符串與第一個出現(xiàn)該字符串的距離,下圖是一個簡單的示例:

wKgaomVOOJiAUGSzAAAUUXecyug847.png

在 LZ77 算法中,主要運(yùn)用了基于滑動窗口的字典壓縮算法。首先是滑動窗口:

wKgZomVOOJmAYqfRAAALlE0EfZw289.png

以上圖為例,一開始,查找區(qū)是沒有字符的?;瑒哟翱趶?K 開始移動,依次在查找區(qū)嘗試查找當(dāng)前指向字符及之后字符的最長匹配,直到滑動窗口區(qū)不再有字符為止。這里就涉及到另外一個問題了,如何在查找區(qū)中快速的找到與滑動窗口中匹配的字符,LZ77 顯然不會采取暴力遍歷查找的方法,通常使用哈希數(shù)組來實(shí)現(xiàn)字典的快速搜索。在哈希數(shù)組中有兩個數(shù)組,一個數(shù)組用來存放最新重復(fù)字符串的哈希地址,一個數(shù)組用來解決哈希沖突。具體以下圖為例進(jìn)行說明:

wKgaomVOOJqAUpPkAAKB7z4YWsI895.png

當(dāng)?shù)谝淮螔呙?ABC 時,對應(yīng)數(shù)組 1 中 4 號位置為空,因此不用轉(zhuǎn)化為長度距離對。當(dāng)?shù)诙螔呙璧?ABC 時,對應(yīng)數(shù)組 1 中 4 號位置存放的是 1,于是將 4 號位置替換為 6,再將 1 放置在數(shù)組 2 中的 6 號位置,此時數(shù)組 2 的 6 號位置存放的是 1,對當(dāng)前字符串后的字符繼續(xù)和 1 位置對應(yīng)字符后的字符繼續(xù)進(jìn)行匹配,記錄最長匹配字符長度。然后在數(shù)組 2 中查找 1 號位置,如果為空則結(jié)束匹配,最后將匹配到的最長字符替換為長度距離對。

Huffman 編碼

Huffman 編碼的原理是基于哈夫曼樹。哈夫曼樹是一種最優(yōu)二叉樹,是一種帶權(quán)路徑長度最短的二叉樹。

以下是哈夫曼樹的構(gòu)造過程:

假設(shè)有 A、B、C、D、E 五個字母,他們對應(yīng)出現(xiàn)的次數(shù)分別為 5,6,8,12,20

wKgZomVOOJqACtcXAAK-fbZiow4958.png

構(gòu)造哈夫曼樹的基本流程:將 A、B、C、D、E 看作是只有一個結(jié)點(diǎn)的樹,其中出現(xiàn)的次數(shù)作為他們的權(quán)值。將權(quán)值和最小的兩個數(shù)進(jìn)行合并稱為一個新樹,權(quán)值較小的樹作為左子樹,權(quán)值較大的樹作為右子樹,新樹的根結(jié)點(diǎn)權(quán)值為兩子樹之和,然后將新樹也加入到樹的集合中,重復(fù)上述流程知道又有一棵樹為止。

針對哈夫曼樹編碼,左分支為 0,右分支為 1??傻贸?A、B、C、D、E 的編碼如下:

wKgaomVOOJuAVdo9AAAVH5PPyR8818.png

從最后的編碼來看,出現(xiàn)次數(shù)最多的 E 的編碼長度比出現(xiàn)次數(shù)較少的 A 或 B 要少。最終頻率高的字符會使用較短的編碼,頻率低的字符會使用較長的編碼,總體的編碼長度就會變小,從而達(dá)到壓縮的結(jié)果。

Gzip 在 Nginx 中的應(yīng)用

Nginx 作為當(dāng)下很流行的開源網(wǎng)頁服務(wù)器和反向代理服務(wù)器,原生支持了 Gzip 的功能。但是在 Nginx 中 Gzip 功能默認(rèn)是不開啟,需要在配置文件中配置相關(guān)指令才可以開啟 Gzip 功能。常見的配置項如下:

wKgZomVOOJuAbgeLAAQ0_ftpfAo173.png

華為云 API網(wǎng)關(guān)的 Gzip 功能

華為云API網(wǎng)關(guān)(APIG)為企業(yè)和開發(fā)者提供的高性能、高可用、高安全的云原生網(wǎng)關(guān)服務(wù),融合安全、負(fù)載均衡、流量入口治理、微服務(wù)流量治理、運(yùn)維等多項能力,也支持 Gzip 壓縮功能。用戶可以通過一鍵式開關(guān)控制 Gzip 功能的開啟。同時 APIG 還開放了壓縮等級,用戶可以通過配置不同的壓縮等級,根據(jù)自己的需求對 Gzip 功能進(jìn)行性能調(diào)優(yōu)。當(dāng)一個客戶端發(fā)送一個 HTTP 請求時,需要包含一個 Accept-Encoding 頭部用來指示客戶端支持的壓縮算法。

APIG 會根據(jù) GZIP 開關(guān)來判斷是否進(jìn)行壓縮。在開關(guān)開啟的狀態(tài)下,APIG 會將響應(yīng)內(nèi)容壓縮,然后將壓縮后的響應(yīng)發(fā)送給客戶端(如果客戶端已經(jīng)進(jìn)行 Gzip 壓縮,那么 APIG 將不會進(jìn)行二次壓縮)??蛻舳耸盏巾憫?yīng)后,會根據(jù)響應(yīng)頭部的 Content-Encoding 字段判斷是否經(jīng)過了壓縮。如果響應(yīng)被壓縮了,客戶端會進(jìn)行解壓縮,以獲取原始的內(nèi)容。

可以參考以下步驟打開 Gzip 開關(guān)及設(shè)置壓縮等級:

打開華為云 APIG 控制臺,依次進(jìn)入實(shí)例管理-->配置參數(shù),在頁面列表中找到參數(shù) gzip 如下:

wKgaomVOOJyAGw8LAABXZy_ZJIc295.png

如上圖,gzip 功能為開啟狀態(tài),且壓縮等級為 6。

此外,APIG 還提供了 Debug 功能用以調(diào)試 Gzip 功能。首先依次打開 API 列表,然后點(diǎn)擊創(chuàng)建 API。

wKgZomVOOJyAeoX2AAGQXfX0NVE360.png

在填寫好 API 詳細(xì)信息后,在后端配置選項頁面選擇 Mock 后端,并且增加 header 參數(shù)-content-length(參數(shù)值需要大于等于 1028,否則 gzip 功能將不生效。)

wKgaomVOOJ2ADw3AAAGLWE-ayl0835.png

然后進(jìn)入 API 的調(diào)試界面,在 Headers 中添加參數(shù):Accept-Encoding,對應(yīng)參數(shù)值為 gzip。在響應(yīng)結(jié)果中,如果有 Content-Encoding:gzip出現(xiàn),即代表 Gzip 功能生效。

wKgZomVOOJ6AWV9wAAMtoVN6byQ970.png

Gzip 自首次發(fā)布以來,已經(jīng)成為互聯(lián)網(wǎng)上常用的壓縮格式之一。各種高性能的開源代理如 Nginx、Envoy 等都原生支持 Gzip 的功能。在傳輸速度和降低帶寬消耗方面,Gzip 有著十分強(qiáng)大的優(yōu)勢,希望本文能幫助到想要了解 Gzip 背后原理及其應(yīng)用的人。

另外,如果你有更多關(guān)于華為云產(chǎn)品的疑問,可掃碼添加華為云專家的聯(lián)系方式,咨詢相關(guān)問題。

審核編輯 黃宇


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

    關(guān)注

    9

    文章

    6214

    瀏覽量

    55002
  • API
    API
    +關(guān)注

    關(guān)注

    2

    文章

    1969

    瀏覽量

    65812
  • 華為云
    +關(guān)注

    關(guān)注

    3

    文章

    2799

    瀏覽量

    18998
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點(diǎn)推薦

    深度解析淘寶API接口:功能、限制與最佳實(shí)踐

    在當(dāng)今日益繁榮的電商領(lǐng)域,淘寶作為中國最大的電子商務(wù)平臺之一,其API接口為開發(fā)者提供了豐富的功能和數(shù)據(jù)資源。本文將深入解析淘寶API接口的功能
    的頭像 發(fā)表于 10-20 13:48 ?102次閱讀

    工業(yè)數(shù)據(jù)采集網(wǎng)關(guān)API接口能夠?qū)幽男┢脚_系統(tǒng)

    從數(shù)據(jù)匯聚、生產(chǎn)管理到?jīng)Q策分析的全鏈路需求,具體可分為以下幾大類別: 1.工業(yè)物聯(lián)網(wǎng)(IIoT)平臺 這類平臺是工業(yè)數(shù)據(jù)的核心匯聚與處理中心,網(wǎng)關(guān)通過標(biāo)準(zhǔn)API(如RESTfulAPI、MQTTAPI等)實(shí)現(xiàn)數(shù)據(jù)實(shí)時上傳與雙向
    的頭像 發(fā)表于 09-17 11:05 ?296次閱讀
    工業(yè)數(shù)據(jù)采集<b class='flag-5'>網(wǎng)關(guān)</b>的<b class='flag-5'>API</b>接口能夠?qū)幽男┢脚_系統(tǒng)

    SIP 廣播對講與華為視頻會議融合解決方案

    對講終端與視頻會議終端接入同一網(wǎng)絡(luò),由統(tǒng)一的管理平臺進(jìn)行管理,實(shí)現(xiàn)功能聯(lián)動。 系統(tǒng)架構(gòu) : 控制層 :可在阿里華為部署 SIP 集群
    發(fā)表于 07-12 10:57

    藍(lán)牙網(wǎng)關(guān)選擇的方法

    ? · 支持集中管理平臺(如AC Server)的網(wǎng)關(guān)可批量配置參數(shù),提升運(yùn)維效率。 · 開放API接口(300+)和SDK支持二次開發(fā),便于與第三方系統(tǒng)(如阿里、AWS IoT)集成。 ?安全與過濾
    發(fā)表于 04-21 16:25

    潤和的Hi3861開發(fā)版如何連接華為

    剛?cè)胧至艘惶诐櫤偷腍i3861開發(fā)套件,下載的是3.2Release版本的源碼,想連接華為但是潤和那邊的代碼倉中沒有相關(guān)的demo,,求大佬指點(diǎn)
    發(fā)表于 04-11 20:32

    潤和的Hi3861開發(fā)板如何連接華為

    剛?cè)胧至艘惶诐櫤偷腍i3861開發(fā)套件,想連接華為但是潤和那邊的代碼倉中沒有相關(guān)的demo,求大佬指點(diǎn)
    發(fā)表于 04-11 20:30

    深入淺出解析低功耗藍(lán)牙協(xié)議棧

    深入Bluetooth LE協(xié)議棧各個組成部分之前,我們先看一下Bluetooth LE協(xié)議棧整體架構(gòu)。 如上圖所述,要實(shí)現(xiàn)一個Bluetooth LE應(yīng)用,首先需要一個支持Bluetooth
    的頭像 發(fā)表于 04-09 14:49 ?865次閱讀
    <b class='flag-5'>深入淺出</b>解析低功耗藍(lán)牙協(xié)議棧

    騰訊率先上線DeepSeek模型API接口,支持聯(lián)網(wǎng)搜索

    API接口,用戶可以輕松接入DeepSeek模型,實(shí)現(xiàn)各種創(chuàng)新應(yīng)用。同時,騰訊旗下的大模型知識應(yīng)用開發(fā)平臺——知識引擎,也成功接入了這兩款模型,并率先支持聯(lián)網(wǎng)搜索功能。這一功能的加
    的頭像 發(fā)表于 02-10 09:47 ?2124次閱讀

    【貝啟科技BQ3568HM開源鴻蒙開發(fā)板深度試用報告】3 - 智能家居中控屏連接華為IoTDA物聯(lián)網(wǎng)平臺

    了應(yīng)用側(cè)API,實(shí)現(xiàn)設(shè)備數(shù)據(jù)采集、命令下發(fā)、設(shè)備管理等業(yè)務(wù)場景。 有關(guān)應(yīng)用側(cè)API參見:應(yīng)用側(cè)API參考_設(shè)備接入 IoTDA_華為。 為
    發(fā)表于 02-06 09:39

    深入解析華為 X 實(shí)例保障上業(yè)務(wù)安全的關(guān)鍵策略

    。華為作為全球領(lǐng)先的服務(wù)提供商之一,在安全性方面為用戶提供了全面的保障。其華為 X 實(shí)例憑借強(qiáng)大的性能和安全性,成為眾多企業(yè)業(yè)務(wù)部署的
    的頭像 發(fā)表于 01-03 09:25 ?913次閱讀
    <b class='flag-5'>深入</b>解析<b class='flag-5'>華為</b><b class='flag-5'>云</b> X 實(shí)例保障<b class='flag-5'>云</b>上業(yè)務(wù)安全的關(guān)鍵策略

    華為 Flexus 服務(wù)器 X 實(shí)例之 openEuler 系統(tǒng)下玩轉(zhuǎn) iSulad 容器技術(shù)

    的靈活性與性能。結(jié)合華為自研的 iSulad 容器技術(shù),用戶能夠在 openEuler 系統(tǒng)上享受到更輕量級、更安全的應(yīng)用程序部署體驗。本文將帶領(lǐng)讀者深入了解如何在華為 Flexus
    的頭像 發(fā)表于 12-30 14:53 ?839次閱讀
    <b class='flag-5'>華為</b><b class='flag-5'>云</b> Flexus <b class='flag-5'>云</b>服務(wù)器 X 實(shí)例之 openEuler 系統(tǒng)下玩轉(zhuǎn) iSulad 容器技術(shù)

    深入淺出RISC-V調(diào)試

    一、JTAG簡介 目前RISC-V官方支持的調(diào)試方式是JTAG(Joint Test Action Group),而ARM支持的調(diào)試方式有JTAG和SWD(Serial Wire Debug)這兩種。 JTAG是一種國際標(biāo)準(zhǔn)的調(diào)試方式(IEEE1149.1),而SWD是ARM開發(fā)的。標(biāo)準(zhǔn)JTAG采用四線方式,分別是TCK、TMS、TDI和TDO,有一個可選的TRST引腳。 ● TCK:測試時鐘輸入。 ● TMS:測試模式選擇。 ● TDI:測試數(shù)據(jù)輸入。 ● TDO:測試數(shù)據(jù)輸出。 在調(diào)試時需要用到一個工具,比如JLink或者CMSIS-DAP,對于這個工具,在這里稱為JTAG主機(jī)(JTAG host),而嵌入在芯片內(nèi)部的JTAG稱為JTAG從機(jī)(JTAG slave),需要注意的是上面這些信號的輸入輸出方向是對于JTAG從機(jī)來說的。下文中如無特別說明,JTAG都是指JTAG從機(jī)。 一個JTAG主機(jī)可以同時對多個JTAG從機(jī)進(jìn)行調(diào)試,這通過JTAG掃描鏈(JTAG Scan Chain)完成,如圖1所示。 圖1 一個JTAG主機(jī)連接多個JTAG從機(jī) JTAG內(nèi)部有一個TAP(Test Access Port)控制器(或者說狀態(tài)機(jī)),通過TCK和TMS信號來改變狀態(tài)機(jī)的狀態(tài)。這個狀態(tài)機(jī)的核心是兩路SCAN,分別是IR SCAN和DR SCAN,TAP狀態(tài)機(jī)如圖2所示。 圖2 TAP狀態(tài)機(jī) 箭頭上的0或1表示的是TMS信號的電平。JTAG在每一個TCK信號的上升沿采樣TMS信號和TDI信號,決定狀態(tài)機(jī)的狀態(tài)是否發(fā)生變化,在每一個TCK信號的下降沿輸出TDO信號??梢钥吹?,無論TAP目前處于哪一個狀態(tài),只要TMS保持高電平并持續(xù)5個TCK時鐘,則TAP一定會回到Test-Logic-Reset狀態(tài)。 JTAG內(nèi)部有一個IR(instruction register)寄存器和多個DR(data register)寄存器,IR寄存器決定要訪問的是哪一個DR寄存器。DR寄存器有IDCODE、BYPASS等。在Test-Logic-Reset狀態(tài)下IR寄存器默認(rèn)選擇的是IDCODE這個DR寄存器。 JTAG主機(jī)通過IR SCAN設(shè)置IR寄存器的值,然后通過DR SCAN來讀、寫相應(yīng)的DR寄存器。 二、RISC-V調(diào)試Spec 調(diào)試模塊在CPU芯片設(shè)計里是最為不起眼的,但又是最為復(fù)雜的模塊之一,大部分開源的處理器IP都沒有調(diào)試模塊。 下面的內(nèi)容基于RISC-V debug spec 0.13版本。 目前RISC-V的官方調(diào)試上位機(jī)是openocd,調(diào)試工具可以是JLink或者CMSIS-DAP,RISC-V調(diào)試系統(tǒng)框架如圖3所示。 圖3 RISC-V調(diào)試系統(tǒng)框架 可以看到主要分為3個部分,分別是Debug Host,可以理解為PC;Debug Hardware,可以理解為JLink或者CMSIS-DAP這樣的調(diào)試工具;第三部分就是嵌入在芯片內(nèi)部的調(diào)試模塊。在調(diào)試模塊內(nèi)部,與調(diào)試工具直接交互的是DTM模塊,DTM模塊通過DMI接口與DM模塊交互。 1>DTM模塊 在DTM模塊里實(shí)現(xiàn)了一個TAP控制器(狀態(tài)機(jī)),其中IR寄存器的長度最少為5位,當(dāng)TAP控制器復(fù)位時,IR的值默認(rèn)為5\'b00001,即選擇的是IDCODE寄存器。DTM模塊的寄存器(DR寄存器)定義如圖4所示。 圖4 DTM寄存器 其中紅色框起來的寄存器是必須要實(shí)現(xiàn)的。下面簡單介紹一下這幾個寄存器。 ① IDCODE寄存器(0x01) 當(dāng)TAP狀態(tài)機(jī)復(fù)位時,IR寄存器的值默認(rèn)為0x01,即選擇的是IDCODE寄存器。IDCODE寄存器的每一位含義如圖5所示。IDCODE是只讀寄存器。 圖5 IDCODE寄存器 ● Version:只讀,版本號,可為任意值。 ● PartNumber:只讀,可為任意值。 ● Manufld:只讀,廠商號,遵循JEP106標(biāo)準(zhǔn)分配,實(shí)際中可為任意值,只要不與已分配的廠商號沖突即可。 ② DTM控制和狀態(tài)寄存器(dtmcs,0x10) dtmcs寄存器的每一位含義如圖6所示。 圖6 dtmcs寄存器 ● dmihardreset:DTM模塊硬復(fù)位,寫1有效。 ● dmireset:清除出錯,寫1有效。 ● idle:只讀,JTAG 主機(jī)在Run-Test-Idle狀態(tài)停留的時鐘周期數(shù),0表示不需要進(jìn)入Run-Test-Idle狀態(tài),1表示進(jìn)入Run-Test-Idle狀態(tài)后可以馬上進(jìn)入下一個狀態(tài),以此類推。 ● dmistat:只讀,上一次操作的狀態(tài)。0表示無出錯,1或者2表示操作出錯,3表示操作還未完成。 ● abits:只讀,dmi寄存器中address域的大小(位數(shù))。 ● version:只讀,實(shí)現(xiàn)所對應(yīng)的spec版本,0表示0.11版本,1表示0.13版本。 ③ DM模塊接口訪問寄存器(dmi,0x11) dmi寄存器的每一位含義如圖7所示。 圖7 dmi寄存器 ● address:可讀可寫,DM寄存器的長度(位數(shù))。 ● data:可讀可寫,往DM寄存器讀、寫的數(shù)據(jù),固定為32位。 ● op:可讀可寫,讀或者寫這個域時有不同的含義。當(dāng)寫這個域時,寫0表示忽略address和data的值,相當(dāng)于nop操作;寫1表示從address指定的寄存器讀數(shù)據(jù);寫2表示把data的數(shù)據(jù)寫到address指定的寄存器。寫3為保留值。當(dāng)讀這個域時,0表示上一個操作正確完成;1為保留值;2表示上一個操作失敗,這個狀態(tài)是會被記住的,因此需要往dtmcs寄存器的dmireset域?qū)?才能清除這個狀態(tài)。3表示上一個操作還未完成。 在Update-DR狀態(tài)時,DTM開始執(zhí)行op指定的操作。在Capture-DR狀態(tài)時,DTM更新data域。 ④ BYPASS寄存器(0x1f) 只讀,長度為1,值固定為0。 2>DM模塊 從圖3可知,DM模塊訪問RISC-V Core有兩種方式,一種是通過abstract command,另一種是通過system bus。abstract command方式是必須要實(shí)現(xiàn)的,system bus的方式是可選的。 DM模塊的寄存器都為32位,定義如圖8所示。 圖8 DM寄存器 下面介紹一下紅色框起來這幾個重要的寄存器。 ① data寄存器(data0-data11,0x04-0x0f) 這12個寄存器是用于abstract command的數(shù)據(jù)寄存器,長度為32位,可讀可寫。 ② DM控制寄存器(dmcontrol,0x10) dmcontrol寄存器的每一位含義如圖9所示。 圖9 dmcontrol寄存器 ● haltreq:只寫,寫1表示halt(暫停)當(dāng)前hart(hart表示CPU核,存在多核的情況)。 ● resumereq:只能寫1,寫1表示resume(恢復(fù))當(dāng)前hart,即go。 ● hartreset:可讀可寫,寫1表示復(fù)位DM模塊,寫0表示撤銷復(fù)位,這是一個可選的位。 ● ackhavereset:只能寫1,寫1表示清除當(dāng)前hart的havereset狀態(tài)。 ● hasel:可讀可寫,0表示當(dāng)前只有一個已經(jīng)被選擇了的hart,1表示當(dāng)前可能有多個已經(jīng)被選擇了的hart。 ● hartsello:可讀可寫,當(dāng)前選擇的hart的低10位。1位表示一個hart。 ● hartselhi:可讀可寫,當(dāng)前選擇的hart的高10位。1位表示一個hart。如果只有一個hart,那么hasel的值為0,hartsello的值為1,hartselhi的值為0。 ● setresethaltreq:只能寫1,寫1表示當(dāng)前選擇的hart復(fù)位后處于harted狀態(tài)。 ● clrresethaltreq:只能寫1,寫1表示清除setresethaltreq的值。 ● ndmreset:可讀可寫,寫1表示復(fù)位整個系統(tǒng),寫0表示撤銷復(fù)位。 ● dmactive:可讀可寫,寫0表示復(fù)位DM模塊,寫1表示讓DM模塊正常工作。正常調(diào)試時,此位必須為1。 ③ DM狀態(tài)寄存器(dmstatus,0x11) dmstatus寄存器是一個只讀寄存器,每一位含義如圖10所示。 圖10 dmstatus寄存器 ● impebreak:1表示執(zhí)行完progbuf的指令后自動插入一條ebreak指令,這樣就可以節(jié)省一個progbuf。當(dāng)progbufsize的值為1時,此值必須為1。 ● allhavereset:1表示當(dāng)前選擇的hart已經(jīng)復(fù)位。 ● anyhavereset:1表示當(dāng)前選擇的hart至少有一個已經(jīng)復(fù)位。 ● allresumeack:1表示當(dāng)前選擇的所有hart已經(jīng)應(yīng)答上一次的resume請求。 ● anyresumeack:1表示當(dāng)前選擇的hart至少有一個已經(jīng)應(yīng)答上一次的resume請求。 ● allnonexistent:1表示當(dāng)前選擇的hart不存在于當(dāng)前平臺。 ● anynonexistent:1表示至少有一個選擇了的hart不存在于當(dāng)前平臺。 ● allunavail:1表示當(dāng)前選擇的hart都不可用。 ● anyunavail:1表示至少有一個選擇了的hart不可用。 ● allrunning:1表示當(dāng)前選擇的hart都處于running狀態(tài)。 ● anyrunning:1表示至少有一個選擇了的hart處于running狀態(tài)。 ● allhalted:1表示當(dāng)前選擇的hart都處于halted狀態(tài)。 ● anyhalted:1表示至少有一個選擇了的hart處于halted狀態(tài)。 ● authenticated:0表示使用DM模塊之前需要進(jìn)行認(rèn)證,1表示已經(jīng)通過認(rèn)證。 ● authbusy:0表示可以進(jìn)行正常的認(rèn)證,1表示認(rèn)證處于忙狀態(tài)。 ● hasresethaltreq:1表示DM模塊支持復(fù)位后處于halted狀態(tài),0表示不支持。 ● confstrptrvalid:1表示confstrptr0~3寄存器保存了配置字符串的地址。 ● version:0表示DM模塊不存在,1表示DM模塊的版本為0.11,2表示DM模塊的版本為0.13。 ④ abstract控制和狀態(tài)寄存器(abstractcs,0x16) abstractcs寄存器定義如圖11所示。 圖11 abstractcs寄存器 ● progbufsize:只讀,program buffer的個數(shù),取值范圍為0~16,每一個的大小為32位。 ● busy:只讀,1表示abstract命令正在執(zhí)行,當(dāng)寫command寄存器后該位應(yīng)該馬上被置位直到命令執(zhí)行完成。 ● cmderr:可讀、只能寫1,cmderr的值僅當(dāng)busy位為0時有效。0表示無錯誤,1表示正在操作command、abstractcs、data或者progbuf寄存器,2表示不支持當(dāng)前命令,3表示執(zhí)行命令時出現(xiàn)異常,4表示由于當(dāng)前hart不可用,或者不是處于halted/running狀態(tài)而不能被執(zhí)行,5表示由于總線出錯(對齊、訪問大小、超時)導(dǎo)致的錯誤,7表示其他錯誤。寫1清零cmderr。 ● datacount:只讀,所實(shí)現(xiàn)的data寄存器的個數(shù)。 ⑤ abstract命令寄存器(command,0x17) 當(dāng)寫這個寄存器時,相應(yīng)的操作就會被執(zhí)行。command寄存器只能寫,定義如圖12所示。 圖12 command寄存器 ● cmdtype:只寫,命令類型,0為表示訪問寄存器,1表示快速訪問,2表示訪問內(nèi)存。 ● control:只寫,不同的命令類型有不同的含義,說明如下。 當(dāng)cmdtype為0時,control定義如圖13所示。 圖13 訪問寄存器 ● cmdtype:值為0。 ● aarsize:2表示訪問寄存器的最低32位,3表示訪問寄存器的最低64位,4表示訪問寄存器的最低128位。如果大于實(shí)際寄存器的大小則此次訪問是失敗的。 ● aarpostincrement:1表示成功訪問寄存器后自動增加regno的值。 ● postexec:1表示執(zhí)行progbuf里的內(nèi)容(指令)。 ● transfer:0表示不執(zhí)行write指定的操作,1表示執(zhí)行write指定的操作。 ● write:0表示從指定的寄存器拷貝數(shù)據(jù)到arg0指定的data寄存器。1表示從arg0指定的data寄存器拷貝數(shù)據(jù)到指定的寄存器。 ● regno:要訪問的寄存器。 綜上,可知: Ⅰ. 當(dāng)write=0,transfer=1時,從regno指定的寄存器拷貝數(shù)據(jù)到arg0對應(yīng)的data寄存器。 Ⅱ. 當(dāng)write=1,transfer=1時,從arg0對應(yīng)的data寄存器拷貝數(shù)據(jù)到regno指定的寄存器。 Ⅲ. 當(dāng)aarpostincrement=1時,將regno的值加1。 Ⅳ. 當(dāng)postexec=1時,執(zhí)行progbuf寄存器里的指令。 arg對應(yīng)的data寄存器如圖14所示。 圖14 arg對應(yīng)的data寄存器 即當(dāng)訪問的寄存器位數(shù)為32位時,arg0對應(yīng)data0寄存器,arg1對應(yīng)data1寄存器,arg2對應(yīng)data2寄存器。 當(dāng)cmdtype為1時,control定義如圖15所示。 圖15 快速訪問 ● cmdtyte:值為1。 此命令會執(zhí)行以下操作: 1)halt住當(dāng)前hart。 2)執(zhí)行progbuf寄存器里的指令。 3)resume當(dāng)前hart。 當(dāng)cmdtype為2時,control定義如圖16所示。 圖16 訪問內(nèi)存 ● cmdtype:值為2。 ● aamvirtual:0表示訪問的是物理地址,1表示訪問的是虛擬地址。 ● aamsize:0表示訪問內(nèi)存的低8位,1表示訪問內(nèi)存的低16位,2表示訪問內(nèi)存的低32位,3表示訪問內(nèi)存的低64位,4表示訪問內(nèi)存的低128位。 ● aampostincrement:1表示訪問成功后,將arg1對應(yīng)的data寄存器的值加上aamsize對應(yīng)的字節(jié)數(shù)。 ● write:0表示從arg1指定的地址拷貝數(shù)據(jù)到arg0指定的data寄存器,1表示從arg0指定的data寄存器拷貝數(shù)據(jù)到arg1指定的地址。 ● target-specific:保留。 綜上,可知: Ⅰ. 當(dāng)write=0時,從arg1指定的地址拷貝數(shù)據(jù)到arg0指定的data寄存器。 Ⅱ. 當(dāng)write=1時,從arg0指定的data寄存器拷貝數(shù)據(jù)到arg1指定的地址。 Ⅲ. 當(dāng)aampostincrement=1時,增加arg1對應(yīng)的data寄存器的值。 ⑥ 系統(tǒng)總線訪問控制和狀態(tài)寄存器(sbcs,0x38) sbcs寄存器定義如圖17所示。 圖17 sbcs寄存器 ● sbversion:只讀,0表示system bus是2018.1.1之前的版本,1表示當(dāng)前debug spec的版本,即0.13版本。 ● sbbusyerror:只讀,寫1清零,當(dāng)debugger要進(jìn)行system bus訪問操作時,如果上一次的system bus訪問還在進(jìn)行中,此時會置位該位。 ● sbbusy:只讀,1表示system bus正在忙。在進(jìn)行system bus訪問前必須確保該位為0。 ● sbreadonaddr:可讀可寫,1表示每次往sbaddress0寄存器寫數(shù)據(jù)時,將會自動觸發(fā)system bus從新的地址讀取數(shù)據(jù)。 ● sbaccess:可讀可寫,訪問的數(shù)據(jù)寬度,0表示8位,1表示16位,2表示32位,3表示64位,4表示128位。 ● sbautoincrement:可讀可寫,1表示每次system bus訪問后自動將sbaddress的值加上sbaccess的大小(字節(jié))。 ● sbreadondata:可讀可寫,1表示每次從sbdata0寄存器讀數(shù)據(jù)后將自動觸發(fā)system bus從新的地址讀取數(shù)據(jù)。 ● sberror:可讀,寫1清零,0表示無錯誤,1表示超時,2表示訪問地址錯誤,3表示地址對齊錯誤,4表示訪問大小錯誤,7表示其他錯誤。 ● sbasize:只讀,system bus地址寬度(位數(shù)),0表示不支持system bus訪問。 ● sbaccess128:只讀,1表示system bus支持128位訪問。 ● sbaccess64:只讀,1表示system bus支持64位訪問。 ● sbaccess32:只讀,1表示system bus支持32位訪問。 ● sbaccess16:只讀,1表示system bus支持16位訪問。 ● sbaccess8:只讀,1表示system bus支持8位訪問。 ⑦ 系統(tǒng)總線地址0寄存器(sbaddress0,0x39) 可讀可寫,如果sbcs寄存器中的sbasize的值為0,那么此寄存器可以不用實(shí)現(xiàn)。 當(dāng)寫該寄存器時,會執(zhí)行以下流程: Ⅰ. 設(shè)置sbcs.sbbusy的值為1。 Ⅱ. 從新的sbaddress地址讀取數(shù)據(jù)。 Ⅲ. 如果讀取成功并且sbcs.sbautoincrement的值為1,則增加sbaddress的值。 Ⅳ. 設(shè)置sbcs.sbbusy的值為0。 ⑧ 系統(tǒng)總線數(shù)據(jù)0寄存器(sbdata0,0x3c) 可讀可寫,如果sbcs寄存器中的所有sbaccessxx的值都為0,那么此寄存器可以不用實(shí)現(xiàn)。 當(dāng)寫該寄存器時,會執(zhí)行以下流程: Ⅰ. 設(shè)置sbcs.sbbusy的值為1。 Ⅱ. 將sbdata的值寫到sbaddress指定的地址。 Ⅲ. 如果寫成功并且sbcs.sbautoincrement的值為1,則增加sbaddress的值。 Ⅳ. 設(shè)置sbcs.sbbusy的值為0。 當(dāng)讀該寄存器時,會執(zhí)行以下流程: Ⅰ. 準(zhǔn)備返回讀取的數(shù)據(jù)。 Ⅱ. 設(shè)置sbcs.sbbusy的值為1。 Ⅲ. 如果sbcs.sbautoincrement的值為1,則增加sbaddress的值。 Ⅳ. 如果sbcs.sbreadondata的值為1,則開始下一次讀操作。 Ⅴ. 設(shè)置sbcs.sbbusy的值為0。 三、RISC-V調(diào)試上位機(jī)分析 RISC-V官方支持的調(diào)試器上位機(jī)是openocd。openocd是地表最強(qiáng)大(沒有之一)的開源調(diào)試上位機(jī),支持各種target(ARM(M、A系列)、FPGA、RISC-V等),支持各種調(diào)試器(Jlink、CMSIS-DAP、FTDI等),支持JTAG和SWD接口。 這里不打算詳細(xì)分析整個openocd的實(shí)現(xiàn),只是重點(diǎn)關(guān)注針對RISC-V平臺的初始化、讀寫寄存器和讀寫內(nèi)存這幾個流程。 1>openocd啟動過程 openocd啟動時需要通過-f參數(shù)制定一個cfg文件,比如: openocd.exe -f riscv.cfg riscv.cfg文件的內(nèi)容如下: adapter_khz1000 reset_config srst_only adapter_nsrst_assert_width 100 interface cmsis-dap transport select jtag set _CHIPNAME riscv jtag newtap $_CHIPNAME cpu -irlen 5 -expected-id 0x1e200a6d set _TARGETNAME $_CHIPNAME.cpu target create $_TARGETNAME riscv -chain-position $_TARGETNAME ■ 第一行設(shè)置TCK的時鐘為1000KHz。 ■ 第二行表示不支持通過TRST引腳復(fù)位,只支持TMS為高電平并持續(xù)5個TCK時鐘這種方式的復(fù)位。 ■ 第三行是復(fù)位持續(xù)的延時。 ■ 第四行指定調(diào)試器為CMSIS-DAP。 ■ 第五行指定調(diào)試接口為JTAG。 ■ 第六行指定調(diào)試的target類型為riscv。 ■ 第七行指定生成一個IR寄存器長度為5位、IDCODE為0x1e200a6d的JTAG TAP。 ■ 第八、九行指定生成一個riscv target。 openocd啟動時的主要流程如圖18所示。 圖18 openocd啟動流程 下面重點(diǎn)關(guān)注一下examine target這個流程。 這里的target是指riscv,對于riscv,首先會讀取dtmcontrol這個寄存器,因為openocd支持0.11和0.13版本的DTM,通過這個寄存器可以知道當(dāng)前調(diào)試的DTM是哪一個版本。這里選擇0.13版本來分析。通過讀取dtmcontrol,還可以知道idle、abits這些參數(shù)。接下來會將dmcontrol這個寄存器的dmactive域?qū)?后再寫1來復(fù)位DM模塊。接下來再讀取dmstatus,判斷version域是否為2。接下來還會讀取sbcs和abstractcs寄存器,最后就是初始化每一個hart的寄存器。 2>read register過程 讀寄存器時,先構(gòu)建command寄存器的內(nèi)容,首先將cmdtype的值設(shè)為0,aarsize的值設(shè)為2(寄存器的寬度為32位),transfer的值設(shè)為1,regno的值設(shè)為要讀的寄存器的number,其他值設(shè)為0,然后寫到command寄存器里。然后一直讀取abstractcs寄存器,直到abstractcs寄存器的busy位為0或者超時。然后再判斷abstractcs寄存器的cmderr的值是否為0,如果不為0則表示此次讀取寄存器失敗,如果為0則繼續(xù)讀取data0寄存器,這樣就可以得到想要讀的寄存器的值。 3>write register過程 寫寄存器時,先將需要寫的值寫到data0寄存器,然后構(gòu)建command寄存器的內(nèi)容,首先將cmdtype的值設(shè)為0,aarsize的值設(shè)為2(寄存器的寬度為32位),transfer的值設(shè)為1,write的值設(shè)為1,regno的值設(shè)為要寫的寄存器的number,其他值設(shè)為0,然后寫到command寄存器里。然后一直讀取abstractcs寄存器,直到abstractcs寄存器的busy位為0或者超時。然后再判斷abstractcs寄存器的cmderr的值是否為0,如果不為0則表示此次寫寄存器失敗,如果為0則表示寫寄存器成功。 4>read memory過程 如果progbufsize的值大于等于2,則會優(yōu)先使用通過執(zhí)行指令的方式來讀取內(nèi)存。這里不分析這種方式,而是分析使用system bus的方式。通過前面的分析可知,system bus有兩個版本V0和V1,這里以V1版本來說明。 先將sbcs寄存器的sbreadonaddr的值設(shè)為1,sbaccess的值設(shè)為2(32位),然后將要讀內(nèi)存的地址寫入sbaddress0寄存器。接著讀sbdata0寄存器,最后讀sbcs寄存器,如果其中的sbbusy、sberror和sbbusyerror都為0,則從sbdata0讀取到的內(nèi)容就是要讀的內(nèi)存的值。 5>write memory過程 和read memory類似,同樣以V1版本來說明。 先將要寫的內(nèi)存地址寫到sbaddress0寄存器,然后將要寫的數(shù)據(jù)寫到data0寄存器,最后讀sbcs寄存器,如果其中的sbbusy、sberror和sbbusyerror都為0,則此次寫內(nèi)存成功。 四、RISC-V JTAG的實(shí)現(xiàn) 通過在STM32F103C8T6上實(shí)現(xiàn)(模擬)RISC-V調(diào)試標(biāo)準(zhǔn),進(jìn)一步加深對RISC-V JTAG調(diào)試的理解。 使用STM32的四個GPIO作為JTAG信號的四根線,其中TCK所在的引腳設(shè)為外部中斷,即上升沿和下降沿觸發(fā)方式,實(shí)現(xiàn)了可以通過openocd以RISC-V的調(diào)試標(biāo)準(zhǔn)來訪問STM32的寄存器和內(nèi)存。程序流程如圖19所示。 圖19 JTAG實(shí)現(xiàn)的程序流程 五、參考資料 1、在STM32上模擬RISC-V JTAG的實(shí)現(xiàn):stm32_riscv_jtag_slave 2、一個從零開始寫的易懂的RISC-V處理器核:tinyriscv
    發(fā)表于 11-28 22:00

    邊緣計算:開啟未來智能網(wǎng)關(guān)的新篇章

    和預(yù)測性維護(hù),減少停機(jī)時間,提高生產(chǎn)效率。本文將為您深入淺出的的介紹MBox20工業(yè)物聯(lián)網(wǎng)關(guān)邊緣計算這一特性。
    的頭像 發(fā)表于 11-14 13:20 ?646次閱讀
    邊緣計算:開啟未來智能<b class='flag-5'>網(wǎng)關(guān)</b>的新篇章

    api驅(qū)動的服務(wù)是什么意思?

    API驅(qū)動的服務(wù)是指利用API技術(shù)來驅(qū)動和提供服務(wù)的模式。在這種模式下,服務(wù)提供商會公開一系列的A
    的頭像 發(fā)表于 11-14 10:06 ?812次閱讀

    華為CodeArts API助力企業(yè)數(shù)字化轉(zhuǎn)型

    工具顯得尤為重要,它能夠顯著幫助企業(yè)提升API的研發(fā)與管理效率,華為CodeArts API正是這樣一位助力企業(yè)數(shù)字化轉(zhuǎn)型的好幫手。
    的頭像 發(fā)表于 11-09 16:07 ?1028次閱讀