针对ad-saver的调试记录

跑通例程ad_saver

目前的配置
FPGA 端:
写时钟200K,读时钟与主频时钟相同,24M 占比50%
fifo的写使能,原来设置的写递增数时默认是1 ,AD采集时另一个,改成写递增数时与写递增数的写使能保持一致,AD采集时不变,这样,在模拟数据时,数据一产生就开始往里写,
具体的流程如下
在这里插入图片描述
在FPGA输出端采用chipscope抓取到的数是正确的 ,隔一段时间读取一组数,从1-256开始,一组一组递增
ARM端数据保存后采用scp指令上传 在MATLAB读出来是正常递增数 int16的时候是正常数值,int32时能看到递增走势,但是数据是位数变换过的

(测试换成其他规律的数在FPGA端写入也能正常读出)
在这里插入图片描述

在ad_saver基础上配置TCP/IP

只配置TCP之后可以正常运行,无报错
尝试:添加测试数组 分别采用数组逐个赋值和memcpy的形式,进行对比
代码如下:

/* create test array to show data */
      
        char tst1[SR_BUFFER_SIZE];
        char tst2[SR_BUFFER_SIZE];
        char k =0;
        for(k=0;k<50;k++)
        {
      	tst1[k] = *(data+k);
      	printf("now count is %d   and  tst1[%d]= %x\n",count,k,tst1[k]);
        }
        memcpy(tst2,data,50);
        char m=0;
        for(m=0;m<50;m++)
        {
      	printf("now count is %d   and  tst2[%d]= %x\n",count,m,tst2[m]);
        }
  

发现一,对于tst1,不管tst1和计数k使用int还是char,结果打印出来都是一样的数,但不明确是几位的
tst2 因为使用的memcpy是属于按字节计数的内存拷贝,所以出来的结果是8位一读 0010 0020 0030…
结果:
在这里插入图片描述
为了看清楚具体的位数,对FPGA端的数据进行改变,
在这里插入图片描述
对比之后发现逐个赋值存在丢数行为,memcpy表达正确
在这里插入图片描述
所以,放弃逐个赋值给数组的情况,这个错误的原因猜想是LINUX和Windows一个是32位机一个是64位的原因,还是uint16_t *data? 不去确诊了,放弃这种办法,采用memcpy 内存拷贝

发现二 ,逐个打印时,count计数,发现不管是tst1还是tst2 ,当count为2时,数组显示均为0值,除count为2 ,其他每组count对应的值都是重复的
1.会不会是memcpy数目太少,增加拷贝数目到300,不改变打印的数组值

/media/addtcp/tx1

 /* create test array to show data */
       
        char tst[SR_BUFFER_SIZE];
        memcpy(tst,data,300);
        char m=0;
        for(m=0;m<50;m++)
        {
      	printf("now count is %d   and  tst2[%d]= %x\n",count,m,tst2[m]);
        }

结果没有变化
2. 先放弃,观察一下数组整体的正确率 把数组扩大到SR_BUFFER_SIZE

char tst[SR_BUFFER_SIZE];
        memcpy(tst,data,SR_BUFFER_SIZE);
        char m=0;
        for(m=0;m<SR_BUFFER_SIZE;m++)
        {
      	printf("now count is %d   tst[%d] = %x\n",count,m,tst[m]);
        }

打印结果,循环tst[0-255] 结果从0 0 1 0 -------0 0 40 0(十进制的64)
SR_BUFFER_SIZE = 256? 错误
调整大小

 char tst[4096];
        memcpy(tst,data,512);
        char m=0;
        for(m=0;m<512;m++)
        {
      	printf("now count is %d   tst[%d] = %x\n",count,m,tst[m]);
        }
  

还是不对,打印到256,

