我试图了解这段代码的实际作用。具体来说,声明和初始化指针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);
}
答案 0 :(得分:1)
由于您发布的代码不足,我只能猜测。向量表可能位于RAM存储器中。该代码只是更改地址之一以指向新的中断处理程序。
该表可能在代码中的某个地方放置在内存中,并且由0x200
对齐。代码的另一部分将VTOR寄存器的值更改为该表的地址。
答案 1 :(得分:1)
可以理解如下:
cyisraddress
是函数指针(指向函数的指针)。在这里,它的形式是不带参数(void)
且不返回任何(void)
的函数。由于这是在ARM Cortex-M3上,因此指针应为4字节的值,例如0x20010004。该4字节值是函数在内存中的位置,即其第一条指令的地址。在这里,oldIsr
和address
分别指向现有的和新的ISR(中断服务程序)。
在#define CY_INT_VECT_TABLE ((cyisraddress **) 0xe000ed08u)
行中,0xe000ed08u
被指定为具有cyisraddress **
类型,这表示指向函数指针的指针。 0xe000ed08u
是寄存器VTOR(向量表偏移量寄存器)的地址,该寄存器存储向量表基址与内存地址0x00000000(reference)的偏移量
当他们使用*CY_INT_VECT_TABLE
时,表示存储在地址0xe000ed08中的值,该值实际上是向量表的地址。此值的类型为指向函数指针的指针。
现在是有趣的部分。对于cyisraddress *ramVectorTable
,ramVectorTable
的类型是指向函数指针的指针。进一步阅读代码时,您会注意到它们使用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的指针的数组。