2016年年终CSDN博客总结

2015年12月1日,结束了4个月的尚观嵌入式培训生涯,经过了几轮重重面试,最终来到了伟易达集团。经过了长达3个月的试用期,正式成为了伟易达集团的助理工程师。

回顾一年来的学习,工作,生活。各种酸甜苦辣,庆幸是有一群支持我的同事小伙伴,他们同样来自尚观IT培训机构,4年前,他们也是一样,怀着自己的理想考上了理想的大学,4年后,怀着自己的理想通过4个月的培训晋升,巩固自己的知识体系,最终也是找到了一份满意的工作,来到了VTECH, 这一年,收获还是非常大的,获得了公司的升职,同时自己的CSDN博客也从默默无闻提升到了CSDN博客专家。


总结下这一年里,我收获了什么?又失去了什么?还记得2015年12月1号入职。第一天,什么也没干,看着一堆平板和一些电子玩具的样板,顿生好奇。原来企业开发是这样子做的啊,既是好奇,又是陌生,当时我在想,我能不能通过试用期,能不能按时完成工作?后面陆陆续续的,上司给我安排工作。首先扔了我一大堆代码,一看我吃了惊,这代码估计得上万行,而且全部看起来既有C也有汇编,还有各种不认识的链接脚本。惨了,我当时就开始怀疑自己的工作能力,首先我质疑自己以下几点:

1、  我才刚毕业,这么庞大的程序还是第一次见,能看得懂么?

2、  在校只接触过51-AVR-STM32-4412这些芯片,公司用的都是不认识的,会用么?

3、  我能否在规定时间内完成这些任务?(当然我得先熟悉源码,熟悉产品功能需求)

后面,陆陆续续看了两个星期的代码,大概熟悉了基本的流程,还好C语言当时学得不算特别差,也有单片机的基础,所以,上手这个GPL凌通的编程还是非常快的,也能够在那上面编写一些独立的测试程序,下到板子上看现象。最最让我头疼的问题就是,这个产品的下载速度慢如乌龟,下一个程序需要长达3分钟,所以开发时间也比较长。好了,接下来说说今年的工作总结:

工作与项目:

第一个项目的功能需求 :

在开发过程中,第一个项目完成的是对SPI-FLASH读写程序的编写,完成这个程序的目的是为了给产品存储数据用的,在存和取的过程中不能出现差错,所以,编写这个程序对时序的要求是非常高的,要求非常的准确。由此,我就对SPI协议进行一下总结:

SPI:其实就是一种串口通讯协议,一般有四条线用来连接,CSN(SPI片选信号)、SCK(SPI时钟)、MOSI(从SPI数据输入脚)、MISO(从SPI数据输出脚)。在SPI总线传输的过程中,片选信号是低电平有效的,当我们要和某个外设通信的时候,需要将外设上的SS线拉低,特别要注意SPI从设备支持的SPI总线最高时钟频率以及外设的CPHA\CPOL模式,这些决定了数据与时钟之间的偏移,采样还有触发边沿上为上升沿还是下降沿。SPI的内容大概就是这么多了,时序图也很简单,这里不多说,主要来说说SPI-FLASH,这类FLASH依赖于SPI总线协议。所以编写这类程序的时候也要按照SPI总线的规格来进行编写。我们需要在程序中实现具有以下功能的接口:

1、  SPI-FLASH的初始化(初始化SPI总线,编写时序相关的代码)

2、  读SPI-FLASH(从哪个地址读(对应片选),读多少,读什么内容)

3、  写SPI-FLASH(写到哪个地址(对应片选),写多少,写什么内容)

4、  擦除SPI-FLASH(芯片擦除还是部分擦除还是?)

5、  计算SPI-FLASH的checksum值(主要用来判别写入的数据是否和读出的数据相同)

   以上大概就是第一个项目完成的工作,后面维护这个项目的时候,大部分时间花在测试数据是否正确,接口编写是否稳定,软件测试在我这里完成,具体产测由公司QA部门负责,一旦出现了问题,那么我就要维护这个代码了,以上做的是什么类型的产品,我只能说是玩具产品,具体产品开发流程细节我不方便透露,以下总结也是一样,由于保密政策,请谅解。

