- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - phát hiện rò rỉ bộ nhớ Ruby/Ruby on Rails
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我用 cortex-A9 开发板做了一些实验。我使用 gpio_to_irq() 获得一个 irq num,我请求了 irq 并用它写了一个小驱动程序,它在 syslog 中是 196。我在 asm_do_IRQ 中添加了一些 printks。当我触发 gpio 中断时,驱动程序工作正常但 asm_do_IRQ 中的 irq num 是 62。我无法理解。为什么 irq 号与我请求的不同?驱动程序如下:
#include
#include
#include
#include
#define GPIO_N 36 //gpio number
int flag = 0;
static irqreturn_t handler(int irq,void *dev_id)
{
printk("hello world hahahahahhahahah \n\n");
trả về 0;
}
static int __init gpio_test_init(void)
{
if(gpio_request_one(GPIO_N,GPIOF_DIR_IN,"some test")<0)
{
printk(KERN_ERR "Oops! BAD! BAD! BAD!\n\n");
trả về 0;
}
int irq,irq2;
irq = OMAP_GPIO_IRQ(TEST_GPIO);
printk("irq : %d \n",irq,irq2);
// ..................
// irq : 196 in dmesg
//......................
set_irq_type(irq,IRQ_TYPE_EDGE_FALLING);
enable_irq(gpio_to_irq(GPIO_N));
int err;
// request the irq ...
if((err = request_irq(irq,&handler,0,NULL,NULL))<0)
{
printk("err : %d\n",err);
trả về 0;
}
printk("gpio test init success!\n");
cờ = 1;
trả về 0;
}
static void __exit gpio_test_exit(void)
{
int irq = gpio_to_irq(TEST_GPIO);
if(flag == 1)free_irq(irq,NULL);
gpio_free(TEST_GPIO);
printk("gpio test exit byebye!\n");
}
module_init(gpio_test_init);
module_exit(gpio_test_exit);
MODULE_LICENSE("GPL");
arch/arm/kernel/irq.c 中的 asm_do_IRQ
asmlinkage void __exception_irq_entry
asm_do_IRQ(unsigned int irq, struct pt_regs *regs)
{
struct pt_regs *old_regs = set_irq_regs(regs);
printk("the irq : %d\n",irq);
//...............
// I get 62 here
//...............
irq_enter();
/*
* Some hardware gives randomly wrong interrupts. Rather
* than crashing, do something sensible.
*/
if (unlikely(irq >= nr_irqs)) {
if (printk_ratelimit())
printk(KERN_WARNING "Bad IRQ%u\n", irq);
ack_bad_irq(irq);
} khác {
generic_handle_irq(irq);
}
/* AT91 specific workaround */
irq_finish(irq);
irq_exit();
set_irq_regs(old_regs);
}
câu trả lời hay nhất
这种观察可能是由于物理和虚拟 IRQ 号之间的映射。在您的驱动程序中看到的数字是虚拟 IRQ 号,仅在使用通用 linux 中断处理子系统时有效。 asm_do_IRQ
中的中断号将是内核中断结构提供的物理中断号。
我相信 OMAP 处理器支持 GPIO 引脚上的中断。通常实现的方式是为一组 GPIO 输入分配一条 IRQ 线,比如 32 位。当任何 GPIO 发生中断时,该 IRQ 线将激活。这可能是您处理器上的数字 62。如果查看处理器的手册,您应该会看到 IRQ 62 对应于 GPIO bank 上的中断。
现在,linux GPIO 子系统将允许您为任何 GPIO 分配一个中断处理程序,为您提供从 linux irq 号到物理 irq 号的映射。您的情况下的 linux irq 号是 196。GPIO 子系统配置为处理所有 GPIO 中断(比如中断 62),读取 GPIO 寄存器以确定银行中的哪些 GPIO 位可能产生中断,然后调用您使用 request_irq
分配的中断处理程序。
这是 GPIO 中断的基本控制流程:
asm_do_IRQ
在 IRQ 62 上运行。GPIO 子系统已通过平台初始化代码注册以处理 IRQ 62。generic_handle_irq
函数,它会调用您的中断处理程序。在虚拟 IRQ 号和物理 IRQ 号之间通常有一个由平台定义的静态映射。要查看此映射,
CONFIG_VIRQ_DEBUG
,或者CONFIG_IRQ_DOMAIN_DEBUG
。然后查看irq_domain_mapping
debugfs 文件。例如。在 PowerPC 上:
# mount -t debugfs none /sys/kernel/debug
# cat /sys/kernel/debug/irq_domain_mapping
irq hwirq chip name chip data domain name
16 0x00009 IPIC 0xcf801c80 /soc8347@e0000000/pic@700
18 0x00012 IPIC 0xcf801c80 /soc8347@e0000000/pic@700
19 0x0000e IPIC 0xcf801c80 /soc8347@e0000000/pic@700
20 0x0000f IPIC 0xcf801c80 /soc8347@e0000000/pic@700
21 0x00010 IPIC 0xcf801c80 /soc8347@e0000000/pic@700
77 0x0004d IPIC 0xcf801c80 /soc8347@e0000000/pic@700
关于linux - 内核函数 asm_do_IRQ() 中的 irq 与我在模块中请求的不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15871048/
Hàm sscanf() của ngôn ngữ C: đọc tệp tiêu đề dữ liệu theo định dạng đã chỉ định từ chuỗi: ?
Gần đây, tôi có một câu hỏi về đánh giá trước công việc mà tôi không biết cách giải quyết ngay cả khi đã truy vấn cách thức hoạt động của từng tính năng. Đây là một mã giả. Dưới đây là một hàm có tên foo() sẽ được truyền một giá trị và trả về một giá trị. Nếu bạn chuyển giá trị sau cho hàm foo,
Hàm CStr trả về một biểu thức đã được chuyển đổi thành Biến thể của kiểu con Chuỗi. Tham số biểu thức CStr(biểu thức) là bất kỳ biểu thức hợp lệ nào. Lưu ý rằng thông thường, bạn có thể
Hàm CSng trả về một biểu thức đã được chuyển đổi thành Biến thể của kiểu con Đơn. Tham số biểu thức CSng(biểu thức) là bất kỳ biểu thức hợp lệ nào. Mô tả Thông thường, nó có thể được
Hàm CreateObject tạo và trả về một tham chiếu đến đối tượng Tự động hóa. CreateObject(servername.typename [, location]) Dịch vụ tham số
Hàm Cos trả về cosin của một góc. Cos(số) Đối số số có thể là bất kỳ biểu thức số hợp lệ nào biểu thị một góc theo radian. Mô tả Hàm Cos lấy một góc và trả về tỷ lệ hai cạnh của một tam giác vuông. Tỷ lệ này là
Hàm CLng trả về một biểu thức đã được chuyển đổi thành Biến thể của kiểu con Dài. Tham số biểu thức CLng(biểu thức) là bất kỳ biểu thức hợp lệ nào. Mô tả Thông thường, bạn có thể sử dụng
Hàm CInt trả về một biểu thức đã được chuyển đổi thành Biến thể của kiểu con Số nguyên. Tham số biểu thức CInt(biểu thức) là bất kỳ biểu thức hợp lệ nào. Mô tả Thông thường, nó có thể được
Hàm Chr trả về ký tự tương ứng với mã ký tự ANSI đã chỉ định. Chr(charcode) Tham số charcode là một số xác định ký tự. Mô tả Các số từ 0 đến 31 thể hiện tiêu chuẩn không thể in được
Hàm CDbl trả về một biểu thức đã được chuyển đổi thành kiểu con Variant của Double. Tham số biểu thức CDbl(biểu thức) là bất kỳ biểu thức hợp lệ nào. Mô tả Thông thường, bạn có thể
Hàm CDate trả về một biểu thức đã được chuyển đổi thành kiểu con Biến thể của Ngày. CDate(date) Tham số ngày là bất kỳ biểu thức ngày hợp lệ nào. Giải thích rằng hàm IsDate được sử dụng để xác định d
Hàm CCur trả về một biểu thức đã được chuyển đổi thành Biến thể của kiểu con Tiền tệ. Tham số biểu thức CCu(biểu thức) là bất kỳ biểu thức hợp lệ nào. Mô tả Thông thường,
Hàm CByte trả về một biểu thức đã được chuyển đổi thành Biến thể của kiểu con Byte. Tham số biểu thức CByte(biểu thức) là bất kỳ biểu thức hợp lệ nào. Lưu ý rằng thông thường, bạn có thể
Hàm CBool trả về một biểu thức đã được chuyển đổi thành Biến thể của kiểu con Boolean. Biểu thức CBool(biểu thức) là bất kỳ biểu thức hợp lệ nào. Giải thích nếu cũ
Hàm Atn trả về arctang của một số. Tham số số Atn(number) có thể là bất kỳ biểu thức số hợp lệ nào. Mô tả: Hàm Atn tính tỷ lệ (số) hai cạnh của một tam giác vuông và trả về cung của góc tương ứng.
Hàm Asc trả về mã ký tự ANSI tương ứng với chữ cái đầu tiên của chuỗi. Asc(string) Tham số chuỗi là bất kỳ biểu thức chuỗi hợp lệ nào. Nếu tham số chuỗi không chứa ký tự thì sẽ xảy ra lỗi thời gian chạy.
Hàm Array trả về một Biến thể chứa một mảng. Array(arglist) Tham số arglist là danh sách các giá trị được phân tách bằng dấu phẩy để gán cho các phần tử mảng có trong Biến thể. Nếu tham số này không được chỉ định thì
Hàm Abs trả về giá trị tuyệt đối của một số. Abs(số) Đối số số có thể là bất kỳ biểu thức số hợp lệ nào. Nếu số chứa Null thì trả về Null; nếu biến chưa được khởi tạo thì trả về 0.
Hàm FormatPercent trả về một biểu thức đã được định dạng dưới dạng phần trăm có dấu % ở cuối (nhân với 100). FormatPercent(biểu thức[,NumDigitsAfterD
Hàm FormatNumber trả về một biểu thức đã được định dạng dưới dạng giá trị số. FormatNumber( biểu thức [,NumDigitsAfterDecimal [,Inc
Tôi là một lập trình viên xuất sắc, rất giỏi!