【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】
对于很多soc来说,上面的cpu一般都是arm。既然是arm处理器,如果使用大型开源操作系统的话,一般跑的都是linux。所以很多同学,在学习了x86 linux虚拟机之后,很自然地就把x86上面的开发习惯带到了arm soc上面。他们印象中,所谓的嵌入式linux开发,只是底层cpu发生了改变,其他都是一样的。只要做好软件算法+外设编程就可以了。其实这种想法是错误的,也是不足取的。一方面这是认识上的偏差,另外一方面如果仅仅是简单地把程序从x86搬到arm,常常效果不尽如人意。这里面有一个很重要的点被忽视掉了,那就是芯片自身sdk的学习。
1、嵌入式linux不是大号的mcu编程
从外设角度来说,soc上的linux编程,和x86虚拟机上面的编程,确实差异不大。但是soc除了外设ip之外,还有算法ip,这些算法ip才是我们需要真正掌握和了解的。
2、soc特有的sdk更有价值
很多soc都有自己专有的开发包。这些开发包里面,除了uboot、kernel、busybox这些通用开源代码之外,最最重要的就是soc自己特有的sdk。不同的平台叫不同的名字,有的叫mpp,有的叫mdp,或者是其他的名字。大部分sdk都是和算法ip相关,就是怎么通过简单的api接口,就可以把算法ip使用起来。
3、sdk一般都有sample code
这些算法ip的sdk一般都有sample。使用的时候一般是这么来处理,首先看看有没有对应的sample code。确认下sample code是否可以编译,如果可以编译的话,那么再次确认里面有没有我们需要的功能。如果有的话,那么就可以把这部分code移植到我们自己的应用上面去。实际开发的时候,一般是不会从0到1去进行开发的,都是从特定的sample code摘取自己想要的功能。等到debug的时候,才会去找专门的手册,或者文档,一五一十去解决和分析。
4、大部分sdk都是和音视频有关
目前这一类的加速ip,都是和音视频相关。类似于视频编解码、音频编解码、isp、npu、crc、fft等等,我们可以很容易找到类似的函数接口。有些功能,比如视频编码,如果是纯软件来做,几乎是不可能实现的。还有的功能,比如从camera到屏幕的低延时显示,只能靠硬件去完成。再比如,很多医疗领域上面的同一个camera的四宫格显示,如果是指望cpu去做,比如qt去做,要么效果不好,要么需要很好的外挂cpu。这方面都没有soc自带的sdk来的方便。毕竟硬件加速的效果,要比纯软件好太多。
5、同时学习linux和soc sdk
有一部分知识,属于通识,不同soc之间差异不大。比如,如果两个soc用的都是linux,那么大部分上层编程、底层驱动都是一样的。在开发应用的时候,一样的boost库,一样的qt,一样的opencv,创建进程、线程、数据库、网络等等,这些都是差别不大的。
但是涉及到soc自身特有的sdk,这方面一定要找厂家的资料来看。比如,哪些是驱动ko安装部分,哪些是sdk的so部分,怎么编译、怎么链接、怎么调试、怎么运行sample code等等。所有这些不同的soc厂家之间,差异还是比较明显的。所以除了linux通用编程之外,我们更要学习这些soc特有的sdk,这样才能在不依赖于cpu性能的基础之上,又快又好地实现客户需要的功能,而且成本很低。