cuter

【笔记】近期总结

3
阅读(961) 评论(17)

有一阵子没有更新博文了...

人的惰性也是有惯性的,而且一旦停下来,再次开始就有了一些难度。就好像汽车在启动的时候油耗往往是最高的,跑起来之后,油耗反而会下降。


最近新接手一个比较急的项目,拿到手之后,发现软件简直一塌糊涂,好在功能不是特别复杂,看了看代码,发现还能hold住。项目期间,有一些体会,记录下来,作为备忘。


硬件

²有一个器件的封装做的偏小,器件放到PCB上之后,将焊盘都覆盖住了,焊接难度很大,而且容易造成虚焊。以后要注意不能太小气...

²有一块PCB开槽问题,偷懒使用不规则焊盘(长方形孔)代替机械开槽,

厂商用低版本的软件打开PCB文件后,孔的形状发生了变化,导致开孔错误,最后返厂重新加工。以后应该更加规范一些,在布局布线之前把机械层和禁布层绘制好,在开孔时,最好小心一些,最好多重保险。也可以考虑直接提供光绘文件给厂商。

 

软件

²软件的工程组织、文件的组织、函数功能划分都过于简单。

所有的文件都放在一个文件夹下,单个c文件过于冗长,不便于代码的修改,以main函数为例,竟然有2500行,各种功能都包含一些,大大增加了软件后续维护成本。多数函数命名不够好,不具有自明性,但是又没有良好的注释。

 

²上位机和下位机通信协议没有形成文档。

这个...交接给过来的文档里没有,只能从程序里反推了,好在协议不复杂,但是这种做事方式不可取,在以后自己负责的项目开发中应该避免。


²下位机使用SD卡作为存储介质,但是没有将SD卡存储区域划分情况形成文档。

在项目设计初期将存储器的存储区域进行划分,并形成文档。以便后续功能的增加、存储区域的维护,项目交接。

 

² 在调试过程中碰到了一些莫名其妙的bug,因为领导给的是量产软件,所以一直怀疑自己添加的代码导致这些奇怪的bug,从而导致debug精力放在自己的代码上,增加了调试时间。最后发现是基础软件本身存在问题,才将debug范围缩小,找到了问题原因。

在以后的项目开发中,拿到一版软件,在改动之前,进行功能测试,验证软件是否存在问题。

 

² 总重量gTotalWeight定义为u16型,为了便于存储,将实际重量扩大10倍后保存,在计算输送量时,将总重量直接除以10,会导致小数位丢失,从而增大了计算误差。调试时才发现该问题,将临时总重量tempWeight定义为float类型,在计算过程中加入了强制类型转换将问题解决。

² 保存之后,对全局变量gTotalWeight进行清零操作,导致其他函数调用gTotalWeight时,计算结果一直为零

 