因为char m , 试过改成uint16,证实确实与m有关,改大点,改成long m=0; 同时打印的数据也增大,
改大点 写入的数是32位的1-2048。2048*8=16384 所以16384可以打印一组循环,改数组大小,如下
/media/addtcp/tx2

        /* create test array to show data */
        char tst[16392];
        memcpy(tst,data,16392);
        uint16_t m=0;
        for(m=0;m<16392;m++)
        {
      	printf("now count is %d   tst[%d] = %x\n",count,m,tst[m]);
        }

可以打印出结果,从 0 0 1 0 打印到 0 0 0 8(2048),再 0 0 1 0
在这里插入图片描述
但是不确定这个后面的这个0010是之前的数循环打印,还是新的数,在FPGA端更改数值,1-2048后跳转到 15++
在matlab端也有体现
在这里插入图片描述
这是第一组数,后面其他的都是打开2048-----15------ 2048----15 证明数据在不断更新
至此,LINUX存档为 home/addtcp/addtcpconfig

加入TCP传输

取消打印tst数据的部分
加入TCPserver程序

/media/addtcp/tx3

while (1) {

                bzero(send_buf, sizeof(send_buf));
                //char *str = fgets(send_buf, sizeof(send_buf), stdin);
                 char *str = memcpy(send_buf,tst,sizeof(send_buf));
                 if (str == NULL) {
                    perror("fgets");
                    goto err;
                }
                if (send(conn_fd, send_buf, strlen(send_buf) - 1, 0) < 0) {
                    perror("send");
                    goto err;
                }
            }

出现的结果是,MATLAB读到的数据
在这里插入图片描述
但是存在问题,传输的数据,按偶数来读的话,读到1-256递增,257开始出现乱码跳变
在这里插入图片描述
修改TCP传输的BUFFER_SIZE 4096
可以传输到1024 ,之后为0有八百多位,然后乱码,证实与TCP设置的传输大小有关

测试打印程序中各个宏定义的数值大小:

         LOG_DEBUG("just for test SR_BUFFER_SIZE = %d\n",SR_BUFFER_SIZE);
         LOG_DEBUG("just for test node->SR_buffer = %d\n",node->SR_buffer);
         LOG_DEBUG("just for test  node->size = %d\n",node->size);

结果如下:
在这里插入图片描述

所以,试着讲传递的所有大小都改成1024*2048的大小,保证一次传一组,没有丢失
ARM端
/media/addtcp/tx4

#define BUFFER_SIZE     1024*2048   // buf size

取消ARM端打印send_buf 的值

MATLAB端,创建连续数组读取数值

clear all
fclose all;
t = tcpip('192.168.1.5',9090)
t.timeout = 30;
t.inputBufferSize =36000;
t.outputBufferSize=36000;
t.byteorder='littleEndian';

 fopen(t);
 fwrite(t,'hello');


for i=1:1000
    a{i}= fread(t,2048,'uint16');
end

fclose(t);

结果:
一共接收到512个数组存数,每个数组存2048个16位的数
计算 5122048uint16 = 102420488
也就是说只读取了一组2M的8位数

在这里插入图片描述
打印出来的结果如下:
在这里插入图片描述
MATLAB端显示还有数据没有读完
在这里插入图片描述

修改MATLLAB端的读数据大小
在这里插入图片描述
a{512}正常,a{512}的第2048位是265,
a{513}-a{1023}为0,
a{1024}乱码,a{1025}从第140位是1开始正常递增到2048后从10 开始递增
a{1537}正常递增到第138位是265之后为0
(换数,还是这几组数相应的位置开始突变)
在这里插入图片描述

更改MATLAB端读取的数组大小
改到数组a到3000
前面的变化一样
a{1537}正常递增到第138位是265之后为0
a{2048}乱码 ,a{2049}的第278位是1开始递增 然后递增到2048之后又从10开始递增
a{2561}递增到第276位是265之后为0
在这里插入图片描述
说明只能读一组数据 5122048 int_16 == 10242048char_8 然后停一组数时间空着,继续重复读数

问题修改:修改ARM端循环
/media/addtcp/tx5/