第二个项目功能需求:

         第一个项目完成的其实就是一个简单的单片机实现的功能需求,单片机其实就大同小异了,如果不清楚或是不知道程序怎么写的情况下,可以参考以前写过的程序,模仿一下也是可以写出来的,重要的还是要多看看数据手册。这个阶段我也学习了鸿哥的十年单片机框架,感触颇深,这让我联想到单片机编写也是可以基于状态机思想来进行开发。那么什么是状态机呢?简单来说就是一个状态到另外一个状态的变换。那么鸿哥框架的优点再哪呢?主要是单片机的运行效率非常的高,一个定时器,若干个标志变量,一个switch语句,还有若干循环即可构成一个强大的单片机系统,有兴趣的可以去看看,欣赏一下。

链接:http://bbs.elecfans.com/jishu_406259_1_1.html   点击打开链接

         接着来说下面做的东西:

我的天,刚搞完单片机的FLASH驱动编写,下面直接就跳到调安卓平板的摄像头驱动了。这对于我来说就是一个无比巨大的挑战,首先,安卓我没有学过,也不懂,Linux驱动在培训的时候我根本就没去上课,但Linux基本操作还是懂的。因为当时我是第一个找到工作的,我的同学都还没有学习完课程我就已经出来工作了,有点吃亏,哈哈。吃亏怕什么,在公司多的时间就是学习,因为项目并不是很多的,毕竟是大公司,不会有太多的事情干,相对自由。对于linux内核和驱动,还有安卓,我当时算是一窍不通,于是就参考了网上的资料还有以前同学的学习笔记,默默的从单片机这种最简单的类似ARM裸板的开发转向了操作系统级别的开发(跨度有点大!)。

调摄像头,调什么呢?调的是OV系列摄像头,实现按键旋转的功能,也就是,在安卓上层,一旦按下对应的按键,摄像头要实现180度旋转,其实这么做是为了节省前后置摄像头,把两个做成了一个,不错,这样做确实省钱。那么调这个驱动要了解什么知识呢?

首先是linux设备驱动程序,这是个大头,但是我们不需要全部去了解它,只了解我们当前要做的项目需要什么知识就够了,其它的慢慢再有时间自己进修。在这部分知识里,我们首先要了解怎么编写字符设备驱动,什么是platfrom总线,什么是IO,什么是定时器等等的一些基础知识。接下来就是了解摄像头驱动的框架,在linux内核中,支持摄像头运作的无非就是V4L2,这个说白了挺复杂的,当时我下了一个专门讲这个东西的文档,看了很久都看不懂,细心专研后发现其实也不是特别难,就是自己当时的C语言基础太薄弱了。当时编写的摄像头是OV2685和HI257的驱动程序。所以当然要参考这两个驱动的数据手册,我的天,数据手册的东西也很多,当然要抓住关键点看,不是要改旋转功能嘛,好办,那就直接找到配置旋转的寄存器,然后到驱动对应的位置,做上这么一个函数接口,然后提供给上层调用。不就可以了吗?

事实也就如此,很快,不到1个星期,摄像头驱动就被我改好了。改好驱动当然就要做测试了,那么就写Linux C程序,同样用V4L2框架,打开设备,映射地址,入队出队,将摄像头读取到的图像转成RGB,最后转成BMP图,这些详细的内容,在以前的博客上是有写的,可以去看看,至于到后面添加到安卓源码,在app层其实就不用多说了,上面有固定的框架对设备驱动进行调用,我们不用去写那部分的程序。

第三个项目功能需求:

         这个项目是要实现对之前搞的玩具产品整个的PCBA程序的编写,PCBA是什么呢?

百度上是这么解释的:

PCBA是英文PrintedCircuit Board +Assembly 的简称,也就是说PCB空板经过SMT上件,再经过DIP插件的整个制程,简称PCBA .这是国内常用的一种写法,而在欧美的标准写法是PCB'A,是加了斜点的。这被称之为官方习惯用语,我们同国外客户沟通或是推广的时候,他们时常会问PCBA是什么意思。

