问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

中断向量表的基地址设置

创作时间:
作者:
@小白创作中心

中断向量表的基地址设置

引用
CSDN
1.
https://m.blog.csdn.net/qq_52578310/article/details/145861853

在嵌入式系统开发中,正确设置中断向量表的基地址对于系统的稳定运行至关重要。本文将详细介绍如何通过条件编译来设置ARM Cortex-M处理器中的VTOR寄存器,以适应不同的调试和运行环境。

条件编译块,用于设置向量表基址寄存器(VTOR)的值。具体来说,它根据是否定义了DebugerUse宏来决定VTOR的值。

#else
    #ifdef DebugerUse
        S32_SCB->VTOR = (uint32_t)0x00000000;
    #else
        S32_SCB->VTOR = (uint32_t)0x00018000u;//0x0000B000;//0x0000A000;//0x00009400
    #endif

详细解释

  1. #else:这是一个条件编译指令,表示前面的条件不满足时执行这里的代码。
  2. #ifdef DebugerUse:检查是否定义了DebugerUse宏。如果定义了,则执行下面的代码。
  3. S32_SCB->VTOR = (uint32_t)0x00000000;:如果定义了DebugerUse,则将VTOR寄存器设置为0x00000000
  4. #else:如果没有定义DebugerUse,则执行下面的代码。
  5. S32_SCB->VTOR = (uint32_t)0x00018000u;:将VTOR寄存器设置为0x00018000u。注释中还列出了其他可能的地址值(0x0000B0000x0000A0000x00009400),但这些值被注释掉了。

背景信息

  • VTOR(Vector Table Offset Register):这是一个ARM Cortex-M处理器中的寄存器,用于指定中断向量表的基地址。
  • 条件编译:通过使用预处理指令(如#ifdef#else#endif),可以根据不同的编译条件生成不同的代码。这在处理不同的硬件配置或调试环境时非常有用。

总结

这段代码通过条件编译来设置VTOR寄存器的值,以适应不同的调试或运行环境。如果定义了DebugerUse,则VTOR被设置为0x00000000;否则,设置为0x00018000u

在以下情况下,可能需要将S32_SCB->VTOR设置为0x00000000

  1. 调试模式:如果你正在进行调试,并且希望中断向量表位于地址0x00000000,可以通过定义DebugerUse宏来实现这一点。这通常用于调试环境,以确保中断向量表在一个已知的、固定的位置。
  2. 特定硬件配置:某些硬件配置可能要求中断向量表位于地址0x00000000。这取决于具体的硬件设计和启动流程。
  3. 引导加载程序:如果系统使用引导加载程序,并且引导加载程序将中断向量表放置在地址0x00000000,则在启动应用程序时需要将VTOR设置为0x00000000

如何修改

要修改S32_SCB->VTOR的值,可以定义DebugerUse宏。例如:

#define DebugerUse

或者在编译时通过编译器选项定义该宏:

gcc -DDebugerUse -o your_program your_program.c

代码示例

在代码中,条件编译部分如下:

#ifdef DebugerUse
    S32_SCB->VTOR = (uint32_t)0x00000000;
#else
    S32_SCB->VTOR = (uint32_t)0x00018000u;
#endif

通过定义DebugerUse宏,可以确保S32_SCB->VTOR被设置为0x00000000

总结

需要将S32_SCB->VTOR设置为0x00000000的情况通常与调试、特定硬件配置或引导加载程序有关。通过定义DebugerUse宏,可以在这些情况下修改VTOR的值。

是的,在使用引导加载程序(bootloader)时,通常需要将中断向量表的基地址设置为应用程序的起始地址。在你的代码中,这可以通过条件编译来实现。

假设你在使用引导加载程序,并且应用程序的起始地址是0x00018000u,你可以通过以下方式修改代码:

  1. 定义一个宏来区分引导加载程序和应用程序:例如,定义一个BOOTLOADER宏来表示当前代码是在引导加载程序环境中。
  2. 修改条件编译部分:根据是否定义了BOOTLOADER宏来设置S32_SCB->VTOR的值。

修改后的代码示例

#ifdef BOOTLOADER
    S32_SCB->VTOR = (uint32_t)0x00018000u;
#else
    #ifdef DebugerUse
        S32_SCB->VTOR = (uint32_t)0x00000000;
    #else
        S32_SCB->VTOR = (uint32_t)0x00018000u; // 或者其他地址,如 0x0000B000, 0x0000A000, 0x00009400
    #endif
#endif

如何定义宏

你可以在代码文件的顶部定义宏,或者在编译时通过编译器选项定义宏。

在代码文件中定义宏

#define BOOTLOADER

在编译时定义宏

如果你使用的是GCC编译器,可以在编译命令中添加-DBOOTLOADER选项:

gcc -DBOOTLOADER -o your_program your_program.c

总结

通过定义一个BOOTLOADER宏,并在条件编译中使用该宏,可以在使用引导加载程序时将S32_SCB->VTOR设置为应用程序的起始地址0x00018000u。这样可以确保中断向量表正确指向应用程序的中断向量。

#define ConstModelAddr (0x18400u)
#define ManufacturerECUSoftwareVersionNumberAddr (0x18410u)
#define ManufacturerECUCalibrationSoftwareVersionNumber (0x18420u)
© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号