while(!quit){
count++;
      
pid>0 (send){
bzero send_buf
    |
wait data
    |
get data node
    |
get upp data
    |
send data
    | 
make free list/node again
}

pid=0 (receive)

}

/media/addtcp/tx6: 把循环改到tcp内部

pid>0 (send){
while(!quit){
bzero send_buf
    |
wait data
    |
get data node
    |
get upp data
    |
send data
    | 
make free list/node again
}
}

pid=0(receive)

/media/addtcp/tx6.1: 在tx6的框架下改成count%2

更改为两个BUFFER轮流读写
方法一:在同一个循环下,轮流用两个buffer,采用num
写入部分: if num =0, buf1 <—data,num+1;
else buf2 <—data, num-1;
读出部分: if num =1,send_buf<—buf2
else send_buf <—buf1
结果:只读一次,结果为0 ,读的最初的buf2的默认值0

方法二,采用总体的一次一个buf
count 计数 count为偶数,和count为奇数
/media/addtcp/tx8
测试轮换之后的send_buf,暂时不接入TCP

if(count%2==0){
         bzero(buffer1,SR_BUFFER_SIZE);
         memcpy(buffer1, data, SR_BUFFER_SIZE);
         LOG_DEBUG("memcpy data to buffer1 ");
        }
        else{
         bzero(buffer2,SR_BUFFER_SIZE);
         memcpy(buffer2, data, SR_BUFFER_SIZE);
         LOG_DEBUG("memcpy data to buffer2");
        }
        
        
        if (count%2==0)            
          { 
              memcpy(send_buf, buffer2, SR_BUFFER_SIZE);   // buffer1 busy 
              LOG_DEBUG("scp buf2 to send  ");
          } 
          else                             
          {                           
              memcpy(send_buf, buffer1, SR_BUFFER_SIZE);  // buffer2 busy 
              LOG_DEBUG("scp buf1 to send  ");
          } 
          int k = 0;
          for(k=0;k<16;k++){
          printf("send_buf[%d] == %x\n ",k,send_buf[k]);
          }

测试结果如下:
当FPGA端输入1-2048,10-2048,10-2048这种循环时
send_buf 的打印信息是,
在这里插入图片描述
可以看到send_buf接收到的是不断变化的数据,
试过如果FPGA换成一直1-2048递增,打印出来的结果
自count=4起一直是和count=2一样的打印结果,表明send_buf接收的数据正确

/media/addtcp/tx8.1
把send_buf 接入到TCP 中

 pid = fork();
        if (pid > 0) {
           
            while (1) {
            
                if (send(conn_fd, send_buf, strlen(send_buf) - 1, 0) < 0) {
                    perror("send");
                    goto err;
                }
             }

结果,直接结束进程
在这里插入图片描述
尝试 memcpy一个测试数组,用来中转一下send_buf
/media/addtcp/tx8.2 一样的报错
在这里插入图片描述

/media/addtcp/tx9
直接按照count的奇偶标准,直接给tcp
在这里插入图片描述在这里插入图片描述

更改,在tcp端 只传输一个buffer给matlab
结果:每次运行count都只显示一个count=2; 正常是指从1-2018,10-2048一组数
buffer2 运行结果:
0-------a{513}正常---------a{1025}乱码-0---------a{1537}的140位开始正常------a{2049}乱码- 0----------a{2561}的278位正常-----------

buffer1 运行结果:
正常-----a{513}乱码到第435位正常----------a{1025}乱码后第870位正常------a{1537}的868位(265)乱码—1034位正常--------a{2049}的1302位(265)乱码----1738位正常-------

说明只有一组数在循环传递,并且有规律的出现乱码

最终例程 tx6.3
将tx6.3 去掉测试打印的数据显示之后,移入mytest的all_addtcp/addtcplastok,即完成上传数据链路的所有, 所有例程均保存在mytest/all_addtcp中

接下来的例程全部在my_test/add_tcp_uart,

添加uart传输部分

1.单独测试uart模块,把原来的uart读写改成单写,去除初始需要手动输入配置的所有内容

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值