lock基本用法
首先通过一个例子来看一下:
seq0 seq1 顶层启动,挂载在同一个sqr上
- 如果没有lock请求的话,seq0/seq1将会交错发送
- seq0获得sqr的发送权以后,会一直发送seq0的数据。但是也会把lock之前的seq1发送完毕。直到unlock调用释放sqr的使用权。
grab的基本用法
将上面case的lock/unlock替换成grab/ungrab.
仿真结果- 相比于lock,grab的优先级更高,一旦获得sqr的使用权,就会只发送对应的seq
源码是如何实现lock的?
lock的意思是将sqr用seq占用住。
- lock/grab都是调用了同一个函数,只不过有一个参数不一样而已。
- lock和grab的区别就是将new_req存放的位置在arb_sequence_q[]的前面还是后面
- grant_queued_locks会多次调用
- lock_list里面存放的是占用sqr的seq,is_block()会根据lock_list查找,如果被block住的话,line686就会放在blocked_seqs[]中,然后将其放在arb_sequence_q[]的前面。
- line698,m_set_arbitration_completed().
这块比较难理解,我就只能理解到这里了。
网友评论