TDA系列SOC采用异构多核设计,架构复杂,上手比较困难,本文将结合本人对TDA2xx开发SDK(vision_SDK)的理解,对TDA软件框架做一个描述,抛砖引玉做一个指引性的指导文章,方便同在TDA平台做开发的各位小伙伴。
从宏观角度来讲,我认为TDA2x的软件框架分为三层,分别是应用层、链接层和板级支持层。如下图所示:
板级支持层包括各种外设及其驱动,链接层也就是link层,每个独立的核都有各自的link及其link ID,有些相同功能的link分布在不同的核,比如ipc在每个核都可以找到;也有些link只存在于某一个核,比如capture link只存在于M4核。应用层就是功能组装层,根据功能将用到的链接连接起来形成chains,如下图所示。
在vision_sdk中,实现了上述所有的内容,除了TDA系列SOC,其他类型的SOC也做了兼容,同时linux版本、bios版本等都支持,所以整个sdk工程显得很庞大。下面根据我对vision_sdk的梳理,整理了各部分内容对应的代码。
下图是应用程序的入口
下图是各个核的入口文件
下图是主要驱动程序的源码
下图是程序运行结构图,每个核都有若干个link,每个link都是一个线程,完成自己独立的任务,link与link之间通过ipc进行通信。
每个link的初使化及运行也基本是固定的模式,下图以IPU1-0中的link(display)为例,描述link的初使化流程。
总的来说,整个TDA平台的框架还是很复杂的,简单的来讲,就是每个核中都运行着若干个线程,每个线程就是一个任务,但微观来讲,深入到代码层还是挺复杂的,有些不同核中的link共用的是同一份代码,不容易区分,SDK里面也采用了大量的函数指针和回调函数,调用函数的时候比较隐避,难以找到函数的源头。需要好好分析,多磨一磨才更好的理解vision_sdk的框架和实现思路。