尝试理解 *ramVectorTable如何到达ramVectorTable[ ]

2skhul33  于 2023-08-03  发布在  其他
关注(0)|答案(2)|浏览(111)

我想知道这段代码到底是干什么的。特别是声明和初始化指针ramVectorTable之后的部分最让我困惑。
它是关于设置指定系统中断号的中断向量的函数。这是为赛普拉斯的PSoC 5,有ARM Cortex M3,如果这有助于某种程度。

#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);
    }

字符串

w80xi6nr

w80xi6nr1#

可以这样理解:
cyisraddress是一个 * 函数指针 (指向函数的指针)。这里它的形式是一个不带参数(void)且不返回任何值(void)的函数。由于这是在ARM Cortex-M3上,指针应为4字节值,例如0x20010004。该4字节值是函数在内存中的位置,即它的第一条指令的地址。这里,oldIsraddress分别指向现有和新的ISR(中断服务例程)。
在这一行#define CY_INT_VECT_TABLE ((cyisraddress **) 0xe000ed08u)中,0xe000ed08u被指定为具有cyisraddress **的类型,这意味着 * 指向函数指针的指针。
注意,0xe000ed08u是寄存器VTOR(向量表偏移寄存器)的地址,该寄存器存储向量表址从存储器地址0x 00000000(reference)的偏移。
当它们使用*CY_INT_VECT_TABLE时,它意味着存储在地址0xe 000 ed 08的值,这实际上是向量表的地址。该值的类型为 * 指向函数指针
现在是有趣的部分。对于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),该值的类型为cyisraddress 函数指针 )。
最后,向量表可以被认为是一个函数指针数组,因此ramVectorTable只是一个 * 指向ISR
的指针数组。

ewm0tg9j

ewm0tg9j2#

由于你没有写足够的代码,我只能猜测。向量表可能位于RAM存储器中。该代码只是更改其中一个地址以指向新的中断处理程序。
在代码中的某个地方,表可能被放置在内存中,并且它由0x200对齐。代码的另一部分将VTOR寄存器的值更改为此表的地址。

相关问题