Linux核心開發之中斷與時鐘(二)

來源:互聯網
上載者:User

“小濤哥,快醒醒,快醒醒..”小王使勁推著睡夢中的我,“你不是說今天要講昨天有關的典型模板執行個體嗎…”

“啊?小姐啊,現在才早上8點,還讓人睡覺不,別吵”我一頭鑽進被子裡說。

“不管,誰讓你昨天不說完,還賣個小關子,害我昨天晚上都沒睡好,想了一晚上…”

我揉揉蒙蒙的眼說:“行,權當看在你渴求的心情上,但只此一次,下不為例,我還想好好睡懶覺呢..”

昨天我們講了有關中斷方面的東西,鑒於小王你不太懂,我今天就專門拿出一章來說說前邊中斷的使用典型模版,你照抄也方便不是:

1)在中斷分類中,我們說到了有關向量中斷和非向量中斷,向量中斷就是入口地址不同,進不同的地址做不同的事。那非向量中斷則是進同一地址,至於區分就放在了進去後用條件判斷,請看下邊的模板:

irq_handler(){    ...    int int_src = read_int_status();   //讀硬體的中斷相關寄存器     switch(int_src)  //判斷中斷源    {       case DEV_A:           dev_a_handler();           break;      case DEV_B:           dev_b_handler();           break;      ....      default:           break;   }}

2)在底半部機制中,我們講了tasklet,工作隊列和非強制中斷先來看tasklet

tasklet使用模版:

void xxx_do_tasklet(unsigned long);DECLARE_TASKLET(XXX_tasklet, xxx_do_tasklet, 0);void xxx_do_tasklet(unsigned long)   //中斷處理底半部{    .....}irqreturn_t xxx_interrupt(int irq, void *dev_id, struct pt_regs *regs)  //中斷處理頂半部{  ...  tasklet_schedule(&xxx_tasklet);}int __init xxx_init(void)   //裝置驅動模組載入函數{  ..  result= request_irq(xxx_irq, xxx_interrupt, SA_INTERRUPT, "XXX",NULL);  //申請中斷  ...}void __exit xxx_exit(void)   //裝置驅動卸載模組{  ..  free_irq(xxx_irq, xxx_interrupt);   //釋放中斷  ..}

工作隊列模版:

struct work_struct xxx_wq;void xxx_do_work(unsigned long);void xxx_do_work(unsigned long)   //中斷處理底半部{    .....}irqreturn_t xxx_interrupt(int irq, void *dev_id, struct pt_regs *regs)  //中斷處理頂半部{  ...  schedule_work(&xxx_wq);}int xxx_init(void)   //裝置驅動模組載入函數{  ..  result= request_irq(xxx_irq, xxx_interrupt, SA_INTERRUPT, "XXX",NULL);  //申請中斷  ...  INIT_WORK(&xxx_wq, (void (*)(void *))xxx_do_work, NULL);    ...}void __exit xxx_exit(void)   //裝置驅動卸載模組{  ..  free_irq(xxx_irq, xxx_interrupt);   //釋放中斷  ..}

3)在上節最後我還給你講了有關中斷共用的東西吧,小王,也把模版給你:

irqreturn_t xxx_interrupt(int irq, void *dev_id, struct pt_regs *regs)  //中斷處理頂半部{  ...  int status = read_int_status();  //擷取終端源  if(!is_myint(dev_id, status))  //判斷是否是本裝置的中斷  {     return  IRQ_NONE://立即返回  }  ..  return IRQ_HANDLED;}int __init xxx_init(void)   //裝置驅動模組載入函數{  ..  result= request_irq(xxx_irq, xxx_interrupt, SA_SHIRQ, "XXX",xxx_dev);  //申請共用中斷  ...}void __exit xxx_exit(void)   //裝置驅動卸載模組{  ..  free_irq(xxx_irq, xxx_interrupt);   //釋放中斷  ..}

共用中斷中,我們仔細看一下其實也沒什麼,不是。就是在和前邊中斷中要修改一下中斷標誌,在中斷處理中判斷一下是否是自己本地的中斷,這個我都用紅色的標識出來了。

 

“小王,看,小濤哥說話算數吧,上邊給出了所有模版,結合前一篇,相信你可以看的很順利的。好了,我要補補剛的覺了,中間不許叫我哈,想我也不行”我打打哈欠說。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.