ESP32-S3 采用雙核共享 ICache
(指令緩存) 和 DCache
(數據緩存) 結構,如下圖所示。以便當 CPU
的指令總線和數據總線同時發起請求時,也可以迅速響應:
Cache
的存儲空間與內部存儲空間可以復用。具體為 Internal SRAM0 和 Internal SRAM2 分別可被用于 ICache
與 DCache
。其中:
Internal SRAM0 的容量為 32 KB,可讀可寫。CPU 只可以通過指令總線訪問這部分存儲器。通過配置,這部分存儲器中的 16 KB、或全部 32 KB 可以被 ICache
占用,用來緩存外部存儲器的指令或只讀數據。被 ICache
占用的部分不可以被 CPU 訪問,未被 ICache
占用的部分仍然可以被 CPU
訪問。
Internal SRAM2 的容量為 64 KB,可讀可寫。 CPU 只可以通過數據總線訪問這部分存儲器。通過配置,這部分存儲器中的 32 KB、或全部 64 KB 可以被 DCache
占用,用來緩存外部存儲器的數據。被 DCache
占用的部分不可以被 CPU 訪問,未被 DCache
占用的部分仍然可以被 CPU 訪問。
當兩個核的指令總線同時訪問 ICache
時,由仲裁器決定誰先獲得訪問 ICache
的權限;當兩個核的數據總線同
時訪問 DCache
時,由仲裁器決定誰先獲得訪問 DCache
的權限。當 Cache
缺失時,Cache
控制器會向外部存儲器發起請求,當 ICache
和 DCache
同時發起外部存儲器請求時,由仲裁器決定誰先獲得外部存儲器的使用權。ICache
的緩存大小可配置為 16 KB 或 32 KB,塊大小可以配置為 16 B 或 32 B,當 ICache
緩存大小配置為 32 KB 時禁用 16 B 塊大小模式。DCache
的緩存大小可配置為 32 KB 或 64 KB,塊大小可以配置為 16 B、32 B 或 64 B,當 DCache 緩存大小配置為 64 KB 時禁用 16 B 塊大小模式。
ESP32-S3 Cache
共有如下幾種操作:
回寫(Write-Back)
Write-Back 操作用于將 Cache
中的 “臟塊” 的 “臟” 標記(Dirty bit)抹除,并將數據同步到外部存儲器。Write-Back 操作結束后,外部存儲器和 Cache
中存放的都是新數據。如果 CPU 接著去訪問該數據,那么可以直接從 Cache
中訪問到。只有 DCache
具有此功能。
所謂 “臟塊” 是指,如果 Cache
中的數據比外部存儲器中的數據要新,則 Cache
中的新數據被稱為 “臟塊”,Cache
通過 “臟” 標記來追蹤這些 “臟塊” 數據。如果抹除掉某個新數據的 “臟” 標記,Cache
將認為這個數據不是新的。
清除(Clean)
Clean 操作用于將 Cache
中的 “臟塊” 的 “臟” 標記(Dirty bit)抹除,但不將數據同步到外部存儲器。Clean
操作結束后,外部存儲器中仍是舊數據,Cache
中存放的是新數據,但 Cache
以為不是新的。如果 CPU 接著去訪問該數據,那么直接可以從 Cache
中訪問到。只有 DCache
具有此功能。
失效(Invalidate)
Invalidate 操作用于刪除 Cache
中的有效數據,即使該數據是 “臟塊”,也不會將臟塊同步到外部存儲器。對于非臟塊數據, Invalidate 操作結束后,該數據僅存在于外部存儲器中。如果 CPU 接著去訪問該數據,那么需要訪問外部存儲器。對于臟塊數據, invalidate 結束后,外部存儲器中存在的是舊數據,新數據將徹底丟失。Invalidate 分為自動失效 (Auto-Invalidate) 和手動失效 (Manual-Invalidate)。Manual-Invalidate 僅對 Cache
中落入指定區域的地址對應的數據做失效處理,而 Auto-Invalidate 會對 Cache
中的所有數據做失效處理。ICache
和 DCache
均具有此功能。
預取 (Preload)
Preload 功能用于將指令和數據提前加載到 Cache
中。預取操作的最小單位為 1 個塊。預取分為手動預取 (Manual-Preload) 和自動預取 (Auto-Preload),Manual-Preload 是指硬件按軟件指定的虛地址預取一段連續的數據;Auto-Preload 是指硬件根據當前命中/缺失(取決于配置)的地址,自動地預取一段連續的數據。ICache
和 DCache
均具有此功能。
鎖定/解鎖 (Lock/Unlock)
Lock 操作用于保護 Cache
中的數據不被替換掉。鎖定分為預鎖定和手動鎖定。預鎖定開啟時,Cache
在填充缺失數據到 Cache
時,如果該數據落在指定區域,則將該數據鎖定,未落入指定區域的數據不會被鎖定。手動鎖定開啟時,Cache
檢查 Cache
中的數據,并將落在指定區域的數據鎖定,未落入指定區域的數據不會被鎖定。當缺失發生時,Cache
會優先替換掉未被鎖定的那一路的數據,因此鎖定區域的數據會一直保存在 Cache
中。但當所有路都被鎖定時, Cache
將進行正常替換,就像所有路都沒有被鎖定一樣。解鎖是鎖定的逆操作,但解鎖只有手動解鎖。ICache
和 DCache
均具有此功能。
需要注意的是,Cache
的 Clean、Write-Back 和 Manual-Invalidate 操作均只對未被鎖定的數據起作用。如果想對被鎖定的數據執行這些操作,請先解鎖這些數據。