中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當(dāng)前位置: 首頁(yè) > news >正文

做線下活動(dòng)的網(wǎng)站武漢seo網(wǎng)絡(luò)優(yōu)化公司

做線下活動(dòng)的網(wǎng)站,武漢seo網(wǎng)絡(luò)優(yōu)化公司,手機(jī)網(wǎng)站收費(fèi),湘潭網(wǎng)站網(wǎng)站建設(shè)Linux中的Interrupt(中斷)系統(tǒng)是一個(gè)至關(guān)重要的組成部分,它負(fù)責(zé)管理和處理系統(tǒng)中發(fā)生的各種硬件和軟件中斷,確保系統(tǒng)能夠正確響應(yīng)外部設(shè)備的請(qǐng)求,保持系統(tǒng)的穩(wěn)定性和可靠性。 1.中斷的作用 允許設(shè)備在沒(méi)有CPU干預(yù)的情…

Linux中的Interrupt(中斷)系統(tǒng)是一個(gè)至關(guān)重要的組成部分,它負(fù)責(zé)管理和處理系統(tǒng)中發(fā)生的各種硬件和軟件中斷,確保系統(tǒng)能夠正確響應(yīng)外部設(shè)備的請(qǐng)求,保持系統(tǒng)的穩(wěn)定性和可靠性。

1.中斷的作用

  • 允許設(shè)備在沒(méi)有CPU干預(yù)的情況下發(fā)送信號(hào)并請(qǐng)求處理。
  • 提高系統(tǒng)的并發(fā)處理能力,使CPU能夠同時(shí)處理多個(gè)任務(wù)。
  • 確保系統(tǒng)能夠及時(shí)響應(yīng)外部設(shè)備的請(qǐng)求,保證系統(tǒng)的實(shí)時(shí)性和穩(wěn)定性。

2. Linux中斷子系統(tǒng)的組成與工作流程

  • 中斷控制器:負(fù)責(zé)收集所有中斷源發(fā)起的中斷,并對(duì)中斷進(jìn)行初步處理,如優(yōu)先級(jí)排序、中斷分發(fā)等。
  • 中斷處理函數(shù):每個(gè)中斷都會(huì)對(duì)應(yīng)一個(gè)或多個(gè)中斷處理函數(shù),當(dāng)中斷發(fā)生時(shí),CPU會(huì)暫停當(dāng)前任務(wù),跳轉(zhuǎn)到相應(yīng)的中斷處理函數(shù)執(zhí)行。
  • 中斷描述符(irq_desc):用于描述IRQ(Interrupt Request,中斷請(qǐng)求)線的屬性與狀態(tài),是中斷子系統(tǒng)中的重要數(shù)據(jù)結(jié)構(gòu)。
  • 中斷芯片(irq_chip):描述不同類型的中斷控制器,提供與硬件中斷控制器交互的接口。

3.特殊中斷類型

  • SGI(Software Generated Interrupt):軟件觸發(fā)的中斷,一般用于核間通信。
  • PPI(Private Peripheral Interrupt):私有外設(shè)中斷,每個(gè)核心私有的中斷。
  • SPI(Shared Peripheral Interrupt):共享外設(shè)中斷,可以分發(fā)到某一個(gè)CPU上。
  • LPI(Locality-specific Peripheral Interrupt):GICv3中的新特性,基于消息的中斷。

4. Linux 中斷 API 函數(shù)

request_irq 函數(shù)

在 Linux 內(nèi)核中要想使用某個(gè)中斷是需要申請(qǐng)的,request_irq 函數(shù)用于申請(qǐng)中斷,request_irq
函數(shù)可能會(huì)導(dǎo)致睡眠,因此不能在中斷上下文或者其他禁止睡眠的代碼段中使用 request_irq 函
數(shù)。 request_irq 函數(shù)會(huì)激活(使能)中斷,所以不需要我們手動(dòng)去使能中斷, request_irq 函數(shù)原型
如下:

int request_irq(unsigned int irq,irq_handler_t handler,unsigned long flags,const char *name,void *dev)
/* irq:要申請(qǐng)中斷的中斷號(hào)。handler:中斷處理函數(shù),當(dāng)中斷發(fā)生以后就會(huì)執(zhí)行此中斷處理函數(shù)。flags:中斷標(biāo)志,可以在文件 include/linux/interrupt.h 里面查看所有的中斷標(biāo)志name:中斷名字,設(shè)置以后可以在/proc/interrupts 文件中看到對(duì)應(yīng)的中斷名字。dev: 如果將 flags 設(shè)置為 IRQF_SHARED 的話, dev 用來(lái)區(qū)分不同的中斷,一般情況下將dev 設(shè)置為設(shè)備結(jié)構(gòu)體, dev 會(huì)傳遞給中斷處理函數(shù) irq_handler_t 的第二個(gè)參數(shù)。返回值: 0 中斷申請(qǐng)成功,其他負(fù)值 中斷申請(qǐng)失敗,如果返回-EBUSY 的話表示中斷已經(jīng)被申請(qǐng)了。*/

