C-跳转重置向量

  • 本文关键字:向量 c embedded
  • 更新时间 :
  • 英文 :


我试图跳回重置向量并从main运行我的程序。这是我的代码,但行不通。有什么问题吗?

 typedef void (*reset_vector_jump)(void); 
 ((reset_vector_jump)RESET_VECTOR_ADDRESS)();

所有这些注释都是相关的,但是,如果您绝对需要跳到有时需要从任何地方重置处理程序,尤其是在执行启动加载程序和重新编程时,这就是您的操作,你很近。

在我的情况下,目标微型是Kinetis ARM Cortex4,我的重置向量是位于位置0x00000004的硬编码。请参阅下面:

/* Interrupt vector table */
__attribute__ ((section (".vectortable"))) const tVectorTable __vect_table = {
    /* ISR name                    No.   Address    Pri Name                          Description */
    &__SP_INIT,                 /* 0x00  0x00000000 -   ivINT_Initial_Stack_Pointer   used by PE */
    (tIsrFunc)&__thumb_startup, /* 0x01  0x00000004 -   ivINT_Initial_Program_Counter used by PE */ 
};

因此,位置0x00000004包含重置处理程序的地址,即&__thumb_startup。所以这就是我所做的:

typedef void (*reset_vector_jump)(void); //exactly as you've done  
#define RESET_VECTOR_ADDRESS ((uint32_t *) 0x00000004) // a pointer to uint32_t
((reset_vector_jump)*RESET_VECTOR_ADDRESS)();//CALL IT

对我有用。因此,基本上,您缺少一个额外的删除。希望这可以帮助。

您正在尝试运行旨在在不是重置状态的处理器状态时从重置状态运行的代码。除最简单的处理器外,所有这些都可能会失败。如果您提出此跳跃的代码已经完成了任何操作,例如配置内存管理单元,启用中断,启动监视程序计时器或配置PLL,则重置代码将在其不在环境中运行期待。

您至少应该禁用中断。然后,您可能会摆脱它,但这取决于处理器的复杂性以及可能已启用了哪些硬件或外围设备并活跃。具体而言,如果启用了MMU,则重置向量可能不再是有效的地址。

X86处理器特异性的一个问题是,对于向后兼容性,它们以16位真实模式 启动。如果尝试跳转时,处理器处于受保护模式中,则重置向量的代码将毫无意义。在任何情况下,切换回实际模式都必须重置处理器。

一种更安全的方法是迫使真正的重置。如果处理器具有监督计时器,那么启用但不提供服务是这样做的一种方法。一些体系结构具有软复位指令,而另一些则具有可以直接执行此操作的重置控制器外围。您的董事会可能与重置别针有GPIO连接以允许此连接。

最新更新