找回密码
 注册
搜索
查看: 890|回复: 1

[讨论] MTK定时器

[复制链接]
发表于 2007-11-10 16:50:33 | 显示全部楼层 |阅读模式
请问我这样在MTK中加入自己的定时器可以吗?  EBR_SEARCH_BLOCK_TIMER,
   
/*Timer Add 2007.09.16*/
    UC_TIMER_BASE_ID,
    UC_TIMER_END_ID = UC_TIMER_BASE_ID+128,

    MAX_TIMERS,  /* Imp: Please do not modify this */

每次用这些定时器时,CB函数能够被执行,但是CB函数一执行,机器就重启了
 楼主| 发表于 2007-11-12 21:24:09 | 显示全部楼层
还是关于定时器的问题:
void L4StartTimer(
        unsigned short nTimerId,
        oslTimerFuncPtr TimerExpiry,
        void *funcArg,
        unsigned long nTimeDuration,
        unsigned char alignment)

这个函数中的void *funcArg能否用来传输CallBack函数中的参数呢?
此函数原来的实现是这样的:
    /*----------------------------------------------------------------*/
    /* Local Variables                                                */
    /*----------------------------------------------------------------*/
    TIMERTABLE *pTable = NULL;
    U16 i = 0;
    U32 temp;

    /*----------------------------------------------------------------*/
    /* Code Body                                                      */
    /*----------------------------------------------------------------*/
    if (TimerExpiry == NULL)
    {   /* If TimerExpiry is NULL, we don't start the timer */
        MMI_ASSERT(0);
        return;
    }

    MMI_ASSERT(nTimerId < MAX_TIMERS);

    if (L4TimerUsePreciseTick(nTimerId))
    {
        temp = (nTimeDuration * KAL_TICKS_10_MSEC) / 10;
        if (temp == 0)
        {
            temp = KAL_TICKS_10_MSEC;
        }
        alignment = TIMER_IS_NO_ALIGNMENT;
    }
    else
    {
        if (nTimeDuration == 1000)
        {
            temp = KAL_TICKS_1_SEC - 4;
        }
        else
        {
            temp = (U32)((nTimeDuration / 5) * MMI_TICKS_5_MSEC);
        }

        if (temp == 0)
        {
            /* Cause by by rounding. If expire immediately, MoDIS boot-up failure because MMI keeps running and block NVRAM task */
            temp = (U32)MMI_TICKS_5_MSEC;
        }

    }   /* if (L4TimerUsePreciseTick(nTimerId)) */

    MMI_TRACE((MMI_TRACE_G1_FRM, MMI_FRM_INFO_L4DRV_STARTTIMER_HDLR, nTimerId, TimerExpiry, temp, alignment));

    pTable = &g_timer_table;
    if (g_timer_table_used >= g_timer_table_size)
    {
        /*
         * TIMERTABLE list doesn't have enough space, allocate the memory
         *
         * If we need to allocate the memeory, it means that MMI may have
         * such many timers run simultaneously. We won't free the memory
         * after we allocate more memory in TIMERTABLE list.
         */
        do
        {
            if (pTable->next == NULL)
            {
                pTable->next = OslMalloc(sizeof(TIMERTABLE));
                memset(pTable->next, 0, sizeof(TIMERTABLE));
                g_timer_table_size += SIMULTANEOUS_TIMER_NUM;
                pTable = pTable->next;
                i = 0;
                break;
            }
            pTable = pTable->next;
        } while (pTable != NULL);
    }
    else
    {
        /* find the empty record in g_timer_table list */
        i = 0;
        do
        {
            if (pTable->event_id == NULL)
            {   /* find the empty space */
                break;
            }
            i++;
            if (i >= SIMULTANEOUS_TIMER_NUM)
            {
                pTable = pTable->next;
                i = 0;
            }
        } while (pTable != NULL);

        if (pTable == NULL)
        {
            /* Can't find the empty space in TIMERTABLE list, assert!!! */
            MMI_ASSERT(0);
        }
    }   /* if (g_timer_table_used >= g_timer_table_size) */

    /*
     * already find the empty record, and then start timer
     *
     * event_sheduler1 = NO alignment scherulder
     * event_sheduler2 = alignment scherulder (low power)
     */
    if (alignment == TIMER_IS_NO_ALIGNMENT)
    {
        /* MSB(Most Significant Bit) is align_timer_mask */
        pTable->timer_id = nTimerId | NO_ALIGNMENT_TIMER_MASK;       
        pTable->event_id = evshed_set_event(
                                event_scheduler1_ptr,
                                (kal_timer_func_ptr) L4CallBackTimer,
                                (void*)nTimerId,
                                temp);

        pTable->callback_func = TimerExpiry;
        g_timer_table_used++;
    }
    else if (alignment == TIMER_IS_ALIGNMENT)
    {
        /* MSB(Most Significant Bit) is align_timer_mask */
        pTable->timer_id = nTimerId | ALIGNMENT_TIMER_MASK;       
        pTable->event_id = evshed_set_event(
                                event_scheduler2_ptr,
                                (kal_timer_func_ptr) L4CallBackTimer,
                                (void*)nTimerId,
                                temp);

        pTable->callback_func = TimerExpiry;
        g_timer_table_used++;
    }

我想通过改写其中的内容,如改写evshed_set_event的调用来实现上述的传输CB函数的参数的功能,不知道行不?
点评回复

使用道具 举报

高级模式
B Color Image Link Quote Code Smilies

本版积分规则

Archiver|手机版|小黑屋|52RD我爱研发网 ( 沪ICP备2022007804号-2 )

GMT+8, 2024-12-25 12:58 , Processed in 0.044285 second(s), 16 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表