C 中断向量处理程序地址

C 中断向量处理程序地址,c,operating-system,interrupt,interrupt-handling,C,Operating System,Interrupt,Interrupt Handling,我正在开发一个简单的操作系统,它需要一个小的中断向量。为了理解这些概念,我一直在阅读有关中断向量的内容 许多参考资料都是这样引用的: [1] 让我困惑的是,我如何知道中断处理程序的地址?我知道我需要为不同类型的中断创建不同的函数,但是我如何知道函数的地址呢 我正在用C语言开发我的代码。中断处理程序最终是一个函数 函数从“地址”开始,您只需使用其名称即可检索它 以下代码将对传递的%p参数类型发出警告,但只是解释性的: #include <stdio.h> void dummy_IS

我正在开发一个简单的操作系统,它需要一个小的中断向量。为了理解这些概念,我一直在阅读有关中断向量的内容

许多参考资料都是这样引用的:

[1]

让我困惑的是,我如何知道中断处理程序的地址?我知道我需要为不同类型的中断创建不同的函数,但是我如何知道函数的地址呢


我正在用C语言开发我的代码。

中断处理程序最终是一个函数

函数从“地址”开始,您只需使用其名称即可检索它

以下代码将对传递的
%p
参数类型发出警告,但只是解释性的:

#include <stdio.h>

void dummy_ISR ( void )
{

}

int main ( void )
{
    printf("Address of function: %p\n", dummy_ISR);

}
#包括
无效虚拟情报室(无效)
{
}
内部主(空)
{
printf(“函数地址:%p\n”,伪ISR);
}

可以使用函数指针创建表

#include<stdio.h>

int dummy_isr1 ( void )
{
    return 0;
}

int dummy_isr2 ( void )
{
    return 0;
}

typedef int (*functionPtr)(void);

functionPtr table[] =
{
        dummy_isr1,
        dummy_isr2
};


int main(void)
{
    for (size_t i=0; i<sizeof(table)/sizeof(table[0]); i++)
    {
        printf("Address %zu: %p\n", i, table[i]);
    }

   return 0;
}
#包括
int dummy_isr1(无效)
{
返回0;
}
int dummy_isr2(无效)
{
返回0;
}
typedef int(*functionPtr)(无效);
函数PTR表[]=
{
伪isr1,
伪isr2
};
内部主(空)
{

对于(size_t i=0;i所有事情都由链接器完成。您编写中断处理程序,用处理程序填充向量表并将其标记为向量表,链接器完成其余工作。您是否在嵌入式设备上开发过?函数的地址由函数名表示。例如:此函数的地址:
void Foo(){bar();};
只是
foo
。要打印该地址:
printf(“%p\n”,(void*)foo);
。谢谢,但是如果我指向一个函数,向量的类型会是什么?如果我有32位机器,你可以使用函数指针。另一种方法是简单地使用
void*
,但是如果我正式支持这个解决方案,标准的律师可能会杀了我;)@Salma:注意,在ARM上,GCC(和其他一些编译器)支持(或
isr
),它告诉编译器围绕函数生成必要的代码,使函数作为中断服务例程安全地工作。对于表,您可以使用,并使用链接器脚本告诉链接器将该节放置在何处。