我想知道这段代码到底是干什么的。特别是声明和初始化指针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);
}
字符串
2条答案
按热度按时间w80xi6nr1#
可以这样理解:
cyisraddress
是一个 * 函数指针 (指向函数的指针)。这里它的形式是一个不带参数(void)
且不返回任何值(void)
的函数。由于这是在ARM Cortex-M3上,指针应为4字节值,例如0x20010004。该4字节值是函数在内存中的位置,即它的第一条指令的地址。这里,oldIsr
和address
分别指向现有和新的ISR(中断服务例程)。在这一行
#define CY_INT_VECT_TABLE ((cyisraddress **) 0xe000ed08u)
中,0xe000ed08u
被指定为具有cyisraddress **
的类型,这意味着 * 指向函数指针的指针。 注意,0xe000ed08u
是寄存器VTOR(向量表偏移寄存器)的地址,该寄存器存储向量表址从存储器地址0x 00000000(reference)的偏移。当它们使用
*CY_INT_VECT_TABLE
时,它意味着存储在地址0xe 000 ed 08的值,这实际上是向量表的地址。该值的类型为 * 指向函数指针 。现在是有趣的部分。对于
cyisraddress *ramVectorTable
,ramVectorTable
的类型是一个指向函数指针的 * 指针。 当进一步阅读代码时,你会注意到他们使用ramVectorTable
作为数组,这与这个更简单的版本类似:字符串
然后,您可以使用
a[i]
(a
作为 * 整数数组 *)或*(a+i)
(a
作为指向整数 * 的 * 指针)来访问数组元素。因此,
ramVectorTable
可以用作 * 函数指针数组 ,因此ramVectorTable[number & CY_INT_SYS_NUMBER_MASK]
就是*(ramVectorTable + number & CY_INT_SYS_NUMBER_MASK)
,该值的类型为cyisraddress
( 函数指针 )。最后,向量表可以被认为是一个函数指针数组,因此
ramVectorTable
只是一个 * 指向ISR 的指针数组。ewm0tg9j2#
由于你没有写足够的代码,我只能猜测。向量表可能位于RAM存储器中。该代码只是更改其中一个地址以指向新的中断处理程序。
在代码中的某个地方,表可能被放置在内存中,并且它由
0x200
对齐。代码的另一部分将VTOR寄存器的值更改为此表的地址。