当前位置:首页 > 技术 > 正文内容

ZYNQ双核调试问题:CPU1程序下载失败及APB总线错误分析

访客 技术 2026年7月20日 4

问题描述

在ZYNQ平台上开发双核应用程序时遇到了一个棘手的问题。对代码进行修改后,Run模式运行出现异常:第一个核心(CPU0)可以正常下载程序并启动,但第二个核心(CPU1)无法完成程序下载。

错误信息

具体的错误提示如下:

Memory write error at 0x200A0000. AP transaction timeout
Cannot reset APU. APB AP transaction error, DAP status 0xF0000021

调试过程

通过XSDB Console获取了详细的调试日志。从日志中可以观察到以下关键信息:

CPU0的程序下载过程正常完成:

Info: ARM Cortex-A9 MPCore #0 (target 2) Stopped at 0x0 (Vector Catch)
Downloading Program -- /home/fang/workspace/zynq7015/25_ov5640_lcd/vitisnew/hello_world/build/hello_world.elf
        section, .text: 0x00100000 - 0x001194eb
        ...
Setting PC to Program Start Address 0x00100000
Successfully downloaded /home/fang/workspace/zynq7015/25_ov5640_lcd/vitisnew/hello_world/build/hello_world.elf
Info: ARM Cortex-A9 MPCore #0 (target 2) Running

CPU1的程序下载时出现问题:

Info: ARM Cortex-A9 MPCore #1 (target 3) Stopped at 0x0 (Vector Catch)
Downloading Program -- /home/fang/workspace/zynq7015/25_ov5640_lcd/vitisnew/cpu1_apriltag/build/cpu1_apriltag.elf
        section, .text: 0x20080000 - 0x200a4d03
        ...
aborting, 1 pending requests... 
Failed to download /home/fang/workspace/zynq7015/25_ov5640_lcd/vitisnew/cpu1_apriltag/build/cpu1_apriltag.elf
Info: ARM Cortex-A9 MPCore #1 (target 3) Running (APB AP transaction error, DAP status 0xF0000021)

问题分析

仔细观察日志的时间顺序,发现了一个重要的现象:CPU0的程序下载完成后会立即启动运行,然后才会开始下载CPU1的程序。这提示问题可能出在CPU0的启动代码中。

经过逐步排查,找到了问题的根本原因:当CPU0已经启动而CPU1尚未启动时,如果在CPU0中执行内存写入操作并调用数据缓存刷新函数,会导致CPU1无法正常启动。

问题代码

导致问题的典型代码如下:

// 问题代码示例
#define DDR_BASE_ADDR  XPAR_PS7_DDR_0_BASEADDRESS
#define OFFSET_ADDR    0x1000000

volatile u8 *shared_buffer = (volatile u8 *)(DDR_BASE_ADDR + OFFSET_ADDR);

// CPU0中执行的代码
shared_buffer[2400] = 0xAA;  // 向共享内存区域写入数据
Xil_DCacheFlush();           // 刷新数据缓存

原因解释

这个问题涉及到ZYNQ的双核缓存一致性机制。当CPU0执行Xil_DCacheFlush()时,会尝试与CPU1进行缓存同步操作。但如果CPU1尚未启动或处于异常状态,APB总线事务会超时,从而导致整个调试器连接失败。

具体来说:

  • Xil_DCacheFlush()函数会清理数据缓存并确保数据写回到DDR内存
  • 在双核系统中,这个操作可能需要与其他核心进行同步
  • 当CPU1未就绪时,调试器无法完成APB事务,导致下载失败

解决方案

针对这个问题,有几种可行的解决方案:

方案一:延迟缓存刷新

在CPU1启动完成后再执行缓存刷新操作。

方案二:使用信号量同步

在CPU0中等待CPU1准备就绪后再进行内存操作和缓存刷新。

方案三:修改启动顺序

调整CPU1的启动时序,确保在CPU0执行缓存操作前已经完成初始化。

总结

在ZYNQ双核开发中,需要特别注意多核之间的启动时序和缓存同步问题。建议在设计双核通信机制时,建立完善的同步机制,避免因为时序问题导致的调试失败。

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。