<acronym id="s8ci2"><small id="s8ci2"></small></acronym>
<rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
<acronym id="s8ci2"></acronym>
<acronym id="s8ci2"><center id="s8ci2"></center></acronym>
0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

先楫HPM片上Cache使用指南經驗分享

先楫半導體HPMicro ? 來源:先楫半導體HPMicro ? 2024-01-22 16:07 ? 次閱讀

概 述

高速緩存(Cache)主要是為了解決CPU運算速度與內存(Memory)讀寫速度不匹配的矛盾而存在, 是CPU與存儲設備之間的臨時存貯器,容量小,但是交換速度比內存快。內置高速緩存通常對CPU的性能提升具有較大作用。

CPU要讀取一個數據時,首先從Cache中查找,如果找到就立即讀取并送給CPU處理;如果沒有找到,就用相對慢的速度從內存中讀取并送給CPU處理,同時把這個數據所在的數據塊調入Cache中,可以使得以后對整塊數據的讀取都從Cache中進行,不必再調用內存。

1f9f6af8-b8fd-11ee-8b88-92fbcf53809c.png

這樣的讀取機制使CPU讀取Cache的命中率非常高(大多數CPU可達90%左右),也就是說CPU下一次要讀取的數據90%都在Cache中,只有大約10%需要從內存讀取。HPM CPU訪問片上的Cache內數據是零等待的,這大大節省了CPU直接讀取內存數據的時間,使CPU讀取數據時基本無需等待??偟膩碚f,CPU讀取數據的順序是先Cache后存儲設備。

一、Cacheable Memory 相關概念

在訪問HPM片上ILM與DLM(Local Memory)時,芯片物理結構決定了CPU不會使用Cache去緩存Local Memory的數據。訪問其它存儲設備如flash、sram、sdram等,則Cache可以發揮其緩存機制來加快訪問速度。在Cache生效的地址空間內,用戶可以設置Memory的物理存儲屬性來設置是否對指定的地址空間使用Cache。

1fa781c0-b8fd-11ee-8b88-92fbcf53809c.png

PMA(Physical Memory Attributes)是指一段存儲地址空間的可讀寫、可執行、可緩存等屬性。讀、寫、執行等屬性容易理解,此處不贅述。下面介紹幾個其它屬性及相關的概念。(注意:HPM5300系列不支持PMA設置)

首先介紹一些Cache基本概念。

1. Cache Line/dirty/invalidate

Cache Line:一次最少緩存多少字節的數據是有要求的,通常以Cache Line為單位。HPM6000系列MCU Cache Line為64byte,HPM5300系列MCU Cache Line為32byte。在進行PMA設置時,要求起始地址按Cache Line字節數對齊,大小為Cache Line大小的整數倍。聲明數組時最好也遵循此規則。

Dirty:表示某Cache Line的數據是否與Memory保持一致,如果只將數據寫入Cache而沒有寫入Memory,會將該Cache Line標記為dirty。

Invalidate:將某地址范圍的Cache Line數據失效掉,當Cache Line狀態被Invalidate時,不管讀取是否命中,CPU都會到Memory拿數據。

對Cache的標準操作包括 write-back,invalidate,flush。

Write-back表示把cache內dirty的數據寫入Memory,invalidate表示忽略某地址范圍的Cache line,flush操作則先對某Cache Line 進行write-back操作,再進行invalidate操作。HPM SDK的hpm_l1c_drv.h文件提供了這3種操作的接口函數。

2. Bufferable

Bufferable是指MCU在寫入一片內存區時,是否可使用Write buffer進行加速。例如向sram內寫入64個字節:

1)不使用Bufferable:CPU等待64字節數據寫入完成后再去執行其它指令;

2)使用Bufferable:CPU將64字節數據寫入Write buffer,不等Write buffer內的數據寫入sram,CPU就去執行其它指令;寫入動作則自動進行直至完成。

3. Cacheable

Cacheable與 non-Cacheable,決定了CPU是否啟用緩存特性。如果啟用Cacheable特性,則HPM芯片上的內存區域可以分區指定PMA,可選的屬性選項如下(詳細信息可參考先楫官方文檔HPM6200 UM 2.8章節):

Write-Back

Write-Back(與Write-Through互斥)是指向存儲設備內寫數據命中時,CPU將數據寫入Cache,并不立馬向存儲設備寫入數據,如下圖所示:數據先寫入到Cache內(①),在Cache內標記該Cache Line為dirty,即表示該Cache Line內容與Memory內容不符;Cache內數據寫入Memory(②),則在Cache Line被替換或手動執行write-back操作或flush操作時(把dirty的數據寫入Memory)才執行。

未命中時,則寫入Memory。是否寫入Cache 由xxx-Allocate決定。

