十年網(wǎng)站開(kāi)發(fā)經(jīng)驗(yàn) + 多家企業(yè)客戶 + 靠譜的建站團(tuán)隊(duì)
量身定制 + 運(yùn)營(yíng)維護(hù)+專(zhuān)業(yè)推廣+無(wú)憂售后,網(wǎng)站問(wèn)題一站解決
開(kāi)發(fā)平臺(tái) 芯靈思Sinlinx A64
內(nèi)存: 1GB 存儲(chǔ): 4GB
開(kāi)發(fā)板詳細(xì)參數(shù) https://m.tb.cn/h.3wMaSKm
開(kāi)發(fā)板交流群 641395230創(chuàng)新互聯(lián)建站是一家專(zhuān)注于成都網(wǎng)站制作、網(wǎng)站建設(shè)、外貿(mào)網(wǎng)站建設(shè)與策劃設(shè)計(jì),宜良網(wǎng)站建設(shè)哪家好?創(chuàng)新互聯(lián)建站做網(wǎng)站,專(zhuān)注于網(wǎng)站建設(shè)十多年,網(wǎng)設(shè)計(jì)領(lǐng)域的專(zhuān)業(yè)建站公司;建站業(yè)務(wù)涵蓋:宜良等地區(qū)。宜良做網(wǎng)站價(jià)格咨詢:028-86922220
Linux 內(nèi)核定時(shí)器是內(nèi)核用來(lái)控制在未來(lái)某個(gè)時(shí)間點(diǎn)(基于jiffies)調(diào)度執(zhí)行某個(gè)函數(shù)的一種機(jī)制,其實(shí)現(xiàn)位于
內(nèi)核定時(shí)器的數(shù)據(jù)結(jié)構(gòu)
struct timer_list {
struct list_head entry; //雙向鏈表元素list:用來(lái)將多個(gè)定時(shí)器連接成一條雙向循環(huán)隊(duì)列。
unsigned long expires; //expires 字段表示期望定時(shí)器執(zhí)行的 jiffies 值,到達(dá)該 jiffies 值時(shí),將調(diào)用 function 函數(shù),并傳遞 data 作為參數(shù)。
void (*function)(unsigned long); //指向一個(gè)可執(zhí)行函數(shù)。當(dāng)定時(shí)器到期時(shí),內(nèi)核就執(zhí)行function所指定的函數(shù)。而data域則被內(nèi)核用作function函數(shù)的調(diào)用參數(shù)。
unsigned long data;
struct tvec_base *base;
/* ... */
};時(shí)間比較操作
在定時(shí)器應(yīng)用中經(jīng)常需要比較兩個(gè)時(shí)間值,以確定timer是否超時(shí),所以Linux內(nèi)核在timer.h頭文件中定義了4個(gè)時(shí)間關(guān)系比較操作宏。這里我們說(shuō)時(shí)刻a在時(shí)刻b之后,就意味著時(shí)間值a≥b。
Linux強(qiáng)烈推薦用戶使用它所定義的下列4個(gè)時(shí)間比較操作宏(include/linux/timer.h):
#define time_after(a,b) ((long)(b) - (long)(a) < 0)
#define time_before(a,b) time_after(b,a)
#define time_after_eq(a,b) ((long)(a) - (long)(b) >= 0)
#define time_before_eq(a,b) time_after_eq(b,a)Linux 內(nèi)核時(shí)間相關(guān)轉(zhuǎn)換函數(shù)
unsigned long usecs_to_jiffies(const unsigned int u)unsigned long msecs_to_jiffies(const unsigned int m)Linux 內(nèi)核定時(shí)器操作相關(guān) API
靜態(tài)定義結(jié)構(gòu)體變量并且初始化(宏)DEFINE_TIMER(_name, _function, _expires, _data)
功能: 定義一個(gè)名字為_(kāi)name 的 struct timer_list 結(jié)構(gòu)的變量, 并且初始化它的 function, expires, data 成員
init_timer(timer)3.設(shè)置定時(shí)器(宏)setup_timer(timer, fn, data)
功能: 設(shè)置定時(shí)器中的 function, data 和一些基礎(chǔ)成員, expires 并沒(méi)有初始化, 需要用戶自己進(jìn)行初始化
注冊(cè)定時(shí)器到內(nèi)核void add_timer(struct timer_list *timer)
功能: 向內(nèi)核注冊(cè)一個(gè)定時(shí)器, 注冊(cè)后會(huì)馬上開(kāi)始計(jì)時(shí)。
5.從內(nèi)核注銷(xiāo)定時(shí)器int del_timer(struct timer_list * timer)
功能: 從內(nèi)核定時(shí)鏈表上刪除指定的定時(shí)器, 刪除后就不會(huì)再執(zhí)行綁定的函數(shù)
int mod_timer(struct timer_list *timer, unsigned long expire0.s)內(nèi)核定時(shí)器編程步驟
Step1 定義timer_list 結(jié)構(gòu)變量
Step2 定義超時(shí)函數(shù)
Step3 對(duì)timer_list結(jié)構(gòu)變量進(jìn)行初始化
Step4 注冊(cè)定時(shí)器,啟動(dòng)定時(shí)
Step5 注銷(xiāo)定時(shí)器
#include
#include
#include
void tasklet_fun(unsigned long data);
//Step1 定義并靜態(tài)初始化tasklet_struct 結(jié)構(gòu)變量
DECLARE_TASKLET(mytasklet, tasklet_fun, 651);
//Step2 tasklet服務(wù)函數(shù)
void tasklet_fun(unsigned long data)
{
static unsigned long count = 0;
printk("count:%lu,%s is call! data:%lu\r\n",count++,__FUNCTION__,data);
tasklet_schedule(&mytasklet); //在工作函數(shù)中重新調(diào)度自己,這樣會(huì)循環(huán)調(diào)用tasklet_fun
}
static int __init mytasklet_init(void)
{
//Step3 開(kāi)始調(diào)度 mytasklet
tasklet_schedule(&mytasklet);
printk("%s is call!\r\n",__FUNCTION__);
return 0;
}
static void __exit mytasklet_exit(void) //Module exit function specified by module_exit()
{
//Step4 刪除 tasklet
tasklet_kill(&mytasklet);
}
module_init(mytasklet_init);
module_exit(mytasklet_exit);
MODULE_LICENSE("GPL"); 實(shí)驗(yàn)現(xiàn)象