仪表识别算法(仅算法)的完整实现——TMS320C6416 DSK

    在7月底放假之前就想着把6416上仿真的自己的仪表识别算法的操作细节整一篇日志,但是假期的诱惑力实在是太大了,我从小学就是寒暑假前拿一包书回家,假期结束后,再把一包书原样拿回来,现在这个陋习还是没改,直接导致7月份代表搞科研力度的日志只有一篇,缺乏控制力真的是不行的。

    其实,在6416上跑,算法和5416上也没有大的变化,主要是DSP本身的改变很大,下面就首先说说对5416和6416之间的一些对比感受。总的来说,就是低端的片子和板子更锻炼人,硬件设计肯定不如后来的片子成熟,使用起来很多东西都是需要自己弄清楚和配置的。第一,存储配置上5416要PMST寄存器和cmd文件规划存储介质的使用,而6416不但片内存储资源较大,而且使用起来也不比像5416那样明确的分配到程序区和数据区,甚至是分配到cmd文件的“块”;第二,从时序的控制上,5416的时钟是可以自己配置的,在上电复位后有对应的引脚给出初始配置,应用程序中,可以用一个CLKMD寄存器负责软配置,而6416的片内时钟频率更高,而且固定,不用考虑和修改;第三,从访问片外存储的时序考虑来看,5416有一系列的寄存器来管理时序,如SWWSR、SWCR、BSCR等,而6416有统一的EMIF来管理扩展的外部存储。第四,就是从芯片的工作模式上来看,我们可以把5416叫做16位处理器,6416叫做32位处理器,因为从二者的dat文件的行宽上来看,一个是16bit的,一个是32bit的,这代表了两种CPU一次性处理数据的能力,需要注意的是,二者默认都是工作在小端模式的,所以在进行bmp文件和dat文件的相互转换时,要特别注意一个Byte数据的数据在16bit或32bit行宽中的前后位置。

    下面再说说这段时间使用5416和6416的心得。首先,未完成的任务,就是在5416上使用片内的程序区来存储和操作一部分数据,这个问题问了TI的工程师很多次,工程师给出了一些有价值的参考方法和相关文档(spra177a),我总结要实现这个愿望的步骤为大体三步:1.编写自定义块的asm文件,分配空间甚至初始化;2.C程序中定义数组为函数,以达到指针位扩展的目的;3.使用pfunc.lib中的函数进行数据操作,达到目的。但是按照这个思路对算法源代码进行修改并没有达到目的,后来从TI工程师的回信中大致能确定问题出在了1小步用伪指令把放在程序区中的数据定义的数据类型和3小步中lib中的函数支持的操作对象的数据类型出现了冲突,以后找机会再来细细实现吧。这段时间只是算法仿真,对DSP了解很少,所以所得也很有限,总结为两点:第一,熟悉DSP的存储分配,特别是5416,PMST寄存器和cmd文件我都有了一定的了解,再比如5416的堆栈大小,起初看DSP的书籍知道函数调用时很多中间数据都会暂存在堆栈中,由于我的算法中牵扯到了“函数的递归调用”(canny算法最后链接边缘调用另一个函数trace),一开始在cmd文件中将stack大小设置为0x400果然出问题,在修改stack大小为0x800之后,问题消失。第二,就是熟悉CCS开发环境,比如利用profiler观察一段代码的执行周期数,仿真load程序后,依然可以设置断点往下进行观察调试等。

    最后再说说要学习的和不足。老师催的比较紧,让我赶快熟悉ARM把算法在ARM上实现一下,并且在我演示算法仿真的时候,指出了我在cmd文件汇编、嵌入式运行的中断和时序机制、CCS操作使用上的不足,而我在假期的几天唯一干的一点事就是在DSP上实验了一下崔师姐的算法,是唐延东老师上课时的理论的应用,可以看成是能量最小求圆心+投影算法,这也让我看到了自己在图像理论知识方面的匮乏。总的来说,今后要学习的东西从大的方面可以归结如下:

    1. DSP(cmd文件、中断asm和工程运行、版主文章看外部接口时序、CCS操作)

    2. ARM(以上二者都要求一些汇编的知识)

    3. 图像理论

    4. 计算机体系结构和程序工程各文件工作机制(编译链接等)

 

你可能感兴趣的:(仪表识别算法(仅算法)的完整实现——TMS320C6416 DSK)