【问题标题】:Interrupt Vector Handler Address中断向量处理程序地址
【发布时间】:2016-11-18 14:05:26
【问题描述】:

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

许多资源是这样引用的:

[1]http://www.embedded.com/electronics-blogs/programming-pointers/4025714/Modeling-interrupt-vectors#references

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

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

【问题讨论】:

  • 一切都由链接器完成。您编写中断处理程序,用处理​​程序填充向量表并将其标记为向量表,然后链接器完成其余工作。你还开发过嵌入式设备吗?
  • 函数的地址由函数名表示。例如:这个函数的地址:void Foo() {bar();};就是foo。并打印该地址:printf("%p\n", (void*)foo);.

标签: c operating-system interrupt interrupt-handling


【解决方案1】:

最后,中断处理程序是一个函数。

函数从“地址”开始,您可以简单地使用它的名称来检索它。

以下代码将警告%p 参数类型已传递,但具有解释性:

#include <stdio.h>

void dummy_ISR ( void )
{

}

int main ( void )
{
    printf("Address of function: %p\n", dummy_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;
}

【讨论】:

  • 谢谢,但是如果我指向一个函数,向量的类型是什么?如果我有 32 位机器
  • 您可以使用函数指针来执行此操作。另一种方法是简单地使用void *,但如果我正式支持该解决方案,标准律师可能会杀了我;)
  • @Salma:请注意,在 ARM 上,GCC(和其他一些编译器)支持 interrupt function attribute(或 isr),它告诉编译器围绕使函数作为中断服务程序安全地工作。对于表格,您可以使用section("name")variable attribute,并使用链接器脚本告诉链接器将该节放在哪里。
猜你喜欢
  • 1970-01-01
  • 2017-10-29
  • 1970-01-01
  • 1970-01-01
  • 2011-07-20
  • 2011-07-19
  • 1970-01-01
  • 1970-01-01
  • 2023-03-08
相关资源
最近更新 更多