| 帮同学宣传一下http://shop57644665.taobao.com/ |
在Nucleus中timer的创建函数是NU_Create_Timer,其定义是
#define NU_Create_Timer TMS_Create_Timer
通过其参数我们就可以看出如何设置一个timer。
STATUS TMS_Create_Timer(NU_TIMER *timer_ptr, CHAR *name, VOID (*expiration_routine)(UNSIGNED), UNSIGNED id, UNSIGNED initial_time, UNSIGNED reschedule_time, OPTION enable) timer -> tm_actual_timer.tm_timer_type = TM_APPL_TIMER; CSC_Place_On_List(&TMD_Created_Timers_List, &(timer -> tm_created)); TMD_Total_Timers++;
创建一个timer是很容易看懂的,我们主要分析timer时间到了之后的系统流程。
在TI平台中使用一个硬件晶振产生中断来作为系统的定时器,每次中断间隔时间作为操作系统的一个tick,也就是一个时间片。当中断发生时也就是产生了一个irq,在以前的irq流程中分析中我们可以知道每个irq都有一个自己的处理函数。在ti的平台的这个函数中我们可以发现如下代码
TMT_Timer_Interrupt();
这个函数就是Nucleus timer的接口函数,在这个函数中会检查是否有timer的时间到了,如果有timer active需要进行对应的操作,该函数会激活timer的HISR,这个HISR是在Nucleus初始化时TMI_Initialize函数中创建的。
status = TCCE_Create_HISR((NU_HISR *) &TMD_HISR, "SYSTEM H", TMC_Timer_HISR, (OPTION) TMD_HISR_Priority, TMD_HISR_Stack_Ptr, TMD_HISR_Stack_Size);
在这个HISR的处理函数中,使用timer函数创建的timer的最主要的代码是
/* Determine if the task timer has expired. */ if (TMD_Timer_State == TM_EXPIRED) /* Resume the timer task. */ TMC_Timer_Expiration();
在TMC_Timer_Expiration函数中
id = app_timer -> tm_expiration_id;
expiration_routine = app_timer -> tm_expiration_routine;
//app_timer的tm_expiration_id和tm_expiration_routine就是创建函数TMS_Create_Timer传入的参数。
if (!done)
{
/* Determine which type of timer has expired. */
if (type == TM_APPL_TIMER)
//类型为TM_APPL_TIMER,也就是task调用timer函数创建的类型。
//调用创建传入的timer超时时需要调用的函数。
/* Call application timer's expiration function. */
(*(expiration_routine)) (id);
else
//这里是Nucleus进行task的时间片处理的部分。
/* Call the task timeout function in the thread control
function. */
TCC_Task_Timeout((NU_TASK *) pointer);
}
基本上Nucleus的timer主要流程就是这些了。
















