我打算以裸机配置在 P1020RDB 上运行一些简单的应用程序。虽然在核心 0 中运行某些东西相对简单,但我无法在核心 1 上运行任何东西。我编写了以下代码:
volatile unsigned int change_me = 2;
void main(void)
{
change_me += 1;
返回;
}
当在核心 0 上运行它时(例如,通过将二进制文件上传到 0x04000000 并运行“go 0x04000000”),当应用程序结束并且 U-Boot 提示符返回时,我可以看到对应于 change_me 的内存已更新。当运行“cpu 1 release 0x04000000”时,似乎 cpu 1 卡在了某个地方——change_me 的内存位置没有更新,核心永远不会回到我释放它之前的自旋循环(虽然我不知道它是否是应该在一切顺利时返回那里)。当运行“cpu 1 status”时,我可以看到“addr”从 0x1 更新到 0x3,正如内核离开其自旋循环时所预期的那样,但我不知道代码或内存写入是否存在问题,因为我我目前没有调试探针。
据我了解 U-Boot 代码,一旦我释放 cpu 1,它就会为 64MB 页面创建一个 TLB 条目,使用“cpu 1 release”命令中给出的地址(在本例中为 0x04000000)屏蔽为64MB 的倍数。在这种情况下,由于我的可执行文件(文本和数据)从 0x04000000 变为 0x04000028,我希望一切正常。
在最后一次尝试中,我在 0x3ff33500 中部署了我的代码(即在启动期间已经为 cpu1 映射的 4KB TLB 条目中),但结果是相同的——核心 0 运行代码没有问题,而核心 1 似乎丢失了。
当我尝试在 T1042 板上释放辅助内核时得到完全相同的结果,我知道我在某处出错了,但我不明白在哪里。如果有人有任何工作代码的工作示例(没有操作系统的复杂性),那将对我很有帮助。