工具与软件:
您好!
我正在使用 DevBoot 模式、一个多核项目在锁步中使用 R5_0、在双核模式中使用 R5_2/R5_3。 启动我的调试配置后、它连接然后运行 GEL 脚本。 我的问题发生在 main ()之前,所以我禁用了"运行到 main "。
大约10%到20%的时间、我发现 R5_2 (并且只有 R5_2) 由于执行0x0处的第一条指令而具有 UNDEF 异常。
矢量表代码 看起来似乎合理 、因此我意识到 UNDEF 的唯一发生方法是因为指令解释错误、即内核在 应处于 Arm 模式时执行第一条指令时处于 Thumb 模式。 下面的屏幕截图确认了这一点。 当我执行下一条指令时、会发生 UNDEF 异常:

当问题不发生时、这是"正常"状态:

我觉得大约有15%的时间 GEL 脚本没有正确设置 Arm 模式(或错误、意外或以其他方式设置 Thumb)。 这种情况不会在100%的时间发生这一事实表明存在一种竞争状况。
浏览 GEL 文件后、我认为问题可能出在 GEL_Reset()中。
我还注意到、与点击"CPU Reset"按钮相比、GEL_Reset ()之后的其他内核中的 CPSR 其他字段不一致。 当为所有内核点击后者时、所有内核中的 CPSR 始终为0x1D3。
但在 GEL_Reset()之后、R5_2和 R5_3中有各种值、如此处第2列所示:
| 内核 | CPSR 在 GEL_Reset ()之后 | "CPU Reset"之后的 CPSR。 | 结果 |
| R5_0 | 0x000001D3 | 0x000001D3 | GEL_Reset()之后的 CPSR 与 CPU 复位一致。 程序始终运行。 |
| R5_2 | 0x200001D7 | 0x000001D3 | GEL_Reset()之后的 CPSR 不同、但程序将运行。 |
| 0x800001D3 | 0x000001D3 | GEL_Reset()之后的 CPSR 不同、但程序将运行。 | |
| 0xA00001FB | 0x000001D3 | GEL_Reset()之后的 CPSR 不同、但由于 T = 1、程序将无法运行。 | |
| R5_3 | 0x000001DB | 0x000001D3 | GEL_Reset()之后的 CPSR 不同、但程序将运行。 |
| 0x200001D7 | 0x000001D3 | GEL_Reset()之后的 CPSR 不同、但程序将运行。 |
大多数情况下、这种变化会被忽略、因为至少 T = 0 (Arm)且程序可以运行。 但是、有时该变体意味着 T=1且程序立即崩溃。
总之,我认为 GEL_Reset()除了在 R5_0中不能正常工作。
- 为什么 GEL_Reset ()不强制所有内核中具有相同的 CPSR 值(0x000001D3)? 即与点击"CPU Reset"按钮相同吗?
谢谢你。

