摘要:本篇文章开始,SRR案例的MSS应用程序已经带大家走完了,接下来将开始对DSS应用程序讲解。我们都知道一个工程的程序入口是从main函数开始的,这篇文章将从这个mian函数开始,分代码片段带着大家理解每一行代码的目的以及含义。
0.准备
首先我们找到SRR案例的DSS工程,如下图所示;
跳转到dss_mian.c文件,找到main函数(在该文件第366行代码处),接下来将对这个函数进行讲解;
1.参数声明
进入main函数,首先看到以下的代码片段,其中
2.Datapath 初始化
在参数声明完成后,接下来我们将看到如下代码片段,我们需要填充毫米波数据路径的所有信息,这些信息都是根据项目设计提前设计好的,例如Range bin 的数量,CFAR 的窗长等信息,在填充信息前,由于SRR案例利用了高级帧配置,即一个帧中包含两个子帧,而这两个子帧由于一些数据路径信息并不相同,故需要一个for循环先将这两个数据路径对象(子帧)进行初始化为0,紧接着就是通过MmwDemo_dataPathConfigPopulate外部函数将状态信息分别填充给数据路径对象。
2.1 MmwDemo_dataPathConfigPopulate函数
跳转进入MmwDemo_dataPathConfigPopulate,如下所示;
在运行MmwDemo_dataPathConfigPopulate外部函数后,此时数据路径对象信息已经填充完成。可以看到在这个函数中数据路径对象信息的填充是使用两个函数完成的,分别是MmwDemo_populateSRR和MmwDemo_populateUSRR,关于这两个函数,由于其中都是一些宏赋值语句,为了不使文章篇幅过长,在这里就不一一讲解。
3.初始化各子帧(对象)状态计数器
在数据路径对象信息填充完成后,接下来在数据处理开始前需要初始化用于记录处理了多少个chirp参数,由于共有两个数据路径对象,故需要调用两次MmwDemo_dataPathInit1Dstate函数;
3.1MmwDemo_dataPathInit1Dstate函数
跳转进入MmwDemo_dataPathInit1Dstate函数,这个函数初始化一些用于1D处理的状态(计数器)如下;
4.EDMA初始化
状态计数器初始化完成后,紧接着就是EDMA初始化,初始化EDMA,这是通过调用MmwDemo_dataPathInitEdma函数完成的,在调用该函数后,数据路径对象1(第一个子帧的数据路径对象)获得EDMA控制句柄,这时需要通过条件编译将EDMA控制句柄复制给数据路径对象2(第二个子帧的数据路径对象)中,如下代码所示;
4.1MmwDemo_dataPathInitEdma函数
跳转进入MmwDemo_dataPathInitEdma函数,并通过代码注释方式讲解,如下;
4.2MmwDemo_dataPathCopyEdmaHandle函数
EDMA句柄复制是通过MmwDemo_dataPathCopyEdmaHandle函数完成的,下图是通过代码注释的方式对这个函数讲解;
5.程序拷贝
EDMA初始化完成后,接下来这部分代码是利用EDMA将L3中的程序拷贝到L1中,如下所示;
5.1 MmwDemo_copyTable函数原型
下面通过代码注释讲述了MmwDemo_copyTable函数,主要将外部拷贝表_MmwDemo_fastCode_L1PSRAM_copy_table中的成员作为 MmwDemo_edmaBlockCopy函数的参数输入,最后通过EDMA实现代码复制。
注意:
关于通过EDMA将L3中的程序拷贝到L1中的代码基本是固定的,各位在编写自己DSS工程是,可以直接使用,但需要注意的是,在使用前,必须要初始化EDMA。
6.SOC初始化
在上一部分完成后,接下来就是SOC初始化,如果不进行初始化将会发生异常错误。这段程序是对SOC进行配置并且进行初始化,首先定义SOC_Cfg变量,然后对定义好的变量进行初始化,接下来是对SOC系统时钟进行配置,初始为旁路模式。接下来调用SOC_init API进行SOC初始化,if是判断SOC是否成功初始化
7.创建线程
紧接着就是创建线程函数,下面是创建任务,首先初始化任务参数,然后设置要创建的任务运行空间的大小,然后利用Task_create来创建任务
8.启动BIOS
总结
首先对datapath进行初始化,对后续1DFFT所用到的变量计数器进行初始化,EDMA初始化,SOC初始化,创建MRR_DSS_initTask任务,BIOS启动