【问题标题】:How to jump between programs in Stellaris如何在 Stellaris 中的程序之间跳转
【发布时间】:2013-01-01 20:32:34
【问题描述】:

我正在为 Stellaris LM3S1607 芯片开发引导加载程序。 我正在使用 Keil MicroVision4 C 编译器。 这个想法是创建 2 个独立的固件,一个将更新另一个。 在固件 1 中,我下载了固件 2 文件并将其写入地址 0x3200 的闪存。直到这里它正在工作。我还验证了数据是否正确写入闪存。 现在我有两个应用程序。一个是我的 uip 引导加载程序,而 seoncd 一个是我的主要项目。 我想知道如何从第一个程序跳转到位于 0x3200 的第二个程序。

如果有人可以帮我跳,那就太好了。 谢谢

【问题讨论】:

    标签: c embedded bootloader keil


    【解决方案1】:

    这适用于任何 Cortex-M 部件...

    创建一个汇编函数,如:

    __asm void boot_jump( uint32_t address )
    {
       LDR SP, [R0]       ;Load new stack pointer address
       LDR PC, [R0, #4]   ;Load new program counter address
    }
    

    内联汇编语法各不相同;这个例子是 Keil ARM-MDK / ARM RealView。

    然后在引导加载程序结束时:

    // Switch off core clock before switching vector table
    SysTick->CTRL = 0 ;
    
    // Switch off any other enabled interrupts too
    ...
    
    // Switch vector table
    SCB->VTOR = APPLICATION_START_ADDR ;
    
    //Jump to start address
    boot_jump( APPLICATION_START_ADDR ) ;
    

    请注意,在这种情况下,APPLICATION_START_ADDR 是链接应用程序代码的基地址或位置地址(在这种情况下为 0x3200),而不是链接映射中指示的入口点。应用程序向量表位于该地址,向量表的开头包含应用程序的初始堆栈指针地址和程序计数器(实际代码入口点)。

    boot_jump() 函数从应用程序的向量表中加载堆栈指针和程序计数器,模拟复位时从闪存基址(引导加载程序的向量表)加载它们时发生的情况。

    请注意,您必须在应用程序代码的链接器设置中将起始地址设置为与引导加载程序将复制映像的起始地址相同。如果您使用的是 Keil 调试器,您将无法在没有引导加载程序的情况下在调试器中加载和运行应用程序(或者至少在没有正确手动设置 SP 和 PC 或使用调试器脚本的情况下),因为调试器会加载重置向量地址而不是应用程序向量地址。

    在切换向量表之前禁用中断很重要,否则在应用程序初始化之前发生的任何中断都会向量到应用程序的处理程序,并且可能还没有准备好。

    请注意您在应用程序和引导代码中使用的任何外设,如果引导代码已经设置了外设寄存器,则任何关于复位条件的假设都可能不成立。

    【讨论】:

    • 在哪里可以找到 NVIC_SetVectorTable() 函数的头文件?我正在使用 keil Uvision4 编译器和 Stellaris LM3S1607 控制器
    • @Shihab:我很抱歉;那是一个STM32标准外设库调用;我错误地认为它是 CMSIS 的一部分。然而,在 Cortex-M 中设置向量表只是设置 SCB VTOR 寄存器的一种情况。我对 Stellaris 不太熟悉,但看起来你的闪存从零开始,所以表达式可能比我建议的更简单。
    • @Shihab:有关设置向量表地址的确切细节,请参阅 Cortex-M3 编程参考和/或 LM3S1607 参考,我的建议改编自 STM32 库,但您可能想要检查您的特定部分。 TI 还可以提供具有 NVIC 功能的库。
    • 我已经简化了 VTOR 设置;原始代码支持表的 RAM 位置,只有在安装了动态中断处理程序的系统启动后更改表时才需要。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-11
    • 2014-08-02
    相关资源
    最近更新 更多