1. 程式人生 > >限制核心printk的列印頻率

限制核心printk的列印頻率

在很多時候我們需要限制printk的列印頻率,避免除錯資訊刷屏。有如下方法可以使用。

1.使用printk_rateelimit()

用法舉例:

if(printk_rateelimit())
	printk("xxxx");

預設限制頻率是5秒10次列印,可以通過/proc/sys/kernel/printk_ratelimit(預設5)和/proc/sys/kernel/printk_ratelimit_burst(預設10)來調整頻率限制。當列印被抑制時,會列印一條function name: 125 callbacks suppressed提示有多少條列印被忽略了。
注意點:
  這個頻率限制是所有呼叫者共用的頻率,如果你單單想限制你自己新增的幾條列印的頻率,那麼不應該用這個。應該用下面這個。

2.使用printk_timed_ratelimit()

用法舉例:

static unsigned long caller_jiffies = 0;	/* 定義靜態變數 */

/* 100ms內列印一次 */
if(printk_timed_ratelimit(caller_jiffies, 100))
{
	printk("xxxx");
}

原型為:bool printk_timed_ratelimit(unsigned long *caller_jiffies, unsigned int interval_msecs)
caller_jiffies為呼叫者的jiffies,這個變數需要為靜態的。第二個為頻率,間隔毫秒數。
這個用起來稍微麻煩一點,但是可以精確控制自己所寫函式的列印頻率。

3.完全自己寫頻率控制

根據上面的原理,我們可以自己寫個。如下:

static unsigned long prev_jiffy = jiffies;

if(time_after(jiffies, prev_jiffy + 2*HZ))
{
	prev_jiffy = jiffies;
	printk("xxxx");
}

注意:
  方法2和方法3我們都自己使用了靜態變數,這是不安全的程式碼。我們臨時除錯的程式碼沒必要搞那麼麻煩,如果正式程式碼,還是需要用原子操作改造一下。