文章目录

一个DSP的工程中往往有很多的.c执行文件,但是具体的执行顺序单从程序上的互相调用来看是理不清楚的,下面以一个具体的工程为例对DSP中工程的执行顺序进行分析,帮助更好的理解其整个芯片的运行机制。如有理解不对之处,敬请批评指正。

如图1所示,这是一个具体的在DSP上实现图像特征提取的工程,共有14个.c执行文件,我们具体来细看一下他们的运行机制。

打开BIOS Config,先在System中查看全局设置,其中有一个名为User Init Function的项目,这标志着整个工程将从dm642_init开始执行。这个函数主要是对DSP芯片进行模块和寄存器的初始化。

在所有的BIOS模块完成初始化后,调用main函数Tcpip_loopbackmain.c。Main函数中是对需要用到的外围设备进行初始化,如EMIFA等,用于FPGA和DSP的通信。

之后Main函数将控制权还给BIOS,我们继续查看BIOS Config下的Scheduling选项,在TSK-Task Manager任务管理项目下,可以看到有三个任务,并且具有不同的优先级。其实每一个任务都是一个线程。TSK_idle的优先级被系统固定为0,当没有其他的任务时,程序会在它的函数IDL_F_loop中持续循环。TSK_input和TSK_network的优先级都被我们设置为5,根据优先级的高低程序会进入其所在的任务函数中继续执行。由于此处TSK_input和TSK_network的优先级是相同的,那么当控制权还给BIOS的时候,由于每次上电后硬件软件的不同差异所以可能导致第一次执行的不是一个固定的函数,而有可能是这两个任务的任务函数(线程)的任意一个。

当TSK_input抢占到了执行权的时候,接下来执行它的任务函数(线程)tskVideoInput.c,在这个文件中可以看到利用while死循环来持续执行该线程,每一次循环中都调用image_and_keypoints()来完成图像信息的处理。这一函数位于image_and_keypoints.c文件中。

当TSK_network抢占到了执行权的时候,它的任务函数是Networkdeal,它位于NetworkSetting.c中。该文件不像tskVideoInput.c那样本身创建死循环来执行线程,而是首先对网口通信进行了相关的配置,在最后它新创建了一个新的任务tskNetworkTx,位于tskNetwork.c中。在tskNetwork.c我们可以看到利用for构成的死循环完成DSP与上位机的网口通讯工作。

但是TSK_input和TSK_network所代表的图像处理任务和网口传输任务是怎么互相切换的呢?我们可以看到无论是在图像处理任务的while死循环还是网口传输任务的for死循环中,都存在SCOM在任务之间来回传送消息,所以当图像处理完一帧时,该循环等待SCOM返回的消息。此时切换到网口传输任务中,开始执行网口数据的传输,当传完后把消息压到SCOM的队列并等待图像处理任务的消息,如此往复就实现了2个线程之间的互相切换。

剩下的seedvpm642_vcapparamsPAL_EMBEDDED.C和vportdis.c是对DSP进行的一些配置,而timer.c和capture.c则封装了计时和获取图像的一些函数,在这个工程里并没有用到。

综合来看,整个DSP运行架构可以近似看为以下的流程图。

文章目录