kernel散記——常見巨集
1,likely()和unlikey()
1.1,來自**?@kernel.h
# define likely(x) (__builtin_expect(!!(x), 1))
# define unlikely(x) (__builtin_expect(!!(x), 0))
1.2,作用?
**優化。詳細佔說是告訴編譯器,優化預取指。
1.3,細節?
細節也說不清,說個大概;
#define likely(x) __builtin_expect(!!(x), 1)也就是說明x==1是「經常發生的」或是「很可能發生的」。
使用likely ,執行if後面語句的可能性大些,編譯器將if{}是的內容編譯到前面, 使用unlikely ,執行else後面語句的可能性大些,編譯器將else{}裡的內容編譯到前面。這樣有利於cpu預取,提高預取指令的正確率,因而可提高效率。
1.4,舉個例子
ret = copy_to_user(to, fifo->data + off, l);
if (unlikely(ret))
ret = div_round_up(ret + len - l, esize);
else
也就是說ret=0的可能性很大,else的內容被編譯到if之前,優化處理器取指
另外,使用!!(x)而不使用x是把x值轉化為bool值。這個也是kernel常見的。
2,在input 子系統中,對bits有幾個常用的位操作巨集
@include/linux/input.h struct input_dev
unsigned long absbit[bits_to_longs
(abs_cnt)];
先看定義:
#define bits_to_longs(nr) div_round_up(nr, bits_per_byte * sizeof(long))
#define div_round_up(n,d) (((n) + (d) - 1) / (d))
在32位系統中,long占用4個位元組。
bits_tolongs就是探測一下共總有多少個32bit。
比較abs_cnt = 0x3f + 1 = 0x40
(也就是說0x40 = 64 = 32 *2
兩個long<32bit>型就可以裝下)
所以bits_to_longs(abs_cnt) = 2
@input.c
test_bit
(abs_mt_tracking_id, dev->absbit)
test_bit 簡單地說就是返回(dev->absbit)這個位址,對應的位(abs_mt_tracking)的值。
@input.c
__set_bit
(ev_syn, dev->evbit);
定義:/**
* __set_bit - set a bit in memory
* @nr: the bit to set
* @addr: the address to start counting from *
* unlike set_bit(), this function is non-atomic and may be reordered.
* if it's called on the same region of memory simultaneously, the effect
* may be that only one operation succeeds.
*/static inline void __set_bit(int nr, volatile unsigned long *addr)
簡單地說,就是把(dev-evbit)這個記憶體開始的位址的第ev_syn(0)位
綜上:理解了上述**,則其它位元位操作api就容易懂了。
__clear_bit: 將addr所指的位址處的值第nr位清0,方法一般 addr[nr/32] & 11111011111
__change_bit: 將addr所指的位址處的值第nr位取反,方法一般 addr[nr/32] ^ 00000100000
test_bit:即測試nr位是否被置位,置位返回1;
3,還是在input系統中,關於bitmap的操作。
@input.c input_match_device()函式
if (!
bitmap_subset
(id->evbit, dev->evbit, ev_max))
bitmap_subset src1的nbits指定位數中設定1的位元位是src2中nbits指定位數中設定1的位元的
子集,則返回1,否則返回0。精確到位。
關於bitmap,參考
ReactiveCocoa常見巨集
1 rac target,keypath,nil value 用於給某個物件的某個屬性繫結。只要文字框文字改變,就會修改label的文字 rac self.labelview,text textfield.rac textsignal reactivecocoa bindings rac self,...
iOS常見巨集定義
最基本的巨集定義語法有兩種,一種是簡單的巨集定義,另一種是帶引數的巨集定義。基本定義 define 帶引數的巨集定義 define 多引數擴充套件 define lock osspinlocklock lock va args osspinlockunlock lock 判斷是否包含了某個frame...
常見巨集定義符號
常見巨集定義 include define define msg str fprintf stderr,file s line d function s n s n file line func str ifdef ifndef else elif endif undef error line pr...