我将通读 CC26xx 驱动程序库文档、其中 interrupt.h 文档中提供了以下静态配置中断矢量表的内容:
通过编辑应用程序启动代码中的中断处理程序表、可实现中断处理程序的静态注册。 德州仪器(TI)为每个受支持的编译器()提供启动文件startup_<compiler>.c,这些启动文件包括默认静态中断矢量表。 除 ResetISRextern 之外的所有条目都声明为具有对默认中断处理程序的弱分配。 这允许用户声明和定义与向量表中的条目的名称相同的函数(在用户代码中)。 在编译时、链接器会将指向矢量表中默认中断处理程序的指针替换为指向用户定义的中断处理程序的指针。
静态配置中断表可提供最快的中断响应时间、因为堆栈操作(对数据总线上的 SRAM 执行写操作)与中断处理程序表提取(对指令总线上的闪存执行读操作)以及中断处理程序的预取并行执行 (假设它也在闪存中)。
我想处理 SVCalls、根据文档中的这段、我必须定义一个与向量表中的条目同名的函数。 但是、当我查看 ti/simplelink_cc13x2_26x2_sdk_3_40_00_02/sources/ti/devices/cc13x2_c26x2/startup_files 中的 startup_ccs.c 文件时、我看不到任何名称。
我确实看到一个 IntDefaultHandler 条目、在它说"//11 Supervisor Call (SVCall)"之后添加了注释、但大多数其他中断也使用 IntDefaultHandler。 那么、如果文档中的那条语句意味着我必须定义我自己的 IntDefaultHandler 函数、那么我也不会处理所有其他中断吗? 此外,该文档指出,这些条目被声明为 extern,但在文件中,我看到 IntDefaultHandler 被声明为“static void IntDefaultHandler( void );",因此不是 extern。
如何静态地将我自己的 SVCall 处理程序添加到此矢量表中? 还是只能动态地执行此操作?
下面的代码显示了 startup_ccs.c 文件的内容。
//
//
//检查编译器是否为 CCS
//
/*********
#if!(defined (__TI_Compiler_version__)
)#error "startup_ccs.c:不支持的编译器!"
#endif
#include "../inc/hw_types.h
#include "../driverlib/setup.h //
*********
//
//! 复位 ISR 和默认故障处理程序的转发声明。
////
*****************
无效 ResetISR( void );
static void NmiSR( void );
static void FaultISR( void );
static void IntDefaultHandler( void );
extern int main(void);
//*********
//
//! 应用启动代码和器件调整 fxn 的入口点。
////
*****************
extern void _c_int00 (void);
//*********
//
// CCS:标记栈顶的链接器变量。
////
*****************
extern unsigned long __stack_end;
//! 矢量表。 请注意
、必须将正确的构造放置在这里、以便//! 确保它最终位于物理地址0x0000.0000或
//开始! 该程序位于0以外的起始地址。
////
*****************
#pragma DATA_SECTION (g_pfnVectors、".intvecs")
void (* const g_pfnVectors [])(void)=
{
(void (*)(void)((unsigned long)&_stack_end)、
// 0初始堆栈指针
ResetISR、 // 1复位处理程序
NmiSR、 // 2 NMI 处理程序
FaultISR、 // 3硬故障处理程序
IntDefaultHandler、 // 4内存管理(MemManage)故障
IntDefaultHandler、 // 5总线故障处理程序
IntDefaultHandler、 // 6用法故障处理程序
0、 // 7保留
0、 // 8保留
0、 // 9保留
0、 //保留10
IntDefaultHandler、 // 11个主管呼叫(SVCall)
IntDefaultHandler、 // 12调试监视器处理程序
0、 // 13保留
IntDefaultHandler、 // 14 PendSV 处理程序
IntDefaultHandler、 // 15 SysTick 处理程序
//--外部中断--
IntDefaultHandler、 // 16 AON 边沿检测
IntDefaultHandler、 // 17个 I2C
IntDefaultHandler、 // 18个射频内核命令和数据包引擎1.
IntDefaultHandler、 // 19 PKA 中断事件
IntDefaultHandler、 // 20 AON RTC
IntDefaultHandler、 // 21 UART0 Rx 和 Tx
IntDefaultHandler、 // 22 AUX 软件事件0
IntDefaultHandler、 // 23个 SSI0 Rx 和 Tx
IntDefaultHandler、 // 24 SSI1 Rx 和 Tx
IntDefaultHandler、 // 25射频内核命令和数据包引擎0
IntDefaultHandler、 // 26个射频内核硬件
IntDefaultHandler、 // 27射频内核命令确认
IntDefaultHandler、 // 28 I2S
IntDefaultHandler、 // 29 AUX 软件事件1
IntDefaultHandler、 // 30个看门狗计时器
IntDefaultHandler、 // 31定时器0子定时器 A
IntDefaultHandler、 // 32 Timer 0子定时器 B
IntDefaultHandler、 // 33定时器1子定时器 A
IntDefaultHandler、 // 34定时器1子定时器 B
IntDefaultHandler、 // 35计时器2子计时器 A
IntDefaultHandler、 // 36定时器2子定时器 B
IntDefaultHandler、 // 37 Timer 3子计时器 A
IntDefaultHandler、 // 38定时器3子定时器 B
IntDefaultHandler、 //提供39加密核心结果
IntDefaultHandler、 // 40 uDMA 软件
IntDefaultHandler、 // 41 uDMA 错误
IntDefaultHandler、 // 42闪存控制器
IntDefaultHandler、 // 43软件事件0
IntDefaultHandler、 // 44 AUX 组合事件
IntDefaultHandler、 // 45 AON 可编程0
IntDefaultHandler、 // 46动态可编程中断
//源(默认值:PRCM)
IntDefaultHandler、 // 47 AUX 比较器 A
IntDefaultHandler、 // 48个 AUX ADC 新采样或 ADC DMA
//完成、ADC 下溢、ADC 溢出
IntDefaultHandler、 // 49 TRNG 事件
IntDefaultHandler、 //来自振荡器控制的50个组合事件
IntDefaultHandler、 // 51 AUX Timer2事件0
IntDefaultHandler、 // 52个 UART1组合中断
IntDefaultHandler //电池监控器的53个组合事件
};
//*********
//
//! 这是处理器首次开始执行时调用
的代码//! 发生复位事件后。 仅执行绝对必要的设置、
//! 之后调用应用程序提供的 entry()例程。 任何花哨
//! 操作(例如根据复位原因寄存器做出决策、和
//! 将该寄存器中的位复位)仅保留在
//! 应用。
////
*****************
void
ResetISR (void)
{
//
//器件的最终修整
//
SetupTrimDevice();
//
//跳转到 CCS C 初始化例程。
//
_asm (".global _c_int00\n"
" _c_int00");
//
//如果我们返回信号错误
//
FaultISR ();
}
//*********
//
//! 这是当处理器接收到 NMI 时被调用的代码。 此
//! 只需进入无限循环、保持系统状态以供检查
//! 进行调试。
////
*****************
静态空
NmiSR (void)
{
//
//输入无限循环。
//
while (1)
{
}
}
//*********
//
//! 这是处理器收到故障
时调用的代码//! 中断。 这只是进入一个无限循环、保持系统状态
//! 以供调试器检查。
////
*****************
静态空
FaultISR (空)
{
//
//输入无限循环。
//
while (1)
{
}
}
//*********
//
//! 这是处理器收到意外
//!时调用的代码 中断。 这只是进入一个无限循环、保持系统状态
//! 以供调试器检查。
////
*****************
静态空
IntDefaultHandler (void)
{
//
//进入无限循环。
//
while (1)
{
}
}