QCC512x QCC302x 延时函数 (阻塞与非阻塞)

ADK4 与 ADK6 都提供了获取系统本地时间的函数,单位是 us

获取系统当前时间(阻塞)

函数原型:

rtime_t SystemClockGetTimerTime(void)
{
    return (rtime_t)VmGetTimerTime();
}

调用的方法(延时 x ms):

void delay_ms(uint16 v_msec_16)
{
    /** add one to the delay to make sure we don't return early */
    uint32 v_delay = SystemClockGetTimerTime() + (v_msec_16 * 1000) + 1;

    while (((int32)(SystemClockGetTimerTime() - v_delay)) < 0);
}

原理是获取系统当前的时间,加上延时的时间,然后在while里循环里一直获取最新时间,并且与设定值比较,直到超过想要的延时,则退出。
在延时等待操作中,会阻塞app程序,但不会阻塞DSP,谨慎使用!
对于设置I2C器件的初始化、不经常性调用到的、想要方便操作的,可以这样子用。

利用消息来进行延时(非阻塞)

如果需要等待的时间较长,或者经常性用到的延时,可以使用 message 来操作。
函数原型:

void meMessageSendLater(Task task, MessageId id, void *message, uint32 delay)
{
    vm_message_send_later(task, id, message, delay, NULL, CONDITION_WIDTH_UNUSED);
}

使用的方法,需要建立 message (在宏中增加 message id),然后找到对应的xxxMessageHandler()函数,增加一个case来处理。
如果不需要跟参数的话,可以传入 NULL。
如果要跟参数的话,先定义参数结构体,然后调用meMessageSendLater()时候传入,并在xxxMessageHandler()中处理掉。

例如:增加 gaia app 交互的功能(带延时操作的功能)、定时关机、去pop音等,需要延时较长但又不能够阻塞的,需要用到 message。
特别地:message的内容不需要手动释放,系统会自己回收。

发布了12 篇原创文章 · 获赞 16 · 访问量 8132

猜你喜欢

转载自blog.csdn.net/qq_29225913/article/details/100982991