高级会员

- 积分
- 600
- 金钱
- 600
- 注册时间
- 2026-1-29
- 在线时间
- 43 小时
|
以下是针对ZYNQ 7000系列(如7z100开发板)在AMP模式下构建CPU0运行Linux、CPU1运行裸机工程的完整解决方案:
一、关键步骤与配置
硬件配置与内存划分
保留内存区域:需在设备树中为CPU1的裸机程序预留DDR空间,例如在system-user.dtsi中添加以下内容,防止Linux系统覆盖该区域:
reserved-memory {
#address-cells = <1>;
#size-cells = <1>;
ranges;
reserved: buffer@0x1e000000 {
no-map;
reg = <0x1e000000 0x02000000>; // 32MB 预留区域
};
};
修改FSBL地址:在FSBL阶段需设置CPU1的启动地址为预留区域起始地址(如0x1e000000),可通过修改FSBL的CPUSTARTMEM宏实现。
软件配置与编译
Petalinux配置:
禁止Linux使用多核:通过 petalinux-config 进入内核配置界面,手动添加启动参数 maxcpus=1,确保Linux仅运行于CPU0。
修改设备树内存范围:调整Linux可用内存为总内存减去预留区域(如总内存512MB时,设置mem=384M)。
裸机工程配置:
BSP设置:在Vitis中为CPU1的裸机工程启用AMP支持,添加编译标志-DUSE_AMP=1,并禁用时间初始化代码(如删除xil-crt0.s中的bl XTime_SetTime)。
链接脚本:确保CPU1程序的链接地址与预留内存区域一致(如0x1e000000)。
启动流程与BOOT.BIN生成
BOOT.BIN组成:包含FSBL(CPU0)、FPGA比特流(如有)、U-Boot(CPU0的Linux引导程序)、CPU1裸机程序(app_cpu1.elf)。
打包工具:使用Vitis或SDK的Create Boot Image工具按顺序合并各组件,注意CPU1程序的地址需与预留内存匹配。
二、常见问题与调试方法
CPU1无法启动
检查设备树保留内存:确认reserved-memory节点已正确生成,且未被Linux占用。
验证启动地址:通过JTAG调试或打印FSBL初始化信息,确认CPU1的启动地址为0x1e000000。
查看串口输出:检查Linux启动日志中是否有remoteproc相关错误(如未找到CPU1的ELF文件)。
核间通信测试
共享内存验证:编写简单测试程序,让CPU1向预留内存写入数据(如递增计数器),Linux端通过/dev/mem读取并验证。
LED控制示例:在CPU1的裸机程序中控制LED闪烁,同时在Linux中通过echo 1 > /sys/class/leds/...触发,观察硬件响应。
三、参考资料与工具链适配
官方文档:Xilinx应用笔记XAPP1078(AMP模式下Linux+裸机)和UG1186(OpenAMP指南)提供了基础框架。
社区资源:论坛讨论(如Xilinx Forum)中关于maxcpus=1的配置细节可解决Linux抢占CPU1的问题。
总的来说,通过以上步骤,可实现ZYNQ 7000的AMP双核独立运行。若问题仍未解决,建议逐步排查硬件初始化(如DDR配置)、编译器兼容性(如不同版本的Petalinux工具链)及电源管理模块(如禁用不必要的外设以减少干扰)。 |
|