flags中斷標(biāo)志介紹如下:

| 標(biāo)志               | 描述                                                       			  |  
|--------------------|--------------------------------------------------------------|  
| IRQF_SHARED        | 允許多個(gè)設(shè)備共享同一個(gè)中斷線,所有共享中斷都需指定此標(biāo)志,dev 參數(shù)為唯一區(qū)分標(biāo)志         |  
| IRQF_PROBE_SHARED  | 類似IRQF_SHARED,但用于自動(dòng)探測(cè)共享中斷。不推薦使用              |  
| IRQF_TIMER         | 這是一個(gè)定時(shí)器中斷                                              |  
| IRQF_IRQPOLL       | 驅(qū)動(dòng)程序應(yīng)使用慢速中斷輪詢                                      |  
| IRQF_ONESHOT       | 如果是共享中斷,request_irq的dev參數(shù)應(yīng)唯一,用于區(qū)分中斷請(qǐng)求     |  
| IRQF_NO_SUSPEND    | 禁止在掛起期間禁用此中斷                                       |  
| IRQF_FORCE_RESUME  | 強(qiáng)制在設(shè)備喚醒時(shí)重新啟用中斷,即使它被標(biāo)記為IRQF_NO_SUSPEND      |  
| IRQF_NOBALANCING   | 不允許在CPU之間平衡此中斷                                     |  
| IRQF_IRQ_DISABLED  | 中斷被禁用(用于特殊目的的中斷初始化)                         |  
| IRQF_PERCPU        | 中斷是每CPU的(不支持共享)                                   |  
| IRQF_NO_THREAD     | 不要為中斷創(chuàng)建線程(也稱為“bottom half”)                     |  
| IRQF_EARLY_RESUME  | 允許在suspend-to-idle期間盡早恢復(fù)中斷(與IRQF_NO_SUSPEND相關(guān))   |  
| IRQF_TRIGGER_NONE  | 沒(méi)有觸發(fā)事件                                                 |  
| IRQF_TRIGGER_RISING | 上升沿觸發(fā)                                                   |  
| IRQF_TRIGGER_FALLING| 下降沿觸發(fā)                                                   |  
| IRQF_TRIGGER_HIGH  | 高電平觸發(fā)                                                   |  
| IRQF_TRIGGER_LOW   | 低電平觸發(fā)                                                   |  
| IRQF_TRIGGER_MASK  | 觸發(fā)類型掩碼(用于清除觸發(fā)類型標(biāo)志)                           |

free_irq 函數(shù)

使用中斷的時(shí)候需要通過(guò) request_irq 函數(shù)申請(qǐng),使用完成以后就要通過(guò) free_irq 函數(shù)釋放
掉相應(yīng)的中斷。如果中斷不是共享的,那么 free_irq 會(huì)刪除中斷處理函數(shù)并且禁止中斷。

void free_irq(unsigned int irq,void *dev)
/*irq: 要釋放的中斷。dev:如果中斷設(shè)置為共享(IRQF_SHARED)的話,此參數(shù)用來(lái)區(qū)分具體的中斷。共享中斷只有在釋放最后中斷處理函數(shù)的時(shí)候才會(huì)被禁止掉。返回值:無(wú)。
*/

5.interrupt子系統(tǒng)實(shí)驗(yàn)

注:本實(shí)驗(yàn)使用的是韋東山I.MX6U開(kāi)發(fā)板

dts文件

/dts-v1/;
/{gpio_keys_100ask_imx6ull{compatible = "100ask,gpio_keys";gpios = <&gpio5 1 GPIO_ACTIVE_LOW&gpio4 14 GPIO_ACTIVE_LOW>;pinctrl-names = "default";pinctrl-0 = <&key1_pinctrl&key2_pinctrl>;status = "okay";};
};
&iomuxc_snvs {key1_pinctrl: key1_pinctrl {        /*!< Function assigned for the core: Cortex-A7[ca7] */fsl,pins = <MX6ULL_PAD_SNVS_TAMPER1__GPIO5_IO01        0x000110A0>;};
};&iomuxc {key2_pinctrl: key2_pinctrl {       /*!< Function assigned for the core: Cortex-A7[ca7] */fsl,pins = <MX6UL_PAD_NAND_CE1_B__GPIO4_IO14           0x000010B0>;};
}

