
首先在Zynq的tab下点击“memeryinterface”出现PS7 DDR Configuration 窗口,为ZEDboard板卡上使用DDR3作为外部存储器,所以“Enable DDR Controller”要选上就连上线了。
在ZedBoard 的硬件用户手册上说使用了MT41K128M16HA-15E型号的DDR3颗粒,与原理图有所不同,其实Micron的这2种颗粒都是DDR3的,不过MT41J仅是15V的,而MT41K是可以使用135V电压的,当然也兼容15V。
外部存储器介绍:
存储器的种类很多,按其用途可分为主存储器和辅助存储器,主存储器又称内存储器(简称内存),辅助存储器又称外存储器(简称外存)。内存储器最突出的特点是存取速度快,但是容量小、价格贵;外存储器的特点是容量大、价格低,但是存取速度慢。
内存储器用于存放那些立即要用的程序和数据;外存储器用于存放暂时不用的程序和数据。内存储器和外存储器之间常常频繁地交换信息。外存通常是磁性介质或光盘,像硬盘,软盘,磁带,CD等,能长期保存信息,并且不依赖于电来保存信息,但是由机械部件带动,速度与CPU相比就显得慢得多。
使用Xilinx SDK开发 zynq,如果不注意修改堆栈大小,运行会直接卡死崩掉。因为SDK开发属于裸机程序开发了,内存需要自己管理,而带系统的由系统管理。
首先在声明变量的时候在后面增加attribute,然后在Linker Script里面做如下修改:双击打开lscriptld,在GUI的Available Memory Region里面增加需要的内存区域。当然这一步也可以直接用Text Editor编辑lscriptld完成。右键单击lscriptld,单击Open With->Text Editor。在其中增加matrix的定义。
XUartPs Uart_Ps; //定义一个全局变量,这里的XUartPs应该是一个宏定义变量
int main()
{XUartPs_Config Config; //定义一个XUartPs_Config的指针变量,这里的XUartPs_Config应该是一个宏定义变量
int Status;
int SentCount = 0, RecvCount = 0; //以上两行定义三个整形变量
u8 HelloZynq[] = "Hello Zynq\n"; //定义一个u8的字符串变量,这里的u8应该是一个宏定义变量
u8 RecvBuf[3] = ""; //同上
XGpio Gpio; //定义一个XGpio类型的变量,这里的XGpio应该是一个宏定义变量
XGpioPs Gpiops; //定义一个XGpioPs类型的变量,这里的XGpioPs应该是一个宏定义变量
XGpioPs_Config ConfigPtr; //定义一个XGpioPs_Config的指针变量,这里的XGpioPs_Config应该是一个宏定义变量
u8 axi_Gpio_Data, ps_Gpio_Data; //定义两个u8类型变量,这里的u8应该是一个宏定义变量
Config = XUartPs_LookupConfig(XPAR_PS7_UART_1_DEVICE_ID); //调用XUartPs_LookupConfig函数
if (NULL == Config) { //判断 Config变量是否为NULL空值
return XST_FAILURE;} //是的话,返回XST_FAILURE值
Status = XUartPs_CfgInitialize(&Uart_Ps, Config, Config->BaseAddress);//调用XUartPs_CfgInitialize 函数
if (Status != XST_SUCCESS) { //XST_SUCCESS应该是一个预先定义好的常量
return XST_FAILURE;}
while (SentCount < (sizeof(HelloZynq) - 1)) { //通过判断SentCount的大小,退出循环
SentCount += XUartPs_Send(&Uart_Ps, &HelloZynq[SentCount], 1);} //调用XUartPs_Send函数
Status = XGpio_Initialize(&Gpio, XPAR_AXI_GPIO_0_DEVICE_ID);//调用XGpio_Initialize函数
if (Status != XST_SUCCESS) {
return XST_FAILURE;}
XGpio_SetDataDirection(&Gpio, 1, 0x0); //调用XGpio_SetDataDirection函数
ConfigPtr = XGpioPs_LookupConfig(XPAR_XGPIOPS_0_DEVICE_ID);//调用XGpioPs_LookupConfig函数
Status = XGpioPs_CfgInitialize(&Gpiops, ConfigPtr, ConfigPtr->BaseAddr);//调用XGpioPs_CfgInitialize函数
if (Status != XST_SUCCESS) {
return XST_FAILURE;}
XGpioPs_SetDirection(&Gpiops, 2, 0xF); //调用XGpioPs_SetDirection函数
XGpioPs_SetOutputEnable(&Gpiops, 2, 0xF);//调用XGpioPs_SetOutputEnable函数
while (1){ //进入循环
RecvCount = 0;
while (RecvCount < 3) {
while (!XUartPs_IsReceiveData(Config->BaseAddress)); //调用XUartPs_IsReceiveData函数
XUartPs_Recv(&Uart_Ps, &RecvBuf[RecvCount], 1);//调用XUartPs_Recv函数
if (RecvBuf[RecvCount] == '\r') {
RecvBuf[RecvCount] = '\n';
XUartPs_Send(&Uart_Ps, &RecvBuf[RecvCount], 1);//调用XUartPs_Send函数
break; }
XUartPs_Send(&Uart_Ps, &RecvBuf[RecvCount++], 1);}//调用XUartPs_Send函数
if (RecvBuf[0] >= '0' && RecvBuf[0] <= '9') axi_Gpio_Data = RecvBuf[0] - '0';
else if (RecvBuf[0] >= 'a' && RecvBuf[0] <= 'z') axi_Gpio_Data = RecvBuf[0] - 'a' + 10;
else if (RecvBuf[0] >= 'A' && RecvBuf[0] <= 'Z') axi_Gpio_Data = RecvBuf[0] - 'A' + 10;
XGpio_DiscreteWrite(&Gpio, 1, axi_Gpio_Data); //调用XGpio_DiscreteWrite函数
if (RecvBuf[1] >= '0' && RecvBuf[1] <= '9') ps_Gpio_Data = RecvBuf[1] - '0';
else if (RecvBuf[1] >= 'a' && RecvBuf[1] <= 'z') ps_Gpio_Data = RecvBuf[1] - 'a' + 10;
else if (RecvBuf[1] >= 'A' && RecvBuf[1] <= 'Z')ps_Gpio_Data = RecvBuf[1] - 'A' + 10;
XGpioPs_Write(&Gpiops, 2, ps_Gpio_Data);}//调用XGpioPs_Write函数
return 0;}
//程序的本质就是不断的调用不同的函数,然后分析返回值,判读返回值的结果,是否要继续执行下面的代码。
可能是堆栈溢出、数组溢出、访问指向空地址的指针未声明的函数调用跑飞等原因。
1、堆栈溢出:以TI CCS33为例,程序运行的堆与栈的空间大小都是由软件设计师自己定义分配大小的。一般出现问题就是为DSP软件运行设置的堆或栈的空间太小,而导致程序不能正常运行。堆或栈空间太小编译生成out文件时,是不会报错的。TI ccs33中Stack Size是0x400(即默认的配置),Heap Size是0x200(即默认配置)。如果程序出现莫名的跑飞情况可以试试改改这两个参数值。
2、数组溢出:数组溢出就是定义数组的空间大小,而通过数组下表访问时,下标超过了数组的边界,这样可能改写其他地址的数据,造成程序跑飞。有可能是使用未初始化的变量作为下标方位数组(这种情况编译器通常会有warning提示);还有可能是通过计算关系计算下标,而在异常的情况下下标会越界(应用下标前对下标的范围进行判定,正常后再使用)。
3、访问指向空地址的指针:访问未初始化的空指针也可能出现DSP跑飞的情况;或者将指针作为函数参数传递时,指针未指向具体的地址,而在函数中使用,可能出现死机的情况(也可能不会,在ccs33下)。这些“指针未初始化”或“指针未指向具体变量”的问题编译器不会提示错误,最多提示警告。而“指针未指向具体变量”作为函数参数传递,在VC2005中,编译时不会报错,但有警告,但是在debug状态下运行时直接就跑死了,也算是暴露问题了。
4、未声明的函数调用跑飞:在TI ccs33中一些函数没有显式声明,而直接调用可能达不到函数预期的效果或者就是跑飞。以前写过一个CCS环境下因printf函数跑飞的问题。其实未声明函数调用,在zynq的开发平台vivado的SDK中也出现过,编译不报错,运行就是达不到预期的效果。
原因是系统崩溃了,需要关闭重启。
1把单片机当做一个ROM芯片,早期的单片机都是如此。
将单片机放在通用编程上编程时,就像给28C256这样的ROM中写程序的过程一样。
只是不同的单片机使用的端口,编程用的时序不一样。
2像AT89S52或AVR单片机一样,在单片机上有SPI接口,这时用专用的下载线将程序烧写到单片机中。
程序故障。zynq_flashexe已停止工作是说明在 *** 作时有不违规的 *** 作,导致flash程序错误。
1、首先,将zynq_flashexe软件程序关闭。
2、然后,再重新打开即可重新继续工作。
在Zynq-7000上编程PL大致有3种方法:1用FSBL,将bitstream集成到bootbin中2用U-BOOT命令3在Linux下用xdevcfg驱动。步骤:1去掉bitstream的文件头用FSBL烧写PLImages没有什么好说的,用XilinxSDK的CreateBootImage工具即可完成,不再赘述。用后两种方法需要把bitstream文件的文件头用bootgen工具去掉。一个典型的bif文件如下所示:the_ROM_image:{[bootloader]elfbitelf}bif文件可以用文本编辑器写,也可以用XilinxSDK的CreateBootImage工具生成。然后在命令行下用以下命令即可去掉bitstream文件的文件头。bootgen-imagebif-splitbin-oiBOOTBIN"-split”参数可以生成以下文件:bitbin2在U-BOOT下烧写PLImage命令”fpgaload”和”fpgaloadb”都可以。区别是前一个命令接受去掉了文件头的bitstream文件,后一个命令接受含有文件头的bitstream文件。在OSL20142上,缺省编译就可以完整支持写入PLImage的功能。但是在Petalinux201310下,尽管可以在U-BOOT下看到命令”fpga”,还需要在文件/subsystems/linux/configs/u-boot/platform-toph中增加以下内容后重新编译才可以支持具体的功能。/EnablethePLtobedownloaded/#defineCONFIG_FPGA#defineCONFIG_FPGA_XILINX#defineCONFIG_FPGA_ZYNQPL#defineCONFIG_CMD_FPGA#defineCONFIG_FPGA_LOADFS在OSL20142U-BOOT中,具体的功能是在zynqplc的zynq_load()中实现的。3在Linux下烧写PLImageOSLLinux2014201中已经含有xdevcfg驱动了(之前就有,不过本文是在这个版本上验证的),直接用以下命令就可以完成PLImage写入。cat/bitbin>/dev/xdevcfgLinux驱动的源代码在xilinx_devcfgc中。因为驱动的编号是通过alloc_chrdev_region()动态分配的,所以不需要手工用mknod命令手动建立设备节点。在Linux驱动中,每次往DevCfg中写入4096字节,直到全部写完。4在用户程序中烧写PLImage目前没有现成的源码来完成这个功能,不过可以用mmap()把DevCfg的寄存器映射到用户程序的虚地址中,然后参考一些现成的软件代码来完成这个功能:FSBL中的pcapcU-BOOT中的zynqplcLinux中的xilinx_devcfgcXilinxSDK中的例子。例子位于以下位置,随SDK的版本会有变化。C:\Xilinx\SDK\20141\data\embeddedsw\XilinxProcessorIPLib\drivers\devcfg_v3_0\examples\indexhtml小结:DevCfg外设内部有自己的DMA,只需要简单的配置PLImage的基地址和长度到DevCfg寄存器,就可以完成Zynq-7000PLImage的加载。Xilinx已经提供了灵活的解决方案,如果开发者要把这个功能集成在自己的应用程序中,也有很多的代码可以参考,并不是很困难的任务。
以上就是关于zynq ddr如何连线全部的内容,包括:zynq ddr如何连线、xilinx sdk中linker script的内存范围如何设置、程序不懂,请大神在每句后标注解释,万分感谢等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)