lock基本用法
首先通過(guò)一個(gè)例子來(lái)看一下:
seq0
seq1
頂層啟動(dòng)捍靠,掛載在同一個(gè)sqr上
- 如果沒(méi)有l(wèi)ock請(qǐng)求的話眼滤,seq0/seq1將會(huì)交錯(cuò)發(fā)送
- seq0獲得sqr的發(fā)送權(quán)以后,會(huì)一直發(fā)送seq0的數(shù)據(jù)。但是也會(huì)把lock之前的seq1發(fā)送完畢倍靡。直到unlock調(diào)用釋放sqr的使用權(quán)碉京。
grab的基本用法
將上面case的lock/unlock替換成grab/ungrab.
仿真結(jié)果
- 相比于lock厢汹,grab的優(yōu)先級(jí)更高,一旦獲得sqr的使用權(quán)谐宙,就會(huì)只發(fā)送對(duì)應(yīng)的seq
源碼是如何實(shí)現(xiàn)lock的烫葬?
lock的意思是將sqr用seq占用住。
- lock/grab都是調(diào)用了同一個(gè)函數(shù)凡蜻,只不過(guò)有一個(gè)參數(shù)不一樣而已搭综。
- lock和grab的區(qū)別就是將new_req存放的位置在arb_sequence_q[]的前面還是后面
- grant_queued_locks會(huì)多次調(diào)用
- lock_list里面存放的是占用sqr的seq,is_block()會(huì)根據(jù)lock_list查找划栓,如果被block住的話兑巾,line686就會(huì)放在blocked_seqs[]中,然后將其放在arb_sequence_q[]的前面忠荞。
- line698蒋歌,m_set_arbitration_completed().
這塊比較難理解,我就只能理解到這里了委煤。