1fae35d8-b8fd-11ee-8b88-92fbcf53809c.png

Write-Through

Write-Through(與Write-Back互斥)是指向存儲設備內寫數據時,無論命中與否,CPU都將數據寫入Memory。

命中時,數據同時寫入Cache 與Memory;

未命中時,數據寫入Memory,是否寫入Cache 由xxx-Allocate決定。

xxx-Allocate

xxx-Allocate則用于控制讀/寫未命中Cache時,是否要在Cache內申請Cache Line用于緩存讀/寫的數據。例如:

Read-Allocate代表讀未命中時,CPU不只從Memory將數據讀入,還將數據在Cache放了一份,那么下次再讀的時候就不用去Memory讀了;

Write-Allocate代表寫未命中時,會在Cache內分配Cache Line儲存寫入的數據,那么下次讀的時候就可以從Cache讀了;具體是否寫入Memory取決于使用的是Write-Back還是Write-Through。

Non-Allocate和 Read-and-Write-Allocate就不再進行解釋了。

/* Init noncachable memory */

externuint32_t__noncacheable_start__[];

externuint32_t__noncacheable_end__[];

start_addr = (uint32_t) __noncacheable_start__;

end_addr = (uint32_t) __noncacheable_end__;

length = end_addr - start_addr;

if(length > 0) {

/* Ensure the address and the length are power of 2 aligned */

assert((length & (length - 1U)) == 0U);

assert((start_addr & (length - 1U)) == 0U);

pmp_entry[index].pmp_addr= PMP_NAPOT_ADDR(start_addr, length);

pmp_entry[index].pmp_cfg.val= PMP_CFG(READ_EN, WRITE_EN, EXECUTE_EN, ADDR_MATCH_NAPOT, REG_UNLOCK);

pmp_entry[index].pma_addr= PMA_NAPOT_ADDR(start_addr, length);

pmp_entry[index].pma_cfg.val= PMA_CFG(ADDR_MATCH_NAPOT, MEM_TYPE_MEM_NON_CACHE_BUF, AMO_EN);

index++;

}

pmp_config(&pmp_entry[0], index);

以上代碼設置了__noncacheable_start__至__noncacheable_end__地址范圍內的存儲區域PMA屬性為noncacheable,bufferable。

通過以上解釋,相信開發者可以看懂UM手冊內的相關描述了,以HPM6200系列為例,User Manual v2.0 2.8章節的內容對PMA有詳細描述。

二、HPM L1-Cache相關函數

HPM系列芯片L1-Cache分為 iCache與 dCache,指令緩存與數據緩存。開發者們經常遇到的問題是開啟dCache導致的CPU拿到的數據與Memory內數據不一致(Cache內的數據與Memory不一致時,讀取命中Cache會發生這樣的結果)。因此,此處主要介紹 dCache相關函數。

打開hpm_l1c_drv.h文件即可看到先楫提供的Cache相關的函數,部分如下:

*

* @brief D-cache disable

*/

voidl1c_dc_disable(void);

/*

* @brief D-cache enable

*/

voidl1c_dc_enable(void);

/*

* @brief D-cache invalidate by address

* @param[in] address Start address to be invalidated

* @param[in] size Size of memory to be invalidated

*/

voidl1c_dc_invalidate(uint32_taddress, uint32_tsize);

/*

* @brief D-cache writeback by address

* @param[in] address Start address to be writtenback

* @param[in] size Size of memory to be writtenback

*/

voidl1c_dc_writeback(uint32_taddress, uint32_tsize);

/*

* @brief D-cache invalidate and writeback by address

* @param[in] address Start address to be invalidated and writtenback

* @param[in] size Size of memory to be invalidted and writtenback

*/

voidl1c_dc_flush(uint32_taddress, uint32_tsize);

/*

* @brief D-cache fill and lock by address

* @param[in] address Start address to be filled and locked

* @param[in] size Size of memory to be filled and locked

*/

voidl1c_dc_fill_lock(uint32_taddress, uint32_tsize);

/*

* @brief Invalidate all icache and writeback all dcache

*/

voidl1c_fence_i(void);

/*

* @brief Invalidate all d-cache

*/

voidl1c_dc_invalidate_all(void);

/*

* @brief Writeback all d-cache

*/

voidl1c_dc_writeback_all(void);

/*

* @brief Flush all d-cache

*/

voidl1c_dc_flush_all(void);

l1c_dc_disable:關閉dCache。此函數特別有用,在debug時如果懷疑是Cache導致的問題,在main函數開始關閉dCache再次運行即可排查是否是Cache導致的問題。注意,如果是用戶程序運行過程中關閉dCache,需要在關閉前將執行l1c_dc_writeback_all,保證Cache數據寫入Memory。

