为期三个月的实习过的很快,也学到了很多,本人去实习的岗位是杭州海康威视汽车电子部门嵌入式软件开发工程师DSP组,下面把自己做的东西总结一下:
1.私有帧解析工具
目的
汽车驾驶过程中需要使用大量传感器辅助分析,单片机计算能力有限因此需要将传感器数据打包上传至上位机再解析后使用。
整体框架
此软件具有三个层次分别为通用引擎层,传感器层,用户定制层。
通用引擎层分为Analyse模块,Quality模块,File模块,Video模块。Analyse模块主要是打包协议版本分析,CRC校验,数据解压,缓冲区数据填充,私有帧帧头分析,融合头分析,通用头分析,私有帧解析流程,进度打印;Quality模块主要是帧和数据包的数量统计,丢包统计,时间戳分析;File模块主要是打开/新建/关闭文件夹,输出文件的管理;Video模块主要是打开/关闭视频,视频格式解析,抓图。
传感器层主要是Sensor模块:它进行数据包分析,通用传感器注册机(传感器单元初始化,传感器注册,传感器功能函数)。
用户定制层则是根据不同部门对软件的要求进行适配主要有:数据转换,配置文件,定制化排序等各种需求。
私有帧解析
从MP4封装中解析PS流(目前只支持PS流的解析),解析出视频帧和私有帧,通过提前注册传感器类型,解析私有帧帧头来获取数据长度,然后继续读取随后的融合头,解析出视频帧号以及系统时间包括数据内容总长度等,其次通过公共头解析出具体传感器类型的具体数据,以二进制保存,并将一些常用传感器通过数据转换,转换为中性格式保存,并需要保证程序的解析速度。
要求对C++/C中的函数以及STL具备较深的理解与熟练使用,并对读逻辑,写逻辑,包括SDK的熟练调用,尤其要求对指针和内存的各种操作以及合理管控内存必须熟练掌握,编写各种接口并封装函数,动态分配内存和全局变量、静态变量的熟练使用,CJSON函数的使用和JSON文件的配置, 以及防止程序错误提前的各种条件判断进行深入理解与操作等。
2.抓图
抓图遵守H.265视频编码协议,通过验证yuv解码、验证jpeg编码、开关配置流程、流程集成等,抓图视频帧中的图片进行保存,通过程序开始时的配置选项可选择保存格式(jpg,jpeg)。通过阻塞式回调(同步回调)函数的使用,通过登记回调函数,触发回调事件,调用回调函数,响应回调事件等来确保抓图的实现。
通过布尔类型的全局变量确认视频是否读取结束来触发回调事件,然后再每次都调用sleep()函数来响应回调事件。
3.测试文档的撰写
主要是使用说明书以及接口规格说明的撰写,需要熟练数据流图,程序流程图的画法,以及VISIO、Xmind、Axure软件的使用:
使用说明目的是让用户读完此文档后,会操作能正确操作软件实现对应功能。主要分为:组件描述、运行环境、使用场景、技术制约及局限、接口定义等;
接口规格使用说明目的是让用户理解对应接口函数实现的操作,输入值与输出值的数据结构及后续操作等,让用户可以理解封装函数的定义并熟练使用。主要分为:目标及范围、设计思想、接口结构、数据流图、接口说明、数据结构描述等。
4.SVN使用
熟练使用SVN,Git等版本控制工具,并规范操作。
5.BUG处理
列举几个典型问题:
1.踩内存问题:发生踩内存多半是内存泄漏引起的,这种BUG处理起来十分棘手,有可能踩到一块毫不相干的内存,导致排查起来十分麻烦,只能自己跟随数据流,一步一步走下去关注数据从哪里开始错误排查;也可以从发现错误的地方一步一步往上追溯,同样是跟随数据流进行排查,一般这种错误最初始的原因都是内存越界,但是没有进行错误判断或没进行错误处理导致后面发生踩内存,也是新手开发者常犯的错误,需要在一开始合理的并全面考虑各种情况并进行判断及时将错误打印出来并进行错误处理。
2.野指针问题:一般这种情况都是将指针指向的内存提前释放了,一般发生在堆区,检查逻辑,在正确位置释放内存,并及时初始化即可。
3.函数传递错误参数问题:这种情况需要检查传入参数,编译器提示错误那一定是参数不符合规范或者参数为NULL或者越界,检查参数并在运行过程中检查其值并改正。
其余的大多都是逻辑问题以及STL或者一些函数的正确使用与操作等。
6.感悟
变化总是潜移默化,总结时感觉没什么东西可写,但是当细细回想发现确实学到了不少东西,尤其程序这种比较抽象的东西还是需要结合实际应用去加深理解,有条件的还是可以去找一个程序员详细问一下他的理解,同事帮助我很多,C++/C的本质就是通过指针对内存进行各种操作和管理,并且C++/C的代码不同的人写出来的代码质量差别很大,需要考虑性能,不是功能完成就结束了,需要考虑代码的优化,以及如何消耗更少的资源去高速高质量的完成任务。
更重要的是,我意识到规范的重要性,包括函数的命名,接口的命名,变量的命名等,以及代码编写规范,规范的代码让人看起来耳目一新,以及各种错误情况的判断以及错误处理考虑全面会减少许多不必要的麻烦;包括相同功能使用不同函数真的会让性能拥有很大的差别;另外应尽量减少全局变量的使用因为别人在读代码时真的很难受。。。
最后预祝自己能在秋招中找到一份好工作。