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