l1c_dc_enable:開啟dCache。

l1c_dc_invalidate:將某地址范圍內的Cache Line失效掉。無論某地址在Cache內是否命中,CPU會從Memory內拿數據。

l1c_dc_writeback:將Cache內數據寫入某Memory地址。如果該地址在Cache內,則將該Cache Line寫入Memory,并清除dirty標志。

l1c_dc_flush:該函數等于 l1c_dc_writeback + l1c_dc_invalidate,把數據寫入到Memory并標記為invalidate,表示下次從Memory拿數據時不走Cache。

l1c_fence_i:將dCache內的數據全部writeback,將iCache內所有Cache Line invalidate。一般關閉Cache前會手動調用此函數。

l1c_dc_invalidate_all、l1c_dc_writeback_all、l1c_dc_flush_all:代表操作整個Cache中的Cache Line,具體含義不再贅述。

三、經驗分享

l1c_dc_writeback:一般非CPU的總線host,如DMA訪問某Memory地址前,通過l1c_dc_writeback將Cache內的數據寫到Memory,保證DMA拿到的數據與CPU看到的數據是一致的。

例如I2C_DMA例程:

/* setup i2c dma tx */

#ifPLACE_BUFF_AT_CACHEABLE

if(l1c_dc_is_enabled()) {

/* cache writeback before DMA sent data */

l1c_dc_writeback((uint32_t)tx_buff, TEST_TRANSFER_DATA_IN_BYTE);

}

#endif

stat= i2c_tx_trigger_dma(TEST_I2C_DMA,

TEST_I2C_DMA_CH,

TEST_I2C,

core_local_mem_to_sys_address(BOARD_RUNNING_CORE, (uint32_t)tx_buff),

TEST_TRANSFER_DATA_IN_BYTE);

if(stat!= status_success) {

printf("i2c tx trigger dma failed ");

while(1) {

}

}

在DMA將tx_buff數據搬到I2C的發送寄存器之前,進行了writeback。

l1c_dc_invalidate:一般CPU在讀取Memory數據時,如果該數據被其它總線host如DMA操作過(一般是DMA搬了某些數據過去),為了能讀到Memory中的數據而不是Cache中的數據,要在讀取之前對Cache Line進行invalidate處理(多數開發者遇到的都是這個問題)。

例如I2C_DMA例程:

/* setup i2c dma rx */

stat= i2c_rx_trigger_dma(TEST_I2C_DMA,

TEST_I2C_DMA_CH,

TEST_I2C,

core_local_mem_to_sys_address(BOARD_RUNNING_CORE, (uint32_t)rx_buff),

TEST_TRANSFER_DATA_IN_BYTE);

i2c_master_start_dma_read(TEST_I2C, TEST_I2C_SLAVE_ADDRESS, TEST_TRANSFER_DATA_IN_BYTE);

i2c_handle_dma_transfer_complete(TEST_I2C);

#ifPLACE_BUFF_AT_CACHEABLE

if(l1c_dc_is_enabled()) {

/* cache invalidate after DMA receive data */

l1c_dc_invalidate((uint32_t)rx_buff, TEST_TRANSFER_DATA_IN_BYTE);

}

#endif

check_transfer_data();

在進行check_transfer_data之前,先對數據進行了l1c_dc_invalidate處理。

l1c_fence_i:一般在CPU關閉Cache之前,或程序跳轉之前(一般二級boot選擇好要執行的固件進行跳轉),為了保證所有dirty的Cache Line寫入到Memory中,會進行l1c_dc_writeback_all,然后等 l1c_dc_writeback_all執行完畢后再跳轉。

例如tinyuf2例程:

voiduf2_board_app_jump(void)

{

fencei();

l1c_dc_disable();

l1c_ic_disable();

__asm("la a0, %0"::"i"(BOARD_FLASH_APP_START+ 4));

__asm("jr a0");

}

uf2_board_app_jump函數在跳轉前,執行了fencei,本質上就是l1c_fence_i。

另外,在執行writeback操作期間中斷不可用,對實時性要求高的場景應進行合理規劃l1c_dc_writeback_all的使用。

四、文末小結

Cache能大幅提高程序運行性能,但用不好Cache也會給開發者帶來各種“奇奇怪怪”的問題現象。在閱讀本文后,希望開發者對先楫的 L1-Cache有更深入的理解,使用先楫半導體高性能 MCU系列產品開發項目時,能更加得心應手。







