试图了解* ramVectorTable如何进入ramVectorTable []

时间:2019-05-25 18:44:37

标签: c cortex-m3 psoc

我试图了解这段代码的实际作用。具体来说,声明和初始化指针ramVectorTable之后的部分最让我感到困惑。

关于设置指定系统中断号的中断向量的功能。如果这样做有帮助,则是针对具有ARM Cortex M3的赛普拉斯PsoC 5。

#define CY_INT_VECT_TABLE ((cyisraddress **) 0xe000ed08u)


typedef void (* cyisraddress)(void);


cyisraddress CyIntSetSysVector(uint8 number, cyisraddress address)
    {
        cyisraddress oldIsr;
        cyisraddress *ramVectorTable = *CY_INT_VECT_TABLE;

 /* Save old Interrupt service routine. */
        oldIsr = ramVectorTable[number & CY_INT_SYS_NUMBER_MASK];

        /* Set new Interrupt service routine. */
        ramVectorTable[number & CY_INT_SYS_NUMBER_MASK] = address;

        return (oldIsr);
    }

2 个答案:

答案 0 :(得分:1)

由于您发布的代码不足,我只能猜测。向量表可能位于RAM存储器中。该代码只是更改地址之一以指向新的中断处理程序。

该表可能在代码中的某个地方放置在内存中,并且由0x200对齐。代码的另一部分将VTOR寄存器的值更改为该表的地址。

答案 1 :(得分:1)

可以理解如下:

cyisraddress函数指针(指向函数的指针)。在这里,它的形式是不带参数(void)且不返回任何(void)的函数。由于这是在ARM Cortex-M3上,因此指针应为4字节的值,例如0x20010004。该4字节值是函数在内存中的位置,即其第一条指令的地址。在这里,oldIsraddress分别指向现有的和新的ISR(中断服务程序)。

#define CY_INT_VECT_TABLE ((cyisraddress **) 0xe000ed08u)行中,0xe000ed08u被指定为具有cyisraddress **类型,这表示指向函数指针的指针。 0xe000ed08u是寄存器VTOR(向量表偏移量寄存器)的地址,该寄存器存储向量表基址与内存地址0x00000000(reference)的偏移量

当他们使用*CY_INT_VECT_TABLE时,表示存储在地址0xe000ed08中的值,该值实际上是向量表的地址。此值的类型为指向函数指针的指针

现在是有趣的部分。对于cyisraddress *ramVectorTableramVectorTable的类型是指向函数指针的指针。进一步阅读代码时,您会注意到它们使用ramVectorTable作为数组,类似于这个简单的版本:

int a[10];

然后,您可以使用a[i]a作为整数的 )或*(a+i)a作为指针的整数)以访问数组元素。

因此,ramVectorTable可以用作函数指针的数组,因此ramVectorTable[number & CY_INT_SYS_NUMBER_MASK]只是*(ramVectorTable + number & CY_INT_SYS_NUMBER_MASK),此值的类型为{{1 }}(函数指针)。

最后,向量表可以看作是函数指针的数组,因此cyisraddress只是ISR的指针的数组。