真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

嵌入式Linux內(nèi)核tasklet機(jī)制(附實(shí)測(cè)代碼)-創(chuàng)新互聯(lián)

Linux 中斷編程分為中斷頂半部,中斷底半部

中斷頂半部: 做緊急,耗時(shí)短的事情,同時(shí)還啟動(dòng)中斷底半部。
中斷底半部: 做耗時(shí)的事件,這個(gè)事件在執(zhí)行過(guò)程可以被中斷。
中斷底半部實(shí)現(xiàn)方法: tasklet,工作隊(duì)列,軟中斷等機(jī)制實(shí)現(xiàn)。實(shí)際上是把耗時(shí)事件推后執(zhí)行,不在中斷程序執(zhí)行。

創(chuàng)新互聯(lián)主要從事成都做網(wǎng)站、網(wǎng)站建設(shè)、外貿(mào)營(yíng)銷網(wǎng)站建設(shè)、網(wǎng)頁(yè)設(shè)計(jì)、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)福州,10年網(wǎng)站建設(shè)經(jīng)驗(yàn),價(jià)格優(yōu)惠、服務(wù)專業(yè),歡迎來(lái)電咨詢建站服務(wù):18980820575

什么是tasklet?

Tasklet 一詞的原意是“小片任務(wù)”的意思,這里是指一小段可執(zhí)行的代碼,且通常以函數(shù)的形式出現(xiàn)。這個(gè) tasklet 綁定的函數(shù)在一個(gè)時(shí)刻只能在一個(gè) CPU 上運(yùn)行 ,tasklet(小任務(wù))機(jī)制是中斷處理下半部分最常用的一種方法,其使用也是非常簡(jiǎn)單的。一個(gè)使用 tasklet 的中斷程序首先會(huì)通過(guò)執(zhí)行中斷處理程序來(lái)快速完成上半部分的工作,接著通過(guò)調(diào)用 tasklet 使得下半部分的工作得以完成??梢钥吹?,下半部分被上半部分所調(diào)用,至于下半部分何時(shí)執(zhí)行則屬于內(nèi)核的工作。

tasklet 機(jī)制核心數(shù)據(jù)結(jié)構(gòu)

Interrupt.h linux-3.5\include\Linux
struct tasklet_struct
{
      struct tasklet_struct *next; // tasklet_struct 結(jié)構(gòu)鏈表
      unsigned long state; //當(dāng)前這個(gè) tasklet 是否已經(jīng)被調(diào)度
      atomic_t count; 
      void (*func)(unsigned long); //指向 tasklet 綁定的函數(shù)的指針
      unsigned long data; //傳遞給tasklet 綁定的函數(shù)的參數(shù)
};

tasklet 相關(guān) API

  • 初始化相關(guān)

    • 1) 靜態(tài)初始化 DECLARE_TASKLET(name, func, data)
      作用:定義一個(gè)名字為 name 的 tasklet_struct 結(jié)構(gòu)變量,并且初始化這個(gè)結(jié)構(gòu)。 所定義的這個(gè) tasklet 是可以被調(diào)度,默認(rèn)是處于被使能狀態(tài)。

    • 2 ) 靜態(tài)初始化 DECLARE_TASKLET_DISABLED(name, func, data)
      作用:定義一個(gè)名字為 name 的 tasklet_struct 結(jié)構(gòu)變量,并且初始化這個(gè)結(jié)構(gòu)。所定義的這個(gè) tasklet 是不能被調(diào)度,默認(rèn)是處于被禁能狀態(tài)。 要調(diào)度這個(gè) tasklet 需要先使能。

    • 3 )動(dòng)態(tài)初始化
      void tasklet_init(struct tasklet_struct *t,void (*func)(unsigned long), unsigned long data)
      作用:初始化一個(gè) tasklet_struct 結(jié)構(gòu)變量,初始化的結(jié)構(gòu)默認(rèn)是處于激活狀態(tài),可以被調(diào)度。

tasklet_disable使能函數(shù)

1. void tasklet_disable(struct tasklet_struct *t)
作用:函數(shù)激活給定的 tasklet被 tasklet_schedule 調(diào)度
2. void tasklet_enable (struct tasklet_struct *t)
作用:函數(shù)禁止給定的 tasklet被 tasklet_schedule 調(diào)度

tasklet 調(diào)度函數(shù)

void tasklet_schedule (struct tasklet_struct *t)
作用:調(diào)用 tasklet_schedule 函數(shù)去通知內(nèi)核幫我們調(diào)度所綁定的函數(shù)
void tasklet_kill(struct tasklet_struct *t);
作用:取消調(diào)度函數(shù)

編程步驟

Step1 定義并靜態(tài)初始化tasklet_struct 結(jié)構(gòu)變量

Step2 編寫(xiě)tasklet服務(wù)函數(shù)

Step3 在適當(dāng)?shù)牡氐胤竭M(jìn)行調(diào)度

Step4 在適當(dāng)?shù)牡氐胤饺∠{(diào)度

開(kāi)發(fā)平臺(tái)

芯靈思SinlinxA33開(kāi)發(fā)板

淘寶店鋪: [https://sinlinx.taobao.com/]()

嵌入式Linux內(nèi)核tasklet機(jī)制(附實(shí)測(cè)代碼)

嵌入式linux 開(kāi)發(fā)板交流 QQ:641395230

驅(qū)動(dòng)代碼:

#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");

Makefile 代碼

KERN_DIR = /work/lichee/linux-3.4
all:
    make -C $(KERN_DIR) M=`pwd` modules 
    arm-none-linux-gnueabi-gcc  btntest.c -o btntest
clean:
    make -C $(KERN_DIR) M=`pwd` modules clean
    rm -rf modules.order
obj-m        += tasklet_drv.o

實(shí)驗(yàn)現(xiàn)象

循環(huán)調(diào)用tasklet_fun函數(shù)

嵌入式Linux內(nèi)核tasklet機(jī)制(附實(shí)測(cè)代碼)

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。


新聞標(biāo)題:嵌入式Linux內(nèi)核tasklet機(jī)制(附實(shí)測(cè)代碼)-創(chuàng)新互聯(lián)
分享網(wǎng)址:http://weahome.cn/article/cocojs.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部