審核編輯:劉清

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • sram
    +關注

    關注

    6

    文章

    748

    瀏覽量

    114010
  • 高速緩存
    +關注

    關注

    0

    文章

    29

    瀏覽量

    10999
  • Cache
    +關注

    關注

    0

    文章

    127

    瀏覽量

    28061
  • HPM
    HPM
    +關注

    關注

    1

    文章

    18

    瀏覽量

    7656

原文標題:經驗分享 | 先楫 HPM片上 Cache使用指南

文章出處:【微信號:HPMicro,微信公眾號:先楫半導體HPMicro】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    HPM5361EVK開發板試用體驗】認識和了解HPM5361EVK開發板

    ,拆開第一眼看到HPM5361EVK開發板,黑色的多層主板主控芯片和其它元件排列整齊,做工非常精細,元件布局合理,元件標識清晰,提供的io接口和調試接口非常豐富。
    發表于 12-24 22:39

    HPM5361EVK開發板試用體驗】HPM5361EVK開發板初體驗

    收到HPM5361EVK開發板,被HPM5361EVK開發板的做工和電路板設計驚艷到了,
    發表于 12-24 22:58

    半導體HPM6750EVKMINI評估板試用體驗】半導體HPM6750EVKMINI評估板開箱

    HPM6750EVKMINI評估板試用資格。RISCV是最近幾年在國內逐漸流行起來的精簡指令集,發源于美國伯克利大學。從去年2021年開始,市場逐漸涌現了非常多基于RISCV指令集的MCU。本次開箱的是
    發表于 06-26 16:24

    如何使用Segger Embedded Studio開發HPM6750?

    。今年3月,半導體與Segger公司達成合作,向所有使用其HPM6000系列RISC-V微控制器的客戶提供免費的Segger的跨平臺集成開發環境“Embedded Studio”,共同推動RISC-V
    發表于 07-26 14:48

    半導體HPM6700系列正式合入OpenHarmony社區主干

    近日,由上海半導體科技有限公司(以下簡稱:半導體)推出的基于HPM6700系列高性能MCU通用開發板代碼已完成并合入OpenAtom
    發表于 11-11 10:03

    如何使用CodeViser調試HPM6750開發板?

    HPM6750EVK2是基于半導體的HPM6750高性能SOC的開發板,HPM6750是基于RISC-V的雙核處理器,主頻高達816M。
    發表于 03-21 16:35

    半導體產品體驗官代碼倉庫集錦

    主要用途: 在 hpm6750搭載 CherryUSB 主從協議棧,從機部分演示 cdc + msc 數據收發,主機部分演示各類 class 的自動枚舉和數據通信 產品體驗官:
    發表于 05-25 16:13

    HPM6000系列微控制器的各類SRAM使用指南

    HPM6000系列微控制器SRAM使用指南
    發表于 06-01 06:19

    HPM6000系列微控制器閃存使用指南

    HPM6000系列MCUFlash使用指南
    發表于 06-01 06:20

    HPM6000系列微控制器閃存使用指南

    HPM6000系列MCUFlash使用指南
    發表于 06-02 08:54

    具有高性能MCU配套的HPM SDK使用指南

    HPM SDK使用指南
    發表于 06-05 07:51

    半導體HPM5361EVK開發板開發資料免費下載

    HPM5300EVK 提供了一系列 HPM5300 微控制器外設的接口,包括一個 ADC 輸入 SMA 接口和一個標準的電機控制及傳感器接口。H
    發表于 10-20 11:21

    HPM5361EVK開發板試用體驗】1上手HPM5361

    在本地存儲更多的指令和數據,而不必依賴外部存儲器,從而極大地提高了性能。 開發工具安裝:上海半導體提供了HPM系列SoC底層驅動軟件包,這個軟件包包含了SoC所集成的P模塊底層驅
    發表于 11-28 12:18

    HPM5361EVK開發板試用體驗】-- HPM5361初體驗

    HPM5361EVK開發板試用體驗】-- HPM5361初體驗
    發表于 12-11 10:27

    先楫 HPM片上 Cache使用指南

    賈工先楫資深FAE工程師12年產品研發經驗,具有變頻器、伺服等工業產品開發經驗,也負責過激光投影顯示系統開發、AI應用開發、PYQT、Linux驅動開發等工作。概述高速緩存(Cache)主要
    的頭像 發表于 01-26 10:00 ?284次閱讀
    先楫 <b class='flag-5'>HPM</b>片上 <b class='flag-5'>Cache</b><b class='flag-5'>使用指南</b>
    亚洲欧美日韩精品久久_久久精品AⅤ无码中文_日本中文字幕有码在线播放_亚洲视频高清不卡在线观看
    <acronym id="s8ci2"><small id="s8ci2"></small></acronym>
    <rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
    <acronym id="s8ci2"></acronym>
    <acronym id="s8ci2"><center id="s8ci2"></center></acronym>