顾名思义,也就是产品在生产的过程中,一旦将元器件贴上PCB板的时候,可能在回流焊,波峰焊等过程中导致硬件元器件的损坏,鉴于此过程,一旦元器件焊接完成后,那么就需要有一个测试程序对焊接完成的硬件进行测试。

这个过程中,主要测试FLASHLED灯、按键、USB接口、喇叭、以及一些能用程序检测的芯片。

写这个程序能为我提高什么样的技能和水平呢?

写这个程序,既让我了解了产品上硬件的连接,又让我熟悉了整个项目所有模块的驱动等等方法等等。

此前,我写过一些文章,专门说的是PCBA的检测方法,像LED灯,玩具产品的LED灯是非常多的,因为这样可以造成非常炫的效果,检测LED的方法可以采用行列扫描法。按键也同样可以采用,也就是说可以做成矩阵键盘那样的效果,这样检测效率就相当的高了。

FLASH的检测在之前就说过了,只要往里写数据,再读数据,校验Checksum值即可。还有喇叭,喇叭主要就是声道的检测,左声道右声道,输出声音大小,可调节音量大小,输出频率等参数。

大概这就是第三个项目的总结,一共花了将近一个月的时间,不断的调试,写程序,最终完成了,这算是我最引以为豪的项目,毕竟是自己手把手写出来的,写了几千行代码,心里成绩感满满的,同时也让我对C语言更加的精进了,其中用到了大量的算法和数据结构,这也就是为什么,我的博客算法和数据结构的文章比较多的原因。

这部分主要完成的功能模块:

1、  按键检测,输出按键键码作为防短路断路检测。

2、  LED检测,检测是否烧坏,开路

3、  音频检测,检测音频模块音频输出的声道,频率等。

4、  FLASH检测,计算Flash的checksum值,看是否正确。

5、  检测RF模块是否能够正常通信

6、  串口: 检测在中断模式下是否能够正常收发。

第四个项目功能需求:

当然,前面有单片机的PCBA测试程序,那么在安卓平板上也要有同样功能的测试程序,但是这个就相当复杂了,对摄像头,LCD,按键,重力传感器,joystick,wifi,音频等模块的测试。

这部分需要了解的知识非常多,除了前面的V4L2是专门用来编写视频,摄像头相关的,后面编写LCD还要用到freambuffer框架,freambuffer也是当初让我非常头疼的东西,后面也是找了一个文档,从头到尾看了好几遍,最终才搞明白。按键测试程序的编写要了解linux中的事件,中断等基本知识。重力传感器其实也是一个事件,有XYZ三个坐标,这东西是基于I2C总线驱动来进行编写的。后面还有wifi等其它的测试,那些就加更复杂了,不过好在供应商提供了复杂部分的程序,所以只要会改即可,后面有时间也去了解了一下。

关于这个项目,需要的知识点就是UNIX环境高级编程和Linux设备驱动。首先要了解什么是设备节点,接着文件IO基本操作,最基本的open,read,write,lseek,ioctl等接口要会使用,这些接口是要对设备节点进行操作的,接下来要了解进程,线程,信号量,管道,为我们编写多线程并发的程序打下基础,掌握好这部分,其实并不难,但是写好程序的确是不简单的,比如,多线程并发过程中会产生的抢占问题,那么就需要了解锁的概念,什么是自旋锁,互斥锁等等。编写这部分程序还要了解内核驱动程序,比如,我用ioctl去控制这个设备,我要传什么命令去控制这个设备,这些信息需要从内核中对应驱动的位置去寻找,写这样的程序大体都要去参考驱动内部的构造,因此,掌握Linux内核的运作机制也是非常重要的,最起码我们要知道,用户态转向内核态的方法。其一进行系统调用,其二是就是异常。

在这个项目中,让我学会的不止是程序的编写,也学会了如何去写一个makefile,如何去写一个shell,这都是为后面写一个大型的程序打下基础。关于这部分就不再啰嗦,在博客中也写了不少这方面的文章,有兴趣可以去参考参考。

         这部分主要完成的功能模块:

1、  按键检测,输出按键键码作为防短路断路检测。这一部分就是利用逻辑读IO口的电平,规定这个按键的键码,用喇叭响声确定就是该按键,其它的按键的键码也是自由规定的,但是不能一致。

