化屾为海 2024-06-21 14:04 采纳率: 0%
浏览 2

ARM中断注册如何理解VEC计算

在C程序中安装异常中断处理程序:

unsigned Install_Handler( unsigned routine, unsigned *vector )
{
   unsigned vec, old_vec;
    vec = (routine - (unsigned)vector - 8) >> 2;
    if (vec & 0xff000000)
    {
        printf("Handler greater than 32MBytes from vector");
    }
    vec = 0xea000000 | vec;     /* OR in 'branch always' code */
    old_vec = *vector;
    *vector = vec;
    return (old_vec);
}

其中第5行 vec = (routine - (unsigned)vector - 8) >> 2;
为什么要减8呢,书上说是为了允许指令预取,可我还是不明白,那位大虾能给我详细的解释一下?

  • 写回答

3条回答 默认 最新

  • 阿里嘎多学长 2024-06-21 14:04
    关注

    以下内容由CHATGPT及阿里嘎多学长共同生成、有用望采纳:


    在ARM架构中,中断处理程序的注册涉及到对向量表(Vector Table)的设置。中断向量表是一个特殊的内存区域,其中包含了指向中断处理程序的指针。下面是对您提出问题的具体解释:

    1. 为什么在计算VEC时要从routine地址中减去8

      在ARM架构中,当处理器响应中断时,它会从向量表中读取指令并执行。这个读取过程通常涉及到指令预取机制,即处理器会提前读取一些指令以提高执行效率。ARM处理器的指令预取机制会预取第一条指令的地址。因此,为了确保处理器能够正确地跳转到中断处理程序的第一条指令,需要从中断处理程序的地址中减去8字节(因为ARM指令通常是32位,即4字节,预取两条指令就是8字节)。这样,当处理器跳转到这个地址时,它实际上会执行第一条指令,而不是跳过它。

    2. 为什么最终VEC的值要与0xea000000进行OR操作?

      0xea000000是一个特定的值,它代表了ARM指令集中的B指令(Branch指令)。在ARM架构中,B指令用于无条件跳转。将这个值与VEC进行OR操作是为了生成一个有效的跳转指令。具体来说,0xea000000B指令的编码,后面跟的值是跳转的偏移量。因此,最终的VEC值是一个指向中断处理程序的跳转指令。

    3. 这段代码中unsigned类型变量的使用和作用。

      unsigned类型在C语言中表示无符号整数,它用于确保变量的值不会是负数。在这个函数中,unsigned类型被用来存储向量地址和旧的向量值。使用unsigned类型可以避免在地址计算中出现负数,这对于内存地址来说是不合适的。此外,使用unsigned类型还可以保证在进行位操作和算术运算时,结果的符号位不会影响计算结果。

    这段代码是一个中断处理程序的安装函数,它通过修改向量表中的条目来设置中断处理程序的入口地址。这个函数首先计算出正确的向量地址,然后生成一个跳转指令,最后将这个指令写入向量表,替换原有的中断处理程序。

    关于参考链接,由于我无法提供实时的网络搜索结果,因此无法给出具体的链接。但是,您可以通过搜索ARM架构的中断处理和向量表相关的文档来获取更多信息。通常,ARM的官方文档和开发手册会提供详细的说明和示例。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 6月21日

悬赏问题

  • ¥15 无法输出helloworld
  • ¥15 高通uboot 打印ubi init err 22
  • ¥20 PDF元数据中的XMP媒体管理属性
  • ¥15 R语言中lasso回归报错
  • ¥15 网站突然不能访问了,上午还好好的
  • ¥15 有没有dl可以帮弄”我去图书馆”秒选道具和积分
  • ¥15 semrush,SEO,内嵌网站,api
  • ¥15 Stata:为什么reghdfe后的因变量没有被发现识别啊
  • ¥15 振荡电路,ADS仿真
  • ¥15 关于#c语言#的问题,请各位专家解答!