几个常用的宏:likely和unlikely __raw_writel
在源碼中,宏likely和unlikely 是這么定義的(位于include/linux/compiler.h):
#define likely(x)?__builtin_expect(!!(x), 1)
#define unlikely(x)?__builtin_expect(!!(x), 0)
要理解宏likely和unlikely ,很明顯必須理解__builtin_expect。__builtin_expect是GCC(version>=2.9)引進的宏,其作用就是幫助編譯器判斷條件跳轉(zhuǎn)的預(yù)期值,避免跳轉(zhuǎn)造成時間浪費。拿下面的代碼來說:
if (likely(acat == 1))???? //表示大多數(shù)情況下if里面是真,程序大多數(shù)直接執(zhí)行if里面的程序
而
if (unlikely (thread_memory_magazine1_is_empty (tmem, ix)))//表示大多數(shù)情況if里面為假,程序大多數(shù)直接執(zhí)行else里面的程序
兩段代碼編譯生成的匯編語句所使用到的跳轉(zhuǎn)指令不一樣,仔細分析下會發(fā)現(xiàn)__builtin_expect實際上是為了滿足在大多數(shù)情況不執(zhí)行跳轉(zhuǎn)指令,所以__builtin_expect僅僅是告訴編譯器優(yōu)化,并沒有改變其對真值的判斷。
有關(guān)文章:http://kernelnewbies.org/FAQ/LikelyUnlikely
???????????? ?http://hi.baidu.com/lammy/blog/item/bc5e3d4e869073c3d1c86a89.html
??????????????http://www.cublog.cn/u/31100/showart_240658.html
__raw_writel到底干了些什么?
在linux/arch/arm/mach-at91/gpio.c?中 at91_set_gpio_output函數(shù)看到這個宏
int?__init_or_module?at91_set_gpio_output(unsigned?pin,?int?value)
{
void?__iomem *pio?=?pin_to_controller(pin);
unsigned mask?=?pin_to_mask(pin);
?
if?(!pio)
return?-EINVAL;
?
__raw_writel(mask,?pio?+?PIO_IDR);
__raw_writel(mask,?pio?+?PIO_PUDR);
__raw_writel(mask,?pio?+?(value???PIO_SODR?:?PIO_CODR));
__raw_writel(mask,?pio?+?PIO_OER);
__raw_writel(mask,?pio?+?PIO_PER);
return?0;
}
定義是:
#define __raw_writel(v,a) (__chk_io_ptr(a), *(volatile unsigned int __force *)(a) = (v))
# define __chk_io_ptr(x) (void)0
這樣看就是賦值,
__chk_io_ptr()是編譯器為了更細致地檢查參數(shù)的屬性,用于調(diào)試,正常編譯時沒有作用。
volatile為了防止Compiler優(yōu)化,說明它是一個隨時被改變的量,每次使用它的時候,不應(yīng)該被假設(shè),而要從相應(yīng)的寄存器中讀取。
?
轉(zhuǎn)載于:https://www.cnblogs.com/yuzaipiaofei/archive/2011/07/07/4124689.html
總結(jié)
以上是生活随笔為你收集整理的几个常用的宏:likely和unlikely __raw_writel的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。