在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主要流程就是这些了。