我的第一个月
从9.10过审核开始写了很久的日报,当然除了实习还包括别的内容:
这一个月以来,我学到了很多东西,学习周期大致可分为三个阶段:初步了解rtt和配置环境、设备树学习以及最后的gpio driver开发。
rtt
由于时间有限,所以仅对rtt的标准版本做了一个比较基本的了解(也就是说没有太涉及到源码部分,只能说是对文档中心的那些对外开发用接口有一定的了解)。rtt是一个微内核的RTOS,这与以前所接触的Linux和xv6都不同。由于RTOS的特性,它的许多设计都十分精简,相比于Linux可谓”麻雀虽小五脏俱全“。
对rtt的基本介绍,详情可见其文档中心。我印象最深(也是开发过程中接触得最多的)的几个点有:
接口设计
与Linux一样,rtt也采用了精简的接口设计。
自动初始化机制
帅的一匹,具体详见此。
其余的只能说不甚了解,还有待挖掘。
配置环境
由于确实对这种东西毫无所知,所以配环境这个过程也是比较漫长,而且很折磨很痛苦(。
硬件方面,一开始拿到IO-board连这是啥都不知道,还以为这就是开发板研究了半天怎么上电和把内核烧进去(((。然后东西也是买得缺斤少两,比如拿到开发板不知道还要有TF卡,上网搜图研究了半天才意识到;再比如也没有USB-TTL,又是一通淘宝购物。这些各种各样的小白问题导致配环境的周期十分漫长。然后还有一些很傻的错误,再次也不好意思多说了,详情可见rtt硬件环境搭建。
软件方面倒是没什么问题,之前也早就跟编译内核用的menuconfig打过很多交道,磁盘分区之类的东西之前也简单使过几次,只不过经过这次后也算是使得更加熟练了。
设备树学习
TODO,这部分还是比较多好写的,虽然还是有点模糊(待我之后有时间整理下放个链接
设备树还是比较复杂,而且因为本人的不审慎,导致对其理解出了偏差,还麻烦了社区看我的代码(悲)只能说个人出道的开源社区还是需要对自己的所有笔代码负责。
gpio driver
pr:
涉及到的各种硬件手册:
这也是我最后这一周在做的工作,虽说只有短短一周,但是每天都研究这个花了我不少时间和精力()目前算是写完了它的所有功能(大概),并且已经能把LED闪烁和中断绑定函数润起来了,提的pr在这里。
以前对驱动的理解,还停留在手把手教你做事的xv6的netlab。也因而,这次可以算是以完全一无所知的状态接下了这个任务。
不过,好在有以前那个短暂的lab经验,我还是稳扎稳打地定下了具体的学习步骤:调研(包括获取各种data book、schematic、rtt官方文档、Linux和rtt相关代码),然后就是学习。
好在有设备树的研究积淀,我也算是比较快地掌握了milkv上gpio的分布、型号及其地址空间,从而顺藤摸瓜找到了对应gpio型号的Linux驱动代码参考和硬件手册,算是免去了不少麻烦。
然后,我观察rtt的gpio驱动们,也找到了对应的pin.md文档,了解了下大致的代码框架思路:
于是接下来的工作也可以比较独立地划分为两部分,一个是数据读写的实现(通过LED闪烁程序测试),另一个是rtt特有的中断回调函数的支持(通过中断程序测试),可以专注对这两个方面开发了。
其中,数据读写的实现需要对寄存器和引脚号等有所了解。寄存器相对比较简单,只需阅读dwapb的data book即可;而引脚号到gpio的转换则花了我不少时间,做了许多猜想并且进行验证,最后误打误撞地“猜”中了正确思路,通过了LED测试。
不过引脚号我现在还是不大懂,总之先参照别的bsp写法自己编了个,等着代码review看下吧。
前期调研一直到LED亮起来花了我整整五六天()相比于此的困难,中断倒显得简单了许多,毕竟它属于是偏软件相关的。调了一天,也从Linux和其他bsp那边抄了些代码,最终在凌晨两点半成功完成了功能测试()今天又花了一个下午整理了下代码和写日记,最终总算是把这个作业交上去了。
整个过程光是写看起来还是比较轻松,但是由于初次开发摸索,每个小跨越都得花费我不少时间去调研搜索,经常是在长达几个小时的不知所措后才短暂地获得了一些光明,我甚至多次想过要不要去辞职了(((。总之,最后还是坚持了下来。看到蓝色的LED在夜晚的T5中闪烁,我还是十分激动的,眼泪都爆出来了()
相关经历在这里:驱动开发小记
稍作总结
总之,这一个月来我学到了许多,同时也对我以前未曾涉足的空白领域做了许多探索,包括对设备树、对嵌入式开发、对Linux设备驱动等的学习,总体来说还是十分甚至九分地开心。可惜考试月临近,再加上联系了老师开始做科研工作,故而实习工作只能到此中止。