首先看fsl_flexcomm.c中函数定义
/*! @brief Pointers real ISRs installed by drivers for each instance. */static flexcomm_Isr_t s_flexcommIsr[FSL_FEATURE_SOC_FLEXCOMM_COUNT];
/*! @brief Pointers to handles for each instance to provide context to interrupt routines */staticvoid *s_flexcommHandle[FSL_FEATURE_SOC_FLEXCOMM_COUNT];
#if (FSL_FEATURE_SOC_FLEXCOMM_COUNT > 6U)void FLEXCOMM6_DriverIRQHandler(void)
{
s_flexcommIsr[6]((void *)s_flexcommBaseAddrs[6], s_flexcommHandle[6]);
}
#endif
fsl_flexcomm.h
/*! @brief Typedef for interrupt handler. */
typedef void (*flexcomm_isr_t)(void *base, void *handle);
FLEXCOMM6_DriverIRQHandler就是系统定义好的中断入口(startup_LPC54114_cm4.s 中定义)
重点其实就是分析
s_flexcommIsr[6]((void*)s_flexcommBaseAddrs[6], s_flexcommHandle[6]);
s_flexcommIsr[6]
这个静态局部数组其实就是指针数组。数组的每一个元素都是指向flexcomm_isr_t类型的函数的一个指针。/! @brief Pointers to real IRQ handlers installed by drivers for each instance. /
s_flexcommBaseAddrs[6]
s_flexcommBaseAddrs这个数组的每一个元素都是对应flexcomm接口的硬件寄存器数组首地址。/! @brief Array to map FLEXCOMM instance number to base address. /
s_flexcommHandle[6]
s_flexcommHandle这个数组的每一个元素都是一个void* 型的指针,用来给中断函数提供context参数。s_flexcommHandle是一个结构体数组,每一个元素都自带callback函数及callback函数的输入参数/! @brief Pointers to real IRQ handlers installed by drivers for each instance. /