学习bsp要分为几个阶段,一阶段要明白bsp是干什么的,然后自己用现成的代码引导一块芯片,熟悉bsp的基本流程。
这个时候可以选择用uboot。在没进行基本的学习和bring up起来一个芯片之前会觉得这个bsp有点神秘,但是当你自己单独运行起来一个芯片之后就会觉得bsp就那么回事。
这个时候应该关注的是基本的启动流程,要看代码的主流程,比如uboot的运行分为三个阶段,汇编对基本硬件进行初始化如cpu_init_crit等,对gd变量初始化后执行函数指针的初始化过程如串口的初始化,这个时候才能打印,然后就是引导系统。
做bsp,必然需要对硬件,汇编有相当的理解才行,cpu模型,总线,cache这些,基本流程掌握之后,就是要对这些学习,如何来学习呢,学到什么程度呢,我觉得可以通过驱动来学习,寄存器模型配置的理解,这个就是用到哪里学到哪里。
框架bsp去兼容不同体系结构的cpu,和不同的引导方式这个也是一个很大的学习点了。
bsp还需要解决的一个问题就是升级的问题,OTA,如何做到自升级,如何升级系统,如何网络升级,怎么不变砖,这个也是需要学习的一个地方。
bsp对硬件和汇编必须还要有一定的理解,比如arm的基础启动文件一般是一个.s,里面有中断向量表这些之类的,如何跳到mian里面,bsp调试的时候也有可能碰到硬件的问题,所以还有辅助定位。
我认为bsp真正难度的地方,都不在上面说的这些,而是当你去bring up一个不熟悉的新芯片的时候,碰到运行不起来,特别是在打印都没出来的阶段的时候,你如何去定位,这个时候是必须要借助调试器的,对调试工具的熟悉程度,大概的猜测,验证的这个过程,并且往往是项目上比较紧急,一堆人看着你的时候,你能顶住压力最终引导成功那么你的bsp学习之路也就可以暂时告一段落了。