2、  LED检测,检测是否烧坏,开路,写一个流水灯程序,或者是行列分别扫描的程序,就可以很快看出LED亮灭的情况,这种如果LED够多的情况下,需要有专门的机器去完成检测。

3、  LCD检测,检测是否出现坏块,花屏等,这块主要就是鉴别LCD在装入过程中,排线是否松动,或者说LCD本身内部芯片的驱动就有问题等等。

4、音频检测,检测音频模块音频输出的声道,频率等。

4、  重力传感器检测,检测方向是否正常。

6、WIFI,检测信号是否正常,wifi模块是否短路或断路。

7、摄像头,能否正常显示,按下按键后能否正常旋转。

8、……..HDMI、触摸屏等。

第五个项目功能需求:

工厂那边有一次突然要一个测试程序,这个程序最终的目的是要在安卓启动的时候不进入系统,然后直接运行Linux程序去完成一个摄像头的功能,并且还要求能够拍照,能够录像等基本功能,最重要的是他需要一张能够实现广角的图片,其实也就是让摄像头以最大事业进行显示。这个程序原本有一个同时已经写好,无奈他离职了,程序也被带走了,所以只能我自己重新开始写了。幸好之前做过PCBA程序,对摄像头应用程序编写有一定的基础,于是很顺利,就完成了这个程序的编写,在这个程序编写过程中是遇到不少问题的,比如摄像头上转图片格式,经过我的测试,我知道我的摄像头最终成像显示的格式是(NV12),其实也就是YUV420,然后就找到转格式的文档对图片进行转换。在没转成功之前,我用YUV查看工具看到的都是层次不分的图象显示,直到后来发现了,改过来,再调节分辨率就能正常显示了。其中,意外的将C语言的输出流学以致用,因为摄像头拍照的照片最终是存放在SD卡下的,所以拍多少张图片总要有个编号,这时我们可以使用sprintf这个函数,前面图片名字是固定的,当按下按键拍摄的时候,用一个变量做计数器就可以不断的将这个变量重定向显示到sprintf这个函数的字符串里,从而实现了这样一个小技巧。

关于这个程序的编写,在以前的博客文章也有所总结,这里就不再哆嗦。

         前五个项目都是比较基础,也是应用比较广泛的,有了这五个项目做基础,相当于提升了我的开发功力。后面陆陆续续的也完成了接下来更多更有挑战的项目,那就是安卓。

         在安卓上,知识点和修改点都较为分散,不像前面的单片机和Linux应用和驱动那样那么好总结,毕竟市场上,能写安卓底层开发书籍的人寥寥无几,APP层的书籍又非常的泛滥于世,当然写得好的很多了,比如我刚开始学安卓的时候看的罗升阳的老罗的安卓之旅,还有鸿洋的博客,郭霖的博客,他们算得上是安卓界的大牛了。

工作间毕业

在长达半年的工作后,终于在2016年的7月份,我迎来了大学本专的同时毕业,拿走了一大叠厚厚的证书,离开了校园。在这几年大学里,我付出了很多,收获了很多,同时也失去了很多,我失去了很多和大学同学玩耍的机会,却获得了让我能胜任工作,走向社会的能力,人们常说有失有得,是的没错,我的大学一刻也没有浪费过,为了我的工程师理想,一直潜行奋斗着。终于迎来了这一神圣的时刻,我想对我的老师说,谢谢您们,您们教育了我知识,让我在社会工作中茁壮成长。



工作与学习

         在这一年里,为了跟上工作开发的节奏,我个人也学习了不少书籍,看过:

1、  韦东山的嵌入式Linux应用开发完全手册

2、  Linux设备驱动程序、linux内核情景分析(上)

3、  Android底层驱动分析和移植

4、  单片机技术(看过吴坚鸿,人称岭南职业杀手的鸿哥单片机框架)

5、  零基础入门java、第一行代码

6、  Linux设备驱动开发详解(宋宝华)

7、  数据结构与算法

8、  C语言程序设计

9、  C++ Primer

10、UNIX环境高级编程

11、C和指针、C陷阱与缺陷、C专家编程

