Bus,Exclusive access,memory attribute


指令LDREX,STREX是在armv6中新加的指令,配合AMBA3--AXI中的lock[1:0]信號。

在Atomic Access一節中是這么規定的:ARLOCK[1:0]/AWLOCK[1:0]信號為2'b00-------Normal access

                                                    ARLOCK[1:0]/AWLOCK[1:0]信號為2'b01-------Exclusive access

                                                    ARLOCK[1:0]/AWLOCK[1:0]信號為2'b10-------Locked access   

 

exclusive的操作相對於lock操作的優點是:只根據返回的resp來確定原子操作是否正確,不會影響interconnect的性能。

 

對於Exclusive access,從slave的角度來看,首先slave必須支持Exclusive的訪問,具體slave必須有一些monitors 來記錄收到exclusive訪問時的,

                               ARID/AWID,ARADDR/AWADDR,ARSIZE/AWSIZE,ARLEN/AWLEN。總之必須保證訪問的master和地址完全的一致。

                                其中的ARID/AWID由arm core來決定,如果是core0,ARID/AWID一般就是0。

從master的角度來看,master要發出一個exclusive的訪問必須,先發出exclusive read后再發出exclusive write來完成一次exclusive的訪問。

                               1)對於exclusive訪問,正確的response是EXOKAY。而由於有的slave不支持exclusive的訪問后直接忽視掉lock信號,此時就會

                                  返回OKAY信號。

                               2)在exclusive read之后,slave仍可在該地址接收normal write,此時如果exclusive指定的地址中的數據已經改變,則slave不

                                 會再下次exclusive write的時候,返回EXOKAY,取而代之會返回OKAY,表示出錯了,此時write的值也不會寫入。

                               3)在一次exclusive read會后,可以不等exclusive write,直接再發出exclusive read,這樣slave monitor的地址就會改變,

                                 相當於發起一個新的exclusive操作。

exclusive的操作,不能是cache的屬性。

在slave端,monitor的最小的地址是length*size,同樣也可以monitor一個比這個乘機更大的地址空間,但是這樣可能會使本來正確的

exclusive access卻報出了錯誤。

 

對於lock操作,主要需要interconnect保證只有特定ID的master可以訪問一個特定的slave地址,直到同一ID的master發出一個unlock的操作接收到。

                    一個master可以開始一個read/write的lock sequence,但這時必須保證沒有其他的outstanding的transaction等待完成。

                    當一個master開始一個lock的transaction時,必須保證沒有其他的locked的transaction還沒有完成。  

 

                    master必須保證一個locked transaction sequences中,最多只有兩個transaction,同時在lock操作的過程中,

                    所有的transaction都必須是同樣的ID,一個lock的sequence,以最后一個unlock的transaction結束。ARLOCK/AWLOCK信號無效。

              

LDREX和STREX指令可以用在多個處理器和共享內存系統之間,實現進程間的通信。

LDREX表示從儲存器加載數據,相當於讀操作,

                    如果該物理地址有共享TLB屬性,則LDREX會將該物理地址標記為由當前處理器獨占訪問,並且清除該處理器對其他任何物理地址的任何獨

                                                              占訪問標志。然后將該物理地址標記為一個未完成的exclusive訪問。

                    如果該物理地址沒有共享TLB屬性,直接將該物理地址標記為一個未完成的exclusive的訪問。        

                          void ldrex32(WORD addr, WORD *data)

                             {   asm("ldrex r2, [r0]");     asm("str  r2, [r1]");   }

STREX表示向存儲器儲存數據,相當於寫操作,

                    如果該物理地址沒有共享TLB屬性,如果該執行處理器中有一個已標記未訪問完成的exclusive操作時,STREX會進行儲存,result返回0。

                                                                 如果該執行處理器無一個已標記未訪問完成的exclusive操作時,STREX不會進行儲存,result返回1。

                    如果該物理地址有共享TLB屬性,如果該執行處理器中有一個已標記獨占訪問的未訪問完成的exclusive操作時,STREX會進行儲存,

                                                                 result返回0。

                                                              如果該執行處理器中無一個已標記獨占訪問的未訪問完成的exclusive操作時,STREX不會進行儲存,

                                                                 result返回1。

                          void strex32(WORD addr, HALF data, WORD *result)

                             {   asm("strex r3, r1, [r0]");     asm("str  r3, [r2]");   }

                                      

AXI中的memory attribute屬性,由AxCache信號來指定,0-3bit分別代表Bufferable,Cacheable,Read Allocate,Write Allocate。

    AxCache[0],Bufferable,只針對寫操作,表示interconnect,或者其他類似component,可以先返回resp,之后再

        寫向final distination。

    AxCache[1],1) 與RA,WA配合,控制cache;

           2) 表示transaction的屬性,可以在中間被更改,對於write操作,很多的write操作可以進行merge。

                                對於read操作,表示該地址可以被prefetch。       

    AxCache[2],Read之后更新到cache line中。

    AxCache[3],Write的時候,cache line中也保存最新的值。            


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM