一. 前言
本文依据个人试验及工作经验总理而成,分享出来供大家参考,如有错误或更好的方法望与大家一起探讨。
二. 背景
作者学习Xilinx SDK的时候,发现该平台使用起来遇到各种各样的问题和bug,网上解决方法都是零零散散的或者根本找不到,有时候遇到问题就要卡上几天甚至更久,特别浪费时间。
所以在个人学习期间,就遇到的一些问题整理出来,不能说是很完整的教程,但是希望后来者少踩一些坑和少走一些弯路。
三. 主要内容
Xilinx SDK软件固化后不能启动。
四. 现象
将程序固化到板卡后断电重启板卡,程序不能启动。而在JTAG调试时程序能正常运行;
五. 问题起因
Xilinx SDK提供了2个RS232串口,其中可用1个串口作为调试串口输出调试信息。因2个串口在项目中都需要用到,故调试信息输出时只好改为控制台(ps7_coresight_comp_0)的方式输出,便于查看调试信息定位问题。
六. 问题分析
可能存在的问题如下:
- 程序固化失败,虽然固化软件提示成功,可能存在某些字节写入失败或文件被破坏;
- DDR没有正常工作;
- 启动模式错误,分别为SD卡启动、FLASH启动、JTAG三种模式;
- BSP配置错误;
七. 排除步骤
- 先将程序固化到FLASH中,再在在JTAG调试模式下将FLASH文件读出来进行文件效验,即验证了FLASH正常工作,也验证了文件烧进FLASH后的正确性。确认FLASH读写无误且文件写入后正确。排除了FLASH问题和文件破坏的问题;
- 通过JTAG方式对DDR进行读写验证,分别按bit、字节、双字节和4字节对内存地址从0开始验证1M范围,读写均正常。排了DDR存在的问题;
- 硬件分析拨码开关连线正确性,并将拨码开关拨至FLASH启动经仔细检查确认无误,问题依旧出现不能启动。排除了因启动模式错误的问题。
- 使用Xilinx SDK自带的内存测试程序,不经任何更改固化到板卡,重启板卡后问题依旧出现;
- 将Xilinx SDK自带的内存测试程序,烧录到可正常启动的另一块板卡上,重启板卡后问题依旧出现;
- 修改Xilinx SDK自带的内存测试程序的内存测试起始地址,将测试起始地址改为内存最后1M空间,问题排除可正常启动;
- 修改BSP中stdin和stdout分别改为其中一个串口输出或改为none不输出,问题排除可正常启动;
八. 故障产生原因
- Xilinx SDK程序固化到板卡后,不能擦除DDR中前一部份数据(lscript.ld中ps7_ddr_0基地址大小0x100000),否则程序加载后会将该内存中的数据擦除导致程序无法运行;
- BSP中stdin和stdout不能使用控制台(ps7_coresight_comp_0)输出,因为该方式只有在JTAG模式下才能用,而程序固化后因为没有连接JTAG输出地址为空设备导致程序启动时崩溃。
九. 结论
- 程序中不能对DDR地址0x0~0x100000(lscript.ld中ps7_ddr_0基地址大小0x100000)内存段进行读写,导致破坏程序地址;
- BSP中设置stdin和stdout不能设置为ps7_coresight_comp_0输出方式;