12、深入理解linux内核、Linux内核设计与实现

等等。。。。

   学的东西太多太杂,确实,因为工作的需求,我会不断的学习。这就是之所以我为什么要写博客的原因:

第一、  防止我看过的重要的东西忘了以后要做不好查找

第二、  将我学习的知识共享给他人,贡献自己的一份力量,帮助更多需要帮助的人。

第三、  提升自己的修养,静下来写作,有时候会有灵感涌现。

关于技术篇大概就总结这么多,当然还有很多东西都还没有涉及,比如安卓是如何启动的,其实以往的博客也都有总结的了


工作与生活

除了工作,之余,也认识了不少公司的同事,大部分都是尚观出来的,很多都比我大,在这一年里,他们也在不同程度上帮助过我,谨以最真诚的感谢。说到工作之余的生活,其实我们过得还算是很有情调的,每个星期我们总会找一天去下馆子,毕竟出来工作了,要对自己好点,特别是吃的喝的用的一样都不能少,所以在这一年里,下馆子就下了不少次,我也算是个吃货了,毕竟是土生土长的广东潮汕人,吃就是唯一的爱好,哈哈哈!

  当然除了吃还是有其它的安排的,比如打乒乓球,如果每天上班上得早,那么就回家锻炼,要是每天起床晚了,来到公司晚了的话下午一般都会去打球,搞IT行业的,不经常锻炼的话很快身体就会出现问题,这一年我真的是受够了。偶尔身体总会出点小问题,比如荨麻疹,这东西跟体质有关,虽然不是什么大病,但是一旦染上了,真的是日夜不得安宁,所以为什么,我的博客有个程序员健康指南的博客内容,主要想写一些养生之道,毕竟,身体健康是最重要的,没有健康,谈什么努力和资本。

  在这一年里也交了不少IT行业的朋友,既是同道,那么大家就应该互相帮助,说实话,干这个行业,做久了,朋友会越来越多,只要你愿意努力,愿意奉献,你能交到越来越多的朋友。

工作与升职

     今年最感动的就是11月份的时候经理却给我的升职加薪,为什么说最感动?因为从一开始我自己连我自己都不太信
任,到最后工作上,经理对我的信任,我觉得我算是迈出了人生的第一步,至少说明一点,我给公司带来了收益。自
古有句话说:宝剑锋从磨砺出,梅花香自苦寒来 。我一直都相信努力最终都会有收获的。从没毕业进公司到2016年
12月1日,仅仅毕业半年,从助理工程师转工程师,从最初还在想着什么时候离职,到现在有信心继续在公司干下去,
毕竟在这里,给了我太多的感动和继续深造的机会。实话说,在工作开始几年,不要太计较金钱,够用就行了,毕竟
有能力金钱自然就会上涨,所以现阶段以工作经验作为学习的根基,一步步往上爬 ,船到桥头自然直,水到自然渠成。

我与CSDN

说到CSDN,什么时候开始坚持的?2015年11月份,从开始的一篇,有关MMU的文章,到如今整整323篇博文。这一年,我将工作中用到的,学到的都毫不隐藏的贡献了出来,也获得了CSDN官方的肯定,于是在今年6月份的时候,我荣登了CSDN博客专家头衔,也被CSDN荣幸邀请成为他们的Linux特邀编辑,后面也成了CSDN博乐群的一员。陆陆续续的,经过自己的努力,我也获得了不少CSDN博客的奖品和书籍。CSDN是我奋斗路上的伯乐,我会坚持在这上面写文章,毕竟,太多人需要我们去无私奉献,IT行业才会日渐强壮!今年有幸参与CSDN博客之星的评选,第25名,可能最后就算有入围奖吧,重在参与。希望往后尽力,争取有机会评选上CSDN博客之星。

 

年终总结

今年收获最多的就是项目经验和知识面的整体提升。当然悲剧的事情也有发生,这里就不说了,过去的事情就让它过去吧,在2017年,制定新的理想和计划,向前看!争取新的一年能在工作上有巨大的突破。

一句话:踏实精进,再创辉煌。


评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Engineer-Bruce_Yang

谢谢您

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值