打開 Timer 7,扁平化的界面十分清晰明了。頂欄包括設(shè)置、收藏與添加新定時(shí)器三個(gè)按鈕。定時(shí)器欄包括重置和展開時(shí)間設(shè)定的三角按鈕。沒有開始和暫停按鈕,只需要在所需定時(shí)器上點(diǎn)擊即可完成操作。應(yīng)用可以同時(shí)運(yùn)行多個(gè)計(jì)時(shí)器,對(duì)應(yīng)的是廚房里兩個(gè)灶火同時(shí)燉東西的情況。開發(fā)者表示最高可同時(shí)運(yùn)行 100 個(gè)定時(shí)器,這個(gè)特性……我就不測(cè)試了。
定時(shí)器沒有常見的小時(shí)與分鐘輪盤,取而代之的是四個(gè)按鈕。在我長(zhǎng)時(shí)間的使用后得到的結(jié)論是,這四個(gè)按鈕是比輪盤更好的存在。點(diǎn)擊的準(zhǔn)確程度在我看來是比滑動(dòng)不知道高到哪里去了。這一個(gè)細(xì)小的改變大幅度縮短了設(shè)置時(shí)間。
此外,還可以對(duì)常用的計(jì)時(shí)器進(jìn)行收藏和取名,計(jì)時(shí)器的管理清晰明了。收藏過的定時(shí)器統(tǒng)一放在收藏頁面下管理。調(diào)用十分方便。
設(shè)置界面支持調(diào)整黑白主題與多種顏色的高亮色。支持將定時(shí)器上秒數(shù)的最小單位從 10s 更改為 1s,滿足了更精準(zhǔn)定時(shí)設(shè)置的要求。
應(yīng)用對(duì)提醒功能的設(shè)置也較為深入,內(nèi)置22種不同的提醒聲音,「絕不重復(fù)」,同時(shí)設(shè)置多個(gè)定時(shí)器時(shí)的確有幫助。而且介于 iOS 的系統(tǒng)限制,對(duì)提醒的循環(huán)和持續(xù)時(shí)間給了一個(gè)比較好的解決方案。
在鎖屏界面上收到通知后左滑,可以快捷重新開始定時(shí)器的計(jì)時(shí)。
除此之外還有一個(gè)非常不起眼的功能,如果你在界面將待命的所有定時(shí)器左滑刪掉,下次打開應(yīng)用時(shí),它將自動(dòng)建立一個(gè)新的定時(shí)器,不用再點(diǎn)擊加號(hào)。開發(fā)者將這一功能解釋為「隨時(shí)待命」。實(shí)際使用中能夠非常微小地改變用戶習(xí)慣,保證隨拿隨用。
Timer 7 的定位從根本來講是為廚房服務(wù)的,應(yīng)用剛下載時(shí)的默認(rèn)定時(shí)器也都是各種料理的計(jì)時(shí)。因此它的功能必然不會(huì)像 Due那樣的全能計(jì)時(shí)器豐富。它只能作為一個(gè)日用計(jì)時(shí)器的補(bǔ)充存在,不能作為貫穿工作生活的效率工具。
此外如果將最小定時(shí)區(qū)間設(shè)為 1s,那么 10s 的選項(xiàng)就會(huì)被取代。而實(shí)際上如果用戶需要將最小時(shí)長(zhǎng)設(shè)為 1s,那就證明他對(duì)精度的要求高,這時(shí)僅有 1s 的選項(xiàng)顯然是拖慢操作速度的。因此 Timer 7 也不能為精度要求高的用戶所用。
如果你和我一樣,不是定時(shí)器的重度使用者,希望找到一個(gè)操作簡(jiǎn)便,界面干凈的定時(shí)器,或者覺得原生定時(shí)器功能太少,不妨嘗試一下 Timer 7,尤其是廚房愛好者。應(yīng)用原價(jià) 6 元,正在限免,點(diǎn)此去 App Store 下載。
reeRTOS中加入了軟件定時(shí)器這個(gè)功能組件,是一個(gè)可選的、不屬于freeRTOS內(nèi)核的功能,由定時(shí)器服務(wù)(其實(shí)就是一個(gè)定時(shí)器任務(wù))來提供。
軟件定時(shí)器是當(dāng)設(shè)定一個(gè)定時(shí)時(shí)間,當(dāng)達(dá)到設(shè)定的時(shí)間之后就會(huì)執(zhí)行指定的功能函數(shù),而這個(gè)功能函數(shù)就叫做回調(diào)函數(shù)。
也就是說回調(diào)函數(shù)的兩次執(zhí)行間隔叫做定時(shí)器的定時(shí)周期。
回調(diào)函數(shù):
回調(diào)函數(shù)就是一個(gè)通過函數(shù)指針調(diào)用的函數(shù)。如果你把函數(shù)的指針(地址)作為參數(shù)傳遞給另一個(gè)函數(shù),當(dāng)這個(gè)指針被用來調(diào)用其所指向的函數(shù)時(shí),我們就說這是回調(diào)函數(shù)。
在freeRTOS中要使用軟件定時(shí)器的話,需要在配置文件freeRTOSConfig.h中設(shè)置相應(yīng)的宏,如下:
#define configUSE_TIMERS 1 //使能軟件定時(shí)器
#define configTIMER_TASK_PRIORITY 2 // 軟件定時(shí)器的優(yōu)先級(jí)
#define configTIMER_QUEUE_LENGTH 10 // 軟件定時(shí)器的隊(duì)列長(zhǎng)度
#define configTIMER_TASK_STACK_DEPTH (configMINIMAL_STACK_SIZE * 2) // 軟件定時(shí)器的堆棧空間大?。▎挝皇亲郑?/code>
(1)單次定時(shí)器
單次定時(shí)器定時(shí)時(shí)間到了就執(zhí)行一次回調(diào)函數(shù),之后不會(huì)再執(zhí)行,只有在再次重新啟動(dòng)的時(shí)候才會(huì)再執(zhí)行一次。
(2)周期定時(shí)器
周期定時(shí)器根據(jù)設(shè)定的時(shí)間周期的執(zhí)行的。
它一旦啟動(dòng)以后,每執(zhí)行一次完一次回調(diào)函數(shù)以后定時(shí)器會(huì)自動(dòng)重啟,回調(diào)函數(shù)會(huì)周期性地執(zhí)行。
單次定時(shí)器和周期定時(shí)器的示意圖如下所示:
3.1、創(chuàng)建軟件定時(shí)器
TimerHandle_t xTimerCreate (
const char * const pcTimerName, /* 定時(shí)器名字 */
const TickType_t xTimerPeriod, /* 定時(shí)器周期 */
const UBaseType_t uxAutoReload, /* 選擇單次模式或者周期模式 */
void * const pvTimerID, /* 定時(shí)器 ID */
TimerCallbackFunction_t pxCallbackFunction ); /* 定時(shí)器回調(diào)函數(shù) */
函數(shù)描述:函數(shù) xTimerCreate 用于創(chuàng)建軟件定時(shí)器。
pcTimerName:定時(shí)器名字,一般用于調(diào)試,方便識(shí)別不同的定時(shí)器。
xTimerPeriod:定時(shí)器周期,單位是系統(tǒng)時(shí)鐘節(jié)拍。
uxAutoReload:選擇定時(shí)器是周期模式還是單次模式。若參數(shù)為 pdTRUE,則表示選擇周期模式,若參數(shù)為 pdFALSE,則表示選擇單次模式。
pvTimerID:定時(shí)器的 ID。當(dāng)創(chuàng)建多個(gè)不同的定時(shí)器,但又使用同一個(gè)回調(diào)函數(shù)時(shí),在回調(diào)函數(shù)中就可以通過不同的 ID 號(hào)來區(qū)分不同的定時(shí)器。
pxCallbackFunction:定時(shí)器的回調(diào)函數(shù)。
返回值:創(chuàng)建成功返回定時(shí)器的句柄,失敗會(huì)返回 NULL。
創(chuàng)建一個(gè)單次觸發(fā)的軟件定時(shí)器示例如下:
TimerHandle_t singalTIMERS; //單次定時(shí)器
void singalTimersFunc(TimerHandle_t xTimers); //單次定時(shí)器回調(diào)函數(shù)
/*創(chuàng)建單次定時(shí)器*/
singalTIMERS=xTimerCreate(
"singalTIMERS", //軟件定時(shí)器的名字
000, //定時(shí)周期,單位是時(shí)鐘節(jié)拍數(shù)
pdFALSE, //定時(shí)器模式,pdTRUE為周期定時(shí)器,//pdFALSE為單次定時(shí)器
(void*)1, //定時(shí)器的ID號(hào)
singalTimersFunc //定時(shí)器回調(diào)函數(shù)
);
3.2、啟動(dòng)軟件定時(shí)器
1)在任務(wù)中啟動(dòng)
BaseType_t xTimerStart(
TimerHandle_t xTimer, /* 定時(shí)器句柄 */
TickType_t xBlockTime ); /* 成功啟動(dòng)定時(shí)器前的最大等待時(shí)間設(shè)置,單位系統(tǒng)時(shí)鐘節(jié)拍 */
函數(shù)描述:函數(shù) xTimerStart 用于啟動(dòng)軟件定時(shí)器。
xTimer:是定時(shí)器句柄。
xBlockTime:是成功啟動(dòng)定時(shí)器前的最大等待時(shí)間設(shè)置,單位系統(tǒng)時(shí)鐘節(jié)拍。
這是定時(shí)器組的大部分 API 函數(shù)不是直接運(yùn)行的,而是通過消息隊(duì)列給定時(shí)器任務(wù)發(fā)消息來實(shí)現(xiàn)的,
此參數(shù)設(shè)置的等待時(shí)間就是當(dāng)消息隊(duì)列已經(jīng)滿的情況下,等待消息隊(duì)列有空間時(shí)的最大等待時(shí)間。
返回值:返回 pdFAIL 表示此函數(shù)向消息隊(duì)列發(fā)送消息失敗,返回 pdPASS 表示此函數(shù)向消息隊(duì)列發(fā) 送消息成功。
注意:定時(shí)器任務(wù)實(shí)際執(zhí)行消息隊(duì)列發(fā)來的命令依賴于定時(shí)器任務(wù)的優(yōu)先級(jí),如果定時(shí)器任務(wù) 是高優(yōu)先級(jí)會(huì)及時(shí)得到執(zhí)行,如果是低優(yōu)先級(jí),就要等待其余高優(yōu)先級(jí)任務(wù)釋放 CPU 權(quán)才可以得到 執(zhí)行。
使用這個(gè)函數(shù)要注意以下問題:
1> 要使用定時(shí)器啟動(dòng)函數(shù)前提是已經(jīng)通過函數(shù) xTimerCreate 成功創(chuàng)建了軟件定時(shí)器。
2> 在 FreeRTOSConfig.h 文件中使能宏定義: #define configUSE_TIMERS 1
2)在中斷中啟動(dòng)
BaseType_t xTimerStartFromISR(TimerHandle_t xTimer BaseType_t* pxHigherPriorityTaskWoken);
函數(shù)描述:
XTimer:軟件定時(shí)器的句柄
pxHigherPriorityTaskWoken:退出此函數(shù)時(shí)是否要進(jìn)行任務(wù)切換
返回值:
pdPASS:軟件定時(shí)器開啟成功。
pdFAIL:軟件定時(shí)器開啟失敗。
3.3、停止定時(shí)器
1)在任務(wù)中停止軟件定時(shí)器
BaseType_t xTimerStop(TimerHandle_t xTime, TickType_t xTicksToWait)
函數(shù)描述:
xTimer:軟件定時(shí)器的句柄。
xTicksToWait:阻塞時(shí)間,即停止定時(shí)器最大的等待時(shí)間。
返回值:
pdPASS:軟件定時(shí)器停止成功
pdFAIL:軟件定時(shí)器停止失敗
2)在中斷中停止軟件定時(shí)器
xTimerStopFormISR(TimerHandle_t xTimer, BaseType_t pxHigherPriorityTaskWoken);
函數(shù)描述:
xTimer:軟件定時(shí)器句柄
pxHigherPriorityTaskWoken:退出此函數(shù)時(shí)是否要進(jìn)行任務(wù)切換
返回值:
pdPASS:軟件定時(shí)器開啟成功。
pdFAIL:軟件定時(shí)器開啟失敗。
3.4、復(fù)位定時(shí)器
1)在任務(wù)中復(fù)位
BaseType_t xTimerReset(TimerHandle_t xTimer, TickType_t xTicksToWait)
函數(shù)描述:
xTimer:軟件定時(shí)器的句柄。
xTicksToWait:阻塞時(shí)間,即停止定時(shí)器最大的等待時(shí)間。
返回值:
pdPASS:軟件定時(shí)器復(fù)位成功
pdFAIL:軟件定時(shí)器復(fù)位失敗
2)在中斷中復(fù)位
BaseType_t xTimerResetFromISR(TimerHandle_t xTimer, BaseType_t *pxHigherPriorityTaskWoken);
函數(shù)描述:
xTimer:軟件定時(shí)器句柄
pxHigherPriorityTaskWoken:退出此函數(shù)時(shí)是否要進(jìn)行任務(wù)切換
返回值:
pdPASS:軟件定時(shí)器復(fù)位成功。
pdFAIL:軟件定時(shí)器復(fù)位失敗。
3.5、查詢定時(shí)器是否已經(jīng)開始運(yùn)行
BaseType_t xTimerIsTimerActive( TimerHandle_t xTimer )
查詢定時(shí)器以查看它是活動(dòng)的還是休眠的。
如果出現(xiàn)以下情況,計(jì)時(shí)器將處于休眠狀態(tài):
1) 已創(chuàng)建但未啟動(dòng)。
2) 已過期的計(jì)時(shí)器尚未重新啟動(dòng)。
返回值:
pdFALSE,沒有運(yùn)行。
其他值,運(yùn)行。
創(chuàng)建2個(gè)軟件定時(shí)器,ID號(hào)分別為1、2,這兩個(gè)軟件定時(shí)器使用同一個(gè)回調(diào)函數(shù),在回調(diào)函數(shù)里面讀取定時(shí)器的ID,通過ID識(shí)別定時(shí)器。
1、創(chuàng)建軟件定時(shí)器
TimerHandle_t SoftWaveTimer1; //軟件定時(shí)器1
TimerHandle_t SoftWaveTimer2; //軟件定時(shí)器2
void pxSoftWaveTimer(TimerHandle_t xTimer); //軟件定時(shí)器回調(diào)函數(shù)
SoftWaveTimer1=xTimerCreate(
"softwaveTimer1",
1000,
pdTRUE,
(void*)1,
pxSoftWaveTimer);
SoftWaveTimer2=xTimerCreate(
"softwaveTimer2", //定時(shí)器句柄
3000, //定時(shí)器周期
pdTRUE, //周期/單次定時(shí)器
(void*)2, //定時(shí)器ID
pxSoftWaveTimer); //回調(diào)函數(shù)指針
2、定時(shí)器回調(diào)函數(shù)
void pxSoftWaveTimer(TimerHandle_t xTimer)
{
u32 TimerID;
u8 *TimerName;
TimerID=(u32)pvTimerGetTimerID(xTimer); //獲取定時(shí)器ID
TimerName=(u8*)pcTimerGetName( xTimer ); //獲取定時(shí)名字
if(TimerID==1)
{
printf("軟件定時(shí)器%s運(yùn)行,1S周期\r\n",TimerName);
}
if(TimerID==2)
{
printf("軟件定時(shí)器%s運(yùn)行,2S周期\r\n",TimerName);
}
}
3、啟動(dòng)、關(guān)閉定時(shí)器
//task1任務(wù)函數(shù)
void task1_task(void *pvParameters) //prio=2
{
u8 keyVal=0;
while(1)
{
keyVal=KEY_Scan(0);
if(keyVal==KEY0_PRES) //啟動(dòng)定時(shí)器
{
xTimerStart(SoftWaveTimer1,0);
xTimerStart(SoftWaveTimer2,0);
}
if(keyVal==KEY1_PRES) //關(guān)閉定時(shí)器
{
xTimerStop(SoftWaveTimer1,0);
xTimerStop(SoftWaveTimer2,0);
}
LED1 ^=1;
vTaskDelay(200); //延時(shí)n個(gè)時(shí)鐘節(jié)拍
}
}
作者簡(jiǎn)介:
本人95后技術(shù)男,從事嵌入式軟件開發(fā),專注于技術(shù)成長(zhǎng)和技術(shù)分享。目標(biāo)是每天進(jìn)一步一點(diǎn)點(diǎn),通過技術(shù)改變自己的生活,創(chuàng)造自己的美好未來!如果你也對(duì)嵌入式感興趣,歡迎關(guān)注我呀!
聲明:
本文作者:嵌入式之入坑筆記
文章版權(quán)歸作者所有,轉(zhuǎn)載請(qǐng)注明出處!
實(shí)在很久以前我們的播放器是沒有睡眠定時(shí)功能的,直到現(xiàn)在也是,比較有名的兩個(gè)例子Pandora radio直到7.0版本才加入sleep timer的功能,如果沒有記錯(cuò)的話。而另外一款在線音樂軟件Spotify至今都沒有睡眠定時(shí)的功能,然而又使用它多一些,順手就找到了這款睡眠定時(shí)器的APP。
使用非常簡(jiǎn)單,打開之后可以自行設(shè)定時(shí)間,順時(shí)針滑動(dòng)圓圈增加睡眠時(shí)間,反之減少;然后選擇開始它會(huì)要求你指定默認(rèn)的播放器,你可以自行選擇包括YouTube在內(nèi)的播放器都沒有問題,然后立即開始即可。它會(huì)在通知欄里面提示還剩余多少時(shí)間,到點(diǎn)之后發(fā)送暫停的廣播通知給播放器即可見見淡出聲音直到停止。
普通版本與高級(jí)版本的區(qū)別僅在廣告和小部件方面,并且你可以自由選擇開發(fā)者設(shè)定的支付額度和多種解鎖方式,最低價(jià)之外土豪們可以多多打賞。
以下為來自Google Play的官方介紹:
睡眠計(jì)時(shí)器讓您聽著最喜歡的音樂入睡。您只需打開音樂,然后設(shè)置倒計(jì)時(shí)器即可。在倒計(jì)時(shí)結(jié)束時(shí),睡眠計(jì)時(shí)器會(huì)溫和地讓音樂漸漸淡出,直至停下來。這樣可讓您睡得香甜,防止電池耗費(fèi)。
邊睡邊聽
使用您最喜歡的音樂播放器,甚至是 YouTube!
選擇要音樂播放多長(zhǎng)時(shí)間
為您經(jīng)常使用的計(jì)時(shí)器創(chuàng)建預(yù)設(shè)值
防止電池耗費(fèi)
搖一搖延長(zhǎng)計(jì)時(shí)
免費(fèi)版
配有小部件的高級(jí)版(可在應(yīng)用內(nèi)購(gòu)買)
--------------------------
頭條號(hào):Appfound
公眾號(hào):Appfound
原載于:http://www.appkg.com/4255.html