zynq sdk裸机开发调试问题汇总

zynq sdk裸机开发总是时不时的就不能进入中断了, 找来找去的找不到原因. 后来我经过多次尝试. 将问题限位到非常小的范围. 只用了最普通的内部定时器, 开启中断也是偶尔会进去偶尔会进不去.
我的版本是 2018.3
后来多次尝试慢慢的摸索出经验规律, 只要修改过代码重新开始调试.就会再也进不去中断函数. 只有按下开发板上的电源键, 进行重启, 重启后的板子再开始调试就能正常进入中断函数. .
找到一个解决方法了, 有没有更好的方法?
能不能在每次点击调试按钮的时候自动重启系统? 找了下还真有. 如下图,
在这里插入图片描述

Reset entire System 一定要勾上

图上第4点. Reset entire System 一定要勾上, 每次调试的时候会自动重启系统, 这样就可以解决各种莫名其妙的问题. 只要重启能解决的问题, 勾上这个以后, 以后就不再出现了.

zynq的调试使用GDB模式比较稳定

System Debugger模式不行, 不能调试断点. 加了也不会暂停执行,唯有GDB调试是可以的.

如果是野指针访问导致的异常, 那么软重启是解决不了问题的, 必须断电重启. 话说C语言真的就无法捕获这种问题么? 有知道的大神请指教… 异常后基本上就无解. . 定位到有问题的代码那得费老大的功夫了. 纯粹的浪费生命. 还是C#和Java好啊. 给你提示一个"找不到对象,或者NullPoint", 还告诉你是那行代码出问题了. 好怀念 “找不到对象” 的时候啊. C语言直接闷声不吭, 啥反映都没有就嗝屁了. 然后一行一行的循环执行. 最后定位到问题点. 那真是苦不堪言. .
刚写完就找到了方法, 已写新文章,如何定位到异常代码请参考下面的连接.
<<zynq c语言中如果出现bug,进入异常中断如何定位到代码行?>>
https://blog.csdn.net/phker/article/details/142852471

人人为我,我为人人.
总结一下吧, zynq的调试 真是各种问题. 最小系统ps的调试也是一路坎坷.

DDR的芯片型号一定要选对

调试的时候似乎需要用到内存. 如果各种莫名其妙的问题, 停留在了"Disassembly"中, 调试也进不去, 或者偶尔能进去但是调试2下就挂了. 那么大概率是内存芯片型号选择的有问题. 或者DDR内存出问题了,有坏块,或者内存的外围电路有问题, 例如电压问题.

电压问题参考这篇文章, 虽然也没写具体的过程, 但总算是提供了一个可能性.
https://blog.csdn.net/Agustin_Mou/article/details/133266613

PL的时钟FCLK_CLK0 能给尽量给, 重启信号FCLK_RESERT0_N 一定要连上,如下图

在这里插入图片描述

最好是要生成bitstream

不管有没有用到PL部分, 如果总是调试不能进入, 那么可以尝试着生成bitstream文件, 然后导出.

快速调试技巧. 减少PL部分FPGA的烧录

为减少PL部分FPGA的烧录, 可以强制重启PL部分. 参考文章如下.
https://blog.csdn.net/qq_21531457/article/details/124581055?spm=1001.2014.3001.5506
为防止原文章丢失, 已将PlSoftwareReset();函数的代码复制过来, 见下文 代码.

最后附上我自己的测试代码.

main.c 在2018.3版本上跑通了. 各种调试正常.

/******************************************************************************
*
* Copyright (C) 2009 - 2014 Xilinx, Inc.  All rights reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* Use of the Software is limited solely to applications:
* (a) running on a Xilinx device, or
* (b) that interact with a Xilinx device through a bus or interconnect.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* XILINX  BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
* OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*
* Except as contained in this notice, the name of the Xilinx shall not be used
* in advertising or otherwise to promote the sale, use or other dealings in
* this Software without prior written authorization from Xilinx.
*
******************************************************************************/

/*
 * helloworld.c: simple test application
 *
 * This application configures UART 16550 to baud rate 9600.
 * PS7 UART (Zynq) is not initialized by this application, since
 * bootrom/bsp configures it to baud rate 115200
 *
 * ------------------------------------------------
 * | UART TYPE   BAUD RATE                        |
 * ------------------------------------------------
 *   uartns550   9600
 *   uartlite    Configurable only in HW design
 *   ps7_uart    115200 (configured by bootrom/bsp)
 */

#include <stdio.h>
#include "platform.h"
#include "xil_printf.h"
//#include "sleep.h"
#include "xparameters.h" // 包含设备参数信息
#include "xuartps.h"     // 包含UART PS的函数声明


#include "xil_io.h"

///SLCR寄存器,绝对地址,
#define SLCR_UNLOCK_ADDR        0xF8000008
#define SLCR_LOCK_ADDR            0xF8000004

//FPGA_RST_CTRL寄存器,绝对地址,

#define FPGA_RST_CTRL          0xF8000240
#define UNLOCK_KEY          0xDF0D  //解锁码
#define LOCK_KEY            0x767B  //加锁码

#define PL_RST_MASK            0x01//低四位对应FCLK_RESETN[3:0]
#define PL_CLR_MASK            0x00

void PlSoftwareReset(void)
{
    Xil_Out32(SLCR_UNLOCK_ADDR, UNLOCK_KEY);  //解锁

    Xil_Out32(FPGA_RST_CTRL, PL_RST_MASK);  //复位
    Xil_Out32(FPGA_RST_CTRL, PL_CLR_MASK);  //拉起复位

    Xil_Out32(SLCR_LOCK_ADDR, LOCK_KEY);  //加锁
}
//————————————————
//
//                            版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
//
//原文链接:https://blog.csdn.net/qq_21531457/article/details/124581055

XUartPs debug_uart; // UART实例


int debug_init(void) {
    int Status;
    XUartPs_Config *Config;

    //默认使用uart0 如果要用uart1 请改成 XPAR_XUARTPS_1_DEVICE_ID
    Config = XUartPs_LookupConfig(XPAR_XUARTPS_0_DEVICE_ID);
    if (NULL == Config) {
        return XST_FAILURE;
    }

    Status = XUartPs_CfgInitialize(&debug_uart, Config, Config->BaseAddress);
    if (Status != XST_SUCCESS) {
        return XST_FAILURE;
    }

    XUartPs_SetBaudRate(&debug_uart, 115200);

    return XST_SUCCESS;
}

int main()
{
  PlSoftwareReset();
  init_platform();

  debug_init();

    while(1){
    	print("Hello\n");
    	usleep(1000);
    }

    cleanup_platform();
    return 0;
}



本文 后续可能持续更新. 遇到的调试问题估计会持续贴上来. 2024-11-02

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值