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的內容不需要手動釋放,系統會自己回收。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章