我正试图跳回重置向量,并从主程序重新运行我的程序。这是我的代码,但不起作用。这有什么问题吗?

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

最佳答案

所有这些注释都是相关的,但是如果您确实需要从任何地方跳转到重置处理程序,有时您需要这样做,特别是当您正在进行引导加载程序和重新编程时,这是您的做法,您非常接近。
在我的例子中,目标Micro是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

那对我有用。所以基本上你少了一个额外的解引用级别。
希望这有帮助。

关于c - 跳转到重置 vector ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37857108/

10-13 09:49