100ask_imx6ull-14x14.dts 完成編寫后,在(內(nèi)核目錄)編譯dts文件

book@100ask:~/100ask_imx6ull-sdk/Linux-4.9.88$ make dtbs

將編譯好的dtb文件拷貝到網(wǎng)絡(luò)文件系統(tǒng)中

cp /home/book/100ask_imx6ull-sdk/Linux-4.9.88/arch/arm/boot/dts/100ask_imx6ull-14x14.dtb ~/nfs_rootfs/

#include "asm-generic/errno-base.h"
#include "asm-generic/int-ll64.h"
#include "asm/gpio.h"
#include "linux/compiler.h"
#include "linux/err.h"
#include "linux/export.h"
#include "linux/gpio/consumer.h"
#include "linux/interrupt.h"
#include "linux/ioport.h"
#include "linux/kdev_t.h"
#include "linux/leds.h"
#include "linux/of.h"
#include "linux/printk.h"
#include "linux/slab.h"
#include "linux/stddef.h"
#include <linux/types.h>
#include <linux/kernel.h>
#include <linux/delay.h>
#include <linux/ide.h>
#include <linux/init.h>
#include <linux/module.h>
#include <linux/errno.h>
#include <linux/gpio.h>
#include <linux/cdev.h>
#include <linux/device.h>
#include <linux/of_gpio.h>
#include <linux/semaphore.h>
#include <linux/timer.h>
#include <linux/irq.h>
#include <linux/wait.h>
#include <linux/poll.h>
#include <linux/fs.h>
#include <linux/fcntl.h>
#include <linux/platform_device.h>
#include <asm/mach/map.h>
#include <asm/uaccess.h>
#include <asm/io.h>struct gpio_key{int gpio;enum of_gpio_flags flags;int irq;
};static struct gpio_key *gpio_keys;static irqreturn_t gpio_keys_100ask_irq(int irq, void *dev_id)
{struct gpio_key *gpio_key = dev_id;printk("key %d val %d\n", irq,gpio_get_value(gpio_key->gpio));return IRQ_HANDLED;
}/*   當(dāng)驅(qū)動(dòng)與設(shè)備連匹配成功時(shí)執(zhí)行此函數(shù)   */
static int keys_probe (struct platform_device *pdv){int count,i,err;int gpio,irq;enum of_gpio_flags flags;struct device_node *node = pdv->dev.of_node;count = of_gpio_count(node); // 得到設(shè)備所使用的GPIO個(gè)數(shù)gpio_keys = kzalloc(count * sizeof(struct gpio_key), GFP_KERNEL);for(i = 0; i < count; i++){gpio = of_get_gpio_flags(node,i,&flags);irq = gpio_to_irq(gpio);gpio_keys[i].gpio = gpio;gpio_keys[i].irq = irq;gpio_keys[i].flags = flags;err = request_irq(irq, gpio_keys_100ask_irq, IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING, "100ask_gpio_key", &gpio_keys[i]);if(err != 0){dev_err(&pdv->dev, "Could not get irq %d.\n", irq);}}return 0;
}static int keys_remove (struct platform_device *pdv)
{int i;for(i = 0; i < of_gpio_count(pdv->dev.of_node); i++){free_irq(gpio_keys[i].irq, &gpio_keys[i]);}kfree(gpio_keys);return 0;
}static struct of_device_id keys_match[] = {{.compatible = "100ask,gpio_keys"},{},
};static struct platform_driver keys_driver = {.probe = keys_probe,.remove = keys_remove,.driver = {.name = "key_driver",.of_match_table = of_match_ptr(keys_match),},
};static int __init keys_init(void)
{return platform_driver_register(&keys_driver);
}static void __exit keys_exit(void)
{platform_driver_unregister(&keys_driver);
}module_init(keys_init);
module_exit(keys_exit);MODULE_AUTHOR("Pumpk1n");
MODULE_LICENSE("GPL");
KERN_DIR = /home/book/100ask_imx6ull-sdk/Linux-4.9.88obj-m += keys_int_driver.oall: $(MAKE) -C $(KERN_DIR) M=`pwd` modulesclean:make -C $(KERN_DIR) M=`pwd` modules cleanrm -rf modules.order

執(zhí)行命令: make

編譯 keys_int_driver.c文件為 keys_int_driver.ko內(nèi)核模塊文件

拷貝文件到網(wǎng)絡(luò)文件系統(tǒng)中

cp keys_int_driver.ko ~/nfs_rootfs/

串口連接開(kāi)發(fā)板

