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