摘要:在这篇博文中,将会对demo的主函数分片段来描述它的作用,并且会对一些函数作用进行描述。
1.变量参数的声明:
主程序是案例代码的入口,进入主程序,我们会先看到定义三个变量参数,为了方便表述,下面将用参数一,二,三来表述;
1)参数一是用于创建线程的线程参数,且是一个结构体,它与创建线程函数是密不可分的(如下中展示的创建线程函数就用到该参数作为它的输入参数)作用用于设置线程函数的优先级等;关于线程的相关知识可以参考操作系统指南。
2)参数二是一个整数型的错误参数,它主要用来标识在整个main函数中程序出现错误时的类型,不同的返回值代表不同的信息。
3)参数三是一个片上系统的结构体变量,它包含了打开和初始化片上系统(SOC)驱动所需要的配置信息,这个的组成如下;
2.参数初始化
参数声明之后,我们将会看到下面三行调用函数代码,这三行代码用到的函数的作用、存在的头文件接下来将一一解答
1)ESM_init函数原型
ESM_init函数在头文件中定义 #include <ti/drivers/esm/esm.h>
作用:初始化ESM驱动,ESM驱动提供api来配置和处理来自ESM H/W模块的错误, 如果不调用这个API,就不能使用ESM API。并且如果你使用TI RTOS,那么ESM错误在进入main之前被清除,并且这个输入参数可以设置为0。 对于任何其他RTOS,检查RTOS实现或将此输入参数设置为1 。
2)在执行ESM驱动初始化之后,接下来就是对全局变量、SOC配置参数初始化为0,函数参数定义之后都需要进行初始化,主要的一个原因是避免出错或值的丢失。其中函数memset()是C语言标志库函数,下面是这个函数的一些基本描述;
注意:
全局变量在mss_main.c文件的第101行中声明,它是一个用于存储全局信息的一个结构体,通俗来说是用于案例SRR TI设计所需的跟踪信息的全局变量。
3.SOC系统初始化
demo在参数初始化之后,接下来就是对SOC进行初始化,SOC驱动程序需要在整个系统中初始化一次。 这是使用SOC_init完成的。 如果不调用这个API,就不能使用任何SOC API ,在进行初始化之前,需要对SOC初始化参数进行配置,在本案例中仅对系统的时钟频率初始化进行配置(如下片段中的第一行),接下来就是调用SOC初始化函数对系统进行初始化并返回控制句柄储存在全局变量中,这个句柄用来告诉系统,已经对其SOC初始化了,可以使用SOC API了,如果这个句柄等于空(NULL),则说明SOC初始化不成功,并退出程序,且在控制台显示相应的错误信息,否则则说明SOC初始化成功,并转到下一步检查判断设备是否是安全设备,这是使用SOC_isSecureDevice完成的,如果设备处于安全保护状态,这时要对一些模块进行访问时则需要先对其禁用防火墙,才可访问它,这是使用SOC_controlSecureFirewall完成的,在这个demo中需要禁用JTAG和LOGGER (UART)的防火墙 ,以便可以对它进行访问。值得注意的是SOC安全设备防火墙功能模块定义在一个枚举变量中,在函数后边附上这个枚举类型的变量。
补充:
函数原型:
1)
描述
该函数用于初始化和设置SOC Driver。 如果应用程序请求系统时钟配置,则该功能将解除BSS,并等待直至APLL校准完成。
参数
[in] ptrCfg 指向SOC配置的指针
[out] errCode 错误时生成的错误代码
返回值
成功 - 指向SOC驱动程序的指针
错误 - NULL
2)
描述
该函数用于判断设备是否是安全设备
参数
[in] handle SOC 驱动控制句柄
[out] errCode 错误时生成的错误代码
返回值
成功 - 1
失败 - 0
其它错误 - <0
3)
描述
该函数用于指定模块开启/关闭安全防火墙。只有当设备是安全设备时,才需要调用该功能
参数
[in] handle SOC 驱动控制句柄
[in] firewallModulesBitmap 需要修改防火墙的模块(由SOC_SecureFirewallModules指定)的位图
[in] control SOC_SECURE_FIREWALL_DISABLE—禁用防火墙(允许访问模块);
SOC_SECURE_FIREWALL_ENABLE—启用防火墙(禁止对模块的访问)
[out] errCode 错误时生成的错误代码
返回值
成功 - 0
错误 - <0
4.创建线程
主程序在完成上述之后,将会创建一个线程,线程通常都是定义在一个死循环中,通常用信号量(semaphore)来阻塞和执行。
在这片代码创建了一个线程,在创建线程函数时需要对线程参数进行初始化,这是使用Task_Params_init来完成的,参数初始化后,就需要对线程的优先级进行设置,优先级越高,则这个线程将会更优先执行,并使用Task_create来创建线程,使得SRR_MSS_initTask函数得以运行在线程中,即程序将会进入线程中一直执行。最后开始BIOS系统,这是BIOS_start完成的。
注意:
关于BIOS_start这个函数,大可不必深究其意,BIOS_start()可以看作是一个系统调用,调用LIB是由BIOS启动起来的。这个函数不会返回。也就是在基于TI-RTOS,都需要调用这个函数。
5.总结
最终程序执行将进入SRR_MSS_initTask线程函数中一直运行,在下一篇博文中详细阐述这个线程函数。至此demo的主函数已经讲解完成。
参考示例:
mmwave_automotive_toolbox\mmwave_automotive_toolbox_3_5_0\labs\lab0002_short_range_radar