有问题请教下论坛里的各位大佬: 我在Zynq开发板上以SGI的方式实现了AMP架构的交互。其中cpu0运行petalinux,cpu1则是裸机。我在能够相互通信的基础上,对裸核增添了硬件GPIO的控制。坏消息是,我的裸机对于GPIO的初始化影响了Linux,导致上电后linux无法启动。随后怀疑是linux启动时对硬件GPIO进行了加载或注册访问动作,导致资源冲突。但实际上我的linux端没有实际代码去操作或访问GPIO。甚至我注释掉了设备树中相关的GPIO节点也无法解决。暂时的解决方案是linux端完全启动后,裸机再进行GPIO初始化,双核交互正常。于是我在启动后加入GPIO翻转逻辑,结果系统能够正常进入,双核通信失效,GPIO翻转失效。我能确定我裸机的GPIO代码正确,硬件没问题。
- int main()
- {
- m_xScuGic.initObject(); // 中断初始化
- g_cores.initDoubleCores(); // 双核通信初始化
- g_cRandTimer.startTimeCounter();
- g_cTestTimer.startTimeCounter();
- if(g_cTestTimer.getElapsedSeconds() > 30)
- {
- g_cPLLED.initObject(XPAR_AXI_GPIO_4_DEVICE_ID, true, false, CQswuXGpioExt::enGpioIODirection::allOutput); // PL-LED
- g_cTestTimer.resetTimerCounter();
- }
- while(1)
- {
- if (g_cRandTimer.getElapsedMilliSeconds() > 500)
- {
- uint32_t udata = rng.generateRandomNumber(1, 10000);
- Xil_Out32(g_cores.m_uOCMADDR, udata); // 写入数据到OCM
- XScuGic_SoftwareIntr(&g_cores.m_xIntc, g_cores.m_uCpu0SGIID, g_cores.m_uCpu0MaskID); // 触发CPU0中断
- // g_cPLLED.togglePins(1);
- g_cRandTimer.resetTimerCounter();
- }
- }
- return 0;
- }
复制代码如上图所示,如果取消注释行,就会出现上述问题,如果注释掉,双核就能正常通信。我想知道原因。毕竟我的linux已经正常启动了,也没有明确的App代码访问该GPIO设备。我不清楚该怎么解决这个错误。
|