SYSBIOS系统中的定时模块

基于TMS320C6678的sysbios系统时钟模块
基于6678做工程,在配置sysbios时用到了XDCtools配置技术,因此现在简单介绍一下在6678平台上做sysbios系统时,关于系统时钟的一个介绍
sysbios以及xdctools中关于计时和时钟的相关服务包括三个方面:

  1. ti.sysbios.knl.Clock模块,Clock模块负责与用户API函数打交道,他可以调用.hal.Timer来获得一个基于硬件计时器的时钟。另外Clock模块还可以配置成由应用提供时钟。

  2. ti.sysbios.hal.Timer模块,该模块主要负责与底层硬件打交道,可以被Clock模块调用,主要负责对片上计时器硬件的配置。

  3. xdc.runtime.Timestamp时间戳模块,该模块给基准测试代码提供时间戳服务,同时可以添加时间戳到日志。

具体
Clock模块负责管理内核用来记录时间的周期性系统时钟,他默认的使用ti.sysbios.hal.Timer来模拟创建一个计时器来生产系统时钟,这个过程是通过调用Clock_tick()函数来实现的。

可以通过配置Clock模块中的 ti.sysbios.knl.tickSorce参数来确定系统是时钟的来源,分别可以设置为:
Clock.tickSource_TIMER 系统使用.hal.Timer来创建系统时钟(默认)
Clock.tickSource_USER 系统使用用户应用程序来提供时钟,那么用户应用程序需要通过中断来调用Clock_tick()函数,并且中断的频率应该基本上等于系统时钟的频率。
Clock.tickSource_NULL,sysbios系统不能调用任何和时钟有关的APIs
对于前两种时钟,可以通过Clock_tickPeriod来设置时钟周期。

Clock_getTicks函数获得从系统启动开始所产生的时钟周期数目,当该值达到32位后就会返回0值。
Clock模块还可以调用以下三个函数调整停止重新配置时钟:
Clock_tickStop函数通过调用Timer_stop来停止用于产生系统时钟的计数器,从而停止系统时钟。
Clock_tickReconfig函数调用Timer_setperiodMicrosecongds函数来重新配置计数器,改变计时周期;
Clock_tickStart函数通过调用Timer_start来重新启动配置好的计数器,从而重新启动系统时钟。

Clock模块可以创建时钟实例,当创建时钟实例时系统自动创建一个SWI,时钟函数都在该软件中断中运行,创建时其中断优先级由系统分配,但是也可以自己配置,通过设置Clock.swi.Priority来改变。

在创建时钟实例时需要调用Clock_create 函数来动态创建(当然也可以静态配置创建),时钟实例可以是单次的也可以是连续的,这个通过clock_params来设置,可以在创建成功后设置立即启动也可以通过后续调用Clock_start来启动,也是通过clockparams来设置,Clock_create 函数只能在main函数或者Task中被调用。

Clock_Params  clockParams;
Clock_Handle myClock;
clockParams.period = 5;
clockParams.startFlag = TRUE;
myClock = Clock_create(myHandler,Timeout,&clockParams,&eb);

这段代码显示的是创建了一个时钟实例,其中Clock_Handle myClock;是设置了一个时钟实例的句柄变量,Clock_Params = clockParams;是设置了一个时钟实例的参数配置变量,其中clockParams.period = 5;表示这是一个连续的时钟实例,他在被第一次唤醒之后每隔5个周期会被再换醒一次,5是除第一次唤醒时的唤醒周期,如果clockParams.period = 0或者没有设置的话那么他即使一个单次的时钟实例,第一次被唤醒之后就再也不会被唤醒了。与他对应的一个参数是Timeout这个参数,这个参数要求是非零的,这个参数表示的是这个时钟实例从启动开始到第一次被唤醒所需要的时钟周期数,他与clockParams.period = 5;这个参数是不同的,他只负责从启动到第一次被唤醒这个时间。参数clockParams.startFlag = TRUE;表示创建好这个时钟实例之后立即启动,如果没有设置那么这个时钟实例不会立即开始启动(注意区分启动与唤醒)需要他启动时调用Clock_start函数即可。myHandler这个是个唤醒时钟服务函数,类似于中断服务函数,当这个时钟实例到时间被唤醒之后他就转向去执行这个函数名为myHandler的函数。
下面是单次实例与连续实例的对比:
SYSBIOS系统中的定时模块_第1张图片
时钟实例都可以调用Clock_stop()和Clock_start()来停止和重启,要注意的是,Clock_tickStop的作用是停止产生时钟周期的计数器,而Clock_stop()的作用是只停止一个时钟对象的一个实例(因为可能一个计数器同时对应多个时钟实例),当调用Clock_start()时那个超时值被重置。时钟实例的这两个函数可以在任何程序中被调用。时钟模块还提供了Clock_setPeriod, Clock_setTimeout, Clock_setFunc()等函数供用户修改被停止的时钟实例,这三个函数与前面的Clock_tickStop,Clock_tickReconfig,Clock_tickStart是不同的前面三个是修改时钟实例,并且要先停止这个时钟实例,他们是不会改变计数器的配置的,然而后面三个是可以调用.hal.Timer模块的相应函数的,他们改变的是计数器的配置

//使用APIs来降低时钟模块的频率,降低计数器频率
BIOS_getCpuFreq(&cpuFreq);
cpuFreq.lo = cpuFreq.lo/2;
BIOS_setCpuFreq(&cpuFreq);
key = Hwi_disable();//门
Clock_tickStop();
Clock_tickReconfig();
Clock_tickStart();
Hwi_restore(key);

ti.sysbios.hal.Timer是硬件抽象层pack的一部分。

你可能感兴趣的:(嵌入式软件)