日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

几个常用的宏:likely和unlikely __raw_writel

發(fā)布時間:2025/3/19 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 几个常用的宏:likely和unlikely __raw_writel 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.


在源碼中,宏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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。