在进行功能设计的时候,根据变量用途,设计好变量类型和生存周期,可以在设计流程图的时候注明一些重要的赋值和清零操作。

  1. @cuter   感谢,问题已经解决,首先这个问题出的也着实然我摸不着头脑,逻辑侧的通过修改IP模块例如指令缓存和数据缓存使能等都无效果,因为microblaze侧建立的应用工程一直采用的是hello_world这个模板进行测试的,后来偶尔想起来试了一下采用memory_test这个模板,一下就成功了,才发现问题原来出在这边,通过对比较hello_world与memory_test这两个工程中的文件发现在platform.c这个程序下enable_caches()这个函数在hello_world是有效的,而在memory_test

    这个函数是被注释掉的,通过注释在hello_world下修改platform.c的enable_caches(),再测试完美解决。

    总的来说也确实如你所说的那样,更数据缓存有关系,只不过我使劲使错了地方,因为看手册觉得时能和禁用缓存也可以通过修改逻辑侧IP核的方式实现,自己也是新手,所以在这个问题上费了比较大的劲,再次感谢大神的提示。


    如果觉得方便的话,可以把工程发给我,帮你调试一下,但是我觉得这个问题应该没那么难调试,用chipscope找几个关键点看一下总线数据,逐步排查一下


  2. @jixiaowei   

    请参考我以前的博文《【再话ZedBoard】ARM软件优化,从1s到10ms》,地址如下:http://blog.chinaaet.com/cuter521/p/32082。

    里面提到了缓存使用相关问题,感觉有可能和你这个问题有点关系。再仔细确认一下读写地址是否一致。


    如果觉得方便的话,可以把工程发给我,帮你调试一下,但是我觉得这个问题应该没那么难调试,用chipscope找几个关键点看一下总线数据,逐步排查一下

  3. @cuter   经过反复测试应该可以确定和数据缓存方式无关,反复测试了write_back方式和write_through方式microblaze都是无法获取到逻辑侧写到DDR3中的数据,读写地址可以确认没有问题,继续查找。网上找的资料按理说流程应该是没有问题,设置什么按默认的就好,目前还是感觉问题出的号无厘头啊,不过也谢谢cuter的耐心解答!


    请参考我以前的博文《【再话ZedBoard】ARM软件优化,从1s到10ms》,地址如下:http://blog.chinaaet.com/cuter521/p/32082。

    里面提到了缓存使用相关问题,感觉有可能和你这个问题有点关系。再仔细确认一下读写地址是否一致。


  4. @cuter   

    嗯,好的,谢谢解答!

    请参考我以前的博文《【再话ZedBoard】ARM软件优化,从1s到10ms》,地址如下:http://blog.chinaaet.com/cuter521/p/32082。

    里面提到了缓存使用相关问题,感觉有可能和你这个问题有点关系。再仔细确认一下读写地址是否一致。


  5. @jixiaowei   

    microblaze我不太熟悉啊,不知道是不是能自己仲裁,DDR3控制器部分是不是也有仲裁机制?你看看问题是不是在这?另外也注意一下缓存的使用,调试的时候不妨先把数据缓存关掉,看看有没有什么改变。


    请参考我以前的博文《【再话ZedBoard】ARM软件优化,从1s到10ms》,地址如下:http://blog.chinaaet.com/cuter521/p/32082。

    里面提到了缓存使用相关问题,感觉有可能和你这个问题有点关系。再仔细确认一下读写地址是否一致。

  6. @cuter   不知道你说的这个数据缓存是不是axi_interconnect哪个里面的,interconnect里面的缓存我设置的是none,即全部不是用,采用的默认方式,目前通过blockram的方式可以同MIcoblaze进行数据通信,剩下的就是这个FPGA通过AXI写DDR3然后Microblaze读的了,继续找原因。

    microblaze我不太熟悉啊,不知道是不是能自己仲裁,DDR3控制器部分是不是也有仲裁机制?你看看问题是不是在这?另外也注意一下缓存的使用,调试的时候不妨先把数据缓存关掉,看看有没有什么改变。


  7. @cuter   谢谢大神的回复,首先关于仲裁的问题,经过查询时有仲裁的,所以仲裁这点是没有问题的,对于你说的那个关闭数据缓存的问题不知道如何操作,因为我近期也查到有网友说这个问题,但就是具体不晓得如何来关闭,如果知道请指点一下,谢谢!

    microblaze我不太熟悉啊,不知道是不是能自己仲裁,DDR3控制器部分是不是也有仲裁机制?你看看问题是不是在这?另外也注意一下缓存的使用,调试的时候不妨先把数据缓存关掉,看看有没有什么改变。


  8. @jixiaowei   

    cuter你好,最近有个问题被困了好久,希望看到的话能给一下解答,谢谢!

    主要集中在vivado下microblzae和外部逻辑交互,采用的方式是外部逻辑通过AXI4将数据写到DDR3中,然后microblaze将数据从DDR3中读出。采用的是axi_burst_master的full模式,即自定义外设那,然后测试结果是外部逻辑和microblaze都可以单独对DDR3进行正常的读写操作,但是外部逻辑写入到DDR3中的数据在microblaze却读出不正确,读出的是ddr3中默认数据,microblaze写到DDR3中的数据在外部逻辑却可以正常读取到,暂时怀疑是因为microblaze和axi_burst_master同时作为master但是这俩货通过axi_interconnect连接到mig应该没有做仲裁,但我看都说microblaze自己可以做仲裁,困在这个地方好几天了,希望看到的话能给一下指导,不知道我这样实现流程对不对,谢谢。

    流程框图:QQ截图20170321085547.png

    microblaze我不太熟悉啊,不知道是不是能自己仲裁,DDR3控制器部分是不是也有仲裁机制?你看看问题是不是在这?另外也注意一下缓存的使用,调试的时候不妨先把数据缓存关掉,看看有没有什么改变。

  9. cuter你好,最近有个问题被困了好久,希望看到的话能给一下解答,谢谢!

    主要集中在vivado下microblzae和外部逻辑交互,采用的方式是外部逻辑通过AXI4将数据写到DDR3中,然后microblaze将数据从DDR3中读出。采用的是axi_burst_master的full模式,即自定义外设那,然后测试结果是外部逻辑和microblaze都可以单独对DDR3进行正常的读写操作,但是外部逻辑写入到DDR3中的数据在microblaze却读出不正确,读出的是ddr3中默认数据,microblaze写到DDR3中的数据在外部逻辑却可以正常读取到,暂时怀疑是因为microblaze和axi_burst_master同时作为master但是这俩货通过axi_interconnect连接到mig应该没有做仲裁,但我看都说microblaze自己可以做仲裁,困在这个地方好几天了,希望看到的话能给一下指导,不知道我这样实现流程对不对,谢谢。

    流程框图:QQ截图20170321085547.png

  10. 统一的规范,良好的文档。咱国内的电工们好像常常忽略这些,给后续工作造成很大的麻烦

  11. @七夜浮生   

    各种怀疑人生调试了两天代码,拿示波器一个一个管脚测信号,最后发现硬件电压没给对

    我也是,运放电压源给小了。。。

  12. 各种怀疑人生调试了两天代码,拿示波器一个一个管脚测信号,最后发现硬件电压没给对

  13. 嘿嘿,充分说明良好编程习惯,统一的编程规范很重要呀!

    总结的非常不错

  14. 太棒了,你提供的资料很有用

  15. 强烈支持一个!!!