3. tick_timer

tick_timer是一个简单的定时器,在该tick_timer初始化后,会以2ms的间隔起来一次中断,优先级为IRQ_TTICKTMR_IP.

具体tick_timer中断如下:

SET(interrupt(""))
void tick_timer_isr()
{
    /* 用户的timer函数不能加入到这里,加到tick_timer_loop */
    j32CPU(core_num())->TTMR_CON |= BIT(6);

    tick_timer_ram_loop();
    if (tick_timer_close) {
        if (tick_timer_close()) {
            return ;
        }
    }

    tick_timer_loop();
}
在该中断里面主要分为两部分:
1、tick_timer_ram_loop() : 该函数里面需要全部放入ram中执行;
2、tick_timer_loop() : 该函数用户正常处理;

设计原因为:

相关底层驱动在操作flash时会关闭总中断,又想在这段时间里执行tick_timer中断

那么就需要满足两个条件:
1、关总中断时额外放开tick_timer中断不受影响。
2、执行的代码都放在ram中;(避免关闭了flash,中断又需要访问flash来执行代码导致卡死问题)

那么在系统底层驱动操作flash时,虽然关闭了总中断,但是放开了 tick_timer 中断, tick_timer 中断运行了 tick_timer_ram_loop() 部分后, tick_timer_close() 判断为真而不执行后面的 tick_timer_loop()

这样用户可以flash关闭期间仍旧执行放在tick_timer的代码操作。

3.1. 注意事项

  1. tick_timer实际是一个定时器触发中断的行为,所以用户在tick_timer函数里不要执行过长时间以免中断执行过久。

  2. tick_timer中断的默认优先级为3,存在会被优先级比他高的中断打断 或者 被同级优先级的中断延迟起中断时间 的问题。