This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] OMAP-L138:从固件内部强制跳转至_c_int00

Guru**** 2473260 points
Other Parts Discussed in Thread: OMAP-L138

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1465592/omap-l138-forced-jump-to-_c_int00-from-inside-the-firmware

器件型号:OMAP-L138

工具与软件:

您好!

我有一个 OMAP-L138系统、此系统具有2个闪存芯片:一个在 SPI1上、其中包含一个程序以检查另外一个闪存(SPI0)是否有两个有效固件版本。

两个闪存的用途是始终能够从失败的固件更新中恢复。 SPI1闪存中的固件将检查 SPI0闪存是否有有效的固件版本、并解析两者最新版本的 AIS 脚本、并将该固件加载到解析的位置。 加载完成后、SPI1固件(我自己的引导加载程序)应跳转至选定运行的 SPI0固件的_c_int00地址。

我尝试了各种技巧来强制我的引导加载程序跳转到_c_int00地址、毫无希望。

我的尝试之一是以下相对简单的代码:

 void (* func_ptr)(void)=(void (*)(void))_c_int00;
 func_ptr();

c_int00的地址是正确的地址(在本例中为0x80000AB7)、但当我在调试模式下单步执行时该地址不起作用。

任何巧妙的想法 如何强制执行到一个地址。

此时 DSP 未激活、它只是正在运行的 ARM。

边注:如果我将地址更改为正常函数、就可以正常工作。 效果

INT I = 0;

void func1 (void)

 I++;
}

INT main

unsigned long address=&func1;
void (* func_ptr)(void)=(void (*)(void))地址;

 while (1)

 {

  func_ptr();
 }

}

谢谢!

克劳斯