问题描述
当CPU复位发生时,应用程序代码开始从复位向量位置运行。应用程序中的.data部分包含可修改的初始化变量。每次应用程序运行时,它都会修改.data节变量,如应用程序代码中所述。如果应用程序依赖于.data初始值,则每次重置处理器时都会导致应用程序产生不可预测的结果。
解决/修复方法
这个问题可以通过多种方式表现出来,但是一个例子是malloc可能在重置后返回NULL指针。发生这种情况是因为malloc依赖于.data部分内的变量来正常运行。 方法1
- 创建一个放置在’copydata.c’中的’CopyData’函数,将数据段从flash复制到最终目的地,参见( Xilinx XAPP642 )。
void copydata(void){int * src_rom =(int *)XPAR_FLASH_MEM0_BASEADDR; //指针src_rom获取flash int的基地址* dst_ram =&__ data_start; //指针dst_ram获取.data节的值(地址)int * end_ram =&__ data1_end; //指针end_ram获取.data1节的结束地址while(dst_ram <end_ram){//将数据从ROM复制到RAM * dst_ram ++ = * src_rom ++; } return; } / * copy.c的结尾* /
- 将$ EDK / sw / lib / ppc405 / src / xil-crt0.s复制到项目目录中。
- 在xil-crt0.s文件中的bl main之前添加bl copydata:
/ *调用__init * / bl __init / *复制数据部分* / bl copydata / *让她撕开* / bl main
- 在EDK Shell中编译xil-crt0.s和copydata.c:
- 为您的软件应用程序添加-B./<path_to_copydata.o_and_xil-crt0.o_files>/额外编译开关。
- 编译您的软件应用程序。
- 从软件应用程序的ELF中将数据部分提取为二进制格式:
- 使用flashwriter将flash.bin从基址开始写入闪存器件。
方法2
.data:{。 = ALIGN(4); __data_start =。; *(。data)*(。data。*)*(。gnu.linkonce.d。*)__ data_end =。; }> ilmb_cntlr_dlmb_cntlr / *创建一个* / .datacopy:{。 = ALIGN(4); __datacopy =。; 。 + = SIZEOF(.data); }> ilmb_cntlr_dlmb_cntlr
#include“xparameters.h”#include“stdio.h”#include“xutil.h”// =========================== ========================= volatile int i = 0xDEADBEEF; extern unsigned char __datacopy; extern unsigned char __data_start; extern unsigned char __data_end; int main(void){unsigned char * dataCopyStart =&__ datacopy; unsigned char * dataStart =&__ data_start; unsigned char * dataEnd =&__ data_end; if(i == 0xDEADBEEF)while(dataStart <dataEnd)* dataCopyStart ++ = * dataStart ++; else while(dataStart <dataEnd)* dataStart ++ = * dataCopyStart ++; print(“ - 输入main() - \ r \ n”); i = 0; print(“ - 退出main() - \ r \ n”);返回0; }
没有回复内容