掛載到網(wǎng)絡(luò)文件系統(tǒng)中

[root@100ask:~]# mount -t nfs -o nolock,vers=3 192.168.5.11:/home/book/nfs_rootfs /mnt

將/mnt/100ask_imx6ull-14x14.dtb文件復(fù)制到/boot/下面

[root@100ask:~]# cp /mnt/100ask_imx6ull-14x14.dtb /boot/

重啟開(kāi)發(fā)板,等待重啟完成后重新掛載網(wǎng)絡(luò)文件系統(tǒng)中

[root@100ask:~]# reboot
[root@100ask:~]# mount -t nfs -o nolock,vers=3 192.168.5.11:/home/book/nfs_rootfs /mnt

進(jìn)入到/mnt/目錄中,并向內(nèi)核加載模塊文件keys_int_driver.ko

[root@100ask:~]# cd /mnt
[root@100ask:mnt]# insmod keys_int_driver.ko

設(shè)置內(nèi)核消息的打印

echo "7 4 1 7" > /proc/sys/kernel/printk

按下按鍵key1,key2可分別在控制臺(tái)打印消息

遇到的錯(cuò)誤:

genirq: Flags mismatch irq 208. 00000003 (100ask_gpio_key) vs. 00000083 (User1 Button)

解決辦法:

If you want to use the same irq number to register different interrupt handler, please use IRQ_SHARED flags.

 err = request_irq(irq, gpio_keys_100ask_irq, IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING | IRQF_SHARED, "100ask_gpio_key", &gpio_keys[i]);
http://m.risenshineclean.com/news/61306.html

相關(guān)文章:

  • 云南酒店網(wǎng)站建設(shè)名優(yōu)網(wǎng)站關(guān)鍵詞優(yōu)化
  • 小游戲網(wǎng)址鏈接seo網(wǎng)站推廣優(yōu)化論文
  • java做直播網(wǎng)站有哪些軟件有哪些微信加人推碼35一單
  • 商務(wù)網(wǎng)站建設(shè)管理思路青島seo經(jīng)理
  • 做的網(wǎng)站怎么發(fā)布到網(wǎng)上網(wǎng)絡(luò)推廣方案怎么寫
  • 模仿網(wǎng)站怎么防止侵權(quán)電商關(guān)鍵詞一般用哪些工具
  • icp備案網(wǎng)站要先建好嗎微信社群營(yíng)銷
  • 北京網(wǎng)站建設(shè)價(jià)格天湛江今日頭條新聞
  • 鄭州網(wǎng)站的優(yōu)化廣州公關(guān)公司
  • 網(wǎng)站建設(shè)外包排名游戲推廣在哪里接活
  • app網(wǎng)站制作要多少錢排名nba
  • 做電影網(wǎng)站的工具抖音關(guān)鍵詞搜索排名
  • 做網(wǎng)站最主要搜索引擎推廣的費(fèi)用
  • 政府網(wǎng)站建設(shè)辦法中國(guó)工商業(yè)聯(lián)合會(huì)
  • 如何通過(guò)建設(shè)網(wǎng)站賺錢天津疫情最新情況
  • 什么網(wǎng)站可以做相冊(cè)城關(guān)網(wǎng)站seo
  • 25轉(zhuǎn)行做網(wǎng)站運(yùn)營(yíng)優(yōu)化搜狗排名
  • 東莞做網(wǎng)站制作珠海網(wǎng)站建設(shè)
  • 綿陽(yáng)做網(wǎng)站的有哪些百度指數(shù)支持?jǐn)?shù)據(jù)下載嗎
  • 高明網(wǎng)站建設(shè)最近一周新聞熱點(diǎn)回顧
  • 湖北網(wǎng)站開(kāi)發(fā)網(wǎng)站多少錢
  • 門戶網(wǎng)站html模板參考網(wǎng)是合法網(wǎng)站嗎?
  • wordpress批量修改圖片標(biāo)題seo中文意思是
  • 網(wǎng)站都有什么費(fèi)用千鋒教育培訓(xùn)怎么樣
  • wordpress的文章分類班級(jí)優(yōu)化大師下載
  • 網(wǎng)站域名包括菏澤資深seo報(bào)價(jià)
  • 軟件界面設(shè)計(jì)工具下載刷seo快速排名
  • wordpress 插件太多seo長(zhǎng)尾快速排名
  • 做畫冊(cè)好的國(guó)外網(wǎng)站推薦如何關(guān)閉2345網(wǎng)址導(dǎo)航
  • 現(xiàn)在的網(wǎng)站設(shè)計(jì)前端seo主要優(yōu)化哪些